@gleanwork/mcp-server-tester 1.0.0-beta.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -1
- package/dist/cli/index.js +12 -1
- package/dist/fixtures/mcp.js +71 -14
- package/dist/fixtures/mcp.js.map +1 -1
- package/dist/index.cjs +73 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -2
- package/dist/index.d.ts +30 -2
- package/dist/index.js +73 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/oauthClientProvider.ts","../node_modules/@ai-sdk/provider/src/errors/get-error-message.ts","../node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../node_modules/@ai-sdk/provider/src/errors/api-call-error.ts","../node_modules/@ai-sdk/provider/src/errors/empty-response-body-error.ts","../node_modules/@ai-sdk/provider/src/errors/invalid-argument-error.ts","../node_modules/@ai-sdk/provider/src/errors/json-parse-error.ts","../node_modules/@ai-sdk/provider/src/errors/load-api-key-error.ts","../node_modules/@ai-sdk/provider/src/errors/load-setting-error.ts","../node_modules/@ai-sdk/provider/src/errors/type-validation-error.ts","../node_modules/eventsource-parser/src/parse.ts","../node_modules/eventsource-parser/src/errors.ts","../node_modules/eventsource-parser/src/stream.ts","../node_modules/@ai-sdk/provider-utils/src/combine-headers.ts","../node_modules/@ai-sdk/provider-utils/src/convert-async-iterator-to-readable-stream.ts","../node_modules/@ai-sdk/provider-utils/src/create-tool-name-mapping.ts","../node_modules/@ai-sdk/provider-utils/src/delay.ts","../node_modules/@ai-sdk/provider-utils/src/extract-response-headers.ts","../node_modules/@ai-sdk/provider-utils/src/uint8-utils.ts","../node_modules/@ai-sdk/provider-utils/src/convert-image-model-file-to-data-uri.ts","../node_modules/@ai-sdk/provider-utils/src/convert-to-form-data.ts","../node_modules/@ai-sdk/provider-utils/src/read-response-with-size-limit.ts","../node_modules/@ai-sdk/provider-utils/src/download-blob.ts","../node_modules/@ai-sdk/provider-utils/src/get-error-message.ts","../node_modules/@ai-sdk/provider-utils/src/is-abort-error.ts","../node_modules/@ai-sdk/provider-utils/src/handle-fetch-error.ts","../node_modules/@ai-sdk/provider-utils/src/get-runtime-environment-user-agent.ts","../node_modules/@ai-sdk/provider-utils/src/normalize-headers.ts","../node_modules/@ai-sdk/provider-utils/src/with-user-agent-suffix.ts","../node_modules/@ai-sdk/provider-utils/src/inject-json-instruction.ts","../node_modules/@ai-sdk/provider-utils/src/is-non-nullable.ts","../node_modules/@ai-sdk/provider-utils/src/is-url-supported.ts","../node_modules/@ai-sdk/provider-utils/src/load-api-key.ts","../node_modules/@ai-sdk/provider-utils/src/load-optional-setting.ts","../node_modules/@ai-sdk/provider-utils/src/load-setting.ts","../node_modules/@ai-sdk/provider-utils/src/media-type-to-extension.ts","../node_modules/@ai-sdk/provider-utils/src/secure-json-parse.ts","../node_modules/@ai-sdk/provider-utils/src/add-additional-properties-to-json-schema.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/any.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/array.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/bigint.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/boolean.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/branded.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/date.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/default.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/effects.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/enum.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/intersection.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/literal.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/string.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/record.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/map.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/native-enum.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/never.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/null.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/union.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/nullable.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/number.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/object.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/promise.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/set.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/tuple.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/undefined.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/unknown.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parse-def.ts","../node_modules/@ai-sdk/provider-utils/src/schema.ts","../node_modules/@ai-sdk/provider-utils/src/validate-types.ts","../node_modules/@ai-sdk/provider-utils/src/parse-json.ts","../node_modules/@ai-sdk/provider-utils/src/parse-json-event-stream.ts","../node_modules/@ai-sdk/provider-utils/src/parse-provider-options.ts","../node_modules/@ai-sdk/provider-utils/src/types/tool.ts","../node_modules/@ai-sdk/provider-utils/src/provider-tool-factory.ts","../node_modules/@ai-sdk/provider-utils/src/remove-undefined-entries.ts","../node_modules/@ai-sdk/provider-utils/src/resolve.ts","../node_modules/@ai-sdk/provider-utils/src/without-trailing-slash.ts","../node_modules/@ai-sdk/provider-utils/src/is-async-iterable.ts","../node_modules/@ai-sdk/provider-utils/src/types/execute-tool.ts","../node_modules/@ai-sdk/provider-utils/src/delayed-promise.ts","../node_modules/@ai-sdk/provider-utils/src/download-error.ts","../node_modules/@ai-sdk/provider-utils/src/generate-id.ts","../node_modules/@ai-sdk/provider-utils/src/version.ts","../node_modules/@ai-sdk/provider-utils/src/get-from-api.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/options.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/catch.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/optional.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/pipeline.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/readonly.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/select-parser.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/get-relative-path.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/refs.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/zod3-to-json-schema.ts","../node_modules/@ai-sdk/provider-utils/src/post-to-api.ts","../node_modules/@ai-sdk/provider-utils/src/response-handler.ts","../node_modules/@ai-sdk/provider-utils/src/index.ts","../src/config/mcpConfig.ts","../src/index.ts","../src/auth/tokenAuth.ts","../src/auth/setupOAuth.ts","../src/debug.ts","../src/auth/oauthFlow.ts","../src/auth/discovery.ts","../src/auth/storage.ts","../src/auth/cli.ts","../package.json","../src/mcp/clientFactory.ts","../src/mcp/response.ts","../src/assertions/validators/utils.ts","../src/assertions/validators/response.ts","../src/assertions/validators/schema.ts","../src/assertions/validators/text.ts","../src/assertions/validators/pattern.ts","../src/assertions/validators/error.ts","../src/assertions/validators/size.ts","../src/assertions/validators/toolCalls.ts","../src/judge/rubrics.ts","../src/judge/judgeTypes.ts","../src/judge/anthropicJudge.ts","../src/judge/vertexAnthropicJudge.ts","../src/judge/claudeAgentJudge.ts","../src/judge/openaiJudge.ts","../src/judge/googleJudge.ts","../src/judge/judgeClient.ts","../src/judge/judgeRegistry.ts","../src/assertions/validators/judge.ts","../src/assertions/validators/types.ts","../src/mcp/fixtures/mcpFixture.ts","../src/assertions/matchers/toMatchToolResponse.ts","../src/assertions/matchers/toMatchToolSchema.ts","../src/assertions/matchers/toContainToolText.ts","../src/assertions/matchers/toMatchToolPattern.ts","../src/assertions/matchers/toMatchToolSnapshot.ts","../src/assertions/matchers/toBeToolError.ts","../src/assertions/matchers/toPassToolJudge.ts","../src/assertions/matchers/toHaveToolResponseSize.ts","../src/assertions/matchers/toSatisfyToolPredicate.ts","../src/assertions/matchers/toHaveToolCalls.ts","../src/assertions/matchers/toHaveToolCallCount.ts","../src/assertions/matchers/index.ts","../src/fixtures/mcp.ts","../src/fixtures/mcpAuth.ts","../src/evals/datasetTypes.ts","../src/evals/datasetLoader.ts","../src/evals/mcpHost/adapters/vercel.ts","../src/evals/mcpHost/adapters/cli/parsers.ts","../src/evals/mcpHost/adapters/cli/runner.ts","../src/evals/mcpHost/mcpHostSimulation.ts","../src/evals/baseline.ts","../src/utils/execFileNoThrow.ts","../src/evals/evalRunner.ts","../src/evals/serverComparison.ts","../src/spec/conformanceChecks.ts"],"names":["path","marker","symbol","_a","_b","name","init_dist","tool","resolve","getErrorMessage","mediaType","jsonSchema","ZodFirstPartyTypeKind","types","x","base","standardSchema","zodSchema","TypeValidationError","InvalidArgumentError","getOriginalFetch","fetch","APICallError","schema","loadOAuthState","createDebug","oauth2","fs2","debug","DEFAULT_TIMEOUT_MS","UndiciAgent","extractText","truncateForDisplay","z","buildJudgePrompt","parseJudgeResponse","baseExpect","test","readFile","result","mkdir","dirname","writeFile","z2","pass"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,2BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,cAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAoVA,eAAsB,eACpB,WAAA,EACkC;AAClC,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAS,EAAA,CAAA,QAAA,CAAS,WAAA,EAAa,OAAO,CAAA;AACtD,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAuBA,eAAsB,cAAA,CACpB,aACA,KAAA,EACe;AACf,EAAA,KAAA,CAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AAGzB,EAAA,MAAM,GAAA,GAAWA,cAAQ,WAAW,CAAA;AACpC,EAAA,MAAS,SAAM,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAEpD,EAAA,MAAS,aAAU,WAAA,EAAa,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,IAC9D,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AArYA,IAiEa;AAjEb,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAiEO,IAAM,gCAAN,MAAmE;AAAA,MACvD,MAAA;AAAA,MACT,WAAA,GAAuC,IAAA;AAAA,MACvC,UAAA,GAA4B,IAAA;AAAA,MAEpC,YAAY,MAAA,EAA6C;AACvD,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAA,GAAsB;AACxB,QAAA,OAAO,KAAK,MAAA,CAAO,WAAA;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,cAAA,GAAsC;AACxC,QAAA,OAAO;AAAA,UACL,aAAA,EAAe,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAAA,UACvC,0BAAA,EAA4B,IAAA,CAAK,MAAA,CAAO,YAAA,GACpC,qBAAA,GACA,MAAA;AAAA,UACJ,WAAA,EAAa,CAAC,oBAAA,EAAsB,eAAe,CAAA;AAAA,UACnD,cAAA,EAAgB,CAAC,MAAM,CAAA;AAAA,UACvB,WAAA,EAAa,8BAAA;AAAA,UACb,GAAG,KAAK,MAAA,CAAO;AAAA,SACjB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,GAAgB;AACd,QAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,UAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,oBAAA,CAAqB,EAAE,CAAA;AAAA,QAChD;AACA,QAAA,OAAO,IAAA,CAAK,UAAA;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBAAA,GAAqE;AAEzE,QAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,UAAA,OAAO;AAAA,YACL,SAAA,EAAW,KAAK,MAAA,CAAO,QAAA;AAAA,YACvB,aAAA,EAAe,KAAK,MAAA,CAAO,YAAA;AAAA,YAC3B,aAAA,EAAe,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW;AAAA,WACzC;AAAA,QACF;AAGA,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,QAAA,IAAI,OAAO,UAAA,EAAY;AACrB,UAAA,OAAO;AAAA,YACL,SAAA,EAAW,MAAM,UAAA,CAAW,QAAA;AAAA,YAC5B,aAAA,EAAe,MAAM,UAAA,CAAW,YAAA;AAAA,YAChC,mBAAA,EAAqB,MAAM,UAAA,CAAW,gBAAA;AAAA,YACtC,wBAAA,EAA0B,MAAM,UAAA,CAAW,qBAAA;AAAA,YAC3C,aAAA,EAAe,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW;AAAA,WACzC;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,sBACJ,iBAAA,EACe;AACf,QAAA,MAAM,QAAS,MAAM,IAAA,CAAK,SAAA,EAAU,IAAM,KAAK,gBAAA,EAAiB;AAChE,QAAA,KAAA,CAAM,UAAA,GAAa;AAAA,UACjB,UAAU,iBAAA,CAAkB,SAAA;AAAA,UAC5B,cAAc,iBAAA,CAAkB,aAAA;AAAA,UAChC,kBAAkB,iBAAA,CAAkB,mBAAA;AAAA,UACpC,uBAAuB,iBAAA,CAAkB;AAAA,SAC3C;AACA,QAAA,MAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAA,GAA2C;AAC/C,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,OAAO;AAAA,YACL,YAAA,EAAc,MAAM,MAAA,CAAO,WAAA;AAAA,YAC3B,UAAA,EAAY,MAAM,MAAA,CAAO,SAAA;AAAA,YACzB,aAAA,EAAe,MAAM,MAAA,CAAO,YAAA;AAAA,YAC5B,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,SAAA,GACrB,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,IAAK,GAAI,CAAA,GACvD;AAAA,WACN;AAAA,QACF;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,WAAW,MAAA,EAAoC;AACnD,QAAA,MAAM,QAAS,MAAM,IAAA,CAAK,SAAA,EAAU,IAAM,KAAK,gBAAA,EAAiB;AAChE,QAAA,KAAA,CAAM,MAAA,GAAS;AAAA,UACb,aAAa,MAAA,CAAO,YAAA;AAAA,UACpB,WAAW,MAAA,CAAO,UAAA;AAAA,UAClB,cAAc,MAAA,CAAO,aAAA;AAAA,UACrB,SAAA,EAAW,OAAO,UAAA,GACd,IAAA,CAAK,KAAI,GAAI,MAAA,CAAO,aAAa,GAAA,GACjC;AAAA,SACN;AAEA,QAAA,OAAO,KAAA,CAAM,YAAA;AACb,QAAA,MAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,wBAAwB,gBAAA,EAAsC;AAGlE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,2CAAA,EAA8C,gBAAA,CAAiB,QAAA,EAAU;AAAA,6HAAA;AAAA,SAG3E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBAAiB,YAAA,EAAqC;AAC1D,QAAA,MAAM,QAAS,MAAM,IAAA,CAAK,SAAA,EAAU,IAAM,KAAK,gBAAA,EAAiB;AAChE,QAAA,KAAA,CAAM,YAAA,GAAe,YAAA;AACrB,QAAA,MAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAA,GAAgC;AACpC,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,QAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,UAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,QACxD;AACA,QAAA,OAAO,KAAA,CAAM,YAAA;AAAA,MACf;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,sBACJ,KAAA,EACe;AACf,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA;AAAA,QACF;AAEA,QAAA,QAAQ,KAAA;AAAO,UACb,KAAK,KAAA;AACH,YAAA,MAAM,KAAK,WAAA,EAAY;AACvB,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,OAAO,KAAA,CAAM,UAAA;AACb,YAAA,MAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAC1B,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,OAAO,KAAA,CAAM,MAAA;AACb,YAAA,MAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAC1B,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,OAAO,KAAA,CAAM,YAAA;AACb,YAAA,MAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAC1B,YAAA;AAAA;AACJ,MACF;AAAA;AAAA,MAIA,MAAc,SAAA,GAA8C;AAC1D,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,OAAO,IAAA,CAAK,WAAA;AAAA,QACd;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,MAAS,EAAA,CAAA,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,aAAa,OAAO,CAAA;AAClE,UAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACrC,UAAA,OAAO,IAAA,CAAK,WAAA;AAAA,QACd,SAAS,KAAA,EAAO;AACd,UAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAc,UAAU,KAAA,EAAwC;AAC9D,QAAA,KAAA,CAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,QAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAGnB,QAAA,MAAM,GAAA,GAAWA,KAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAChD,QAAA,MAAS,SAAM,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAEpD,QAAA,MAAS,EAAA,CAAA,SAAA;AAAA,UACP,KAAK,MAAA,CAAO,WAAA;AAAA,UACZ,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,UAC7B,EAAE,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,GAAA;AAAM,SACnC;AAAA,MACF;AAAA,MAEA,MAAc,WAAA,GAA6B;AACzC,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,QAAA,IAAI;AACF,UAAA,MAAS,EAAA,CAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAAA,QACzC,SAAS,KAAA,EAAO;AACd,UAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,gBAAA,GAAqC;AAC3C,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAK,GAAA;AAAI,SACpB;AAAA,MACF;AAAA,MAEQ,qBAAqB,MAAA,EAAwB;AACnD,QAAA,MAAM,KAAA,GACJ,gEAAA;AACF,QAAA,IAAI,MAAA,GAAS,EAAA;AACb,QAAA,MAAM,YAAA,GAAe,IAAI,UAAA,CAAW,MAAM,CAAA;AAC1C,QAAA,MAAA,CAAO,gBAAgB,YAAY,CAAA;AACnC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,UAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA;AACvC,UAAA,MAAA,IAAU,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,MAAM,CAAA;AAAA,QAC5C;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChUO,SAAS,gBAAgB,KAAA,EAA4B;AAC1D,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,eAAA;AACT,EAAA;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AACT,EAAA;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA;AACf,EAAA;AAEA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;ACVM,IAAA,MAAA,CAAA,CACA,QALN,EAAA,CAAA,CAAA,EAAA,CAAA,CAWa,UAAA,CAAA,CCTP,IAAA,CAAA,CACAC,SACAC,OAAAA,CAAAA,CAJNC,GAAAA,CAAAA,CAAAC,GAAAA,CAAAA,CAMa,YAAA,CAAA,CCJPC,OACAJ,OAAAA,CAAAA,CACAC,OAAAA,CAAAA,CAJNC,KAAAC,GAAAA,CAAAA,CAMa,sBAAA,CAAA,CCJPC,OACAJ,OAAAA,CAAAA,CACAC,OAAAA,CAAAA,CAJNC,GAAAA,CAAAA,CAAAC,GAAAA,CAAAA,CASa,sBCNPC,OACAJ,OAAAA,CAAAA,CACAC,OAAAA,CAAAA,CALNC,KAAAC,GAAAA,CAAAA,CAOa,cAAA,CAAA,CCLPC,KAAAA,CAAAA,CACAJ,OAAAA,CAAAA,CACAC,SAJNC,GAAAA,CAAAA,CAAAC,GAAAA,CAAAA,CAMa,eAAA,CAAA,CCJPC,KAAAA,CAAAA,CACAJ,SACAC,OAAAA,CAAAA,CAJNC,GAAAA,CAAAA,CAAAC,GAAAA,CAAAA,CAMa,gBAAA,CAAA,CCHPC,MAAAA,CAAAA,CACAJ,QAAAA,CAAAA,CACAC,QAAAA,CAAAA,CALNC,MAAAC,IAAAA,CAAAA,CAwBa,mBAAA;;;APpBb,IAAM,MAAA,GAAS,iBAAA;AACf,IAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAMzB,IAAM,aAAN,MAAM,WAAA,UAAmB,KAAA,KAAA,EACZ,EAAA,GAAA,QADY,EAAA,EAAM;;;;;;;;;MAgBpC,WAAA,CAAY;QACV,IAAA,EAAAC,OAAAA;AACA,QAAA,OAAA;AACA,QAAA;OACF,EAIG;AACD,QAAA,KAAA,CAAM,OAAO,CAAA;AAxBf,QAAA,IAAA,CAAkB,EAAA,CAAA,GAAU,IAAA;AA0B1B,QAAA,IAAA,CAAK,IAAA,GAAOA,OAAAA;AACZ,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACf,MAAA;;;;;;AAOA,MAAA,OAAO,WAAW,KAAA,EAAqC;AACrD,QAAA,OAAO,WAAA,CAAW,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAC3C,MAAA;MAEA,OAAiB,SAAA,CAAU,OAAgBJ,SAAAA,EAAyB;AAClE,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAIA,SAAM,CAAA;AACtC,QAAA,OACE,KAAA,IAAS,IAAA,IACT,OAAO,KAAA,KAAU,YACjB,YAAA,IAAgB,KAAA,IAChB,OAAO,KAAA,CAAM,YAAY,CAAA,KAAM,SAAA,IAC/B,KAAA,CAAM,YAAY,CAAA,KAAM,IAAA;AAE5B,MAAA;AACF,KAAA;AC3DA,IAAM,IAAA,GAAO,iBAAA;AACb,IAAMA,OAAAA,GAAS,mBAAmB,IAAI,CAAA,CAAA;AACtC,IAAMC,OAAAA,GAAS,MAAA,CAAO,GAAA,CAAID,OAAM,CAAA;AAEzB,IAAM,eAAN,eAA2BG,GAAAA,GAAA,UAAA,EACdD,GAAAA,GAAAD,SADcE,GAAAA,EAAW;MAa3C,WAAA,CAAY;AACV,QAAA,OAAA;AACA,QAAA,GAAA;AACA,QAAA,iBAAA;AACA,QAAA,UAAA;AACA,QAAA,eAAA;AACA,QAAA,YAAA;AACA,QAAA,KAAA;QACA,WAAA,GAAc,UAAA,IAAc,SACzB,UAAA,KAAe,GAAA;QACd,UAAA,KAAe,GAAA;QACf,UAAA,KAAe,GAAA;QACf,UAAA,IAAc,GAAA,CAAA;;AAClB,QAAA;OACF,EAUG;AACD,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AArChC,QAAA,IAAA,CAAkBD,GAAAA,CAAAA,GAAU,IAAA;AAuC1B,QAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,QAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AACzB,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,QAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,QAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,QAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACd,MAAA;AAEA,MAAA,OAAO,WAAW,KAAA,EAAuC;AACvD,QAAA,OAAO,UAAA,CAAW,SAAA,CAAU,KAAA,EAAOF,OAAM,CAAA;AAC3C,MAAA;AACF,KAAA;ACxDA,IAAMI,KAAAA,GAAO,2BAAA;AACb,IAAMJ,OAAAA,GAAS,mBAAmBI,KAAI,CAAA,CAAA;AACtC,IAAMH,OAAAA,GAAS,MAAA,CAAO,GAAA,CAAID,OAAM,CAAA;AAEzB,IAAM,yBAAN,eAAqCG,GAAAA,GAAA,UAAA,EACxBD,GAAAA,GAAAD,SADwBE,GAAAA,EAAW;;AAGrD,MAAA,WAAA,CAAY,EAAE,OAAA,GAAU,qBAAA,EAAsB,GAA0B,EAAC,EAAG;AAC1E,QAAA,KAAA,CAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,OAAA,EAAS,CAAA;AAHzB,QAAA,IAAA,CAAkBF,GAAAA,CAAAA,GAAU,IAAA;AAI5B,MAAA;AAEA,MAAA,OAAO,WAAW,KAAA,EAAiD;AACjE,QAAA,OAAO,UAAA,CAAW,SAAA,CAAU,KAAA,EAAOF,OAAM,CAAA;AAC3C,MAAA;AACF,KAAA;ACdA,IAAMI,KAAAA,GAAO,yBAAA;AACb,IAAMJ,OAAAA,GAAS,mBAAmBI,KAAI,CAAA,CAAA;AACtC,IAAMH,OAAAA,GAAS,MAAA,CAAO,GAAA,CAAID,OAAM,CAAA;AAKzB,IAAM,uBAAN,eAAmCG,GAAAA,GAAA,UAAA,EACtBD,GAAAA,GAAAD,SADsBE,GAAAA,EAAW;MAKnD,WAAA,CAAY;AACV,QAAA,OAAA;AACA,QAAA,KAAA;AACA,QAAA;OACF,EAIG;AACD,QAAA,KAAA,CAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAbhC,QAAA,IAAA,CAAkBF,GAAAA,CAAAA,GAAU,IAAA;AAe1B,QAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAClB,MAAA;AAEA,MAAA,OAAO,WAAW,KAAA,EAA+C;AAC/D,QAAA,OAAO,UAAA,CAAW,SAAA,CAAU,KAAA,EAAOF,OAAM,CAAA;AAC3C,MAAA;AACF,KAAA;AC5BA,IAAMI,KAAAA,GAAO,mBAAA;AACb,IAAMJ,OAAAA,GAAS,mBAAmBI,KAAI,CAAA,CAAA;AACtC,IAAMH,OAAAA,GAAS,MAAA,CAAO,GAAA,CAAID,OAAM,CAAA;AAEzB,IAAM,iBAAN,eAA6BG,GAAAA,GAAA,UAAA,EAChBD,GAAAA,GAAAD,SADgBE,GAAAA,EAAW;MAK7C,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,EAAM,EAAqC;AAC7D,QAAA,KAAA,CAAM;UACJ,IAAA,EAAAC,KAAAA;AACA,UAAA,OAAA,EACE,8BACS,IAAI,CAAA;AACK,eAAA,EAAA,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAA;AAC1C,UAAA;SACD,CAAA;AAZH,QAAA,IAAA,CAAkBF,GAAAA,CAAAA,GAAU,IAAA;AAc1B,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACd,MAAA;AAEA,MAAA,OAAO,WAAW,KAAA,EAAyC;AACzD,QAAA,OAAO,UAAA,CAAW,SAAA,CAAU,KAAA,EAAOF,OAAM,CAAA;AAC3C,MAAA;AACF,KAAA;AC1BA,IAAMI,KAAAA,GAAO,oBAAA;AACb,IAAMJ,OAAAA,GAAS,mBAAmBI,KAAI,CAAA,CAAA;AACtC,IAAMH,OAAAA,GAAS,MAAA,CAAO,GAAA,CAAID,OAAM,CAAA;AAEzB,IAAM,kBAAN,eAA8BG,GAAAA,GAAA,UAAA,EACjBD,GAAAA,GAAAD,SADiBE,GAAAA,EAAW;;MAG9C,WAAA,CAAY,EAAE,SAAQ,EAAwB;AAC5C,QAAA,KAAA,CAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,OAAA,EAAS,CAAA;AAHzB,QAAA,IAAA,CAAkBF,GAAAA,CAAAA,GAAU,IAAA;AAI5B,MAAA;AAEA,MAAA,OAAO,WAAW,KAAA,EAA0C;AAC1D,QAAA,OAAO,UAAA,CAAW,SAAA,CAAU,KAAA,EAAOF,OAAM,CAAA;AAC3C,MAAA;AACF,KAAA;ACdA,IAAMI,KAAAA,GAAO,qBAAA;AACb,IAAMJ,OAAAA,GAAS,mBAAmBI,KAAI,CAAA,CAAA;AACtC,IAAMH,OAAAA,GAAS,MAAA,CAAO,GAAA,CAAID,OAAM,CAAA;AAEzB,IAAM,mBAAN,eAA+BG,GAAAA,GAAA,UAAA,EAClBD,GAAAA,GAAAD,SADkBE,GAAAA,EAAW;;MAG/C,WAAA,CAAY,EAAE,SAAQ,EAAwB;AAC5C,QAAA,KAAA,CAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,OAAA,EAAS,CAAA;AAHzB,QAAA,IAAA,CAAkBF,GAAAA,CAAAA,GAAU,IAAA;AAI5B,MAAA;AAEA,MAAA,OAAO,WAAW,KAAA,EAA2C;AAC3D,QAAA,OAAO,UAAA,CAAW,SAAA,CAAU,KAAA,EAAOF,OAAM,CAAA;AAC3C,MAAA;AACF,KAAA;ACbA,IAAMI,MAAAA,GAAO,wBAAA;AACb,IAAMJ,QAAAA,GAAS,mBAAmBI,MAAI,CAAA,CAAA;AACtC,IAAMH,QAAAA,GAAS,MAAA,CAAO,GAAA,CAAID,QAAM,CAAA;AAmBzB,IAAM,sBAAN,MAAM,oBAAA,UAA4BG,OAAA,UAAA,EACrBD,IAAAA,GAAAD,UADqBE,IAAAA,EAAW;MAMlD,WAAA,CAAY;AACV,QAAA,KAAA;AACA,QAAA,KAAA;AACA,QAAA;OACF,EAIG;AACD,QAAA,IAAI,aAAA,GAAgB,wBAAA;AAEpB,QAAA,IAAI,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,KAAA,EAAO;AAClB,UAAA,aAAA,IAAiB,CAAA,KAAA,EAAQ,QAAQ,KAAK,CAAA,CAAA;AACxC,QAAA;AAEA,QAAA,IAAA,CAAI,OAAA,IAAA,OAAA,MAAA,GAAA,OAAA,CAAS,gBAAc,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,QAAA,CAAA,EAAU;AAC5C,UAAA,aAAA,IAAiB,IAAA;AACjB,UAAA,MAAM,QAAkB,EAAC;AACzB,UAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,YAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,UAAU,CAAA;AAC/B,UAAA;AACA,UAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA,CAAA,CAAG,CAAA;AACxC,UAAA;AACA,UAAA,aAAA,IAAiB,KAAA,CAAM,KAAK,IAAI,CAAA;AAChC,UAAA,aAAA,IAAiB,GAAA;AACnB,QAAA;AAEA,QAAA,KAAA,CAAM;UACJ,IAAA,EAAAC,MAAAA;AACA,UAAA,OAAA,EACE,GAAG,aAAa,CAAA,SAAA,EACN,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACb,eAAA,EAAA,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAA;AAC1C,UAAA;SACD,CAAA;AAxCH,QAAA,IAAA,CAAkBF,IAAAA,CAAAA,GAAU,IAAA;AA0C1B,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACjB,MAAA;AAEA,MAAA,OAAO,WAAW,KAAA,EAA8C;AAC9D,QAAA,OAAO,UAAA,CAAW,SAAA,CAAU,KAAA,EAAOF,QAAM,CAAA;AAC3C,MAAA;;;;;;;;;;;;AAaA,MAAA,OAAO,IAAA,CAAK;AACV,QAAA,KAAA;AACA,QAAA,KAAA;AACA,QAAA;OACF,EAIwB;AA9F1B,QAAA,IAAAE,OAAAC,KAAAA,EAAA,EAAA;AA+FI,QAAA,IACE,qBAAoB,UAAA,CAAW,KAAK,KACpC,KAAA,CAAM,KAAA,KAAU,WAChBD,KAAAA,GAAA,KAAA,CAAM,YAAN,IAAA,GAAA,MAAA,GAAAA,MAAe,KAAA,OAAU,OAAA,IAAA,OAAA,MAAA,GAAA,OAAA,CAAS,YAClCC,KAAAA,GAAA,KAAA,CAAM,OAAA,KAAN,IAAA,GAAA,SAAAA,KAAAA,CAAe,UAAA,OAAe,WAAA,IAAA,GAAA,MAAA,GAAA,QAAS,UAAA,CAAA,IAAA,CAAA,CACvC,EAAA,GAAA,MAAM,OAAA,KAAN,IAAA,GAAA,SAAA,EAAA,CAAe,QAAA,OAAa,WAAA,IAAA,GAAA,MAAA,GAAA,QAAS,QAAA,CAAA,EACrC;AACA,UAAA,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,OAAO,IAAI,oBAAA,CAAoB,EAAE,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AAC1D,MAAA;AACF,KAAA;;;;;ACnGA,SAAS,KAAK,IAAA,EAAe;AAE7B;AAcO,SAAS,aAAa,SAAA,EAA+C;AAC1E,EAAA,IAAI,OAAO,SAAA,IAAc,UAAA;AACvB,IAAA,MAAM,IAAI,SAAA;AACR,MAAA;AAAA,KAAA;AAIJ,EAAA,MAAM,EAAC,UAAU,IAAA,EAAM,OAAA,GAAU,MAAM,OAAA,GAAU,IAAA,EAAM,WAAA,GAAa,SAAA;AAEpE,EAAA,IAAI,iBAAiB,EAAA,EAEjB,YAAA,GAAe,MACf,EAAA,EACA,IAAA,GAAO,IACP,SAAA,GAAY,EAAA;AAEhB,EAAA,SAAS,KAAK,QAAA,EAAkB;AAE9B,IAAA,MAAM,QAAQ,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,GAAI,QAAA,EAI/D,CAAC,QAAA,EAAU,UAAU,CAAA,GAAI,UAAA,CAAW,GAAG,cAAc,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAErE,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAA;AACjB,MAAA,SAAA,CAAU,IAAI,CAAA;AAGhB,IAAA,cAAA,GAAiB,YACjB,YAAA,GAAe,KAAA;AACjB,EAAA;AAEA,EAAA,SAAS,UAAU,IAAA,EAAc;AAE/B,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,aAAA,EAAA;AACA,MAAA;AACF,IAAA;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACpB,MAAA,SAAA,IACF,SAAA,CAAU,KAAK,KAAA,CAAM,IAAA,CAAK,WAAW,IAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAErD,MAAA;AACF,IAAA;AAGA,IAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC5C,IAAA,IAAI,wBAAwB,EAAA,EAAI;AAG9B,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,mBAAmB,CAAA,EAKzC,SAAS,IAAA,CAAK,mBAAA,GAAsB,CAAC,CAAA,KAAM,MAAM,CAAA,GAAI,CAAA,EACrD,QAAQ,IAAA,CAAK,KAAA,CAAM,sBAAsB,MAAM,CAAA;AAErD,MAAA,YAAA,CAAa,KAAA,EAAO,OAAO,IAAI,CAAA;AAC/B,MAAA;AACF,IAAA;AAMA,IAAA,YAAA,CAAa,IAAA,EAAM,IAAI,IAAI,CAAA;AAC7B,EAAA;AAEA,EAAA,SAAS,YAAA,CAAa,KAAA,EAAe,KAAA,EAAe,IAAA,EAAc;AAEhE,IAAA,QAAQ,KAAA;MACN,KAAK,OAAA;AAEH,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;MACF,KAAK,MAAA;AAGH,QAAA,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAG,KAAK;;AACtB,QAAA;MACF,KAAK,IAAA;AAGH,QAAA,EAAA,GAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,GAAI,MAAA,GAAY,KAAA;AACxC,QAAA;MACF,KAAK,OAAA;AAIC,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,GACpB,OAAA,CAAQ,SAAS,KAAA,EAAO,EAAE,CAAC,CAAA,GAE3B,OAAA;UACE,IAAI,UAAA,CAAW,CAAA,0BAAA,EAA6B,KAAK,CAAA,CAAA,CAAA,EAAK;YACpD,IAAA,EAAM,eAAA;AACN,YAAA,KAAA;AACA,YAAA;WACD;AAAA,SAAA;AAGL,QAAA;AACF,MAAA;AAEE,QAAA,OAAA;UACE,IAAI,UAAA;YACF,CAAA,eAAA,EAAkB,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,CAAC,CAAA,MAAA,CAAA,GAAM,KAAK,CAAA,CAAA,CAAA;AACtE,YAAA,EAAC,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,KAAA,EAAO,IAAA;AAAI;AAC5C,SAAA;AAEF,QAAA;AAAA;AAEN,EAAA;AAEA,EAAA,SAAS,aAAA,GAAgB;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,KAEnC,OAAA,CAAQ;AACN,MAAA,EAAA;AACA,MAAA,KAAA,EAAO,SAAA,IAAa,MAAA;;;AAGpB,MAAA,IAAA,EAAM,KAAK,QAAA,CAAS;AAAI,CAAA,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,KACjD,CAAA,EAIH,EAAA,GAAK,MAAA,EACL,IAAA,GAAO,IACP,SAAA,GAAY,EAAA;AACd,EAAA;AAEA,EAAA,SAAS,KAAA,CAAM,OAAA,GAA+B,EAAA,EAAI;AAC5C,IAAA,cAAA,IAAkB,OAAA,CAAQ,OAAA,IAC5B,SAAA,CAAU,cAAc,CAAA,EAG1B,YAAA,GAAe,IAAA,EACf,EAAA,GAAK,MAAA,EACL,IAAA,GAAO,EAAA,EACP,SAAA,GAAY,IACZ,cAAA,GAAiB,EAAA;AACnB,EAAA;AAEA,EAAA,OAAO,EAAC,MAAM,KAAA,EAAA;AAChB;AASA,SAAS,WAAW,KAAA,EAA8D;AAOhF,EAAA,MAAM,QAAuB,EAAA;AAC7B,EAAA,IAAI,cAAA,GAAiB,IACjB,WAAA,GAAc,CAAA;AAElB,EAAA,OAAO,WAAA,GAAc,MAAM,MAAA,IAAQ;AAEjC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAA,EACzC,OAAA,GAAU,MAAM,OAAA,CAAQ;GAAM,WAAW,CAAA;AAG/C,IAAA,IAAI,OAAA,GAAU,EAAA;AAiBd,IAAA,IAhBI,OAAA,KAAY,EAAA,IAAM,OAAA,KAAY,EAAA,GAEhC,OAAA,GAAU,KAAK,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA,GAC1B,OAAA,KAAY,EAAA,GAGjB,YAAY,KAAA,CAAM,MAAA,GAAS,CAAA,GAC7B,OAAA,GAAU,EAAA,GAEV,OAAA,GAAU,OAAA,GAEH,OAAA,KAAY,EAAA,KACrB,OAAA,GAAU,OAAA,CAAA,EAIR,OAAA,KAAY,EAAA,EAAI;AAElB,MAAA,cAAA,GAAiB,KAAA,CAAM,MAAM,WAAW,CAAA;AACxC,MAAA;IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,WAAA,EAAa,OAAO,CAAA;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAGf,WAAA,GAAc,OAAA,GAAU,CAAA,EACpB,KAAA,CAAM,WAAA,GAAc,CAAC,CAAA,KAAM,IAAA,IAAQ,KAAA,CAAM,WAAW,CAAA,KAAM;AAC5D,CAAA,IAAA,WAAA,EAAA;AAEJ,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,CAAC,OAAO,cAAc,CAAA;AAC/B;AC5NO,IAAM,UAAA;AAAN,IAAAE,UAAAA,GAAA,KAAA,CAAA;;AAAM,IAAA,UAAA,GAAN,cAAyB,KAAA,CAAM;AAqBpC,MAAA,WAAA,CACE,SACA,OAAA,EACA;AACA,QAAA,KAAA,CAAM,OAAO,CAAA,EACb,IAAA,CAAK,OAAO,YAAA,EACZ,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA,EACpB,KAAK,KAAA,GAAQ,OAAA,CAAQ,OACrB,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,EACrB,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACtB,MAAA;AACF,KAAA;;;;;ACaa,IAAA,uBAAA;;;;AAAN,IAAM,uBAAA,GAAN,cAAsC,eAAA,CAA4C;AACvF,MAAA,WAAA,CAAY,EAAC,OAAA,EAAS,OAAA,EAAS,SAAA,EAAA,GAA4B,EAAA,EAAI;AAC7D,QAAA,IAAI,MAAA;AAEJ,QAAA,KAAA,CAAM;AACJ,UAAA,KAAA,CAAM,UAAA,EAAY;AAChB,YAAA,MAAA,GAAS,YAAA,CAAa;AACpB,cAAA,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,gBAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAC1B,cAAA,CAAA;AACA,cAAA,OAAA,CAAQ,KAAA,EAAO;AACT,gBAAA,OAAA,KAAY,WAAA,GACd,WAAW,KAAA,CAAM,KAAK,IACb,OAAO,OAAA,IAAY,UAAA,IAC5B,OAAA,CAAQ,KAAK,CAAA;AAIjB,cAAA,CAAA;AACA,cAAA,OAAA;AACA,cAAA;aACD,CAAA;AACH,UAAA,CAAA;AACA,UAAA,SAAA,CAAU,KAAA,EAAO;AACf,YAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACnB,UAAA;SACD,CAAA;AACH,MAAA;AACF,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpFO,SAAS,kBACX,OAAA,EACiC;AACpC,EAAA,OAAO,OAAA,CAAQ,MAAA;AACb,IAAA,CAAC,iBAAiB,cAAA,MAAoB;MACpC,GAAG,eAAA;MACH,GAAI,cAAA,IAAA,IAAA,GAAA,cAAA,GAAkB;AACxB,KAAA,CAAA;IACA;AACF,GAAA;AACF;ACHO,SAAS,qCACd,QAAA,EACmB;AACnB,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,OAAO,IAAI,cAAA,CAAkB;;;;;;;AAO3B,IAAA,MAAM,KAAK,UAAA,EAAY;AACrB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAM,SAAS,IAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,UAAA,CAAW,KAAA,EAAM;QACnB,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAC1B,QAAA;AACF,MAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,QAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AACxB,MAAA;AACF,IAAA,CAAA;;;;AAIA,IAAA,MAAM,OAAO,MAAA,EAAkB;AAC7B,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,CAAS,OAAO,MAAM,CAAA;AAC9B,QAAA,CAAA,CAAA,OAAQ,CAAA,EAAA;AAER,QAAA;AACF,MAAA;AACF,IAAA;GACD,CAAA;AACH;ACdO,SAAS,qBAAA,CAAsB;AACpC,EAAA,KAAA,GAAQ,EAAC;AACT,EAAA;AACF,CAAA,EAYoB;AAClB,EAAA,MAAM,mCAA2D,EAAC;AAClE,EAAA,MAAM,mCAA2D,EAAC;AAElE,EAAA,KAAA,MAAWC,SAAQ,KAAA,EAAO;AACxB,IAAA,IAAIA,KAAAA,CAAK,IAAA,KAAS,UAAA,IAAcA,KAAAA,CAAK,MAAM,iBAAA,EAAmB;AAC5D,MAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkBA,KAAAA,CAAK,EAAE,CAAA;AAClD,MAAA,gCAAA,CAAiCA,KAAAA,CAAK,IAAI,CAAA,GAAI,gBAAA;AAC9C,MAAA,gCAAA,CAAiC,gBAAgB,IAAIA,KAAAA,CAAK,IAAA;AAC5D,IAAA;AACF,EAAA;AAEA,EAAA,OAAO;AACL,IAAA,kBAAA,EAAoB,CAAC,cAAA,KAAwB;AA5DjD,MAAA,IAAAJ,IAAAA;AA6DM,MAAA,OAAA,CAAAA,IAAAA,GAAA,gCAAA,CAAiC,cAAc,CAAA,KAA/C,OAAAA,IAAAA,GAAoD,cAAA;AAAA,IAAA,CAAA;AACtD,IAAA,gBAAA,EAAkB,CAAC,gBAAA,KAA0B;AA9DjD,MAAA,IAAAA,IAAAA;AA+DM,MAAA,OAAA,CAAAA,IAAAA,GAAA,gCAAA,CAAiC,gBAAgB,CAAA,KAAjD,OAAAA,IAAAA,GAAsD,gBAAA;AAAA,IAAA;AAC1D,GAAA;AACF;AC1DA,eAAsB,KAAA,CACpB,WACA,OAAA,EAGe;AACf,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,OAAO,QAAQ,OAAA,EAAQ;AACzB,EAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,WAAA;AAExB,EAAA,OAAO,IAAI,OAAA,CAAc,CAACK,QAAAA,EAAS,MAAA,KAAW;AAC5C,IAAA,IAAI,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,OAAA,EAAS;AACnB,MAAA,MAAA,CAAO,kBAAkB,CAAA;AACzB,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,MAAA,OAAA,EAAQ;AACRA,MAAAA,QAAAA,EAAQ;AACV,IAAA,CAAA,EAAG,SAAS,CAAA;AAEZ,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,mBAAA,CAAoB,SAAS,OAAA,CAAA;AACvC,IAAA,CAAA;AAEA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,kBAAkB,CAAA;AAC3B,IAAA,CAAA;AAEA,IAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,gBAAA,CAAiB,SAAS,OAAA,CAAA;EACpC,CAAC,CAAA;AACH;AAEA,SAAS,gBAAA,GAAiC;AACxC,EAAA,OAAO,IAAI,YAAA,CAAa,mBAAA,EAAqB,YAAY,CAAA;AAC3D;ACxCO,SAAS,uBAAuB,QAAA,EAAoB;AACzD,EAAA,OAAO,OAAO,WAAA,CAAoB,CAAC,GAAG,QAAA,CAAS,OAAO,CAAC,CAAA;AACzD;ACHO,SAAS,0BAA0B,YAAA,EAAsB;AAC9D,EAAA,MAAM,SAAA,GAAY,aAAa,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AACnE,EAAA,MAAM,YAAA,GAAe,KAAK,SAAS,CAAA;AACnC,EAAA,OAAO,UAAA,CAAW,KAAK,YAAA,EAAc,CAAA,SAAQ,IAAA,CAAK,WAAA,CAAY,CAAC,CAAE,CAAA;AACnE;AAEO,SAAS,0BAA0B,KAAA,EAA2B;AACnE,EAAA,IAAI,YAAA,GAAe,EAAA;AAInB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,YAAA,IAAgB,MAAA,CAAO,aAAA,CAAc,KAAA,CAAM,CAAC,CAAC,CAAA;AAC/C,EAAA;AAEA,EAAA,OAAO,KAAK,YAAY,CAAA;AAC1B;AAEO,SAAS,gBAAgB,KAAA,EAAoC;AAClE,EAAA,OAAO,KAAA,YAAiB,UAAA,GAAa,yBAAA,CAA0B,KAAK,CAAA,GAAI,KAAA;AAC1E;ACfO,SAAS,+BAA+B,IAAA,EAAgC;AAC7E,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO,OAAO,IAAA,CAAK,GAAA;AAErC,EAAA,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,QAAA,EAC3B,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GACjB,IAAA,CAAK,IAAA,GACL,yBAAA,CAA0B,IAAA,CAAK,IAAI,CACzC,CAAA,CAAA;AACF;ACaO,SAAS,iBAAA,CACd,KAAA,EACA,OAAA,GAA0C,EAAC,EACjC;AACV,EAAA,MAAM,EAAE,gBAAA,GAAmB,IAAA,EAAK,GAAI,OAAA;AACpC,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAE9B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,KAAA,CAAM,CAAC,CAAkB,CAAA;AAC9C,QAAA;AACF,MAAA;AAEA,MAAA,MAAM,QAAA,GAAW,gBAAA,GAAmB,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA,GAAO,GAAA;AACjD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,QAAA,CAAS,MAAA,CAAO,UAAU,IAAqB,CAAA;AACjD,MAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAsB,CAAA;AAC7C,EAAA;AAEA,EAAA,OAAO,QAAA;AACT;AChCA,eAAsB,yBAAA,CAA0B;AAC9C,EAAA,QAAA;AACA,EAAA,GAAA;EACA,QAAA,GAAW;AACb,CAAA,EAIwB;AAEtB,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAC3D,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,EAAe,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,CAAM,MAAM,CAAA,IAAK,SAAS,QAAA,EAAU;AACvC,MAAA,MAAM,IAAI,aAAA,CAAc;AACtB,QAAA,GAAA;AACA,QAAA,OAAA,EAAS,CAAA,YAAA,EAAe,GAAG,CAAA,0BAAA,EAA6B,QAAQ,2BAA2B,MAAM,CAAA,EAAA;OAClG,CAAA;AACH,IAAA;AACF,EAAA;AAEA,EAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AAGtB,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,IAAI,WAAW,CAAC,CAAA;AACzB,EAAA;AAEA,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA;AACF,MAAA;AAEA,MAAA,UAAA,IAAc,KAAA,CAAM,MAAA;AAEpB,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,MAAM,IAAI,aAAA,CAAc;AACtB,UAAA,GAAA;UACA,OAAA,EAAS,CAAA,YAAA,EAAe,GAAG,CAAA,0BAAA,EAA6B,QAAQ,CAAA,OAAA;SACjE,CAAA;AACH,MAAA;AAEA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACnB,IAAA;EACF,CAAA,SAAA;AACE,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAA,EAAO;IACtB,CAAA,SAAA;AACE,MAAA,MAAA,CAAO,WAAA,EAAY;AACrB,IAAA;AACF,EAAA;AAGA,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,UAAU,CAAA;AACxC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,IAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAClB,EAAA;AAEA,EAAA,OAAO,MAAA;AACT;AC/EA,eAAsB,YAAA,CACpB,KACA,OAAA,EACe;AApBjB,EAAA,IAAAL,IAAAA,EAAAC,IAAAA;AAqBE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;MAChC,MAAA,EAAQ,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAS;KAClB,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,aAAA,CAAc;AACtB,QAAA,GAAA;AACA,QAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,QAAA,UAAA,EAAY,QAAA,CAAS;OACtB,CAAA;AACH,IAAA;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,yBAAA,CAA0B;AAC3C,MAAA,QAAA;AACA,MAAA,GAAA;AACA,MAAA,QAAA,EAAA,CAAUD,OAAA,OAAA,IAAA,IAAA,GAAA,SAAA,OAAA,CAAS,QAAA,KAAT,OAAAA,IAAAA,GAAqB;KAChC,CAAA;AAED,IAAA,MAAM,WAAA,GAAA,CAAcC,OAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,cAAc,CAAA,KAAnC,OAAAA,IAAAA,GAAwC,KAAA,CAAA;AAC5D,IAAA,OAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,cAAc,EAAE,IAAA,EAAM,WAAA,EAAY,GAAI,KAAA,CAAS,CAAA;AACzE,EAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,IAAA,IAAI,aAAA,CAAc,UAAA,CAAW,KAAK,CAAA,EAAG;AACnC,MAAA,MAAM,KAAA;AACR,IAAA;AAEA,IAAA,MAAM,IAAI,aAAA,CAAc,EAAE,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAC/C,EAAA;AACF;ACjDO,SAASK,iBAAgB,KAAA,EAA4B;AAC1D,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,eAAA;AACT,EAAA;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AACT,EAAA;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA;AACf,EAAA;AAEA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;ACdO,SAAS,aAAa,KAAA,EAAgC;AAC3D,EAAA,OAAA,CACG,KAAA,YAAiB,SAAS,KAAA,YAAiB,YAAA,MAC3C,MAAM,IAAA,KAAS,YAAA,IACd,MAAM,IAAA,KAAS,iBAAA;AACf,EAAA,KAAA,CAAM,IAAA,KAAS,cAAA,CAAA;AAErB;ACQA,SAAS,kBAAkB,KAAA,EAAoD;AAC7E,EAAA,IAAI,EAAE,iBAAiB,KAAA,CAAA,EAAQ;AAC7B,IAAA,OAAO,KAAA;AACT,EAAA;AAEA,EAAA,MAAM,OAAQ,KAAA,CAAc,IAAA;AAC5B,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC9D,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,gBAAA,CAAiB;AAC/B,EAAA,KAAA;AACA,EAAA,GAAA;AACA,EAAA;AACF,CAAA,EAIG;AACD,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,IAAA,OAAO,KAAA;AACT,EAAA;AAGA,EAAA,IACE,KAAA,YAAiB,aACjB,2BAAA,CAA4B,QAAA,CAAS,MAAM,OAAA,CAAQ,WAAA,EAAa,CAAA,EAChE;AACA,IAAA,MAAM,QAAS,KAAA,CAAc,KAAA;AAE7B,IAAA,IAAI,SAAS,IAAA,EAAM;AAEjB,MAAA,OAAO,IAAI,YAAA,CAAa;QACtB,OAAA,EAAS,CAAA,uBAAA,EAA0B,MAAM,OAAO,CAAA,CAAA;AAChD,QAAA,KAAA;AACA,QAAA,GAAA;AACA,QAAA,iBAAA;QACA,WAAA,EAAa;;OACd,CAAA;AACH,IAAA;AACF,EAAA;AAEA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,YAAA,CAAa;MACtB,OAAA,EAAS,CAAA,uBAAA,EAA0B,MAAM,OAAO,CAAA,CAAA;MAChD,KAAA,EAAO,KAAA;AACP,MAAA,GAAA;AACA,MAAA,iBAAA;MACA,WAAA,EAAa;KACd,CAAA;AACH,EAAA;AAEA,EAAA,OAAO,KAAA;AACT;ACvEO,SAAS,8BAAA,CACd,gBAAqB,UAAA,EACb;AAFV,EAAA,IAAAN,MAAAC,IAAAA,EAAA,EAAA;AAIE,EAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,IAAA,OAAO,CAAA,eAAA,CAAA;AACT,EAAA;AAGA,EAAA,IAAA,CAAID,OAAA,aAAA,CAAc,SAAA,KAAd,IAAA,GAAA,MAAA,GAAAA,KAAyB,SAAA,EAAW;AACtC,IAAA,OAAO,CAAA,QAAA,EAAW,aAAA,CAAc,SAAA,CAAU,SAAA,CAAU,aAAa,CAAA,CAAA;AACnE,EAAA;AAGA,EAAA,IAAA,CAAI,EAAA,GAAA,CAAAC,IAAAA,GAAA,aAAA,CAAc,OAAA,KAAd,IAAA,GAAA,MAAA,GAAAA,IAAAA,CAAuB,QAAA,KAAvB,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiC,IAAA,EAAM;AACzC,IAAA,OAAO,mBAAmB,aAAA,CAAc,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AACtE,EAAA;AAEA,EAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,IAAA,OAAO,CAAA,mBAAA,CAAA;AACT,EAAA;AAEA,EAAA,OAAO,iBAAA;AACT;AChBO,SAAS,iBACd,OAAA,EAKwB;AACxB,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,EAAC;AACV,EAAA;AAEA,EAAA,MAAM,aAAqC,EAAC;AAE5C,EAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC9B,MAAA,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,KAAA;IAClC,CAAC,CAAA;EACH,CAAA,MAAO;AACL,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC3B,MAAA,OAAA,GAAU,MAAA,CAAO,QAAQ,OAAO,CAAA;AAClC,IAAA;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,KAAA;AAClC,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,UAAA;AACT;ACzBO,SAAS,mBAAA,CACd,YACG,oBAAA,EACqB;AACxB,EAAA,MAAM,iBAAA,GAAoB,IAAI,OAAA,CAAQ,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAE/D,EAAA,MAAM,sBAAA,GAAyB,iBAAA,CAAkB,GAAA,CAAI,YAAY,CAAA,IAAK,EAAA;AAEtE,EAAA,iBAAA,CAAkB,GAAA;AAChB,IAAA,YAAA;IACA,CAAC,sBAAA,EAAwB,GAAG,oBAAoB,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG;AAC5E,GAAA;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,iBAAA,CAAkB,OAAA,EAAS,CAAA;AACvD;ACfO,SAAS,qBAAA,CAAsB;AACpC,EAAA,MAAA;AACA,EAAA,MAAA;EACA,YAAA,GAAe,MAAA,IAAU,OAAO,qBAAA,GAAwB,MAAA;EACxD,YAAA,GAAe,MAAA,IAAU,OACrB,qBAAA,GACA;AACN,CAAA,EAKW;AACT,EAAA,OAAO;AACL,IAAA,MAAA,IAAU,IAAA,IAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AAC/C,IAAA,MAAA,IAAU,IAAA,IAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,EAAA,GAAK,MAAA;;AAC3C,IAAA,YAAA;AACA,IAAA,MAAA,IAAU,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,MAAA;AAC1C,IAAA;AACF,GAAA,CACG,OAAO,CAAA,IAAA,KAAQ,QAAQ,IAAI,CAAA,CAC3B,KAAK,IAAI,CAAA;AACd;AAEO,SAAS,iCAAA,CAAkC;AAChD,EAAA,QAAA;AACA,EAAA,MAAA;AACA,EAAA,YAAA;AACA,EAAA;AACF,CAAA,EAK0B;AA7C1B,EAAA,IAAAD,IAAAA,EAAAC,IAAAA;AA8CE,EAAA,MAAM,aAAA,GAAA,CAAA,CACJD,OAAA,QAAA,CAAS,CAAC,MAAV,IAAA,GAAA,MAAA,GAAAA,KAAa,IAAA,MAAS,QAAA,GAClB,EAAE,GAAG,QAAA,CAAS,CAAC,CAAA,EAAE,GACjB,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,EAAA,EAAG;AAEpC,EAAA,aAAA,CAAc,UAAU,qBAAA,CAAsB;AAC5C,IAAA,MAAA,EAAQ,aAAA,CAAc,OAAA;AACtB,IAAA,MAAA;AACA,IAAA,YAAA;AACA,IAAA;GACD,CAAA;AAED,EAAA,OAAO;AACL,IAAA,aAAA;AACA,IAAA,GAAA,CAAA,CAAIC,IAAAA,GAAA,QAAA,CAAS,CAAC,CAAA,KAAV,IAAA,GAAA,MAAA,GAAAA,IAAAA,CAAa,IAAA,MAAS,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,GAAI;AAC3D,GAAA;AACF;ACvDO,SAAS,cACd,KAAA,EACyB;AACzB,EAAA,OAAO,KAAA,IAAS,IAAA;AAClB;ACAO,SAAS,cAAA,CAAe;AAC7B,EAAA,SAAA;AACA,EAAA,GAAA;AACA,EAAA;AACF,CAAA,EAIY;AAEV,EAAA,GAAA,GAAM,IAAI,WAAA,EAAY;AACtB,EAAA,SAAA,GAAY,UAAU,WAAA,EAAY;AAElC,EAAA,OACE,MAAA,CAAO,QAAQ,aAAa,CAAA,CAEzB,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrB,IAAA,MAAMM,UAAAA,GAAY,IAAI,WAAA,EAAY;AAClC,IAAA,OAAOA,eAAc,GAAA,IAAOA,UAAAA,KAAc,QACtC,EAAE,eAAA,EAAiB,IAAI,OAAA,EAAS,KAAA,EAAM,GACtC,EAAE,iBAAiBA,UAAAA,CAAU,OAAA,CAAQ,MAAM,EAAE,CAAA,EAAG,SAAS,KAAA,EAAM;EACrE,CAAC,CAAA,CAEA,MAAA,CAAO,CAAC,EAAE,eAAA,OAAsB,SAAA,CAAU,UAAA,CAAW,eAAe,CAAC,CAAA,CACrE,OAAA,CAAQ,CAAC,EAAE,OAAA,EAAQ,KAAM,OAAO,CAAA,CAEhC,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAExC;ACrCO,SAAS,UAAA,CAAW;AACzB,EAAA,MAAA;AACA,EAAA,uBAAA;EACA,mBAAA,GAAsB,QAAA;AACtB,EAAA;AACF,CAAA,EAKW;AACT,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,MAAA;AACT,EAAA;AAEA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,eAAA,CAAgB;AACxB,MAAA,OAAA,EAAS,GAAG,WAAW,CAAA,0BAAA;KACxB,CAAA;AACH,EAAA;AAEA,EAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,IAAA,MAAM,IAAI,eAAA,CAAgB;MACxB,OAAA,EAAS,CAAA,EAAG,WAAW,CAAA,wCAAA,EAA2C,mBAAmB,CAAA,wEAAA;KACtF,CAAA;AACH,EAAA;AAEA,EAAA,MAAA,GAAS,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAE5C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,eAAA,CAAgB;AACxB,MAAA,OAAA,EAAS,CAAA,EAAG,WAAW,CAAA,wCAAA,EAA2C,mBAAmB,sBAAsB,uBAAuB,CAAA,sBAAA;KACnI,CAAA;AACH,EAAA;AAEA,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,IAAI,eAAA,CAAgB;MACxB,OAAA,EAAS,CAAA,EAAG,WAAW,CAAA,4CAAA,EAA+C,uBAAuB,CAAA,sCAAA;KAC9F,CAAA;AACH,EAAA;AAEA,EAAA,OAAO,MAAA;AACT;ACrCO,SAAS,mBAAA,CAAoB;AAClC,EAAA,YAAA;AACA,EAAA;AACF,CAAA,EAGuB;AACrB,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,OAAO,YAAA;AACT,EAAA;AAEA,EAAA,IAAI,YAAA,IAAgB,IAAA,IAAQ,OAAO,OAAA,KAAY,WAAA,EAAa;AAC1D,IAAA,OAAO,MAAA;AACT,EAAA;AAEA,EAAA,YAAA,GAAe,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAElD,EAAA,IAAI,YAAA,IAAgB,IAAA,IAAQ,OAAO,YAAA,KAAiB,QAAA,EAAU;AAC5D,IAAA,OAAO,MAAA;AACT,EAAA;AAEA,EAAA,OAAO,YAAA;AACT;AClBO,SAAS,WAAA,CAAY;AAC1B,EAAA,YAAA;AACA,EAAA,uBAAA;AACA,EAAA,WAAA;AACA,EAAA;AACF,CAAA,EAKW;AACT,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,OAAO,YAAA;AACT,EAAA;AAEA,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,MAAM,IAAI,gBAAA,CAAiB;AACzB,MAAA,OAAA,EAAS,GAAG,WAAW,CAAA,0BAAA;KACxB,CAAA;AACH,EAAA;AAEA,EAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,IAAA,MAAM,IAAI,gBAAA,CAAiB;MACzB,OAAA,EACE,CAAA,EAAG,WAAW,CAAA,wCAAA,EACQ,WAAW,CAAA,wEAAA;KAEpC,CAAA;AACH,EAAA;AAEA,EAAA,YAAA,GAAe,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAElD,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,MAAM,IAAI,gBAAA,CAAiB;AACzB,MAAA,OAAA,EACE,CAAA,EAAG,WAAW,CAAA,wCAAA,EACQ,WAAW,sBACvB,uBAAuB,CAAA,sBAAA;KACpC,CAAA;AACH,EAAA;AAEA,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,MAAM,IAAI,gBAAA,CAAiB;MACzB,OAAA,EACE,CAAA,EAAG,WAAW,CAAA,4CAAA,EACM,uBAAuB,CAAA,sCAAA;KAC9C,CAAA;AACH,EAAA;AAEA,EAAA,OAAO,YAAA;AACT;ACpDO,SAAS,qBAAqB,SAAA,EAAmB;AATxD,EAAA,IAAAP,IAAAA;AAUE,EAAA,MAAM,CAAC,OAAO,OAAA,GAAU,EAAE,IAAI,SAAA,CAAU,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA;AAE/D,EAAA,OAAA,CACEA,IAAAA,GAAA;IACE,IAAA,EAAM,KAAA;IACN,OAAA,EAAS,KAAA;IACT,IAAA,EAAM,KAAA;IACN,GAAA,EAAK,KAAA;IACL,OAAA,EAAS;GACX,CAAE,OAAO,CAAA,KANT,IAAA,GAAAA,IAAAA,GAMc,OAAA;AAElB;ACKA,SAAS,OAAO,IAAA,EAAc;AAE5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG3B,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,IAAA,OAAO,GAAA;AACT,EAAA;AAEA,EAAA,IACE,cAAA,CAAe,KAAK,IAAI,CAAA,KAAM,SAC9B,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA,KAAM,KAAA,EACpC;AACA,IAAA,OAAO,GAAA;AACT,EAAA;AAGA,EAAA,OAAO,OAAO,GAAG,CAAA;AACnB;AAEA,SAAS,OAAO,GAAA,EAAU;AACxB,EAAA,IAAI,IAAA,GAAO,CAAC,GAAG,CAAA;AAEf,EAAA,OAAO,KAAK,MAAA,EAAQ;AAClB,IAAA,MAAM,KAAA,GAAQ,IAAA;AACd,IAAA,IAAA,GAAO,EAAC;AAER,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA,EAAG;AAC3D,QAAA,MAAM,IAAI,YAAY,8CAA8C,CAAA;AACtE,MAAA;AAEA,MAAA,IACE,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,MAAM,aAAa,CAAA,IACxD,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA,EAClE;AACA,QAAA,MAAM,IAAI,YAAY,8CAA8C,CAAA;AACtE,MAAA;AAEA,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,QAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,UAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACjB,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,gBAAgB,IAAA,EAAc;AAC5C,EAAA,MAAM,EAAE,iBAAgB,GAAI,KAAA;AAC5B,EAAA,IAAI;AAEF,IAAA,KAAA,CAAM,eAAA,GAAkB,CAAA;AAC1B,EAAA,CAAA,CAAA,OAAS,CAAA,EAAG;AAEV,IAAA,OAAO,OAAO,IAAI,CAAA;AACpB,EAAA;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,IAAI,CAAA;EACpB,CAAA,SAAA;AACE,IAAA,KAAA,CAAM,eAAA,GAAkB,eAAA;AAC1B,EAAA;AACF;ACtFO,SAAS,oCACdQ,WAAAA,EACa;AACb,EAAA,IACEA,WAAAA,CAAW,IAAA,KAAS,QAAA,IACnB,KAAA,CAAM,OAAA,CAAQA,WAAAA,CAAW,IAAI,CAAA,IAAKA,WAAAA,CAAW,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EACpE;AACAA,IAAAA,WAAAA,CAAW,oBAAA,GAAuB,KAAA;AAClC,IAAA,MAAM,EAAE,YAAW,GAAIA,WAAAA;AACvB,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACzC,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAC,CAAA;AACzC,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA,IAAIA,WAAAA,CAAW,SAAS,IAAA,EAAM;AAC5BA,IAAAA,WAAAA,CAAW,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQA,WAAAA,CAAW,KAAK,CAAA,GAC7CA,WAAAA,CAAW,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,GAC1B,KAAA,CAAMA,YAAW,KAAK,CAAA;AAC5B,EAAA;AAEA,EAAA,IAAIA,WAAAA,CAAW,SAAS,IAAA,EAAM;AAC5BA,IAAAA,WAAAA,CAAW,KAAA,GAAQA,WAAAA,CAAW,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAC/C,EAAA;AAEA,EAAA,IAAIA,WAAAA,CAAW,SAAS,IAAA,EAAM;AAC5BA,IAAAA,WAAAA,CAAW,KAAA,GAAQA,WAAAA,CAAW,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAC/C,EAAA;AAEA,EAAA,IAAIA,WAAAA,CAAW,SAAS,IAAA,EAAM;AAC5BA,IAAAA,WAAAA,CAAW,KAAA,GAAQA,WAAAA,CAAW,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAC/C,EAAA;AAEA,EAAA,MAAM,EAAE,aAAY,GAAIA,WAAAA;AACxB,EAAA,IAAI,eAAe,IAAA,EAAM;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAC1C,MAAA,WAAA,CAAY,GAAG,CAAA,GAAI,KAAA,CAAM,WAAA,CAAY,GAAG,CAAC,CAAA;AAC3C,IAAA;AACF,EAAA;AAEA,EAAA,OAAOA,WAAAA;AACT;AAEA,SAAS,MAAM,GAAA,EAAmD;AAChE,EAAA,IAAI,OAAO,GAAA,KAAQ,SAAA,EAAW,OAAO,GAAA;AACrC,EAAA,OAAO,oCAAoC,GAAG,CAAA;AAChD;AClDO,SAAS,WAAA,GAAkC;AAChD,EAAA,OAAO,EAAC;AACV;ACQO,SAAS,aAAA,CAAc,KAAkB,IAAA,EAAY;AAZ5D,EAAA,IAAAR,MAAAC,IAAAA,EAAA,EAAA;AAaE,EAAA,MAAM,GAAA,GAA4B;IAChC,IAAA,EAAM;AACR,GAAA;AACA,EAAA,IAAA,CAAA,CACED,IAAAA,GAAA,IAAI,IAAA,KAAJ,IAAA,GAAA,SAAAA,IAAAA,CAAU,IAAA,KAAA,CAAA,CACV,MAAAC,IAAAA,GAAA,GAAA,CAAI,SAAJ,IAAA,GAAA,MAAA,GAAAA,KAAU,IAAA,KAAV,IAAA,GAAA,SAAA,EAAA,CAAgB,QAAA,MAAa,sBAAsB,MAAA,EACnD;AACA,IAAA,GAAA,CAAI,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM;MAClC,GAAG,IAAA;AACH,MAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,OAAO;KAC3C,CAAA;AACH,EAAA;AAEA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,GAAA,CAAI,QAAA,GAAW,IAAI,SAAA,CAAU,KAAA;AAC/B,EAAA;AACA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,GAAA,CAAI,QAAA,GAAW,IAAI,SAAA,CAAU,KAAA;AAC/B,EAAA;AACA,EAAA,IAAI,IAAI,WAAA,EAAa;AACnB,IAAA,GAAA,CAAI,QAAA,GAAW,IAAI,WAAA,CAAY,KAAA;AAC/B,IAAA,GAAA,CAAI,QAAA,GAAW,IAAI,WAAA,CAAY,KAAA;AACjC,EAAA;AACA,EAAA,OAAO,GAAA;AACT;ACzBO,SAAS,eAAe,GAAA,EAA0C;AACvE,EAAA,MAAM,GAAA,GAA6B;IACjC,IAAA,EAAM,SAAA;IACN,MAAA,EAAQ;AACV,GAAA;AAEA,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,GAAA;AAExB,EAAA,KAAA,MAAW,KAAA,IAAS,IAAI,MAAA,EAAQ;AAC9B,IAAA,QAAQ,MAAM,IAAA;MACZ,KAAK,KAAA;AACH,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,GAAA,CAAI,UAAU,KAAA,CAAM,KAAA;QACtB,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,mBAAmB,KAAA,CAAM,KAAA;AAC/B,QAAA;AACA,QAAA;MACF,KAAK,KAAA;AACH,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,GAAA,CAAI,UAAU,KAAA,CAAM,KAAA;QACtB,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,mBAAmB,KAAA,CAAM,KAAA;AAC/B,QAAA;AAEA,QAAA;MACF,KAAK,YAAA;AACH,QAAA,GAAA,CAAI,aAAa,KAAA,CAAM,KAAA;AACvB,QAAA;AACJ;AACF,EAAA;AACA,EAAA,OAAO,GAAA;AACT;ACvCO,SAAS,eAAA,GAA0C;AACxD,EAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAC3B;ACFO,SAAS,eAAA,CAAgB,MAA0B,IAAA,EAAY;AACpE,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AACtC;ACSO,SAAS,YAAA,CACd,GAAA,EACA,IAAA,EACA,oBAAA,EACqB;AACrB,EAAA,MAAM,QAAA,GAAW,oBAAA,IAAA,IAAA,GAAA,oBAAA,GAAwB,IAAA,CAAK,YAAA;AAE9C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,IAAA,OAAO;MACL,KAAA,EAAO,QAAA,CAAS,IAAI,CAAC,IAAA,EAAM,MAAM,YAAA,CAAa,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC;AAChE,KAAA;AACF,EAAA;AAEA,EAAA,QAAQ,QAAA;IACN,KAAK,QAAA;IACL,KAAK,kBAAA;AACH,MAAA,OAAO;QACL,IAAA,EAAM,QAAA;QACN,MAAA,EAAQ;AACV,OAAA;IACF,KAAK,aAAA;AACH,MAAA,OAAO;QACL,IAAA,EAAM,QAAA;QACN,MAAA,EAAQ;AACV,OAAA;IACF,KAAK,SAAA;AACH,MAAA,OAAO,kBAAkB,GAAG,CAAA;AAChC;AACF;ACtCO,SAAS,eAAA,CACd,MACA,IAAA,EACoC;AACpC,EAAA,OAAO;AACL,IAAA,GAAG,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AACrC,IAAA,OAAA,EAAS,KAAK,YAAA;AAChB,GAAA;AACF;ACPO,SAAS,eAAA,CACd,MACA,IAAA,EAC6B;AAC7B,EAAA,OAAO,IAAA,CAAK,mBAAmB,OAAA,GAC3B,QAAA,CAAS,KAAK,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA,GAC/B,WAAA,EAAY;AAClB;ACNO,SAAS,aAAa,GAAA,EAAsC;AACjE,EAAA,OAAO;IACL,IAAA,EAAM,QAAA;IACN,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAM;AAC7B,GAAA;AACF;ACMO,SAAS,oBAAA,CACd,KACA,IAAA,EACoD;AACpD,EAAA,MAAM,KAAA,GAAQ;IACZ,QAAA,CAAS,GAAA,CAAI,KAAK,IAAA,EAAM;MACtB,GAAG,IAAA;AACH,MAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,SAAS,GAAG;KAChD,CAAA;IACD,QAAA,CAAS,GAAA,CAAI,MAAM,IAAA,EAAM;MACvB,GAAG,IAAA;AACH,MAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,SAAS,GAAG;KAChD;AACH,GAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAA4B,CAAC,CAAC,CAAC,CAAA;AAEzC,EAAA,MAAM,cAAiC,EAAC;AAExC,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,MAAA,KAAU;AACtB,IAAA,IAAI,sBAAA,CAAuB,MAAM,CAAA,EAAG;AAClC,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,MAAA,CAAO,KAAK,CAAA;IAClC,CAAA,MAAO;AACL,MAAA,IAAI,YAAA,GAAgC,MAAA;AACpC,MAAA,IACE,sBAAA,IAA0B,MAAA,IAC1B,MAAA,CAAO,oBAAA,KAAyB,KAAA,EAChC;AACA,QAAA,MAAM,EAAE,oBAAA,EAAsB,GAAG,IAAA,EAAK,GAAI,MAAA;AAC1C,QAAA,YAAA,GAAe,IAAA;AACjB,MAAA;AACA,MAAA,WAAA,CAAY,KAAK,YAAY,CAAA;AAC/B,IAAA;EACF,CAAC,CAAA;AACD,EAAA,OAAO,WAAA,CAAY,MAAA,GAAS,EAAE,KAAA,EAAO,aAAY,GAAI,MAAA;AACvD;ACxCO,SAAS,gBAAgB,GAAA,EAA4C;AAC1E,EAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,KAAA;AAC9B,EAAA,IACE,eAAe,QAAA,IACf,UAAA,KAAe,YACf,UAAA,KAAe,SAAA,IACf,eAAe,QAAA,EACf;AACA,IAAA,OAAO;AACL,MAAA,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,OAAA,GAAU;AAC7C,KAAA;AACF,EAAA;AAEA,EAAA,OAAO;IACL,IAAA,EAAM,UAAA,KAAe,WAAW,SAAA,GAAY,UAAA;AAC5C,IAAA,KAAA,EAAO,GAAA,CAAI;AACb,GAAA;AACF;AC+DO,SAAS,cAAA,CACd,KACA,IAAA,EACuB;AACvB,EAAA,MAAM,GAAA,GAA6B;IACjC,IAAA,EAAM;AACR,GAAA;AAEA,EAAA,IAAI,IAAI,MAAA,EAAQ;AACd,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,MAAA,EAAQ;AAC9B,MAAA,QAAQ,MAAM,IAAA;QACZ,KAAK,KAAA;AACH,UAAA,GAAA,CAAI,SAAA,GACF,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,GACrB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA,GACnC,KAAA,CAAM,KAAA;AACZ,UAAA;QACF,KAAK,KAAA;AACH,UAAA,GAAA,CAAI,SAAA,GACF,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,GACrB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA,GACnC,KAAA,CAAM,KAAA;AAEZ,UAAA;QACF,KAAK,OAAA;AACH,UAAA,QAAQ,KAAK,aAAA;YACX,KAAK,cAAA;AACH,cAAA,SAAA,CAAU,GAAA,EAAK,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC3C,cAAA;YACF,KAAK,kBAAA;AACH,cAAA,SAAA,CAAU,GAAA,EAAK,WAAA,EAAa,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC/C,cAAA;YACF,KAAK,aAAA;AACH,cAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,KAAA,EAAO,KAAA,CAAM,SAAS,IAAI,CAAA;AACtD,cAAA;AACJ;AAEA,UAAA;QACF,KAAK,KAAA;AACH,UAAA,SAAA,CAAU,GAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AACzC,UAAA;QACF,KAAK,MAAA;AACH,UAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC1C,UAAA;QACF,KAAK,OAAA;AACH,UAAA,UAAA,CAAW,GAAA,EAAK,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,SAAS,IAAI,CAAA;AAChD,UAAA;QACF,KAAK,MAAA;AACH,UAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,IAAA,EAAM,KAAA,CAAM,SAAS,IAAI,CAAA;AACrD,UAAA;QACF,KAAK,OAAA;AACH,UAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,KAAA,EAAO,KAAA,CAAM,SAAS,IAAI,CAAA;AACtD,UAAA;QACF,KAAK,YAAA;AACH,UAAA,UAAA;AACE,YAAA,GAAA;AACA,YAAA,MAAA,CAAO,IAAI,uBAAA,CAAwB,KAAA,CAAM,KAAA,EAAO,IAAI,CAAC,CAAA,CAAE,CAAA;YACvD,KAAA,CAAM,OAAA;AACN,YAAA;AACF,WAAA;AACA,UAAA;QACF,KAAK,UAAA;AACH,UAAA,UAAA;AACE,YAAA,GAAA;AACA,YAAA,MAAA,CAAO,GAAG,uBAAA,CAAwB,KAAA,CAAM,KAAA,EAAO,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;YACvD,KAAA,CAAM,OAAA;AACN,YAAA;AACF,WAAA;AACA,UAAA;QACF,KAAK,UAAA;AACH,UAAA,SAAA,CAAU,GAAA,EAAK,WAAA,EAAa,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC/C,UAAA;QACF,KAAK,MAAA;AACH,UAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC1C,UAAA;QACF,KAAK,MAAA;AACH,UAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC1C,UAAA;QACF,KAAK,UAAA;AACH,UAAA,SAAA,CAAU,GAAA,EAAK,UAAA,EAAY,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC9C,UAAA;QACF,KAAK,QAAA;AACH,UAAA,GAAA,CAAI,SAAA,GACF,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,GACrB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA,GACnC,KAAA,CAAM,KAAA;AACZ,UAAA,GAAA,CAAI,SAAA,GACF,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,GACrB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA,GACnC,KAAA,CAAM,KAAA;AACZ,UAAA;AACF,QAAA,KAAK,UAAA,EAAY;AACf,UAAA,UAAA;AACE,YAAA,GAAA;AACA,YAAA,MAAA,CAAO,uBAAA,CAAwB,KAAA,CAAM,KAAA,EAAO,IAAI,CAAC,CAAA;YACjD,KAAA,CAAM,OAAA;AACN,YAAA;AACF,WAAA;AACA,UAAA;AACF,QAAA;AACA,QAAA,KAAK,IAAA,EAAM;AACT,UAAA,IAAI,KAAA,CAAM,YAAY,IAAA,EAAM;AAC1B,YAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC5C,UAAA;AACA,UAAA,IAAI,KAAA,CAAM,YAAY,IAAA,EAAM;AAC1B,YAAA,SAAA,CAAU,GAAA,EAAK,MAAA,EAAQ,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC5C,UAAA;AACA,UAAA;AACF,QAAA;QACA,KAAK,WAAA;AACH,UAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,SAAA,EAAW,KAAA,CAAM,SAAS,IAAI,CAAA;AAC1D,UAAA;QACF,KAAK,KAAA;AACH,UAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,GAAA,EAAK,KAAA,CAAM,SAAS,IAAI,CAAA;AACpD,UAAA;AACF,QAAA,KAAK,MAAA,EAAQ;AACX,UAAA,IAAI,KAAA,CAAM,YAAY,IAAA,EAAM;AAC1B,YAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,QAAA,EAAU,KAAA,CAAM,SAAS,IAAI,CAAA;AAC3D,UAAA;AACA,UAAA,IAAI,KAAA,CAAM,YAAY,IAAA,EAAM;AAC1B,YAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,QAAA,EAAU,KAAA,CAAM,SAAS,IAAI,CAAA;AAC3D,UAAA;AACA,UAAA;AACF,QAAA;QACA,KAAK,OAAA;AACH,UAAA,UAAA,CAAW,KAAK,WAAA,CAAY,KAAA,EAAM,EAAG,KAAA,CAAM,SAAS,IAAI,CAAA;AACxD,UAAA;AACF,QAAA,KAAK,MAAA,EAAQ;AACX,UAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,IAAA,EAAM,KAAA,CAAM,SAAS,IAAI,CAAA;AACrD,UAAA;AACF,QAAA;AACA,QAAA,KAAK,QAAA,EAAU;AACb,UAAA,QAAQ,KAAK,cAAA;AACX,YAAA,KAAK,eAAA,EAAiB;AACpB,cAAA,SAAA,CAAU,GAAA,EAAK,QAAA,EAAiB,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AACnD,cAAA;AACF,YAAA;AAEA,YAAA,KAAK,wBAAA,EAA0B;AAC7B,cAAA,GAAA,CAAI,eAAA,GAAkB,QAAA;AACtB,cAAA;AACF,YAAA;AAEA,YAAA,KAAK,aAAA,EAAe;AAClB,cAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,MAAA,EAAQ,KAAA,CAAM,SAAS,IAAI,CAAA;AACvD,cAAA;AACF,YAAA;AACF;AACA,UAAA;AACF,QAAA;AACA,QAAA,KAAK,QAAA,EAAU;AACb,UAAA,UAAA,CAAW,GAAA,EAAK,WAAA,CAAY,MAAA,EAAQ,KAAA,CAAM,SAAS,IAAI,CAAA;AACzD,QAAA;AAQF;AACF,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,uBAAA,CAAwB,SAAiB,IAAA,EAAoB;AACpE,EAAA,OAAO,IAAA,CAAK,eAAA,KAAoB,QAAA,GAC5B,qBAAA,CAAsB,OAAO,CAAA,GAC7B,OAAA;AACN;AAMA,SAAS,sBAAsB,MAAA,EAAgB;AAC7C,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG;AACjC,MAAA,MAAA,IAAU,IAAA;AACZ,IAAA;AAEA,IAAA,MAAA,IAAU,OAAO,CAAC,CAAA;AACpB,EAAA;AAEA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,SAAA,CACP,MAAA,EACA,KAAA,EACA,OAAA,EACA,IAAA,EACA;AAhSF,EAAA,IAAAD,IAAAA;AAiSE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAA,CAAUA,IAAAA,GAAA,MAAA,CAAO,KAAA,KAAP,IAAA,GAAA,MAAA,GAAAA,IAAAA,CAAc,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,CAAA,CAAA,EAAS;AACtD,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAA,CAAO,QAAQ,EAAC;AAClB,IAAA;AAEA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,MAAA,CAAO,MAAO,IAAA,CAAK;AACjB,QAAA,MAAA,EAAQ,MAAA,CAAO;OAChB,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,MAAA;AAChB,IAAA;AAEA,IAAA,MAAA,CAAO,MAAO,IAAA,CAAK;MACjB,MAAA,EAAQ,KAAA;MACR,GAAI,OAAA,IACF,KAAK,aAAA,IAAiB,EAAE,cAAc,EAAE,MAAA,EAAQ,SAAQ;KAC3D,CAAA;EACH,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,MAAA,GAAS,KAAA;AAClB,EAAA;AACF;AAGA,SAAS,UAAA,CACP,MAAA,EACA,KAAA,EACA,OAAA,EACA,IAAA,EACA;AA7TF,EAAA,IAAAA,IAAAA;AA8TE,EAAA,IAAI,MAAA,CAAO,OAAA,KAAA,CAAWA,IAAAA,GAAA,MAAA,CAAO,KAAA,KAAP,IAAA,GAAA,MAAA,GAAAA,IAAAA,CAAc,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAA,CAAA,EAAU;AACxD,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAA,CAAO,QAAQ,EAAC;AAClB,IAAA;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAA,CAAO,MAAO,IAAA,CAAK;AACjB,QAAA,OAAA,EAAS,MAAA,CAAO;OACjB,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,OAAA;AAChB,IAAA;AAEA,IAAA,MAAA,CAAO,MAAO,IAAA,CAAK;MACjB,OAAA,EAAS,wBAAA,CAAyB,OAAO,IAAI,CAAA;MAC7C,GAAI,OAAA,IACF,KAAK,aAAA,IAAiB,EAAE,cAAc,EAAE,OAAA,EAAS,SAAQ;KAC5D,CAAA;EACH,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,OAAA,GAAU,wBAAA,CAAyB,KAAA,EAAO,IAAI,CAAA;AACvD,EAAA;AACF;AAGA,SAAS,wBAAA,CAAyB,OAAe,IAAA,EAAoB;AArVrE,EAAA,IAAAA,IAAAA;AAsVE,EAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,CAAC,MAAM,KAAA,EAAO;AACzC,IAAA,OAAO,KAAA,CAAM,MAAA;AACf,EAAA;AAGA,EAAA,MAAM,KAAA,GAAQ;IACZ,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;;IAC3B,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;;IAC3B,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,GAAG;;AAC7B,GAAA;AAGA,EAAA,MAAM,SAAS,KAAA,CAAM,CAAA,GAAI,MAAM,MAAA,CAAO,WAAA,KAAgB,KAAA,CAAM,MAAA;AAC5D,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,IAAW,OAAO,CAAC,CAAA;AACnB,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAI,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,EAAG;AAC5B,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,OAAA,IAAW,OAAO,CAAC,CAAA;AACnB,YAAA,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,IAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAG,WAAA,EAAY;AACvD,YAAA,WAAA,GAAc,KAAA;AAChB,UAAA,CAAA,MAAA,IAAW,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,KAAM,SAAOA,IAAAA,GAAA,MAAA,CAAO,CAAA,GAAI,CAAC,MAAZ,IAAA,GAAA,MAAA,GAAAA,IAAAA,CAAe,KAAA,CAAM,OAAA,CAAA,CAAA,EAAU;AACjE,YAAA,OAAA,IAAW,OAAO,CAAC,CAAA;AACnB,YAAA,WAAA,GAAc,IAAA;UAChB,CAAA,MAAO;AACL,YAAA,OAAA,IAAW,CAAA,EAAG,OAAO,CAAC,CAAC,GAAG,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA;AACnD,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA,CAAA,MAAA,IAAW,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,EAAG;AACnC,QAAA,OAAA,IAAW,CAAA,CAAA,EAAI,OAAO,CAAC,CAAC,GAAG,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,CAAA;AAClD,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,EAAK;AACrB,QAAA,OAAA,IAAW,CAAA;;AACX,QAAA;MACF,CAAA,MAAA,IAAW,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,EAAK;AAC5B,QAAA,OAAA,IAAW,CAAA;;AACX,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,KAAA,CAAM,CAAA,IAAK,MAAA,CAAO,CAAC,MAAM,GAAA,EAAK;AAChC,MAAA,OAAA,IAAW,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;IAAS,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAC,CAAA;;AAC3D,MAAA;AACF,IAAA;AAEA,IAAA,OAAA,IAAW,OAAO,CAAC,CAAA;AACnB,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,EAAM;AACtB,MAAA,SAAA,GAAY,IAAA;AACd,IAAA,CAAA,MAAA,IAAW,WAAA,IAAe,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,EAAK;AAC3C,MAAA,WAAA,GAAc,KAAA;AAChB,IAAA,CAAA,MAAA,IAAW,CAAC,WAAA,IAAe,MAAA,CAAO,CAAC,MAAM,GAAA,EAAK;AAC5C,MAAA,WAAA,GAAc,IAAA;AAChB,IAAA;AACF,EAAA;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,OAAO,CAAA;AACpB,EAAA,CAAA,CAAA,OAAQ,CAAA,EAAA;AACN,IAAA,OAAA,CAAQ,IAAA;AACN,MAAA,CAAA,mCAAA,EAAsC,KAAK,WAAA,CAAY,IAAA;AACrD,QAAA;OACD,CAAA,qEAAA;AACH,KAAA;AACA,IAAA,OAAO,KAAA,CAAM,MAAA;AACf,EAAA;AAEA,EAAA,OAAO,OAAA;AACT;AClZO,SAAS,cAAA,CACd,KACA,IAAA,EACuB;AA1BzB,EAAA,IAAAA,IAAAA,EAAAC,IAAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2BE,EAAA,MAAM,MAAA,GAAgC;IACpC,IAAA,EAAM,QAAA;AACN,IAAA,oBAAA,EAAA,CACED,IAAAA,GAAA,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM;MAC3B,GAAG,IAAA;AACH,MAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,sBAAsB;KAC1D,CAAA,KAHD,IAAA,GAAAA,IAAAA,GAGM,IAAA,CAAK;AACf,GAAA;AAEA,EAAA,IAAA,CAAA,CACEC,OAAA,GAAA,CAAI,OAAA,KAAJ,OAAA,MAAA,GAAAA,IAAAA,CAAa,KAAK,QAAA,MAAaQ,qBAAAA,CAAsB,SAAA,KAAA,CACrD,EAAA,GAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,WAAjB,IAAA,GAAA,MAAA,GAAA,GAAyB,MAAA,CAAA,EACzB;AACA,IAAA,MAAM,EAAE,MAAM,GAAG,OAAA,KAAY,cAAA,CAAe,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAElE,IAAA,OAAO;MACL,GAAG,MAAA;MACH,aAAA,EAAe;AACjB,KAAA;EACF,CAAA,MAAA,IAAA,CAAA,CAAW,EAAA,GAAA,IAAI,OAAA,KAAJ,IAAA,GAAA,SAAA,EAAA,CAAa,IAAA,CAAK,QAAA,MAAaA,qBAAAA,CAAsB,OAAA,EAAS;AACvE,IAAA,OAAO;MACL,GAAG,MAAA;MACH,aAAA,EAAe;QACb,IAAA,EAAM,GAAA,CAAI,QAAQ,IAAA,CAAK;AACzB;AACF,KAAA;AACF,EAAA,CAAA,MAAA,IAAA,CAAA,CACE,EAAA,GAAA,GAAA,CAAI,OAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAa,IAAA,CAAK,QAAA,MAAaA,qBAAAA,CAAsB,UAAA,IACrD,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,KAAaA,qBAAAA,CAAsB,SAAA,KAAA,CAC9D,EAAA,GAAA,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,KAA3B,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmC,MAAA,CAAA,EACnC;AACA,IAAA,MAAM,EAAE,IAAA,EAAM,GAAG,OAAA,EAAQ,GAAI,eAAA;AAC3B,MAAA,GAAA,CAAI,OAAA,CAAQ,IAAA;AACZ,MAAA;AACF,KAAA;AAEA,IAAA,OAAO;MACL,GAAG,MAAA;MACH,aAAA,EAAe;AACjB,KAAA;AACF,EAAA;AAEA,EAAA,OAAO,MAAA;AACT;ACpDO,SAAS,WAAA,CACd,KACA,IAAA,EAC4C;AAC5C,EAAA,IAAI,IAAA,CAAK,gBAAgB,QAAA,EAAU;AACjC,IAAA,OAAO,cAAA,CAAe,KAAK,IAAI,CAAA;AACjC,EAAA;AAEA,EAAA,MAAM,IAAA,GACJ,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM;IACzB,GAAG,IAAA;AACH,IAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,OAAA,EAAS,SAAS,GAAG;AAC1D,GAAC,KAAK,WAAA,EAAY;AACpB,EAAA,MAAM,MAAA,GACJ,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM;IAC3B,GAAG,IAAA;AACH,IAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,OAAA,EAAS,SAAS,GAAG;AAC1D,GAAC,KAAK,WAAA,EAAY;AACpB,EAAA,OAAO;IACL,IAAA,EAAM,OAAA;IACN,QAAA,EAAU,GAAA;IACV,KAAA,EAAO;MACL,IAAA,EAAM,OAAA;MACN,KAAA,EAAO,CAAC,MAAM,MAAM,CAAA;MACpB,QAAA,EAAU,CAAA;MACV,QAAA,EAAU;AACZ;AACF,GAAA;AACF;ACvCO,SAAS,mBACd,GAAA,EAC2B;AAC3B,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAgB;AACjE,IAAA,OAAO,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA,KAAM,QAAA;EACxC,CAAC,CAAA;AAED,EAAA,MAAM,eAAe,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,KAAgB,MAAA,CAAO,GAAG,CAAC,CAAA;AAEhE,EAAA,MAAM,cAAc,KAAA,CAAM,IAAA;AACxB,IAAA,IAAI,IAAI,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,KAA4B,OAAO,MAAM,CAAC;AACtE,GAAA;AAEA,EAAA,OAAO;IACL,IAAA,EACE,WAAA,CAAY,MAAA,KAAW,CAAA,GACnB,WAAA,CAAY,CAAC,CAAA,KAAM,QAAA,GACjB,QAAA,GACA,QAAA,GACF,CAAC,QAAA,EAAU,QAAQ,CAAA;IACzB,IAAA,EAAM;AACR,GAAA;AACF;ACxBO,SAAS,aAAA,GAAkD;AAChE,EAAA,OAAO,EAAE,GAAA,EAAK,WAAA,EAAY,EAAE;AAC9B;ACJO,SAAS,YAAA,GAAoC;AAClD,EAAA,OAAO;IACL,IAAA,EAAM;AACR,GAAA;AACF;AC8BO,SAAS,aAAA,CACd,KACA,IAAA,EACkE;AAClE,EAAA,MAAM,OAAA,GACJ,GAAA,CAAI,OAAA,YAAmB,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,CAAA,GAAI,GAAA,CAAI,OAAA;AAGtE,EAAA,IACE,OAAA,CAAQ,KAAA;AACN,IAAA,CAAA,CAAA,KACE,CAAA,CAAE,IAAA,CAAK,QAAA,IAAY,iBAAA,KAClB,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA,IAAU,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,MAAA;GACtC,EACA;AAGA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAACC,QAA+B,CAAA,KAAM;AACjE,MAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,CAAA,CAAE,IAAA,CAAK,QAAwB,CAAA;AAC9D,MAAA,OAAO,IAAA,IAAQ,CAACA,MAAAA,CAAM,QAAA,CAAS,IAAI,IAAI,CAAC,GAAGA,MAAAA,EAAO,IAAI,CAAA,GAAIA,MAAAA;AAC5D,IAAA,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,OAAO;AACL,MAAA,IAAA,EAAM,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,MAAM,CAAC;AAC1C,KAAA;EACF,CAAA,MAAA,IACE,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,YAAA,IAAgB,CAAC,CAAA,CAAE,WAAW,CAAA,EACrE;AAGA,IAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACpB,MAAA,CAAC,KAA6B,CAAA,KAA+B;AAC3D,QAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,IAAA,CAAK,KAAA;AAC3B,QAAA,QAAQ,IAAA;UACN,KAAK,QAAA;UACL,KAAK,QAAA;UACL,KAAK,SAAA;AACH,YAAA,OAAO,CAAC,GAAG,GAAA,EAAK,IAAI,CAAA;UACtB,KAAK,QAAA;AACH,YAAA,OAAO,CAAC,GAAG,GAAA,EAAK,SAAkB,CAAA;UACpC,KAAK,QAAA;AACH,YAAA,IAAI,CAAA,CAAE,KAAK,KAAA,KAAU,IAAA,SAAa,CAAC,GAAG,KAAK,MAAe,CAAA;UAC5D,KAAK,QAAA;UACL,KAAK,WAAA;UACL,KAAK,UAAA;AACL,UAAA;AACE,YAAA,OAAO,GAAA;AACX;AACF,MAAA,CAAA;MACA;AACF,KAAA;AAEA,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AAGnC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAA;AAChE,MAAA,OAAO;AACL,QAAA,IAAA,EAAM,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,YAAY,CAAC,CAAA;AAC1D,QAAA,IAAA,EAAM,OAAA,CAAQ,MAAA;AACZ,UAAA,CAAC,KAAK,CAAA,KAAM;AACV,YAAA,OAAO,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,GAAI,GAAA,GAAM,CAAC,GAAG,GAAA,EAAK,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACjE,UAAA,CAAA;UACA;AACF;AACF,OAAA;AACF,IAAA;EACF,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAM,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,QAAA,KAAa,SAAS,CAAA,EAAG;AAC5D,IAAA,OAAO;MACL,IAAA,EAAM,QAAA;AACN,MAAA,IAAA,EAAM,OAAA,CAAQ,MAAA;AACZ,QAAA,CAAC,KAAe,CAAA,KAAM;UACpB,GAAG,GAAA;UACH,GAAG,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAACC,OAAc,CAAC,GAAA,CAAI,QAAA,CAASA,EAAC,CAAC;AACzD,SAAA;QACA;AACF;AACF,KAAA;AACF,EAAA;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1B;ACvGO,SAAS,gBAAA,CACd,KACA,IAAA,EACqC;AACrC,EAAA,IACE,CAAC,WAAA,EAAa,WAAA,EAAa,WAAA,EAAa,YAAA,EAAc,SAAS,CAAA,CAAE,QAAA;AAC/D,IAAA,GAAA,CAAI,UAAU,IAAA,CAAK;GACrB,KACC,CAAC,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,MAAA,IAAU,CAAC,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,MAAA,CAAA,EAC1D;AACA,IAAA,OAAO;MACL,IAAA,EAAM;QACJ,iBAAA,CACE,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,QACrB,CAAA;AACA,QAAA;AACF;AACF,KAAA;AACF,EAAA;AAEA,EAAA,MAAMC,KAAAA,GAAO,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM;IACxC,GAAG,IAAA;AACH,IAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,SAAS,GAAG;GAChD,CAAA;AAED,EAAA,OAAOA,KAAAA,IAAQ,EAAE,KAAA,EAAO,CAACA,OAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAE;AACnD;AC9BO,SAAS,eAAe,GAAA,EAA0C;AACvE,EAAA,MAAM,GAAA,GAA6B;IACjC,IAAA,EAAM;AACR,GAAA;AAEA,EAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,GAAA;AAExB,EAAA,KAAA,MAAW,KAAA,IAAS,IAAI,MAAA,EAAQ;AAC9B,IAAA,QAAQ,MAAM,IAAA;MACZ,KAAK,KAAA;AACH,QAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AACX,QAAA;MACF,KAAK,KAAA;AACH,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,GAAA,CAAI,UAAU,KAAA,CAAM,KAAA;QACtB,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,mBAAmB,KAAA,CAAM,KAAA;AAC/B,QAAA;AACA,QAAA;MACF,KAAK,KAAA;AACH,QAAA,IAAI,MAAM,SAAA,EAAW;AACnB,UAAA,GAAA,CAAI,UAAU,KAAA,CAAM,KAAA;QACtB,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,mBAAmB,KAAA,CAAM,KAAA;AAC/B,QAAA;AACA,QAAA;MACF,KAAK,YAAA;AACH,QAAA,GAAA,CAAI,aAAa,KAAA,CAAM,KAAA;AACvB,QAAA;AACJ;AACF,EAAA;AACA,EAAA,OAAO,GAAA;AACT;AC/BO,SAAS,cAAA,CAAe,KAAmB,IAAA,EAAY;AAC5D,EAAA,MAAM,MAAA,GAAgC;IACpC,IAAA,EAAM,QAAA;AACN,IAAA,UAAA,EAAY;AACd,GAAA;AAEA,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,EAAM;AAExB,EAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,IAAA,IAAI,OAAA,GAAU,MAAM,QAAQ,CAAA;AAE5B,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW;AACvD,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,YAAA,GAAe,eAAe,OAAO,CAAA;AAE3C,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM;MACvC,GAAG,IAAA;AACH,MAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,cAAc,QAAQ,CAAA;AACzD,MAAA,YAAA,EAAc,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,cAAc,QAAQ;KAC3D,CAAA;AAED,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA;AACF,IAAA;AAEA,IAAA,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,GAAI,SAAA;AAE9B,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AACxB,IAAA;AACF,EAAA;AAEA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AACpB,EAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,0BAAA,CAA2B,GAAA,EAAK,IAAI,CAAA;AAEjE,EAAA,IAAI,yBAAyB,MAAA,EAAW;AACtC,IAAA,MAAA,CAAO,oBAAA,GAAuB,oBAAA;AAChC,EAAA;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,0BAAA,CAA2B,KAAmB,IAAA,EAAY;AACjE,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,QAAA,KAAa,UAAA,EAAY;AAC7C,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM;MACjC,GAAG,IAAA;AACH,MAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,sBAAsB;KAC1D,CAAA;AACH,EAAA;AAEA,EAAA,QAAQ,IAAI,WAAA;IACV,KAAK,aAAA;AACH,MAAA,OAAO,IAAA,CAAK,2BAAA;IACd,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,4BAAA;IACd,KAAK,OAAA;AACH,MAAA,OAAO,IAAA,CAAK,wBAAA,KAA6B,QAAA,GACrC,IAAA,CAAK,8BACL,IAAA,CAAK,4BAAA;AACb;AACF;AAEA,SAAS,eAAe,MAAA,EAA6B;AACnD,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,UAAA,EAAW;AAC3B,EAAA,CAAA,CAAA,OAAQ,CAAA,EAAA;AACN,IAAA,OAAO,IAAA;AACT,EAAA;AACF;AClFO,SAAS,eAAA,CACd,KACA,IAAA,EAC6B;AAC7B,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AACrC;ACGO,SAAS,WAAA,CAAY,KAAgB,IAAA,EAAgC;AAC1E,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM;IACzC,GAAG,IAAA;AACH,IAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,OAAO;GAC3C,CAAA;AAED,EAAA,MAAM,MAAA,GAA6B;IACjC,IAAA,EAAM,OAAA;IACN,WAAA,EAAa,IAAA;AACb,IAAA;AACF,GAAA;AAEA,EAAA,IAAI,IAAI,OAAA,EAAS;AACf,IAAA,MAAA,CAAO,QAAA,GAAW,IAAI,OAAA,CAAQ,KAAA;AAChC,EAAA;AAEA,EAAA,IAAI,IAAI,OAAA,EAAS;AACf,IAAA,MAAA,CAAO,QAAA,GAAW,IAAI,OAAA,CAAQ,KAAA;AAChC,EAAA;AAEA,EAAA,OAAO,MAAA;AACT;AChBO,SAAS,aAAA,CACd,KACA,IAAA,EACsB;AACtB,EAAA,IAAI,IAAI,IAAA,EAAM;AACZ,IAAA,OAAO;MACL,IAAA,EAAM,OAAA;AACN,MAAA,QAAA,EAAU,IAAI,KAAA,CAAM,MAAA;AACpB,MAAA,KAAA,EAAO,IAAI,KAAA,CACR,GAAA;AAAI,QAAA,CAAC,CAAA,EAAG,CAAA,KACP,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM;UACf,GAAG,IAAA;AACH,UAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,aAAa,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA,CAAE;SACnD;OACH,CACC,MAAA;QACC,CAAC,GAAA,EAAwB,MAAO,CAAA,KAAM,MAAA,GAAY,MAAM,CAAC,GAAG,KAAK,CAAC,CAAA;QAClE;AACF,OAAA;MACF,eAAA,EAAiB,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM;QACvC,GAAG,IAAA;AACH,QAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,iBAAiB;OACrD;AACH,KAAA;EACF,CAAA,MAAO;AACL,IAAA,OAAO;MACL,IAAA,EAAM,OAAA;AACN,MAAA,QAAA,EAAU,IAAI,KAAA,CAAM,MAAA;AACpB,MAAA,QAAA,EAAU,IAAI,KAAA,CAAM,MAAA;AACpB,MAAA,KAAA,EAAO,IAAI,KAAA,CACR,GAAA;AAAI,QAAA,CAAC,CAAA,EAAG,CAAA,KACP,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM;UACf,GAAG,IAAA;AACH,UAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,aAAa,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA,CAAE;SACnD;OACH,CACC,MAAA;QACC,CAAC,GAAA,EAAwB,MAAO,CAAA,KAAM,MAAA,GAAY,MAAM,CAAC,GAAG,KAAK,CAAC,CAAA;QAClE;AACF;AACJ,KAAA;AACF,EAAA;AACF;ACtDO,SAAS,iBAAA,GAA8C;AAC5D,EAAA,OAAO;AACL,IAAA,GAAA,EAAK,WAAA;AACP,GAAA;AACF;ACNO,SAAS,eAAA,GAA0C;AACxD,EAAA,OAAO,WAAA,EAAY;AACrB;ACEO,SAAS,QAAA,CACd,GAAA,EACA,IAAA,EACA,eAAA,GAAkB,KAAA,EACW;AAZ/B,EAAA,IAAAZ,IAAAA;AAaE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAElC,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,MAAM,kBAAiBA,IAAAA,GAAA,IAAA,CAAK,QAAA,KAAL,IAAA,GAAA,SAAAA,IAAAA,CAAA,IAAA;AAAA,MAAA,IAAA;AACrB,MAAA,GAAA;AACA,MAAA,IAAA;AACA,MAAA,QAAA;AACA,MAAA;AAAA,KAAA;AAGF,IAAA,IAAI,mBAAmB,cAAA,EAAgB;AACrC,MAAA,OAAO,cAAA;AACT,IAAA;AACF,EAAA;AAEA,EAAA,IAAI,QAAA,IAAY,CAAC,eAAA,EAAiB;AAChC,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA;AAEzC,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,OAAO,UAAA;AACT,IAAA;AACF,EAAA;AAEA,EAAA,MAAM,UAAgB,EAAE,GAAA,EAAK,MAAM,IAAA,CAAK,WAAA,EAAa,YAAY,MAAA,EAAU;AAE3E,EAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAE1B,EAAA,MAAM,kBAAA,GAAqB,YAAA,CAAa,GAAA,EAAM,GAAA,CAAY,UAAU,IAAI,CAAA;AAGxE,EAAA,MAAMQ,WAAAA,GACJ,OAAO,kBAAA,KAAuB,UAAA,GAC1B,SAAS,kBAAA,EAAmB,EAAG,IAAI,CAAA,GACnC,kBAAA;AAEN,EAAA,IAAIA,WAAAA,EAAY;AACd,IAAA,OAAA,CAAQ,GAAA,EAAK,MAAMA,WAAU,CAAA;AAC/B,EAAA;AAEA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,WAAA,CAAYA,WAAAA,EAAY,KAAK,IAAI,CAAA;AAEhE,IAAA,OAAA,CAAQ,UAAA,GAAaA,WAAAA;AAErB,IAAA,OAAO,iBAAA;AACT,EAAA;AAEA,EAAA,OAAA,CAAQ,UAAA,GAAaA,WAAAA;AAErB,EAAA,OAAOA,WAAAA;AACT;ACdO,SAAS,WACd,YAAA,EACoB;AAEpB,EAAA,IAAI,MAAA;AACJ,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAA,GAAS,YAAA,EAAa;AACxB,IAAA;AACA,IAAA,OAAO,MAAA;AACT,EAAA,CAAA;AACF;AAkCO,SAAS,WACdA,WAAAA,EAIA;AACE,EAAA;AACF,CAAA,GAII,EAAC,EACW;AAChB,EAAA,OAAO;AACL,IAAA,CAAC,YAAY,GAAG,IAAA;IAChB,KAAA,EAAO,MAAA;;AACP,IAAA,IAAI,UAAA,GAAa;AACf,MAAA,IAAI,OAAOA,gBAAe,UAAA,EAAY;AACpCA,QAAAA,WAAAA,GAAaA,WAAAA,EAAW;AAC1B,MAAA;AACA,MAAA,OAAOA,WAAAA;AACT,IAAA,CAAA;AACA,IAAA;AACF,GAAA;AACF;AAEA,SAAS,SAAS,KAAA,EAAiC;AACjD,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,YAAA,IAAgB,KAAA,IAChB,KAAA,CAAM,YAAY,CAAA,KAAM,IAAA,IACxB,YAAA,IAAgB,SAChB,UAAA,IAAc,KAAA;AAElB;AAEO,SAAS,SACd,MAAA,EACgB;AAChB,EAAA,OAAO,MAAA,IAAU,IAAA,GACb,UAAA,CAAW,EAAE,UAAA,EAAY,EAAC,EAAG,oBAAA,EAAsB,KAAA,EAAO,CAAA,GAC1D,QAAA,CAAS,MAAM,CAAA,GACb,MAAA,GACA,WAAA,IAAe,MAAA,GACb,MAAA,CAAO,WAAW,CAAA,CAAE,MAAA,KAAW,KAAA,GAC7B,SAAA,CAAU,MAA2B,CAAA,GACrC,cAAA,CAAe,MAAgC,CAAA,GACjD,MAAA,EAAO;AACjB;AAEA,SAAS,eACPK,eAAAA,EACgB;AAChB,EAAA,OAAO,UAAA;IACL,MACE,mCAAA;MACEA,eAAAA,CAAe,WAAW,CAAA,CAAE,UAAA,CAAW,KAAA,CAAM;QAC3C,MAAA,EAAQ;OACT;AACH,KAAA;AACF,IAAA;AACE,MAAA,QAAA,EAAU,OAAM,KAAA,KAAS;AACvB,QAAA,MAAM,SAAS,MAAMA,eAAAA,CAAe,WAAW,CAAA,CAAE,SAAS,KAAK,CAAA;AAC/D,QAAA,OAAO,OAAA,IAAW,SACd,EAAE,OAAA,EAAS,MAAM,KAAA,EAAO,MAAA,CAAO,OAAM,GACrC;UACE,OAAA,EAAS,KAAA;AACT,UAAA,KAAA,EAAO,IAAI,mBAAA,CAAoB;AAC7B,YAAA,KAAA;AACA,YAAA,KAAA,EAAO,MAAA,CAAO;WACf;AACH,SAAA;AACN,MAAA;AACF;AACF,GAAA;AACF;AAEO,SAAS,UAAA,CACdC,YACA,OAAA,EASgB;AAvLlB,EAAA,IAAAd,IAAAA;AAyLE,EAAA,MAAM,aAAA,GAAA,CAAgBA,OAAA,OAAA,IAAA,IAAA,GAAA,SAAA,OAAA,CAAS,aAAA,KAAT,OAAAA,IAAAA,GAA0B,KAAA;AAEhD,EAAA,OAAO,UAAA;;AAEL,IAAA,MACE,iBAAiBc,UAAAA,EAAW;AAC1B,MAAA,YAAA,EAAc,gBAAgB,MAAA,GAAS;KACxC,CAAA;AACH,IAAA;AACE,MAAA,QAAA,EAAU,OAAM,KAAA,KAAS;AACvB,QAAA,MAAM,MAAA,GAAS,MAAMA,UAAAA,CAAU,cAAA,CAAe,KAAK,CAAA;AACnD,QAAA,OAAO,MAAA,CAAO,OAAA,GACV,EAAE,OAAA,EAAS,MAAM,KAAA,EAAO,MAAA,CAAO,IAAA,EAAK,GACpC,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAC5C,MAAA;AACF;AACF,GAAA;AACF;AAEO,SAAS,UAAA,CACdA,YACA,OAAA,EASgB;AAvNlB,EAAA,IAAAd,IAAAA;AAyNE,EAAA,MAAM,aAAA,GAAA,CAAgBA,OAAA,OAAA,IAAA,IAAA,GAAA,SAAA,OAAA,CAAS,aAAA,KAAT,OAAAA,IAAAA,GAA0B,KAAA;AAEhD,EAAA,OAAO,UAAA;;IAEL,MACE,mCAAA;AACK,MAAA,EAAA,CAAA,YAAA,CAAac,UAAAA,EAAW;QACzB,MAAA,EAAQ,SAAA;QACR,EAAA,EAAI,OAAA;AACJ,QAAA,MAAA,EAAQ,gBAAgB,KAAA,GAAQ;OACjC;AACH,KAAA;AACF,IAAA;AACE,MAAA,QAAA,EAAU,OAAM,KAAA,KAAS;AACvB,QAAA,MAAM,MAAA,GAAS,MAAS,EAAA,CAAA,cAAA,CAAeA,UAAAA,EAAW,KAAK,CAAA;AACvD,QAAA,OAAO,MAAA,CAAO,OAAA,GACV,EAAE,OAAA,EAAS,MAAM,KAAA,EAAO,MAAA,CAAO,IAAA,EAAK,GACpC,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAM;AAC5C,MAAA;AACF;AACF,GAAA;AACF;AAEO,SAAS,aACdA,UAAAA,EACyC;AAEzC,EAAA,OAAO,MAAA,IAAUA,UAAAA;AACnB;AAEO,SAAS,SAAA,CACdA,YAGA,OAAA,EASgB;AAChB,EAAA,IAAI,YAAA,CAAaA,UAAS,CAAA,EAAG;AAC3B,IAAA,OAAO,UAAA,CAAWA,YAAW,OAAO,CAAA;EACtC,CAAA,MAAO;AACL,IAAA,OAAO,UAAA,CAAWA,YAAW,OAAO,CAAA;AACtC,EAAA;AACF;AC7PA,eAAsB,aAAA,CAAsB;AAC1C,EAAA,KAAA;AACA,EAAA,MAAA;AACA,EAAA;AACF,CAAA,EAIoB;AAClB,EAAA,MAAM,SAAS,MAAM,iBAAA,CAAkB,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA;AAEjE,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAMC,mBAAAA,CAAoB,KAAK,EAAE,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA;AACxE,EAAA;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AAYA,eAAsB,iBAAA,CAA0B;AAC9C,EAAA,KAAA;AACA,EAAA,MAAA;AACA,EAAA;AACF,CAAA,EAeE;AACA,EAAA,MAAM,YAAA,GAAe,SAAS,MAAM,CAAA;AAEpC,EAAA,IAAI;AACF,IAAA,IAAI,YAAA,CAAa,YAAY,IAAA,EAAM;AACjC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAwB,UAAU,KAAA,EAAM;AAClE,IAAA;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAEhD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,MAAA,CAAO,KAAA,EAAO,UAAU,KAAA,EAAM;AAC/D,IAAA;AAEA,IAAA,OAAO;MACL,OAAA,EAAS,KAAA;MACT,KAAA,EAAOA,mBAAAA,CAAoB,KAAK,EAAE,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA;MACvE,QAAA,EAAU;AACZ,KAAA;AACF,EAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,IAAA,OAAO;MACL,OAAA,EAAS,KAAA;AACT,MAAA,KAAA,EAAOA,oBAAoB,IAAA,CAAK,EAAE,OAAO,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;MAChE,QAAA,EAAU;AACZ,KAAA;AACF,EAAA;AACF;ACvDA,eAAsB,SAAA,CAAa;AACjC,EAAA,IAAA;AACA,EAAA;AACF,CAAA,EAGe;AACb,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,gBAAgB,IAAI,CAAA;AAElC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,OAAO,aAAA,CAAiB,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAC3C,EAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,IAAA,IACE,eAAe,UAAA,CAAW,KAAK,KAC/BA,mBAAAA,CAAoB,UAAA,CAAW,KAAK,CAAA,EACpC;AACA,MAAA,MAAM,KAAA;AACR,IAAA;AAEA,IAAA,MAAM,IAAI,cAAA,CAAe,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AACjD,EAAA;AACF;AAgCA,eAAsB,aAAA,CAAiB;AACrC,EAAA,IAAA;AACA,EAAA;AACF,CAAA,EAG4B;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,gBAAgB,IAAI,CAAA;AAElC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAmB,UAAU,KAAA,EAAM;AAC7D,IAAA;AAEA,IAAA,OAAO,MAAM,iBAAA,CAAqB,EAAE,KAAA,EAAO,QAAQ,CAAA;AACrD,EAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,IAAA,OAAO;MACL,OAAA,EAAS,KAAA;MACT,KAAA,EAAO,cAAA,CAAe,UAAA,CAAW,KAAK,CAAA,GAClC,KAAA,GACA,IAAI,cAAA,CAAe,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;MAC7C,QAAA,EAAU;AACZ,KAAA;AACF,EAAA;AACF;AAEO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,IAAI;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,OAAO,IAAA;AACT,EAAA,CAAA,CAAA,OAAQ,CAAA,EAAA;AACN,IAAA,OAAO,KAAA;AACT,EAAA;AACF;AC/GO,SAAS,oBAAA,CAAwB;AACtC,EAAA,MAAA;AACA,EAAA;AACF,CAAA,EAGmC;AACjC,EAAA,OAAO,MAAA,CACJ,WAAA,CAAY,IAAI,iBAAA,EAAmB,EACnC,WAAA,CAAY,IAAI,uBAAA,EAAyB,CAAA,CACzC,WAAA;AACC,IAAA,IAAI,eAAA,CAAoD;AACtD,MAAA,MAAM,SAAA,CAAU,EAAE,IAAA,EAAK,EAAG,UAAA,EAAY;AAEpC,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA;AACF,QAAA;AAEA,QAAA,UAAA,CAAW,OAAA,CAAQ,MAAM,aAAA,CAAc,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;AAChE,MAAA;KACD;AACH,GAAA;AACJ;AC5BA,eAAsB,oBAAA,CAA8B;AAClD,EAAA,QAAA;AACA,EAAA,eAAA;AACA,EAAA;AACF,CAAA,EAIiC;AAC/B,EAAA,IAAA,CAAI,mBAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAkB,QAAA,MAAa,IAAA,EAAM;AACvC,IAAA,OAAO,MAAA;AACT,EAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,MAAM,iBAAA,CAAuC;AACzE,IAAA,KAAA,EAAO,gBAAgB,QAAQ,CAAA;AAC/B,IAAA;GACD,CAAA;AAED,EAAA,IAAI,CAAC,sBAAsB,OAAA,EAAS;AAClC,IAAA,MAAM,IAAIC,oBAAAA,CAAqB;MAC7B,QAAA,EAAU,iBAAA;AACV,MAAA,OAAA,EAAS,WAAW,QAAQ,CAAA,iBAAA,CAAA;AAC5B,MAAA,KAAA,EAAO,qBAAA,CAAsB;KAC9B,CAAA;AACH,EAAA;AAEA,EAAA,OAAO,qBAAA,CAAsB,KAAA;AAC/B;ACwPO,SAAS,KAAKZ,KAAAA,EAAgB;AACnC,EAAA,OAAOA,KAAAA;AACT;AAKO,SAAS,YAAYA,KAAAA,EAmC1B;AACA,EAAA,OAAO,EAAE,GAAGA,KAAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AACpC;ACrTO,SAAS,yBAAA,CAAsD;AACpE,EAAA,EAAA;AACA,EAAA;AACF,CAAA,EAGqC;AACnC,EAAA,OAAO,CAAS;AACd,IAAA,OAAA;AACA,IAAA,YAAA;AACA,IAAA,aAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,gBAAA;IACA,GAAG;AACL,GAAA,KASE,IAAA,CAAK;IACH,IAAA,EAAM,UAAA;AACN,IAAA,EAAA;AACA,IAAA,IAAA;AACA,IAAA,WAAA;AACA,IAAA,YAAA;AACA,IAAA,OAAA;AACA,IAAA,aAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA;GACD,CAAA;AACL;AAiBO,SAAS,yCAAA,CAId;AACA,EAAA,EAAA;AACA,EAAA,WAAA;AACA,EAAA,YAAA;AACA,EAAA;AACF,CAAA,EAe6D;AAC3D,EAAA,OAAO,CAAC;AACN,IAAA,OAAA;AACA,IAAA,aAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,gBAAA;IACA,GAAG;AACL,GAAA,KAQE,IAAA,CAAK;IACH,IAAA,EAAM,UAAA;AACN,IAAA,EAAA;AACA,IAAA,IAAA;AACA,IAAA,WAAA;AACA,IAAA,YAAA;AACA,IAAA,OAAA;AACA,IAAA,aAAA;AACA,IAAA,aAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,gBAAA;AACA,IAAA;GACD,CAAA;AACL;ACvHO,SAAS,uBACd,MAAA,EACmB;AACnB,EAAA,OAAO,MAAA,CAAO,WAAA;IACZ,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM,KAAA,IAAS,IAAI;AAChE,GAAA;AACF;ACHA,eAAsB,QAAW,KAAA,EAAkC;AAEjE,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,KAAA,GAAS,KAAA,EAAmB;AAC9B,EAAA;AAGA,EAAA,OAAO,OAAA,CAAQ,QAAQ,KAAU,CAAA;AACnC;AChBO,SAAS,qBAAqB,GAAA,EAAyB;AAC5D,EAAA,OAAO,OAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAK,OAAA,CAAQ,OAAO,EAAA,CAAA;AAC7B;ACFO,SAAS,gBAAyB,GAAA,EAAmC;AAC1E,EAAA,OAAO,OAAO,IAAA,IAAQ,OAAO,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA,KAAM,UAAA;AAC7D;ACCA,gBAAuB,WAAA,CAA2B;AAChD,EAAA,OAAA;AACA,EAAA,KAAA;AACA,EAAA;AACF,CAAA,EAME;AACA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA;AAErC,EAAA,IAAI,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC3B,IAAA,IAAI,UAAA;AACJ,IAAA,WAAA,MAAiB,UAAU,MAAA,EAAQ;AACjC,MAAA,UAAA,GAAa,MAAA;AACb,MAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,MAAA,EAAO;AACtC,IAAA;AACA,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY;EAC7C,CAAA,MAAO;AACL,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,MAAM,MAAA,EAAO;AAC9C,EAAA;AACF;ICrBa,cAAA,E3DFL,IAAA,EAAM,M4DDRF,MAAAA,EACAJ,QAAAA,EACAC,UAJNC,IAAAA,EAAAC,IAAAA,EAMa,aAAA,EzDOA,yBAAA,E0DDA,iBAAA,EA4CA,UAAA,EtDrDP,6BAEA,eAAA,EuDHO,OAAA,ECSP,kBAEO,UAAA,EpDPP,qBAAA,EACA,uBAEA,sBAAA,EOcA,cAAA,EACA,oBAAA,E8CdO,cAAA,EAsDA,cAAA,EAsBA,iBAAA,EClFA,exCyCP,iBAAA,EIlCA,sBAAA,EERF,YAQS,WAAA,EA6PP,aAAA,EM9PO,mBA8GP,OAAA,E6BlHO,gBAAA,ECAA,gBAAA,ECFA,gBAAA,ECgCA,YAAA,ECpCA,eAAA,ExBiEP,SAkCA,OAAA,EyBnFO,OAAA,ECTP,gBAAA,EzBGA,YAAA,E0BCAgB,iBAAAA,EAEO,aAAA,EAiCA,mBA8BA,SAAA,EC5DA,8BAAA,EAkEA,gCAAA,EAoBA,yBAAA,EA+BA,2BAAA,EAmCA,oCAAA;;;AdxKb,IAAA,SAAA,EAAA;ACAA,IAAA,SAAA,EAAA;AEAA,IAAA,SAAA,EAAA;AxDAA,IAAA,SAAA,EAAA;AOAA,IAAA,SAAA,EAAA;AEAA,IAAA,SAAA,EAAA;AiCAA,IAAA,SAAA,EAAA;ADAA,IAAA,SAAA,EAAA;ADAA,IAAA,SAAA,EAAA;AGAA,IAAA,WAAA,EAAA;ACAA,IAAA,SAAA,EAAA;AsBAA,IAAA,SAAA,EAAA;ACAA,IAAA,SAAA,EAAA;ACmEA,IAAA,WAAA,EAAA;AhB9DO,IAAM,iBAAN,MAAwB;MAAxB,WAAA,GAAA;AACL,QAAA,IAAA,CAAQ,MAAA,GAGmC,EAAE,IAAA,EAAM,SAAA,EAAU;AAE7D,QAAA,IAAA,CAAQ,QAAA,GAA6C,MAAA;AACrD,QAAA,IAAA,CAAQ,OAAA,GAAkD,MAAA;AAAA,MAAA;AAE1D,MAAA,IAAI,OAAA,GAAsB;AACxB,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,OAAO,IAAA,CAAK,QAAA;AACd,QAAA;AAEA,QAAA,IAAA,CAAK,QAAA,GAAW,IAAI,OAAA,CAAW,CAACZ,UAAS,MAAA,KAAW;AAClD,UAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AACnCA,YAAAA,QAAAA,CAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;UAC3B,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC1C,YAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAC1B,UAAA;AAEA,UAAA,IAAA,CAAK,QAAA,GAAWA,QAAAA;AAChB,UAAA,IAAA,CAAK,OAAA,GAAU,MAAA;QACjB,CAAC,CAAA;AAED,QAAA,OAAO,IAAA,CAAK,QAAA;AACd,MAAA;AAEA,MAAA,OAAA,CAAQ,KAAA,EAAgB;AAjC1B,QAAA,IAAAL,IAAAA;AAkCI,QAAA,IAAA,CAAK,MAAA,GAAS,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM;AAExC,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,CAAAA,IAAAA,GAAA,KAAK,QAAA,KAAL,IAAA,GAAA,SAAAA,IAAAA,CAAA,IAAA,CAAA,MAAgB,KAAA,CAAA;AAClB,QAAA;AACF,MAAA;AAEA,MAAA,MAAA,CAAO,KAAA,EAAsB;AAzC/B,QAAA,IAAAA,IAAAA;AA0CI,QAAA,IAAA,CAAK,MAAA,GAAS,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM;AAExC,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,CAAAA,IAAAA,GAAA,KAAK,OAAA,KAAL,IAAA,GAAA,SAAAA,IAAAA,CAAA,IAAA,CAAA,MAAe,KAAA,CAAA;AACjB,QAAA;AACF,MAAA;MAEA,UAAA,GAAsB;AACpB,QAAA,OAAO,IAAA,CAAK,OAAO,IAAA,KAAS,UAAA;AAC9B,MAAA;MAEA,UAAA,GAAsB;AACpB,QAAA,OAAO,IAAA,CAAK,OAAO,IAAA,KAAS,UAAA;AAC9B,MAAA;MAEA,SAAA,GAAqB;AACnB,QAAA,OAAO,IAAA,CAAK,OAAO,IAAA,KAAS,SAAA;AAC9B,MAAA;AACF,KAAA;A3DzDA,IAAA,CAAM,EAAE,MAAM,IAAA,EAAA,GAAS,UAAA;A4DDvB,IAAME,MAAAA,GAAO,kBAAA;AACb,IAAMJ,QAAAA,GAAS,mBAAmBI,MAAI,CAAA,CAAA;AACtC,IAAMH,QAAAA,GAAS,MAAA,CAAO,GAAA,CAAID,QAAM,CAAA;AAEzB,IAAM,gBAAN,eAA4BG,IAAAA,GAAA,UAAA,EACfD,IAAAA,GAAAD,UADeE,IAAAA,EAAW;MAO5C,WAAA,CAAY;AACV,QAAA,GAAA;AACA,QAAA,UAAA;AACA,QAAA,UAAA;AACA,QAAA,KAAA;AACA,QAAA,OAAA,GAAU,KAAA,IAAS,IAAA,GACf,CAAA,mBAAA,EAAsB,GAAG,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,GACtD,CAAA,mBAAA,EAAsB,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA;OACzC,EAMG;AACD,QAAA,KAAA,CAAM,EAAE,IAAA,EAAAC,MAAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AArBhC,QAAA,IAAA,CAAkBF,IAAA,CAAA,GAAU,IAAA;AAuB1B,QAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,QAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AACpB,MAAA;AAEA,MAAA,OAAO,WAAW,KAAA,EAAwC;AACxD,QAAA,OAAO,UAAA,CAAW,SAAA,CAAU,KAAA,EAAOF,QAAM,CAAA;AAC3C,MAAA;AACF,KAAA;AzDzBO,IAAM,yBAAA,GAA4B,CAAA,GAAI,IAAA,GAAO,IAAA,GAAO,IAAA;A0DDpD,IAAM,oBAAoB,CAAC;AAChC,MAAA,MAAA;MACA,IAAA,GAAO,EAAA;MACP,QAAA,GAAW,gEAAA;MACX,SAAA,GAAY;AACd,KAAA,GAKI,EAAC,KAAmB;AACtB,MAAA,MAAM,YAAY,MAAM;AACtB,QAAA,MAAM,iBAAiB,QAAA,CAAS,MAAA;AAChC,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,UAAA,KAAA,CAAM,CAAC,CAAA,GAAI,QAAA,CAAU,KAAK,MAAA,EAAO,GAAI,iBAAkB,CAAC,CAAA;AAC1D,QAAA;AACA,QAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB,MAAA,CAAA;AAEA,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,OAAO,SAAA;AACT,MAAA;AAGA,MAAA,IAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,oBAAA,CAAqB;UAC7B,QAAA,EAAU,WAAA;UACV,OAAA,EAAS,CAAA,eAAA,EAAkB,SAAS,CAAA,oCAAA,EAAuC,QAAQ,CAAA,EAAA;SACpF,CAAA;AACH,MAAA;AAEA,MAAA,OAAO,MAAM,CAAA,EAAG,MAAM,GAAG,SAAS,CAAA,EAAG,WAAW,CAAA,CAAA;AAClD,IAAA,CAAA;AAWO,IAAM,aAAa,iBAAA,EAAkB;AtDrD5C,IAAM,2BAAA,GAA8B,CAAC,cAAA,EAAgB,iBAAiB,CAAA;AAEtE,IAAM,eAAA,GAAkB;AACtB,MAAA,mBAAA;AACA,MAAA,kBAAA;AACA,MAAA,oBAAA;AACA,MAAA,YAAA;AACA,MAAA,cAAA;AACA,MAAA,WAAA;AACA,MAAA;AACF,KAAA;AuDXO,IAAM,OAAA,GAEP,QAAA,CACA;ACMN,IAAM,gBAAA,GAAmB,MAAM,UAAA,CAAW,KAAA;AAEnC,IAAM,aAAa,OAAU;AAClC,MAAA,GAAA;AACA,MAAA,OAAA,GAAU,EAAC;AACX,MAAA,yBAAA;AACA,MAAA,qBAAA;AACA,MAAA,WAAA;AACA,MAAA,KAAA,EAAAoB,SAAQ,gBAAA;KACV,KAOM;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAMA,MAAAA,CAAM,GAAA,EAAK;UAChC,MAAA,EAAQ,KAAA;UACR,OAAA,EAAS,mBAAA;AACP,YAAA,OAAA;AACA,YAAA,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAA;YAChC,8BAAA;AACF,WAAA;UACA,MAAA,EAAQ;SACT,CAAA;AAED,QAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAEvD,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,IAAI,gBAAA;AAKJ,UAAA,IAAI;AACF,YAAA,gBAAA,GAAmB,MAAM,qBAAA,CAAsB;AAC7C,cAAA,QAAA;AACA,cAAA,GAAA;AACA,cAAA,iBAAA,EAAmB;aACpB,CAAA;AACH,UAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,YAAA,IAAI,aAAa,KAAK,CAAA,IAAKC,YAAAA,CAAa,UAAA,CAAW,KAAK,CAAA,EAAG;AACzD,cAAA,MAAM,KAAA;AACR,YAAA;AAEA,YAAA,MAAM,IAAIA,YAAAA,CAAa;cACrB,OAAA,EAAS,kCAAA;cACT,KAAA,EAAO,KAAA;AACP,cAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,cAAA,GAAA;AACA,cAAA,eAAA;AACA,cAAA,iBAAA,EAAmB;aACpB,CAAA;AACH,UAAA;AAEA,UAAA,MAAM,gBAAA,CAAiB,KAAA;AACzB,QAAA;AAEA,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,yBAAA,CAA0B;AACrC,YAAA,QAAA;AACA,YAAA,GAAA;AACA,YAAA,iBAAA,EAAmB;WACpB,CAAA;AACH,QAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,UAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,YAAA,IAAI,aAAa,KAAK,CAAA,IAAKA,YAAAA,CAAa,UAAA,CAAW,KAAK,CAAA,EAAG;AACzD,cAAA,MAAM,KAAA;AACR,YAAA;AACF,UAAA;AAEA,UAAA,MAAM,IAAIA,YAAAA,CAAa;YACrB,OAAA,EAAS,uCAAA;YACT,KAAA,EAAO,KAAA;AACP,YAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,YAAA,GAAA;AACA,YAAA,eAAA;AACA,YAAA,iBAAA,EAAmB;WACpB,CAAA;AACH,QAAA;AACF,MAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,QAAA,MAAM,iBAAiB,EAAE,KAAA,EAAO,KAAK,iBAAA,EAAmB,IAAI,CAAA;AAC9D,MAAA;AACF,IAAA,CAAA;ApD1FA,IAAM,qBAAA,GAAwB,cAAA;AAC9B,IAAM,qBAAA,GACJ,wEAAA;AACF,IAAM,sBAAA,GAAyB,4BAAA;AOc/B,IAAM,cAAA,GAAiB,iBAAA;AACvB,IAAM,oBAAA,GAAuB,mBAAA;A8CdtB,IAAM,cAAA,mBAAiB,MAAA;AAC5B,MAAA;AACF,KAAA;AAoDO,IAAM,cAAA,GAA0B;MACrC,IAAA,EAAM,MAAA;MACN,YAAA,EAAc,MAAA;AACd,MAAA,QAAA,EAAU,CAAC,GAAG,CAAA;MACd,cAAA,EAAgB,OAAA;MAChB,YAAA,EAAc,KAAA;MACd,YAAA,EAAc,kBAAA;MACd,WAAA,EAAa,SAAA;MACb,wBAAA,EAA0B,aAAA;MAC1B,2BAAA,EAA6B,IAAA;MAC7B,4BAAA,EAA8B,KAAA;MAC9B,cAAA,EAAgB,aAAA;MAChB,YAAA,EAAc,KAAA;AACd,MAAA,WAAA,EAAa,EAAC;MACd,aAAA,EAAe,KAAA;MACf,eAAA,EAAiB,QAAA;MACjB,eAAA,EAAiB,KAAA;MACjB,aAAA,EAAe,cAAA;MACf,cAAA,EAAgB,wBAAA;MAChB,YAAA,EAAc;AAChB,KAAA;AAEO,IAAM,iBAAA,GAAoB,CAC/B,OAAA,KAEC,OAAO,YAAY,QAAA,GAChB;MACE,GAAG,cAAA;MACH,IAAA,EAAM;KACR,GACA;MACE,GAAG,cAAA;MACH,GAAG;AACL,KAAA;AC7FC,IAAM,aAAA,GAAgB,CAAC,GAAA,EAAuB,IAAA,KAAe;AAClE,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AAC1C,IAAA,CAAA;AxCuCA,IAAM,iBAAA,GAAoB,CAAC,GAAA,KAAoB;AAC7C,MAAA,MAAM,GAAA,GAA2B;QAC/B,IAAA,EAAM,SAAA;QACN,MAAA,EAAQ;AACV,OAAA;AAEA,MAAA,KAAA,MAAW,KAAA,IAAS,IAAI,MAAA,EAAQ;AAC9B,QAAA,QAAQ,MAAM,IAAA;UACZ,KAAK,KAAA;AACH,YAAA,GAAA,CAAI,UAAU,KAAA,CAAM,KAAA;AACpB,YAAA;UACF,KAAK,KAAA;AACH,YAAA,GAAA,CAAI,UAAU,KAAA,CAAM,KAAA;AACpB,YAAA;AACJ;AACF,MAAA;AAEA,MAAA,OAAO,GAAA;AACT,IAAA,CAAA;AIpDA,IAAM,sBAAA,GAAyB,CAC7B,IAAA,KACiC;AACjC,MAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,UAAU,OAAO,KAAA;AACrD,MAAA,OAAO,OAAA,IAAW,IAAA;AACpB,IAAA,CAAA;AEbA,IAAI,UAAA,GAAiC,MAAA;AAQ9B,IAAM,WAAA,GAAc;;;;MAIzB,IAAA,EAAM,kBAAA;MACN,KAAA,EAAO,aAAA;MACP,IAAA,EAAM,0BAAA;;;;MAIN,KAAA,EACE,kGAAA;;;;;;;;;;;;AAYF,MAAA,KAAA,EAAO,MAAM;AACX,QAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,UAAA,UAAA,GAAa,MAAA;AACX,YAAA,sDAAA;AACA,YAAA;AACF,WAAA;AACF,QAAA;AACA,QAAA,OAAO,UAAA;AACT,MAAA,CAAA;;;;MAIA,IAAA,EAAM,uFAAA;;;;MAIN,IAAA,EAAM,qHAAA;MACN,QAAA,EACE,0IAAA;;;;MAIF,IAAA,EAAM,8XAAA;MACN,QAAA,EACE,yrBAAA;MACF,MAAA,EAAQ,kEAAA;MACR,SAAA,EACE,wEAAA;MACF,MAAA,EAAQ,qBAAA;MACR,GAAA,EAAK;AACP,KAAA;AAwMA,IAAM,gBAAgB,IAAI,GAAA;AACxB,MAAA;AACF,KAAA;AMhQO,IAAM,iBAAA,GAAoB;MAC/B,SAAA,EAAW,QAAA;MACX,SAAA,EAAW,QAAA;MACX,SAAA,EAAW,SAAA;MACX,UAAA,EAAY,SAAA;MACZ,OAAA,EAAS;AACX,KAAA;AAwGA,IAAM,OAAA,GAAU,CACd,GAAA,EACA,IAAA,KACqE;AACrE,MAAA,MAAM,KAAA,GAAA,CACH,GAAA,CAAI,OAAA,YAAmB,GAAA,GACpB,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,CAAA,GAC/B,GAAA,CAAI,OAAA,EAEP,GAAA;AAAI,QAAA,CAAC,CAAA,EAAG,CAAA,KACP,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM;UACf,GAAG,IAAA;AACH,UAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,aAAa,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA,CAAE;SACnD;OACH,CACC,MAAA;AACC,QAAA,CAAC,CAAA,KACC,CAAC,CAAC,CAAA,KACD,CAAC,IAAA,CAAK,YAAA,IACJ,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,MAAA,GAAS,CAAA;AACxD,OAAA;AAEF,MAAA,OAAO,KAAA,CAAM,MAAA,GAAS,EAAE,KAAA,EAAM,GAAI,MAAA;AACpC,IAAA,CAAA;A6BzIO,IAAM,gBAAA,GAAmB,CAC9B,GAAA,EACA,IAAA,KACgC;AATlC,MAAA,IAAAnB,IAAAA;AAUE,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS,MAAA,CAAMA,IAAAA,GAAA,IAAA,CAAK,YAAA,KAAL,IAAA,GAAA,MAAA,GAAAA,IAAAA,CAAmB,QAAA,EAAA,CAAA,EAAY;AACjE,QAAA,OAAO,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AAC1C,MAAA;AAEA,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM;QAC/C,GAAG,IAAA;AACH,QAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,SAAS,GAAG;OAChD,CAAA;AAED,MAAA,OAAO,WAAA,GACH,EAAE,KAAA,EAAO,CAAC,EAAE,GAAA,EAAK,WAAA,EAAY,EAAE,EAAG,WAAW,CAAA,EAAE,GAC/C,WAAA,EAAY;AAClB,IAAA,CAAA;AChBO,IAAM,gBAAA,GAAmB,CAC9B,GAAA,EACA,IAAA,KACuD;AACvD,MAAA,IAAI,IAAA,CAAK,iBAAiB,OAAA,EAAS;AACjC,QAAA,OAAO,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM,IAAI,CAAA;MACnC,CAAA,MAAA,IAAW,IAAA,CAAK,iBAAiB,QAAA,EAAU;AACzC,QAAA,OAAO,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACpC,MAAA;AAEA,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,IAAA,EAAM;QAC9B,GAAG,IAAA;AACH,QAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,WAAA,EAAa,SAAS,GAAG;OAChD,CAAA;AACD,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM;QAC/B,GAAG,IAAA;AACH,QAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,aAAa,OAAA,EAAS,CAAA,GAAI,MAAM,GAAG;OAC1D,CAAA;AAED,MAAA,OAAO;QACL,KAAA,EAAO,CAAC,GAAG,CAAC,CAAA,CAAE,OAAO,CAAC,CAAA,KAA4B,MAAM,MAAS;AACnE,OAAA;AACF,IAAA,CAAA;ACxBO,IAAM,gBAAA,GAAmB,CAAC,GAAA,EAA0B,IAAA,KAAe;AACxE,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AAC1C,IAAA,CAAA;AC8BO,IAAM,YAAA,GAAe,CAC1B,GAAA,EACA,QAAA,EACA,IAAA,KACiD;AACjD,MAAA,QAAQ,QAAA;AACN,QAAA,KAAKS,qBAAAA,CAAsB,SAAA;AACzB,UAAA,OAAO,cAAA,CAAe,KAAK,IAAI,CAAA;AACjC,QAAA,KAAKA,qBAAAA,CAAsB,SAAA;AACzB,UAAA,OAAO,eAAe,GAAG,CAAA;AAC3B,QAAA,KAAKA,qBAAAA,CAAsB,SAAA;AACzB,UAAA,OAAO,cAAA,CAAe,KAAK,IAAI,CAAA;AACjC,QAAA,KAAKA,qBAAAA,CAAsB,SAAA;AACzB,UAAA,OAAO,eAAe,GAAG,CAAA;AAC3B,QAAA,KAAKA,qBAAAA,CAAsB,UAAA;AACzB,UAAA,OAAO,eAAA,EAAgB;AACzB,QAAA,KAAKA,qBAAAA,CAAsB,OAAA;AACzB,UAAA,OAAO,YAAA,CAAa,KAAK,IAAI,CAAA;AAC/B,QAAA,KAAKA,qBAAAA,CAAsB,YAAA;AACzB,UAAA,OAAO,iBAAA,EAAkB;AAC3B,QAAA,KAAKA,qBAAAA,CAAsB,OAAA;AACzB,UAAA,OAAO,YAAA,EAAa;AACtB,QAAA,KAAKA,qBAAAA,CAAsB,QAAA;AACzB,UAAA,OAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAChC,QAAA,KAAKA,qBAAAA,CAAsB,QAAA;AAC3B,QAAA,KAAKA,qBAAAA,CAAsB,qBAAA;AACzB,UAAA,OAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAChC,QAAA,KAAKA,qBAAAA,CAAsB,eAAA;AACzB,UAAA,OAAO,oBAAA,CAAqB,KAAK,IAAI,CAAA;AACvC,QAAA,KAAKA,qBAAAA,CAAsB,QAAA;AACzB,UAAA,OAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAChC,QAAA,KAAKA,qBAAAA,CAAsB,SAAA;AACzB,UAAA,OAAO,cAAA,CAAe,KAAK,IAAI,CAAA;AACjC,QAAA,KAAKA,qBAAAA,CAAsB,UAAA;AACzB,UAAA,OAAO,gBAAgB,GAAG,CAAA;AAC5B,QAAA,KAAKA,qBAAAA,CAAsB,OAAA;AACzB,UAAA,OAAO,aAAa,GAAG,CAAA;AACzB,QAAA,KAAKA,qBAAAA,CAAsB,aAAA;AACzB,UAAA,OAAO,mBAAmB,GAAG,CAAA;AAC/B,QAAA,KAAKA,qBAAAA,CAAsB,WAAA;AACzB,UAAA,OAAO,gBAAA,CAAiB,KAAK,IAAI,CAAA;AACnC,QAAA,KAAKA,qBAAAA,CAAsB,WAAA;AACzB,UAAA,OAAO,gBAAA,CAAiB,KAAK,IAAI,CAAA;AACnC,QAAA,KAAKA,qBAAAA,CAAsB,MAAA;AACzB,UAAA,OAAO,WAAA,CAAY,KAAK,IAAI,CAAA;AAC9B,QAAA,KAAKA,qBAAAA,CAAsB,MAAA;AACzB,UAAA,OAAO,WAAA,CAAY,KAAK,IAAI,CAAA;AAC9B,QAAA,KAAKA,qBAAAA,CAAsB,OAAA;AACzB,UAAA,OAAO,MAAO,GAAA,CAAY,MAAA,EAAO,CAAE,IAAA;AACrC,QAAA,KAAKA,qBAAAA,CAAsB,UAAA;AACzB,UAAA,OAAO,eAAA,CAAgB,KAAK,IAAI,CAAA;AAClC,QAAA,KAAKA,qBAAAA,CAAsB,MAAA;AAC3B,QAAA,KAAKA,qBAAAA,CAAsB,QAAA;AACzB,UAAA,OAAO,aAAA,EAAc;AACvB,QAAA,KAAKA,qBAAAA,CAAsB,UAAA;AACzB,UAAA,OAAO,eAAA,CAAgB,KAAK,IAAI,CAAA;AAClC,QAAA,KAAKA,qBAAAA,CAAsB,MAAA;AACzB,UAAA,OAAO,WAAA,EAAY;AACrB,QAAA,KAAKA,qBAAAA,CAAsB,UAAA;AACzB,UAAA,OAAO,eAAA,EAAgB;AACzB,QAAA,KAAKA,qBAAAA,CAAsB,UAAA;AACzB,UAAA,OAAO,eAAA,CAAgB,KAAK,IAAI,CAAA;AAClC,QAAA,KAAKA,qBAAAA,CAAsB,UAAA;AACzB,UAAA,OAAO,eAAA,CAAgB,KAAK,IAAI,CAAA;AAClC,QAAA,KAAKA,qBAAAA,CAAsB,WAAA;AACzB,UAAA,OAAO,gBAAA,CAAiB,KAAK,IAAI,CAAA;AACnC,QAAA,KAAKA,qBAAAA,CAAsB,QAAA;AACzB,UAAA,OAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAChC,QAAA,KAAKA,qBAAAA,CAAsB,WAAA;AACzB,UAAA,OAAO,gBAAA,CAAiB,KAAK,IAAI,CAAA;AACnC,QAAA,KAAKA,qBAAAA,CAAsB,WAAA;AAC3B,QAAA,KAAKA,qBAAAA,CAAsB,OAAA;AAC3B,QAAA,KAAKA,qBAAAA,CAAsB,SAAA;AACzB,UAAA,OAAO,MAAA;AACT,QAAA;AAEE,UAAA,uBAAQ,CAAA,CAAC,CAAA,KAAa,MAAA,EAAmB,CAAA;AAC7C;AACF,IAAA,CAAA;AClHO,IAAM,eAAA,GAAkB,CAAC,KAAA,EAAiB,KAAA,KAAoB;AACnE,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,OAAO,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAChD,QAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,KAAA,CAAM,CAAC,CAAA,EAAG;AAC7B,MAAA;AACA,MAAA,OAAO,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,EAAS,EAAG,GAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACpE,IAAA,CAAA;AxB2DA,IAAM,OAAA,GAAU,CACd,IAAA,EACA,IAAA,KAMe;AACf,MAAA,QAAQ,KAAK,YAAA;QACX,KAAK,MAAA;AACH,UAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAE;QACrC,KAAK,UAAA;AACH,UAAA,OAAO,EAAE,IAAA,EAAM,eAAA,CAAgB,KAAK,WAAA,EAAa,IAAA,CAAK,IAAI,CAAA,EAAE;QAC9D,KAAK,MAAA;AACL,QAAA,KAAK,MAAA,EAAQ;AACX,UAAA,IACE,KAAK,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,UACpC,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,OAAO,KAAA,KAAU,IAAA,CAAK,YAAY,KAAK,CAAA,KAAM,KAAK,CAAA,EACnE;AACA,YAAA,OAAA,CAAQ,IAAA;AACN,cAAA,CAAA,gCAAA,EAAmC,KAAK,WAAA,CAAY,IAAA;AAClD,gBAAA;eACD,CAAA,mBAAA;AACH,aAAA;AAEA,YAAA,OAAO,WAAA,EAAY;AACrB,UAAA;AAEA,UAAA,OAAO,IAAA,CAAK,YAAA,KAAiB,MAAA,GAAS,WAAA,EAAY,GAAI,MAAA;AACxD,QAAA;AACF;AACF,IAAA,CAAA;AAEA,IAAM,OAAA,GAAU,CACd,GAAA,EACA,IAAA,EACAD,WAAAA,KACoB;AACpB,MAAA,IAAI,IAAI,WAAA,EAAa;AACnBA,QAAAA,WAAAA,CAAW,cAAc,GAAA,CAAI,WAAA;AAC/B,MAAA;AACA,MAAA,OAAOA,WAAAA;AACT,IAAA,CAAA;AyB5FO,IAAM,OAAA,GAAU,CAAC,OAAA,KAA8C;AACpE,MAAA,MAAM,QAAA,GAAW,kBAAkB,OAAO,CAAA;AAC1C,MAAA,MAAM,WAAA,GACJ,QAAA,CAAS,IAAA,KAAS,MAAA,GACd,CAAC,GAAG,QAAA,CAAS,QAAA,EAAU,QAAA,CAAS,cAAA,EAAgB,QAAA,CAAS,IAAI,IAC7D,QAAA,CAAS,QAAA;AACf,MAAA,OAAO;QACL,GAAG,QAAA;AACH,QAAA,WAAA;QACA,YAAA,EAAc,MAAA;AACd,QAAA,IAAA,EAAM,IAAI,GAAA;UACR,MAAA,CAAO,OAAA,CAAQ,SAAS,WAAW,CAAA,CAAE,IAAI,CAAC,CAACN,MAAAA,EAAM,GAAG,CAAA,KAAM;YACxD,GAAA,CAAI,IAAA;AACJ,YAAA;AACE,cAAA,GAAA,EAAK,GAAA,CAAI,IAAA;AACT,cAAA,IAAA,EAAM,CAAC,GAAG,QAAA,CAAS,QAAA,EAAU,QAAA,CAAS,gBAAgBA,MAAI,CAAA;;cAE1D,UAAA,EAAY;AACd;WACD;AACH;AACF,OAAA;AACF,IAAA,CAAA;AC/BA,IAAM,gBAAA,GAAmB,CACvB,MAAA,EACA,OAAA,KAMG;AAfL,MAAA,IAAAF,IAAAA;AAgBE,MAAA,MAAM,IAAA,GAAO,QAAQ,OAAO,CAAA;AAE5B,MAAA,IAAI,WAAA,GACF,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,cACnC,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,CAAE,MAAA;AAClC,QAAA,CAAC,GAAA,EAAyC,CAACE,MAAAA,EAAMkB,OAAM,CAAA,KAAG;AArBpE,UAAA,IAAApB,IAAAA;AAqBwE,UAAA,OAAA;YAC5D,GAAG,GAAA;YACH,CAACE,MAAI,IACHF,IAAAA,GAAA,QAAA;cACEoB,OAAAA,CAAO,IAAA;AACP,cAAA;gBACE,GAAG,IAAA;AACH,gBAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,gBAAgBlB,MAAI;AAC3D,eAAA;AACA,cAAA;aACF,KAPA,IAAA,GAAAF,OAOK,WAAA;AACT,WAAA;AAAA,QAAA,CAAA;QACA;OACF,GACA,MAAA;AAEN,MAAA,MAAME,MAAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,WACA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,kBAAiB,OAAA,GACxB,MAAA,GACA,OAAA,IAAA,IAAA,GAAA,SAAA,OAAA,CAAS,IAAA;AAEjB,MAAA,MAAM,QACJF,IAAAA,GAAA,QAAA;QACE,MAAA,CAAO,IAAA;AACPE,QAAAA,MAAAA,KAAS,SACL,IAAA,GACA;UACE,GAAG,IAAA;AACH,UAAA,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,gBAAgBA,MAAI;AAC3D,SAAA;AACJ,QAAA;OACF,KATA,IAAA,GAAAF,OASM,WAAA,EAAY;AAEpB,MAAA,MAAM,KAAA,GACJ,OAAO,OAAA,KAAY,QAAA,IACnB,OAAA,CAAQ,IAAA,KAAS,MAAA,IACjB,OAAA,CAAQ,YAAA,KAAiB,OAAA,GACrB,OAAA,CAAQ,IAAA,GACR,MAAA;AAEN,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACf,MAAA;AAEA,MAAA,MAAM,QAAA,GACJE,MAAAA,KAAS,MAAA,GACL,WAAA,GACE;QACE,GAAG,IAAA;QACH,CAAC,IAAA,CAAK,cAAc,GAAG;AACzB,OAAA,GACA,IAAA,GACF;QACE,IAAA,EAAM;AACJ,UAAA,GAAI,IAAA,CAAK,YAAA,KAAiB,UAAA,GAAa,KAAK,IAAA,CAAK,QAAA;UACjD,IAAA,CAAK,cAAA;AACLA,UAAAA;AACF,SAAA,CAAE,KAAK,GAAG,CAAA;QACV,CAAC,IAAA,CAAK,cAAc,GAAG;UACrB,GAAG,WAAA;AACH,UAAA,CAACA,MAAI,GAAG;AACV;AACF,OAAA;AAEN,MAAA,QAAA,CAAS,OAAA,GAAU,yCAAA;AAEnB,MAAA,OAAO,QAAA;AACT,IAAA,CAAA;AzBhFA,IAAM,YAAA,mBAAe,MAAA,CAAO,GAAA,CAAI,kBAAkB,CAAA;A0BClD,IAAMe,iBAAAA,GAAmB,MAAM,UAAA,CAAW,KAAA;AAEnC,IAAM,gBAAgB,OAAU;AACrC,MAAA,GAAA;AACA,MAAA,OAAA;AACA,MAAA,IAAA;AACA,MAAA,qBAAA;AACA,MAAA,yBAAA;AACA,MAAA,WAAA;MACA,KAAA,EAAAC;AACF,KAAA,KASE,SAAA,CAAU;AACR,MAAA,GAAA;MACA,OAAA,EAAS;QACP,cAAA,EAAgB,kBAAA;QAChB,GAAG;AACL,OAAA;MACA,IAAA,EAAM;QACJ,OAAA,EAAS,IAAA,CAAK,UAAU,IAAI,CAAA;QAC5B,MAAA,EAAQ;AACV,OAAA;AACA,MAAA,qBAAA;AACA,MAAA,yBAAA;AACA,MAAA,WAAA;MACA,KAAA,EAAAA;KACD,CAAA;AAEI,IAAM,oBAAoB,OAAU;AACzC,MAAA,GAAA;AACA,MAAA,OAAA;AACA,MAAA,QAAA;AACA,MAAA,qBAAA;AACA,MAAA,yBAAA;AACA,MAAA,WAAA;MACA,KAAA,EAAAA;AACF,KAAA,KASE,SAAA,CAAU;AACR,MAAA,GAAA;AACA,MAAA,OAAA;MACA,IAAA,EAAM;QACJ,OAAA,EAAS,QAAA;AACT,QAAA,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAa,QAAA,CAAiB,OAAA,EAAS;AACxD,OAAA;AACA,MAAA,qBAAA;AACA,MAAA,yBAAA;AACA,MAAA,WAAA;MACA,KAAA,EAAAA;KACD,CAAA;AAEI,IAAM,YAAY,OAAU;AACjC,MAAA,GAAA;AACA,MAAA,OAAA,GAAU,EAAC;AACX,MAAA,IAAA;AACA,MAAA,yBAAA;AACA,MAAA,qBAAA;AACA,MAAA,WAAA;AACA,MAAA,KAAA,EAAAA,SAAQD,iBAAAA;KACV,KAWM;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAMC,MAAAA,CAAM,GAAA,EAAK;UAChC,MAAA,EAAQ,MAAA;UACR,OAAA,EAAS,mBAAA;AACP,YAAA,OAAA;AACA,YAAA,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAA;YAChC,8BAAA;AACF,WAAA;AACA,UAAA,IAAA,EAAM,IAAA,CAAK,OAAA;UACX,MAAA,EAAQ;SACT,CAAA;AAED,QAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAEvD,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,IAAI,gBAAA;AAKJ,UAAA,IAAI;AACF,YAAA,gBAAA,GAAmB,MAAM,qBAAA,CAAsB;AAC7C,cAAA,QAAA;AACA,cAAA,GAAA;AACA,cAAA,iBAAA,EAAmB,IAAA,CAAK;aACzB,CAAA;AACH,UAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,YAAA,IAAI,aAAa,KAAK,CAAA,IAAKC,YAAAA,CAAa,UAAA,CAAW,KAAK,CAAA,EAAG;AACzD,cAAA,MAAM,KAAA;AACR,YAAA;AAEA,YAAA,MAAM,IAAIA,YAAAA,CAAa;cACrB,OAAA,EAAS,kCAAA;cACT,KAAA,EAAO,KAAA;AACP,cAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,cAAA,GAAA;AACA,cAAA,eAAA;AACA,cAAA,iBAAA,EAAmB,IAAA,CAAK;aACzB,CAAA;AACH,UAAA;AAEA,UAAA,MAAM,gBAAA,CAAiB,KAAA;AACzB,QAAA;AAEA,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,yBAAA,CAA0B;AACrC,YAAA,QAAA;AACA,YAAA,GAAA;AACA,YAAA,iBAAA,EAAmB,IAAA,CAAK;WACzB,CAAA;AACH,QAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,UAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,YAAA,IAAI,aAAa,KAAK,CAAA,IAAKA,YAAAA,CAAa,UAAA,CAAW,KAAK,CAAA,EAAG;AACzD,cAAA,MAAM,KAAA;AACR,YAAA;AACF,UAAA;AAEA,UAAA,MAAM,IAAIA,YAAAA,CAAa;YACrB,OAAA,EAAS,uCAAA;YACT,KAAA,EAAO,KAAA;AACP,YAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,YAAA,GAAA;AACA,YAAA,eAAA;AACA,YAAA,iBAAA,EAAmB,IAAA,CAAK;WACzB,CAAA;AACH,QAAA;AACF,MAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,QAAA,MAAM,iBAAiB,EAAE,KAAA,EAAO,KAAK,iBAAA,EAAmB,IAAA,CAAK,QAAQ,CAAA;AACvE,MAAA;AACF,IAAA,CAAA;ACrJO,IAAM,iCACX,CAAI;AACF,MAAA,WAAA;AACA,MAAA,cAAA;AACA,MAAA;AACF,KAAA,KAKA,OAAO,EAAE,QAAA,EAAU,GAAA,EAAK,mBAAkB,KAAM;AAC9C,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AACzC,MAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAGvD,MAAA,IAAI,YAAA,CAAa,IAAA,EAAK,KAAM,EAAA,EAAI;AAC9B,QAAA,OAAO;AACL,UAAA,eAAA;AACA,UAAA,KAAA,EAAO,IAAIA,YAAAA,CAAa;AACtB,YAAA,OAAA,EAAS,QAAA,CAAS,UAAA;AAClB,YAAA,GAAA;AACA,YAAA,iBAAA;AACA,YAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,YAAA,eAAA;AACA,YAAA,YAAA;AACA,YAAA,WAAA,EAAa,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAc,QAAA;WAC5B;AACH,SAAA;AACF,MAAA;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU;UAClC,IAAA,EAAM,YAAA;UACN,MAAA,EAAQ;SACT,CAAA;AAED,QAAA,OAAO;AACL,UAAA,eAAA;AACA,UAAA,KAAA,EAAO,IAAIA,YAAAA,CAAa;AACtB,YAAA,OAAA,EAAS,eAAe,WAAW,CAAA;AACnC,YAAA,GAAA;AACA,YAAA,iBAAA;AACA,YAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,YAAA,eAAA;AACA,YAAA,YAAA;YACA,IAAA,EAAM,WAAA;AACN,YAAA,WAAA,EAAa,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAc,UAAU,WAAA;WACtC;AACH,SAAA;AACF,MAAA,CAAA,CAAA,OAAS,UAAA,EAAY;AACnB,QAAA,OAAO;AACL,UAAA,eAAA;AACA,UAAA,KAAA,EAAO,IAAIA,YAAAA,CAAa;AACtB,YAAA,OAAA,EAAS,QAAA,CAAS,UAAA;AAClB,YAAA,GAAA;AACA,YAAA,iBAAA;AACA,YAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,YAAA,eAAA;AACA,YAAA,YAAA;AACA,YAAA,WAAA,EAAa,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAc,QAAA;WAC5B;AACH,SAAA;AACF,MAAA;AACF,IAAA,CAAA;AAEK,IAAM,mCACX,CACE,WAAA,KAEF,OAAO,EAAE,UAAS,KAA8B;AAC9C,MAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAEvD,MAAA,IAAI,QAAA,CAAS,QAAQ,IAAA,EAAM;AACzB,QAAA,MAAM,IAAI,sBAAA,CAAuB,EAAE,CAAA;AACrC,MAAA;AAEA,MAAA,OAAO;AACL,QAAA,eAAA;AACA,QAAA,KAAA,EAAO,oBAAA,CAAqB;AAC1B,UAAA,MAAA,EAAQ,QAAA,CAAS,IAAA;UACjB,MAAA,EAAQ;SACT;AACH,OAAA;AACF,IAAA,CAAA;AAEK,IAAM,yBAAA,GACX,CAAI,cAAA,KACJ,OAAO,EAAE,QAAA,EAAU,GAAA,EAAK,mBAAkB,KAAM;AAC9C,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,MAAA,MAAM,YAAA,GAAe,MAAM,aAAA,CAAc;QACvC,IAAA,EAAM,YAAA;QACN,MAAA,EAAQ;OACT,CAAA;AAED,MAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAEvD,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,QAAA,MAAM,IAAIA,YAAAA,CAAa;UACrB,OAAA,EAAS,uBAAA;AACT,UAAA,KAAA,EAAO,YAAA,CAAa,KAAA;AACpB,UAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,UAAA,eAAA;AACA,UAAA,YAAA;AACA,UAAA,GAAA;AACA,UAAA;SACD,CAAA;AACH,MAAA;AAEA,MAAA,OAAO;AACL,QAAA,eAAA;AACA,QAAA,KAAA,EAAO,YAAA,CAAa,KAAA;AACpB,QAAA,QAAA,EAAU,YAAA,CAAa;AACzB,OAAA;AACF,IAAA,CAAA;AAEK,IAAM,8BACX,MACA,OAAO,EAAE,QAAA,EAAU,GAAA,EAAK,mBAAkB,KAAM;AAC9C,MAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AAEvD,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAIA,YAAAA,CAAa;UACrB,OAAA,EAAS,wBAAA;AACT,UAAA,GAAA;AACA,UAAA,iBAAA;AACA,UAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,UAAA,eAAA;UACA,YAAA,EAAc;SACf,CAAA;AACH,MAAA;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAY;AAC1C,QAAA,OAAO;AACL,UAAA,eAAA;UACA,KAAA,EAAO,IAAI,WAAW,MAAM;AAC9B,SAAA;AACF,MAAA,CAAA,CAAA,OAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAIA,YAAAA,CAAa;UACrB,OAAA,EAAS,yCAAA;AACT,UAAA,GAAA;AACA,UAAA,iBAAA;AACA,UAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,UAAA,eAAA;UACA,YAAA,EAAc,MAAA;UACd,KAAA,EAAO;SACR,CAAA;AACH,MAAA;AACF,IAAA,CAAA;AAEK,IAAM,uCACX,MACA,OAAO,EAAE,QAAA,EAAU,GAAA,EAAK,mBAAkB,KAAM;AAC9C,MAAA,MAAM,eAAA,GAAkB,uBAAuB,QAAQ,CAAA;AACvD,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,MAAA,OAAO;AACL,QAAA,eAAA;AACA,QAAA,KAAA,EAAO,IAAIA,YAAAA,CAAa;AACtB,UAAA,OAAA,EAAS,QAAA,CAAS,UAAA;AAClB,UAAA,GAAA;AACA,UAAA,iBAAA;AACA,UAAA,UAAA,EAAY,QAAA,CAAS,MAAA;AACrB,UAAA,eAAA;AACA,UAAA;SACD;AACH,OAAA;AACF,IAAA,CAAA;;;AEoFF,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EACzC,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACrD,KAAA,EAAO,EACJ,MAAA,CAAO;AAAA,IACN,WAAA,EAAa,EAAE,OAAA;AAAQ,GACxB,EACA,QAAA;AACL,CAAC,CAAA;AAKD,IAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EACpC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,+BAA+B,CAAA;AAAA,EACzD,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,UAAU,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EACpC,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,aAAa,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA;AAChC,CAAC,CAAA;AAKD,IAAM,gCAAA,GAAmC,EAAE,MAAA,CAAO;AAAA,EAChD,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,eAAe,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,mCAAmC,EAAE,QAAA,EAAS;AAAA,EAC5E,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAC9B,CAAC,CAAA;AAKD,IAAM,mBAAA,GAAsB,EACzB,MAAA,CAAO;AAAA,EACN,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,KAAA,EAAO,qBAAqB,QAAA,EAAS;AAAA,EACrC,iBAAA,EAAmB,iCAAiC,QAAA;AACtD,CAAC,CAAA,CACA,MAAA;AAAA,EACC,CAAC,IAAA,KAAS,EAAE,IAAA,CAAK,eAAe,IAAA,CAAK,KAAA,CAAA;AAAA,EACrC;AACF,CAAA;AAKF,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACjC,SAAA,EAAW,CAAA,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EAC5B,SAAS,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,yCAAyC,CAAA;AAAA,EACpE,MAAM,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACnC,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,GAAA,EAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,EAC/C,YAAA,EAAc,0BAA0B,QAAA,EAAS;AAAA,EACjD,kBAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACjD,kBAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACjD,eAAe,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACrB,CAAC,CAAA;AAKD,SAAS,YAAY,QAAA,EAA2B;AAC9C,EAAA,OACE,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,KAAA;AAEzE;AAKA,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EAChC,SAAA,EAAW,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EAC3B,SAAA,EAAW,EACR,MAAA,EAAO,CACP,IAAI,+BAA+B,CAAA,CACnC,MAAA,CAAO,CAAC,GAAA,KAAQ;AACf,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAI,IAAI,GAAG,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,QAAA,KAAa,OAAA,IAAW,CAAC,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA,EAAG;AAChE,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,sEAAA,EAAyE,OAAO,QAAQ,CAAA,sEAAA;AAAA,OAE1F;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAAA,EACH,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,EACnD,YAAA,EAAc,0BAA0B,QAAA,EAAS;AAAA,EACjD,kBAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACjD,kBAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACjD,eAAe,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,IAAA,EAAM,oBAAoB,QAAA,EAAS;AAAA,EACnC,KAAA,EAAO,EACJ,MAAA,CAAO;AAAA,IACN,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,+BAA+B;AAAA,GACpD,EACA,QAAA,EAAS;AAAA,EACZ,aAAA,EAAe,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAChD,GAAA,EAAK,EACF,MAAA,CAAO;AAAA,IACN,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACxB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACzB,kBAAA,EAAoB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC1C,EACA,QAAA;AACL,CAAC,CAAA;AAKM,IAAM,eAAA,GAAkB,CAAA,CAAE,kBAAA,CAAmB,WAAA,EAAa;AAAA,EAC/D,iBAAA;AAAA,EACA;AACF,CAAC;AASM,SAAS,kBAAkB,MAAA,EAA4B;AAC5D,EAAA,OAAO,eAAA,CAAgB,MAAM,MAAM,CAAA;AACrC;AAKO,SAAS,cAAc,MAAA,EAA6C;AACzE,EAAA,OAAO,OAAO,SAAA,KAAc,OAAA;AAC9B;AAKO,SAAS,aAAa,MAAA,EAA4C;AACvE,EAAA,OAAO,OAAO,SAAA,KAAc,MAAA;AAC9B;;;AC/XA,wBAAA,EAAA;;;ACdO,SAAS,sBAAA,CACd,WAAA,EACA,SAAA,GAAoB,QAAA,EACI;AACxB,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,WAAW,CAAA;AAAA,GAC5C;AACF;AAQO,SAAS,oBAAoB,WAAA,EAAuC;AACzE,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,WAAA,CAAY,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,EAChD;AACF;AAWO,SAAS,eAAe,WAAA,EAA8B;AAC3D,EAAA,IAAI;AAEF,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACnC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAEtB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA;AAAA,MACnB,OAAO,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA,CAAE,SAAS,OAAO;AAAA,KACxD;AAEA,IAAA,IAAI,OAAO,OAAA,CAAQ,GAAA,KAAQ,QAAA,EAAU;AAEnC,MAAA,OAAO,OAAA,CAAQ,GAAA,GAAM,GAAA,GAAO,IAAA,CAAK,GAAA,EAAI;AAAA,IACvC;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AASO,SAAS,mBAAA,CACd,SAAA,EACA,QAAA,GAAmB,GAAA,EACV;AACT,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAA,GAAY,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI;AACzC;;;ACjFA,wBAAA,EAAA;ACMA,IAAM,SAAA,GAAY,mBAAA;AAKX,IAAM,WAAA,GAAc,WAAA,CAAY,CAAA,EAAG,SAAS,CAAA,OAAA,CAAS,CAAA;AAKrD,IAAM,UAAA,GAAa,WAAA,CAAY,CAAA,EAAG,SAAS,CAAA,MAAA,CAAQ,CAAA;AAKnD,IAAM,SAAA,GAAY,WAAA,CAAY,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;AAajD,IAAM,SAAA,GAAY,WAAA,CAAY,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;;;AD5BxD,IAAM,kBAAA,GAAqB,GAAA;AAK3B,IAAM,oBAAA,GAAuB,sCAAA;AAkC7B,eAAsB,kBACpB,MAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,kBAAA;AACtC,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,oBAAA;AAG1C,EAAA,MAAM,WAAW,MAAM,mCAAA;AAAA,IACrB,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qCAAA,EAAwC,OAAO,aAAa,CAAA;AAAA,KAC9D;AAAA,EACF;AAGA,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,SAAA,EAAW,OAAO,QAAA,IAAY,0BAAA;AAAA,IAC9B,eAAe,MAAA,CAAO;AAAA,GACxB;AAGA,EAAA,MAAM,EAAE,gBAAA,EAAkB,YAAA,EAAa,GAAI,MAAM,kBAAA;AAAA,IAC/C,MAAA,CAAO,aAAA;AAAA,IACP;AAAA,MACE,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA,EAAa,WAAA;AAAA,MACb,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,MAC7B,UAAU,MAAA,CAAO,QAAA,GAAW,IAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,GAAI;AAAA;AACzD,GACF;AAGA,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,MAAA,CAAO;AAAA,IACpC,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAA,KAAgB;AAAA,GACvC,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,EAAW;AACzC,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,OAAA,EAAQ;AAGnC,IAAA,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAGhC,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,CAAA;AAG3C,IAAA,IAAI,iBAAA,IAAqB,MAAA,IAAU,MAAA,CAAO,eAAA,EAAiB;AACzD,MAAA,MAAM,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAM,iBAAA,CAAkB,MAAM,MAAM,CAAA;AAAA,IACtC;AAGA,IAAA,MAAM,IAAA,CAAK,UAAA;AAAA,MACT,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA,IAAK,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAAA,MACxE,EAAE,SAAS,SAAA;AAAU,KACvB;AAGA,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAElD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,gBAAA,GACJ,WAAA,CAAY,YAAA,CAAa,GAAA,CAAI,mBAAmB,CAAA;AAClD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,+BAA+B,KAAK,CAAA,EAAG,mBAAmB,CAAA,GAAA,EAAM,gBAAgB,KAAK,EAAE,CAAA;AAAA,OACzF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,MAAA,CAAO,aAAA,EAAe;AAAA,MAC/D,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA,EAAmB,IAAA;AAAA,MACnB,YAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAU,MAAA,CAAO,QAAA,GAAW,IAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AAAA,KACxD,CAAA;AAKD,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,MAAA,EAAQ;AAAA,QACN,aAAa,MAAA,CAAO,YAAA;AAAA,QACpB,WAAW,MAAA,CAAO,UAAA;AAAA,QAClB,cAAc,MAAA,CAAO,aAAA;AAAA,QACrB,SAAA,EAAW,OAAO,UAAA,GACd,IAAA,CAAK,KAAI,GAAI,MAAA,CAAO,aAAa,GAAA,GACjC,KAAA;AAAA,OACN;AAAA,MACA,UAAA,EAAY,OAAO,QAAA,GACf;AAAA,QACE,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,cAAc,MAAA,CAAO;AAAA,OACvB,GACA,KAAA,CAAA;AAAA,MACJ,OAAA,EAAS,KAAK,GAAA;AAAI,KACpB;AAEA,IAAA,MAAM,cAAA,CAAe,MAAA,CAAO,UAAA,EAAY,KAAK,CAAA;AAE7C,IAAA,UAAA,CAAW,wBAAA,EAA0B,OAAO,UAAU,CAAA;AAAA,EACxD,CAAA,SAAE;AACA,IAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,EACtB;AACF;AAKA,eAAe,iBAAA,CACb,MACA,MAAA,EAIe;AACf,EAAA,MAAM,EAAE,cAAA,EAAgB,WAAA,EAAY,GAAI,MAAA;AAGxC,EAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,cAAA,CAAe,aAAA,EAAe;AAAA,IACvD,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,MAAM,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,aAAA,EAAe,YAAY,QAAQ,CAAA;AAGlE,EAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,cAAA,CAAe,aAAA,EAAe;AAAA,IACvD,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,MAAM,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,aAAA,EAAe,YAAY,QAAQ,CAAA;AAGlE,EAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,cAAA,CAAe,YAAA,EAAc;AAAA,IACtD,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,MAAM,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,YAAY,CAAA;AAG5C,EAAA,IAAI,eAAe,aAAA,EAAe;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,cAAA,CAAe,aAAA,EAAe;AAAA,QACvD,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,aAAa,CAAA;AAAA,IAC/C,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAsBA,eAAsB,mBACpB,WAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,cAAA,EAAAE,eAAAA,EAAe,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,wBAAA,EAAA,EAAA,2BAAA,CAAA,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAMA,eAAAA,CAAe,WAAW,CAAA;AAE9C,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa;AAC/B,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,KAAA,CAAM,OAAO,SAAA,EAAW;AAC1B,MAAA,MAAM,QAAA,GAAW,GAAA;AACjB,MAAA,IAAI,MAAM,MAAA,CAAO,SAAA,GAAY,QAAA,GAAW,IAAA,CAAK,KAAI,EAAG;AAClD,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAuBA,eAAsB,0BACpB,MAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,MAAA,CAAO,UAAU,CAAA;AAE3D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,UAAA,CAAW,mCAAA,EAAqC,OAAO,UAAU,CAAA;AACjE,IAAA;AAAA,EACF;AAEA,EAAA,UAAA,CAAW,qDAAqD,CAAA;AAChE,EAAA,MAAM,kBAAkB,MAAM,CAAA;AAChC;AEtSA,IAAM,KAAA,GAAQC,YAAY,8BAA8B,CAAA;AAsKxD,eAAsB,YAAA,GAAkC;AACtD,EAAA,MAAM,eAAqB,KAAA,CAAA,0BAAA,EAA2B;AACtD,EAAA,MAAM,aAAA,GAAgB,MAAY,KAAA,CAAA,0BAAA,CAA2B,YAAY,CAAA;AAEzE,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAOO,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAa,KAAA,CAAA,mBAAA,EAAoB;AACnC;AAQO,SAAS,sBAAsB,MAAA,EAAqC;AACzE,EAAA,MAAM,qBAAA,GAAwB,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,sBAAA;AACvD,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,IAAI,GAAA,CAAI,qBAAqB,CAAA;AAEtD,EAAA,gBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,QAAQ,CAAA;AAC9D,EAAA,gBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,cAAA,EAAgB,MAAA,CAAO,WAAW,CAAA;AACpE,EAAA,gBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,eAAA,EAAiB,MAAM,CAAA;AACzD,EAAA,gBAAA,CAAiB,aAAa,GAAA,CAAI,OAAA,EAAS,OAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAClE,EAAA,gBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,gBAAA,EAAkB,MAAA,CAAO,aAAa,CAAA;AACxE,EAAA,gBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,uBAAA,EAAyB,MAAM,CAAA;AACjE,EAAA,gBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAEvD,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,gBAAA,CAAiB,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,gBAAA;AACT;AAQA,eAAsB,sBACpB,MAAA,EACsB;AACtB,EAAA,MAAM,MAAA,GAAuB;AAAA,IAC3B,WAAW,MAAA,CAAO,QAAA;AAAA,IAClB,0BAAA,EAA4B,MAAA,CAAO,YAAA,GAC/B,qBAAA,GACA;AAAA,GACN;AAEA,EAAA,MAAM,aAAa,MAAA,CAAO,YAAA,GAChB,wBAAkB,MAAA,CAAO,YAAY,IACrC,KAAA,CAAA,IAAA,EAAK;AAGf,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,MAAA,CAAO,WAAW,CAAA;AAC9C,EAAA,WAAA,CAAY,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAChD,EAAA,WAAA,CAAY,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAIlD,EAAA,MAAM,eAAA,GAAwB,KAAA,CAAA,oBAAA;AAAA,IAC5B,OAAO,UAAA,CAAW,MAAA;AAAA,IAClB,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,MAAM,WAAW,MAAY,KAAA,CAAA,6BAAA;AAAA,IAC3B,OAAO,UAAA,CAAW,MAAA;AAAA,IAClB,MAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA,CAAO,WAAA;AAAA,IACP,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,MAAM,SAAS,MAAY,KAAA,CAAA,gCAAA;AAAA,IACzB,OAAO,UAAA,CAAW,MAAA;AAAA,IAClB,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,YAAA;AAAA,IACpB,WAAW,MAAA,CAAO,UAAA;AAAA,IAClB,WAAW,MAAA,CAAO,UAAA;AAAA,IAClB,cAAc,MAAA,CAAO,aAAA;AAAA,IACrB,OAAO,MAAA,CAAO;AAAA,GAChB;AACF;AAQA,eAAsB,mBACpB,MAAA,EACsB;AACtB,EAAA,MAAM,MAAA,GAAuB;AAAA,IAC3B,WAAW,MAAA,CAAO,QAAA;AAAA,IAClB,0BAAA,EAA4B,MAAA,CAAO,YAAA,GAC/B,qBAAA,GACA;AAAA,GACN;AAEA,EAAA,MAAM,aAAa,MAAA,CAAO,YAAA,GAChB,wBAAkB,MAAA,CAAO,YAAY,IACrC,KAAA,CAAA,IAAA,EAAK;AAEf,EAAA,MAAM,WAAW,MAAY,KAAA,CAAA,wBAAA;AAAA,IAC3B,OAAO,UAAA,CAAW,MAAA;AAAA,IAClB,MAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA,CAAO;AAAA,GACT;AAGA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,IAAA,IAAI,eAAe,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAElF,IAAA,IAAI;AACF,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAE5C,QAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAAS,KAAA,GAAQ,IAAA,EAAK;AAI/C,QAAA,IAAI,UAAU,KAAA,EAAO;AACnB,UAAA,YAAA,GAAe,CAAA,sBAAA,EAAyB,UAAU,KAAK,CAAA,CAAA;AACvD,UAAA,IAAI,UAAU,iBAAA,EAAmB;AAC/B,YAAA,YAAA,IAAgB,CAAA,GAAA,EAAM,UAAU,iBAAiB,CAAA,CAAA;AAAA,UACnD;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,KAAA,GAAQ,IAAA,EAAK;AAC7C,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,YAAA,GAAe,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA;AAAA,QACvE;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,SAAS,MAAY,KAAA,CAAA,2BAAA;AAAA,IACzB,OAAO,UAAA,CAAW,MAAA;AAAA,IAClB,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,YAAA;AAAA,IACpB,WAAW,MAAA,CAAO,UAAA;AAAA,IAClB,WAAW,MAAA,CAAO,UAAA;AAAA,IAClB,cAAc,MAAA,CAAO,aAAA;AAAA,IACrB,OAAO,MAAA,CAAO;AAAA,GAChB;AACF;AAqCA,eAAsB,6BACpB,MAAA,EACsB;AAGtB,EAAA,MAAM,gBAAA,GAAmB,IAAI,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA;AACrD,EAAA,MAAM,UAAA,GAAwC;AAAA,IAC5C,QAAQ,gBAAA,CAAiB,MAAA;AAAA,IACzB,gBAAgB,MAAA,CAAO;AAAA,GACzB;AAEA,EAAA,MAAM,MAAA,GAAuB;AAAA,IAC3B,WAAW,MAAA,CAAO;AAAA,GACpB;AAIA,EAAA,MAAM,UAAA,GAAmB,KAAA,CAAA,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA;AAE9D,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,IAAA,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,WAAW,MAAY,KAAA,CAAA,6BAAA;AAAA,IAC3B,UAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,SAAS,MAAY,KAAA,CAAA,gCAAA;AAAA,IACzB,UAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,kBAAkB,IAAI,GAAA;AAAA,IAC1B,MAAA,CAAO,UAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,CAAO,SAAS;AAAC,GAC/D;AACA,EAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,IAAA,CACvB,OAAO,KAAA,IAAS,EAAA,EAAI,MAAM,GAAG,CAAA,CAAE,OAAO,OAAO;AAAA,GAChD;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,eAAe,CAAA,CAAE,MAAA;AAAA,IACzC,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,IAAI,CAAC;AAAA,GAC7B;AACA,EAAA,IACE,aAAA,CAAc,SAAS,CAAA,IACvB,eAAA,CAAgB,OAAO,CAAA,IACvB,aAAA,CAAc,OAAO,CAAA,EACrB;AACA,IAAA,KAAA;AAAA,MACE,gFAAA;AAAA,MACA,aAAA,CAAc,KAAK,IAAI;AAAA,KACzB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,YAAA;AAAA,IACpB,WAAW,MAAA,CAAO,UAAA;AAAA,IAClB,WAAW,MAAA,CAAO,UAAA;AAAA,IAClB,OAAO,MAAA,CAAO;AAAA,GAChB;AACF;AC3bA,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,IAAI,MAAA,CAAO,QAAA;AACjB,IAAA,OAAO,CAAA,KAAM,WAAA,IAAe,CAAA,KAAM,WAAA,IAAe,CAAA,KAAM,KAAA;AAAA,EACzD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQA,SAAS,4BAA4B,UAAA,EAI5B;AACP,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,EAAE,IAAA,EAAM,wBAAA,EAA0B,GAAA,EAAK,WAAW,sBAAA,EAAuB;AAAA,IACzE,EAAE,IAAA,EAAM,gBAAA,EAAkB,GAAA,EAAK,WAAW,cAAA;AAAe,GAC3D;AAEA,EAAA,KAAA,MAAW,EAAE,IAAA,EAAApB,MAAAA,EAAM,GAAA,MAAS,SAAA,EAAW;AACrC,IAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,IAAK,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG;AAC9D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,qCAAA,EAAwCA,MAAI,CAAA,GAAA,EAAM,GAAG,CAAA,oFAAA;AAAA,OAEvD;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,oBAAA,GAAuB;AAwEpC,eAAsB,0BACpB,YAAA,EAC2C;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,YAAY,CAAA;AAChC,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAGrB,EAAA,MAAM,YAAA,GAAe,CAAA,EAAG,MAAM,CAAA,qCAAA,EAAwC,QAAQ,CAAA,CAAA;AAE9E,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,8BAAA,CAA+B,YAAY,CAAA;AAClE,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,YAAA,EAAc,YAAA;AAAA,MACd,sBAAA,EAAwB;AAAA,KAC1B;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,IAAI,KAAA,YAAiB,cAAA,IAAkB,KAAA,CAAM,MAAA,KAAW,GAAA,EAAK;AAC3D,MAAA,MAAM,OAAA,GAAU,GAAG,MAAM,CAAA,qCAAA,CAAA;AAGzB,MAAA,MAAM,QAAA,GAAW,MAAM,8BAAA,CAA+B,OAAO,CAAA;AAC7D,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,YAAA,EAAc,OAAA;AAAA,QACd,sBAAA,EAAwB;AAAA,OAC1B;AAAA,IACF;AAGA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAKO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,WAAA,CACE,OAAA,EACgB,MAAA,EACA,GAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAKA,eAAe,+BACb,YAAA,EACoC;AACpC,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,YAAA,EAAc;AAAA,IACzC,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,kBAAA;AAAA,MACR,sBAAA,EAAwB;AAAA;AAC1B,GACD,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,qCAAA,EAAwC,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,MAC9E,QAAA,CAAS,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AAGtC,EAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,wEAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAeA,eAAsB,4BACpB,aAAA,EAC6B;AAC7B,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,aAAa,CAAA;AAGpC,EAAA,MAAM,QAAA,GAAW,MAAYqB,KAAA,CAAA,gBAAA,CAAiB,MAAA,EAAQ;AAAA,IACpD,SAAA,EAAW,QAAA;AAAA,IACX,OAAA,EAAS,IAAI,OAAA,CAAQ;AAAA,MACnB,sBAAA,EAAwB;AAAA,KACzB;AAAA,GACF,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,MAAYA,KAAA,CAAA,wBAAA,CAAyB,MAAA,EAAQ,QAAQ,CAAA;AAEtE,EAAA,2BAAA,CAA4B,QAAQ,CAAA;AAEpC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AACF;AClJO,IAAM,aAAA,GAAgB;AAAA,EAC3B,WAAA,EAAa,kBAAA;AAAA,EACb,YAAA,EAAc,mBAAA;AAAA,EACd,SAAA,EAAW,gBAAA;AAAA,EACX,SAAA,EAAW;AACb;AAKA,IAAM,wBAAA,GAA2B,GAAA;AAY1B,SAAS,kBAAkB,SAAA,EAA2B;AAC3D,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAS,CAAA;AAG7B,EAAA,IAAI,MAAM,GAAA,CAAI,QAAA;AAGd,EAAA,IAAI,IAAI,IAAA,EAAM;AACZ,IAAA,GAAA,IAAO,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,EACrB;AAGA,EAAA,IAAI,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,QAAA,KAAa,GAAA,EAAK;AACxC,IAAA,MAAM,SAAA,GAAY,IAAI,QAAA,CACnB,OAAA,CAAQ,cAAc,EAAE,CAAA,CACxB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACrB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,IAAO,IAAI,SAAS,CAAA,CAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,kBAAA,EAAoB,GAAG,CAAA;AAC5C;AAcO,SAAS,WAAA,CAAY,WAAmB,SAAA,EAA4B;AACzE,EAAA,MAAM,SAAA,GAAY,kBAAkB,SAAS,CAAA;AAE7C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAY,KAAA,CAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,MAAM,YAAA,GAAe,QAAQ,GAAA,CAAI,YAAA;AACjC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAY,KAAA,CAAA,IAAA,CAAK,YAAA,EAAc,WAAA,EAAa,SAAS,CAAA;AAAA,IACvD;AAEA,IAAA,OAAY,WAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,OAAA,EAAS,aAAa,SAAS,CAAA;AAAA,EACxE;AAGA,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,OAAA,IAAW,OAAA,CAAQ,IAAI,cAAA,EAAgB;AAC9D,IAAA,OAAY,KAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,cAAA,EAAgB,aAAa,SAAS,CAAA;AAAA,EACrE;AAGA,EAAA,OAAY,WAAK,OAAA,EAAQ,EAAG,QAAA,EAAU,OAAA,EAAS,aAAa,SAAS,CAAA;AACvE;AAgFO,SAAS,iBAAA,GAAyC;AACvD,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,WAAW,CAAA;AAEzD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,SAAS,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,YAAA,GAAe,QAAA,CAAS,YAAA,EAAc,EAAE,CAAA,GAAI,MAAA;AAE9D,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,YAAA,EAAc,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,YAAY,CAAA;AAAA,IACpD,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,aAAA,CAAc,SAAS,CAAA,IAAK,QAAA;AAAA,IACnD,WAAW,SAAA,IAAa,CAAC,KAAA,CAAM,SAAS,IAAI,SAAA,GAAY;AAAA,GAC1D;AACF;AASA,eAAsB,YAAA,CACpB,SAAA,EACA,MAAA,EACA,QAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,EAAE,SAAA,EAAW,UAAU,CAAA;AAC9D,EAAA,MAAM,OAAA,CAAQ,WAAW,MAAM,CAAA;AACjC;AAsBA,eAAsB,UAAA,CACpB,WACA,QAAA,EAC8B;AAC9B,EAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,EAAE,SAAA,EAAW,UAAU,CAAA;AAC9D,EAAA,OAAO,QAAQ,UAAA,EAAW;AAC5B;AAwBA,eAAsB,cAAA,CACpB,WACA,OAAA,EACkB;AAClB,EAAA,MAAM,UAAU,sBAAA,CAAuB;AAAA,IACrC,SAAA;AAAA,IACA,UAAU,OAAA,EAAS;AAAA,GACpB,CAAA;AACD,EAAA,OAAO,OAAA,CAAQ,aAAA,CAAc,OAAA,EAAS,QAAQ,CAAA;AAChD;AAQO,SAAS,uBACd,MAAA,EACc;AACd,EAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AACpC;AAKA,IAAM,mBAAN,MAA+C;AAAA,EAC5B,QAAA;AAAA,EAEjB,YAAY,MAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,QAAA,GAAW,WAAA,CAAY,MAAA,CAAO,SAAA,EAAW,OAAO,QAAQ,CAAA;AAAA,EAC/D;AAAA,EAEA,IAAY,kBAAA,GAA6B;AACvC,IAAA,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,aAAa,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAY,UAAA,GAAqB;AAC/B,IAAA,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,aAAa,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAY,UAAA,GAAqB;AAC/B,IAAA,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,aAAa,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,kBAAA,GAA2D;AAC/D,IAAA,OAAO,IAAA,CAAK,QAAA,CAA+B,IAAA,CAAK,kBAAkB,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,mBAAmB,QAAA,EAA+C;AACtE,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,kBAAA,EAAoB,QAAQ,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,UAAA,GAA+C;AACnD,IAAA,OAAO,IAAA,CAAK,QAAA,CAA2B,IAAA,CAAK,UAAU,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,WAAW,MAAA,EAAyC;AACxD,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,UAAA,GAA2C;AAC/C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAuB,IAAA,CAAK,UAAU,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,WAAW,MAAA,EAAqC;AACpD,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,YAAA,GAA8B;AAClC,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,aAAA,CACJ,QAAA,GAAmB,wBAAA,EACD;AAClB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,EAAW;AAErC,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,OAAO,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAY,QAAA,EAAqC;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAASC,EAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACnD,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,WAAA,CAAY,QAAA,EAAkB,IAAA,EAA8B;AAMxE,IAAA,MAASA,EAAA,CAAA,KAAA,CAAM,KAAK,QAAA,EAAU,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAE9D,IAAA,MAAM,OAAA,GAAU,GAAG,QAAQ,CAAA,IAAA,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AAG5C,IAAA,MAASA,EAAA,CAAA,SAAA,CAAU,SAAS,OAAA,EAAS,EAAE,UAAU,OAAA,EAAS,IAAA,EAAM,KAAO,CAAA;AAGvE,IAAA,MAASA,EAAA,CAAA,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,QAAA,EAAiC;AACxD,IAAA,IAAI;AACF,MAAA,MAASA,UAAO,QAAQ,CAAA;AAAA,IAC1B,SAAS,KAAA,EAAO;AAEd,MAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF,CAAA;ACtcA,IAAMC,MAAAA,GAAQH,YAAY,6BAA6B,CAAA;AAqFvD,IAAMI,mBAAAA,GAAqB,GAAA;AAK3B,IAAM,mBAAA,GAAsB,8BAAA;AAM5B,IAAM,uBAAA,GAA0B,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAKxC,IAAM,iBAAN,MAAqB;AAAA,EACT,MAAA;AAAA,EACA,OAAA;AAAA,EAEjB,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,UAAU,sBAAA,CAAuB;AAAA,MACpC,WAAW,MAAA,CAAO,YAAA;AAAA,MAClB,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAA,GAA0C;AAE9C,IAAA,MAAM,YAAY,iBAAA,EAAkB;AACpC,IAAA,IAAI,SAAA,EAAW;AACb,MAAAD,OAAM,yCAAyC,CAAA;AAC/C,MAAA,OAAO;AAAA,QACL,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAA,EAAW,KAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAW;AAEnD,IAAA,IAAI,cAAc,WAAA,EAAa;AAE7B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAc;AAEjD,MAAA,IAAI,OAAA,EAAS;AACX,QAAAA,OAAM,kCAAkC,CAAA;AACxC,QAAA,OAAO;AAAA,UACL,aAAa,YAAA,CAAa,WAAA;AAAA,UAC1B,WAAW,YAAA,CAAa,SAAA;AAAA,UACxB,WAAW,YAAA,CAAa,SAAA;AAAA,UACxB,SAAA,EAAW,KAAA;AAAA,UACX,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAGA,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAAA,OAAM,mCAAmC,CAAA;AACzC,QAAA,IAAI;AACF,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,CAAmB,YAAY,CAAA;AAClE,UAAA,OAAO;AAAA,YACL,aAAa,eAAA,CAAgB,WAAA;AAAA,YAC7B,WAAW,eAAA,CAAgB,SAAA;AAAA,YAC3B,WAAW,eAAA,CAAgB,SAAA;AAAA,YAC3B,SAAA,EAAW,IAAA;AAAA,YACX,OAAA,EAAS;AAAA,WACX;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,MAAAA,CAAM,+CAA+C,KAAK,CAAA;AAAA,QAE5D;AAAA,MACF;AAAA,IACF;AAGA,IAAAA,OAAM,sCAAsC,CAAA;AAC5C,IAAA,OAAO,KAAK,YAAA,EAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,iBAAA,GAAoD;AAExD,IAAA,MAAM,YAAY,iBAAA,EAAkB;AACpC,IAAA,IAAI,SAAA,EAAW;AACb,MAAAA,OAAM,yCAAyC,CAAA;AAC/C,MAAA,OAAO;AAAA,QACL,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAA,EAAW,KAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAW;AAEnD,IAAA,IAAI,cAAc,WAAA,EAAa;AAE7B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAc;AAEjD,MAAA,IAAI,OAAA,EAAS;AACX,QAAAA,OAAM,kCAAkC,CAAA;AACxC,QAAA,OAAO;AAAA,UACL,aAAa,YAAA,CAAa,WAAA;AAAA,UAC1B,WAAW,YAAA,CAAa,SAAA;AAAA,UACxB,WAAW,YAAA,CAAa,SAAA;AAAA,UACxB,SAAA,EAAW,KAAA;AAAA,UACX,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAGA,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAAA,OAAM,mCAAmC,CAAA;AACzC,QAAA,IAAI;AACF,UAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,kBAAA,CAAmB,YAAY,CAAA;AAClE,UAAA,OAAO;AAAA,YACL,aAAa,eAAA,CAAgB,WAAA;AAAA,YAC7B,WAAW,eAAA,CAAgB,SAAA;AAAA,YAC3B,WAAW,eAAA,CAAgB,SAAA;AAAA,YAC3B,SAAA,EAAW,IAAA;AAAA,YACX,OAAA,EAAS;AAAA,WACX;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAAA,MAAAA,CAAM,yBAAyB,KAAK,CAAA;AAEpC,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,IAAAA,OAAM,0BAA0B,CAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAwC;AAE5C,IAAA,MAAM,EAAE,iBAAA,EAAmB,UAAA,EAAW,GAAI,MAAM,KAAK,eAAA,EAAgB;AAGrE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAA;AAGxD,IAAA,MAAM,EAAE,MAAA,EAAQ,eAAA,EAAgB,GAAI,MAAM,IAAA,CAAK,gBAAA;AAAA,MAC7C,UAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAA,EAAW,KAAA;AAAA,MACX,OAAA,EAAS,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAAyC;AAC7C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAW;AAC7C,IAAA,OAAO,QAAQ,WAAA,KAAgB,MAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAkC;AACtC,IAAA,MAAM,IAAA,CAAK,QAAQ,YAAA,EAAa;AAChC,IAAAA,OAAM,4BAA4B,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,GAGX;AAED,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAmB;AAC7D,IAAA,IAAI,cAAA,EAAgB;AAElB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,GAAI,cAAA,CAAe,YAAA;AACxC,MAAA,IAAI,MAAM,uBAAA,EAAyB;AACjC,QAAAA,MAAAA,CAAM,4CAA4C,GAAG,CAAA;AACrD,QAAAA,MAAAA;AAAA,UACE,sCAAA;AAAA,UACA,eAAe,iBAAA,CAAkB;AAAA,SACnC;AACA,QAAAA,MAAAA;AAAA,UACE,+BAAA;AAAA,UACA,cAAA,CAAe,WAAW,MAAA,CAAO;AAAA,SACnC;AACA,QAAA,OAAO;AAAA,UACL,mBAAmB,cAAA,CAAe,iBAAA;AAAA,UAClC,YAAY,cAAA,CAAe;AAAA,SAC7B;AAAA,MACF;AACA,MAAAA,MAAAA,CAAM,+DAA+D,GAAG,CAAA;AAAA,IAC1E;AAGA,IAAAA,MAAAA,CAAM,iCAAA,EAAmC,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA;AACjE,IAAA,MAAM,QAAA,GAAW,MAAM,yBAAA,CAA0B,IAAA,CAAK,OAAO,YAAY,CAAA;AACzE,IAAAA,MAAAA,CAAM,2BAAA,EAA6B,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA;AAC7D,IAAAA,MAAAA;AAAA,MACE,yCAAA;AAAA,MACA,SAAS,QAAA,CAAS;AAAA,KACpB;AAGA,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,QAAA,CAAS,qBAAA,GAAwB,CAAC,CAAA;AACjE,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAAA,MAAAA,CAAM,qCAAqC,aAAa,CAAA;AACxD,IAAA,MAAM,UAAA,GAAa,MAAM,2BAAA,CAA4B,aAAa,CAAA;AAClE,IAAAA,MAAAA,CAAM,6BAAA,EAA+B,UAAA,CAAW,MAAM,CAAA;AACtD,IAAAA,MAAAA;AAAA,MACE,kCAAA;AAAA,MACA,WAAW,MAAA,CAAO;AAAA,KACpB;AAGA,IAAA,MAAM,QAAA,GAAiC;AAAA,MACrC,UAAA;AAAA,MACA,mBAAmB,QAAA,CAAS,QAAA;AAAA,MAC5B,YAAA,EAAc,KAAK,GAAA;AAAI,KACzB;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,mBAAmB,QAAA,CAAS,QAAA;AAAA,MAC5B;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBACZ,UAAA,EAC2B;AAE3B,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,MAAAA,OAAM,gCAAgC,CAAA;AACtC,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,QACtB,YAAA,EAAc,KAAK,MAAA,CAAO;AAAA,OAC5B;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAW;AACnD,IAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,MAAAA,OAAM,kCAAkC,CAAA;AACxC,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAAA,OAAM,gCAAgC,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AACnD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAEpC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eACZ,UAAA,EAC2B;AAC3B,IAAA,MAAM,oBAAA,GAAuB,WAAW,MAAA,CAAO,qBAAA;AAC/C,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAIA,IAAA,MAAM,WAAA,GAAc,6BAAA;AAEpB,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,oBAAA,EAAsB;AAAA,MACjD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,sBAAA,EAAwB;AAAA,OAC1B;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,aAAA,EAAe,CAAC,WAAW,CAAA;AAAA,QAC3B,0BAAA,EAA4B,MAAA;AAAA,QAC5B,WAAA,EAAa,CAAC,oBAAA,EAAsB,eAAe,CAAA;AAAA,QACnD,cAAA,EAAgB,CAAC,MAAM,CAAA;AAAA,QACvB,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc;AAAA,OACxC;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,oCAAA,EAAuC,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU;AAAA,EAAK,SAAS,CAAA;AAAA,OAC7F;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAOlC,IAAAA,MAAAA,CAAM,oBAAA,EAAsB,IAAA,CAAK,SAAS,CAAA;AAE1C,IAAA,OAAO;AAAA,MACL,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,kBAAkB,IAAA,CAAK,mBAAA;AAAA,MACvB,uBAAuB,IAAA,CAAK;AAAA,KAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,UAAA,EACA,MAAA,EACA,iBAAA,EAC8D;AAE9D,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,EAAa;AAChC,IAAA,MAAM,QAAQ,aAAA,EAAc;AAG5B,IAAA,MAAM,EAAE,MAAM,WAAA,EAAa,KAAA,KAAU,MAAM,IAAA,CAAK,oBAAoB,KAAK,CAAA;AACzE,IAAA,MAAM,WAAA,GAAc,oBAAoB,IAAI,CAAA,SAAA,CAAA;AAE5C,IAAA,IAAI;AAGF,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,MAAA,IAClC,iBAAA,CAAkB,oBAClB,UAAA,CAAW,MAAA,CAAO,gBAAA,IAAoB,CAAC,QAAQ,CAAA;AAEjD,MAAAA,OAAM,mBAAmB,CAAA;AACzB,MAAAA,MAAAA,CAAM,4BAAA,EAA8B,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACtD,MAAAA,MAAAA;AAAA,QACE,6CAAA;AAAA,QACA,iBAAA,CAAkB;AAAA,OACpB;AACA,MAAAA,MAAAA;AAAA,QACE,sCAAA;AAAA,QACA,WAAW,MAAA,CAAO;AAAA,OACpB;AACA,MAAAA,MAAAA,CAAM,kCAAkC,eAAe,CAAA;AAEvD,MAAA,MAAM,UAAU,qBAAA,CAAsB;AAAA,QACpC,UAAA;AAAA,QACA,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,WAAA;AAAA,QACA,MAAA,EAAQ,eAAA;AAAA,QACR,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,KAAA;AAAA,QACA,UAAU,iBAAA,CAAkB;AAAA,OAC7B,CAAA;AAID,MAAAA,MAAAA;AAAA,QACE,8BAAA;AAAA,QACA,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,EAAG,QAAQ,QAAQ,CAAA;AAAA,OACtC;AACA,MAAAA,OAAM,2BAA2B,CAAA;AACjC,MAAAA,OAAM,mBAAA,EAAqB,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,WAAW,CAAC,CAAA;AAChE,MAAAA,OAAM,sBAAA,EAAwB,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,cAAc,CAAC,CAAA;AACtE,MAAAA,OAAM,eAAA,EAAiB,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,OAAO,CAAC,CAAA;AACxD,MAAAA,OAAM,kBAAA,EAAoB,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,UAAU,CAAC,CAAA;AAG9D,MAAA,MAAM,IAAA,CAAK,sBAAsB,OAAO,CAAA;AAGxC,MAAAA,OAAM,+BAA+B,CAAA;AACrC,MAAA,MAAM,OAAO,MAAM,WAAA;AACnB,MAAAA,OAAM,6BAA6B,CAAA;AAGnC,MAAA,MAAM,WAAA,GAAc,MAAM,qBAAA,CAAsB;AAAA,QAC9C,UAAA;AAAA,QACA,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,IAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB;AAAA,OACD,CAAA;AAGD,MAAA,MAAM,SAAS,IAAA,CAAK,yBAAA;AAAA,QAClB,WAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACT;AACA,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAEpC,MAAA,OAAO,EAAE,QAAQ,eAAA,EAAgB;AAAA,IACnC,CAAA,SAAE;AAEA,MAAA,KAAA,EAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,mBACZ,YAAA,EACuB;AACvB,IAAA,IAAI,CAAC,aAAa,YAAA,EAAc;AAC9B,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAmB;AACvD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAIA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,aAAa,QAAA,EAAU;AAEzB,MAAAA,OAAM,+CAA+C,CAAA;AACrD,MAAA,QAAA,GAAW,YAAA,CAAa,QAAA;AAGxB,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAW;AACnD,MAAA,IAAI,YAAA,EAAc,aAAa,QAAA,EAAU;AACvC,QAAA,YAAA,GAAe,YAAA,CAAa,YAAA;AAAA,MAC9B;AAAA,IACF,CAAA,MAAO;AAEL,MAAAA,MAAAA;AAAA,QACE;AAAA,OACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,mBAAA,CAAoB,SAAS,UAAU,CAAA;AACjE,MAAA,QAAA,GAAW,MAAA,CAAO,QAAA;AAClB,MAAA,YAAA,GAAe,MAAA,CAAO,YAAA;AAAA,IACxB;AAGA,IAAA,MAAM,WAAA,GAAc,MAAM,kBAAA,CAAmB;AAAA,MAC3C,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,QAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAc,YAAA,CAAa;AAAA,KAC5B,CAAA;AAGD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,yBAAA,CAA0B,WAAA,EAAa,QAAQ,CAAA;AACnE,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAEpC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAoB,aAAA,EAI/B;AACD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,SAAA,IAAaC,mBAAAA;AAE3C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACrB,QAAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,SAAc,IAAA,CAAA,YAAA,EAAa;AAGjC,MAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,MAAA,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,CAAC,MAAA,KAAW;AAClC,QAAA,WAAA,CAAY,IAAI,MAAM,CAAA;AACtB,QAAA,MAAA,CAAO,GAAG,OAAA,EAAS,MAAM,WAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,MACrD,CAAC,CAAA;AAGD,MAAA,MAAM,aAAa,MAAM;AACvB,QAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,UAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,QACjB;AACA,QAAA,MAAA,CAAO,KAAA,EAAM;AAAA,MACf,CAAA;AAEA,MAAA,IAAI,WAAA;AACJ,MAAA,IAAI,UAAA;AAEJ,MAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAAgB,CAAC,KAAK,GAAA,KAAQ;AACpD,QAAA,WAAA,GAAc,GAAA;AACd,QAAA,UAAA,GAAa,GAAA;AAAA,MACf,CAAC,CAAA;AAGD,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,UAAA,EAAW;AACX,QAAA,UAAA,CAAW,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,SAAS,IAAI,CAAC,CAAA;AAAA,MACnE,GAAG,SAAS,CAAA;AAGZ,MAAA,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,EAAK,GAAA,KAAQ;AACjC,QAAA,MAAM,MAAM,IAAI,GAAA;AAAA,UACd,IAAI,GAAA,IAAO,GAAA;AAAA,UACX,CAAA,iBAAA,EAAqB,MAAA,CAAO,OAAA,EAAQ,CAAkB,IAAI,CAAA;AAAA,SAC5D;AAEA,QAAA,IAAI,GAAA,CAAI,aAAa,WAAA,EAAa;AAChC,UAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,UAAA,GAAA,CAAI,IAAI,WAAW,CAAA;AACnB,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAC1C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,mBAAmB,CAAA;AACjE,UAAA,YAAA,CAAa,OAAO,CAAA;AACpB,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,UAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,gBAAA,IAAoB,MAAS,CAAC,CAAA;AAC5D,UAAA,UAAA;AAAA,YACE,IAAI,KAAA;AAAA,cACF,gBAAgB,KAAK,CAAA,EAAG,mBAAmB,CAAA,GAAA,EAAM,gBAAgB,KAAK,EAAE,CAAA;AAAA;AAC1E,WACF;AACA,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAC1C,QAAA,IAAI,UAAU,aAAA,EAAe;AAC3B,UAAA,YAAA,CAAa,OAAO,CAAA;AACpB,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,UAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,0BAA0B,CAAC,CAAA;AACnE,UAAA,UAAA,CAAW,IAAI,KAAA,CAAM,6CAA6C,CAAC,CAAA;AACnE,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AACxC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,YAAA,CAAa,OAAO,CAAA;AACpB,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,UAAA,GAAA,CAAI,GAAA;AAAA,YACF,IAAA,CAAK,SAAA,CAAU,cAAA,EAAgB,gCAAgC;AAAA,WACjE;AACA,UAAA,UAAA,CAAW,IAAI,KAAA,CAAM,mCAAmC,CAAC,CAAA;AACzD,UAAA;AAAA,QACF;AAGA,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,aAAa,CAAA;AAClD,QAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAA;AAC1B,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB,CAAC,CAAA;AAGD,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,CAAA;AAElD,MAAA,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe,WAAA,EAAa,MAAM;AAC9C,QAAA,MAAM,OAAA,GAAU,OAAO,OAAA,EAAQ;AAC/B,QAAAoB,MAAAA,CAAM,mCAAA,EAAqC,OAAA,CAAQ,IAAI,CAAA;AACvD,QAAApB,QAAAA,CAAQ,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,WAAA,EAAa,KAAA,EAAO,YAAY,CAAA;AAAA,MAChE,CAAC,CAAA;AAED,MAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC1B,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,MACZ,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAsB,GAAA,EAAyB;AAC3D,IAAA,IAAI,YAAW,EAAG;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AACjC,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,QAAA,KAAa,IAAI,CAAA;AACxC,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAE,IAAI,IAAI,CAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAChC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,CAAA;AACjC,MAAAoB,OAAM,mCAAmC,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AAEd,MAAAA,MAAAA,CAAM,2BAA2B,KAAK,CAAA;AACtC,MAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,MAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,QAAA,EAAS,GAAI,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,yBAAA,CACN,QACA,QAAA,EACc;AACd,IAAA,OAAO;AAAA,MACL,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,SAAA,EAAW,OAAO,SAAA,GACd,IAAA,CAAK,KAAI,GAAI,MAAA,CAAO,YAAY,GAAA,GAChC,MAAA;AAAA,MACJ;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAsB;AAC5B,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AAAA,EA+BT;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,OAAe,WAAA,EAA8B;AAC7D,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAA,EA4BW,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IAAA,EACjC,cAAc,CAAA,GAAA,EAAM,UAAA,CAAW,WAAW,CAAC,SAAS,EAAE;AAAA;AAAA;AAAA,OAAA,CAAA;AAAA,EAI1D;AACF;AAKA,SAAS,UAAA,GAAsB;AAE7B,EAAA,IAAI,OAAA,CAAQ,IAAI,EAAA,EAAI;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IACE,OAAA,CAAQ,QAAA,KAAa,OAAA,IACrB,CAAC,OAAA,CAAQ,IAAI,OAAA,IACb,CAAC,OAAA,CAAQ,GAAA,CAAI,eAAA,EACb;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,KACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;;;ACv4BA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,cAuMb,CAAA;;;ACpLA,SAAS,qBAAqB,GAAA,EAA6B;AACzD,EAAA,MAAM,WAAY,GAAA,EAAiC,QAAA;AAGnD,EAAA,MAAM,UAAA,GAAa,QAAA,EAAU,OAAA,EAAS,GAAA,GAAM,aAAa,CAAA;AACzD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAO,CAAA,SAAU,OAAA,GAAU,GAAA;AAAA,EACxC;AACA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,iBAAiB,GAAA,EAAuB;AAC/C,EAAA,MAAM,WAAY,GAAA,EAAiC,QAAA;AAGnD,EAAA,OAAO,UAAU,MAAA,KAAW,GAAA;AAC9B;AAKA,SAAS,wBAAwB,GAAA,EAAuB;AACtD,EAAA,IAAI,EAAE,GAAA,YAAe,KAAA,CAAA,EAAQ,OAAO,KAAA;AACpC,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY;AACpC,EAAA,OACE,GAAA,CAAI,QAAA,CAAS,YAAY,CAAA,IACzB,GAAA,CAAI,QAAA,CAAS,cAAc,CAAA,IAC3B,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,IACxB,GAAA,CAAI,SAAS,WAAW,CAAA,IACxB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,IACtB,GAAA,CAAI,QAAA,CAAS,gBAAgB,CAAA,IAC7B,GAAA,CAAI,QAAA,CAAS,cAAc,CAAA;AAE/B;AAKA,SAAS,iBAAiB,GAAA,EAAuB;AAC/C,EAAA,OAAO,uBAAA,CAAwB,GAAG,CAAA,IAAK,gBAAA,CAAiB,GAAG,CAAA;AAC7D;AAMA,eAAe,gBAAA,CACb,IACA,WAAA,EACY;AACZ,EAAA,IAAI,OAAA;AACJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,EAAa,OAAA,EAAA,EAAW;AACvD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,IAAI,OAAA,GAAU,WAAA,IAAe,gBAAA,CAAiB,GAAG,CAAA,EAAG;AAClD,QAAA,MAAM,YAAA,GAAe,qBAAqB,GAAG,CAAA;AAC7C,QAAA,MAAM,OAAA,GACJ,iBAAiB,IAAA,GACb,YAAA,GACA,KAAK,GAAA,CAAI,GAAA,GAAO,CAAA,IAAK,OAAA,EAAS,GAAK,CAAA;AACzC,QAAA,WAAA;AAAA,UACE,wDAAA;AAAA,UACA,OAAA,GAAU,CAAA;AAAA,UACV,WAAA,GAAc,CAAA;AAAA,UACd,OAAA;AAAA,UACC,GAAA,CAAc;AAAA,SACjB;AACA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAACpB,aAAY,UAAA,CAAWA,QAAAA,EAAS,OAAO,CAAC,CAAA;AAAA,MAC7D,CAAA,MAAO;AACL,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,OAAA;AACR;AAMA,IAAM,aAAA,uBAAoB,OAAA,EAA0C;AA+DpE,eAAsB,wBAAA,CACpB,QACA,OAAA,EACiB;AAEjB,EAAA,MAAM,eAAA,GAAkB,kBAAkB,MAAM,CAAA;AAGhD,EAAA,MAAM,SAAS,IAAI,MAAA;AAAA,IACjB;AAAA,MACE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,IAAA,IAAQ,8BAAA;AAAA,MACnC,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,OAAA,IAAW,eAAA,CAAY;AAAA,KACvD;AAAA,IACA;AAAA,MACE,YAAA,EAAc;AAAA,QACZ,GAAI,eAAA,CAAgB,YAAA,IAAgB,EAAC;AAAA;AAAA;AAAA,QAGrC,UAAU,OAAA,EAAS,eAAA,GACd,gBAAgB,YAAA,EAAc,QAAA,IAAY,EAAC,GAC5C;AAAA;AACN;AACF,GACF;AAGA,EAAA,IAAI,aAAA,CAAc,eAAe,CAAA,EAAG;AAClC,IAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,CAAqB;AAAA,MACzC,SAAS,eAAA,CAAgB,OAAA;AAAA,MACzB,IAAA,EAAM,eAAA,CAAgB,IAAA,IAAQ,EAAC;AAAA,MAC/B,GAAI,eAAA,CAAgB,GAAA,IAAO,EAAE,GAAA,EAAK,gBAAgB,GAAA,EAAI;AAAA;AAAA,MAEtD,GAAI,eAAA,CAAgB,KAAA,IAAS,EAAE,QAAQ,QAAA,EAAkB;AAAA,MACzD,GAAI,gBAAgB,GAAA,IAAO;AAAA,QACzB,KAAK,MAAA,CAAO,WAAA;AAAA,UACV,MAAA,CAAO,OAAA,CAAQ,EAAE,GAAG,OAAA,CAAQ,KAAK,GAAG,eAAA,CAAgB,GAAA,EAAK,CAAA,CAAE,MAAA;AAAA,YACzD,CAAC,KAAA,KAAqC,KAAA,CAAM,CAAC,CAAA,KAAM;AAAA;AACrD;AACF;AACF,KACD,CAAA;AAED,IAAA,WAAA,CAAY,0BAAA,EAA4B;AAAA,MACtC,SAAS,eAAA,CAAgB,OAAA;AAAA,MACzB,MAAM,eAAA,CAAgB,IAAA;AAAA,MACtB,KAAK,eAAA,CAAgB;AAAA,KACtB,CAAA;AAED,IAAA,MAAM,MAAA,CAAO,OAAA;AAAA,MACX,SAAA;AAAA,MACA,gBAAgB,gBAAA,KAAqB,MAAA,GACjC,EAAE,OAAA,EAAS,eAAA,CAAgB,kBAAiB,GAC5C;AAAA,KACN;AAAA,EACF,CAAA,MAAA,IAAW,YAAA,CAAa,eAAe,CAAA,EAAG;AAGxC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,YAAA,EAAc,CAAA,6BAAA,EAAgC,eAAA,CAAY,OAAO,CAAA,CAAA;AAAA,MACjE,GAAG,eAAA,CAAgB;AAAA,KACrB;AAGA,IAAA,IAAI,eAAA,CAAgB,IAAA,EAAM,iBAAA,IAAqB,CAAC,SAAS,YAAA,EAAc;AACrE,MAAA,MAAM,QAAA,GAAW,gBAAgB,IAAA,CAAK,iBAAA;AACtC,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,IAAY,OAAA,CAAQ,IAAI,eAAe,CAAA;AACjE,MAAA,MAAM,YAAA,GACJ,QAAA,CAAS,YAAA,IAAgB,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAE1D,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,EAAc;AAC9B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,SAAS,aAAA,EAAe;AAC3B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,WAAA,CAAY,6CAA6C,CAAA;AACzD,MAAA,MAAM,WAAA,GAAc,MAAM,4BAAA,CAA6B;AAAA,QACrD,eAAe,QAAA,CAAS,aAAA;AAAA,QACxB,QAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAQ,QAAA,CAAS;AAAA,OAClB,CAAA;AACD,MAAA,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,WAAA,CAAY,WAAW,CAAA,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAI,eAAA,CAAgB,IAAA,EAAM,WAAA,IAAe,CAAC,SAAS,YAAA,EAAc;AAC/D,MAAA,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA;AAC7C,IAAA,IAAI,WAAA,GACF,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,GAAS,CAAA,GAAI,EAAE,OAAA,EAAQ,GAAI,MAAA;AAGlD,IAAA,MAAM,QAAA,GACJ,eAAA,CAAgB,KAAA,EAAO,GAAA,IACvB,OAAA,CAAQ,IAAI,aAAa,CAAA,IACzB,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAE1B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,QAAQ,CAAA;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,QAAQ,CAAA;AAClC,QAAA,WAAA;AAAA,UACE,yBAAA;AAAA,UACA,SAAA,CAAU,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,CAAA;AAAA,UAC9B,SAAA,CAAU,QAAA;AAAA,UACV,SAAA,CAAU;AAAA,SACZ;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,WAAA,CAAY,+BAA+B,CAAA;AAAA,MAC7C;AACA,MAAA,WAAA,GAAc;AAAA,QACZ,GAAG,WAAA;AAAA,QACH,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,IAAI,gBAAgB,GAAA,EAAK;AACvB,MAAA,MAAM,SAAS,eAAA,CAAgB,GAAA;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,IAAIsB,KAAA,CAAY;AAAA,UACjC,OAAA,EAAS;AAAA,YACP,GAAI,OAAO,EAAA,IAAM,EAAE,IAAI,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA,EAAE;AAAA,YAC/C,GAAI,OAAO,IAAA,IAAQ,EAAE,MAAM,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,YACrD,GAAI,OAAO,GAAA,IAAO,EAAE,KAAK,YAAA,CAAa,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,YAClD,kBAAA,EAAoB,OAAO,kBAAA,IAAsB;AAAA;AACnD,SACD,CAAA;AACD,QAAA,aAAA,CAAc,GAAA,CAAI,QAAQ,UAAU,CAAA;AACpC,QAAA,WAAA,GAAc;AAAA,UACZ,GAAG,WAAA;AAAA,UACH;AAAA,SACF;AACA,QAAA,WAAA,CAAY,2BAA2B,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,QAAQ,MAAA,CAAO,GAAA;AACpD,QAAA,MAAM,WAAW,MAAA,CAAO,EAAA,GACpB,gBAAA,GACA,MAAA,CAAO,OACL,oBAAA,GACA,YAAA;AACN,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,mBAAA,EAAsB,QAAQ,CAAA,MAAA,EAAS,QAAQ,CAAA,EAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SAC5G;AAAA,MACF;AAAA,IACF,WAAW,QAAA,EAAU;AAGnB,MAAA,MAAM,qBACJ,WAAA,EACC,UAAA;AACH,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,aAAA,CAAc,GAAA,CAAI,QAAQ,kBAAkB,CAAA;AAAA,MAC9C;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,yBAAA,EAA2B;AAAA,MACrC,WAAW,eAAA,CAAgB,SAAA;AAAA,MAC3B,OAAA,EACE,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AAAA,MAC3D,eAAA,EAAiB,CAAC,CAAC,OAAA,EAAS;AAAA,KAC7B,CAAA;AAED,IAAA,SAAA,CAAU,kBAAA,EAAoB,gBAAgB,SAAS,CAAA;AACvD,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,MAAA,SAAA,CAAU,0BAAA,EAA4B,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,aAAA,GAAgB,gBAAgB,aAAA,IAAiB,CAAA;AACvD,IAAA,MAAM,cAAA,GACJ,gBAAgB,gBAAA,KAAqB,MAAA,GACjC,EAAE,OAAA,EAAS,eAAA,CAAgB,kBAAiB,GAC5C,MAAA;AAGN,IAAA,MAAM,iBAAiB,YAAY;AACjC,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,sCAAsC,CAAA;AAChD,QAAA,MAAM,mBAAA,GAAsB,IAAI,6BAAA,CAA8B,GAAA,EAAK;AAAA,UACjE,WAAA;AAAA,UACA,cAAc,OAAA,EAAS;AAAA,SACxB,CAAA;AACD,QAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,mBAAA,EAAqB,cAAc,CAAA;AACxD,QAAA,WAAA,CAAY,+BAA+B,CAAA;AAC3C,QAAA,SAAA,CAAU,2CAA2C,CAAA;AAAA,MACvD,SAAS,GAAA,EAAK;AACZ,QAAA,SAAA;AAAA,UACE,iDAAA;AAAA,UACC,GAAA,CAAc;AAAA,SACjB;AACA,QAAA,WAAA,CAAY,uDAAuD,CAAA;AACnE,QAAA,SAAA,CAAU,2BAA2B,CAAA;AACrC,QAAA,MAAM,YAAA,GAAe,IAAI,kBAAA,CAAmB,GAAA,EAAK;AAAA,UAC/C,WAAA;AAAA,UACA,cAAc,OAAA,EAAS;AAAA,SACxB,CAAA;AACD,QAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc,cAAc,CAAA;AACjD,QAAA,WAAA,CAAY,mBAAmB,CAAA;AAC/B,QAAA,SAAA,CAAU,gCAAgC,CAAA;AAAA,MAC5C;AAAA,IACF,GAAG,aAAa,CAAA;AAAA,EAClB;AAEA,EAAA,WAAA,CAAY,wBAAwB,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,OAAO,gBAAA,EAAiB;AAC3C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,WAAA,CAAY,mBAAmB,UAAU,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,MAAA;AACT;AAOA,eAAsB,eAAe,MAAA,EAA+B;AAKlE,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,KAAA,EAAM;AAAA,EACrB,SAAS,KAAA,EAAO;AACd,IAAA,WAAA;AAAA,MACE,0BAAA;AAAA,MACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,KACvD;AACA,IAAA,MAAM,KAAA;AAAA,EACR,CAAA,SAAE;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,aAAA,CAAc,OAAO,MAAM,CAAA;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,KAAA,EAAM;AAAA,MACpB,SAAS,UAAA,EAAY;AACnB,QAAA,WAAA;AAAA,UACE,gCAAA;AAAA,UACC,UAAA,CAAqB;AAAA,SACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC3WO,SAAS,sBACd,MAAA,EACwB;AACxB,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,KAAA;AAClC,EAAA,MAAM,gBAAgC,EAAC;AACvC,EAAA,MAAM,YAAsB,EAAC;AAG7B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AACjC,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,OAAA,EAAS;AAClC,MAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC9C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,YAAA,GAA6B;AAAA,QACjC,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO;AAAA,OAC9C;AAGA,MAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,QAAA,YAAA,CAAa,OAAO,CAAA,CAAE,IAAA;AACtB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,MACvB;AAGA,MAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAW;AACxB,QAAA,YAAA,CAAa,OAAO,CAAA,CAAE,IAAA;AAAA,MACxB;AAGA,MAAA,IAAI,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,EAAU;AAClC,QAAA,YAAA,CAAa,WAAW,CAAA,CAAE,QAAA;AAAA,MAC5B;AAEA,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAAA,IACjC;AAAA,EACF;AAGA,EAAA,IAAI,iBAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,MAAA,CAAO,sBAAsB,MAAA,EAAW;AAC1C,IAAA,iBAAA,GAAoB,MAAA,CAAO,iBAAA;AAG3B,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,IAAI,OAAO,MAAA,CAAO,iBAAA,KAAsB,QAAA,EAAU;AAChD,QAAA,SAAA,CAAU,IAAA,CAAK,OAAO,iBAAiB,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,MAAA,CAAO,iBAAA,IAAqB,IAAA,EAAM;AAE3C,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,iBAAiB,CAAC,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,GAAA,EAAK,MAAA;AAAA,IACL,OAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAaO,SAAS,YAAY,QAAA,EAA2B;AAErD,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,OAAO,EAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI,oBAAA,CAAqB,QAAQ,CAAA,EAAG;AAClC,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAGA,EAAA,IAAI,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC9B,IAAA,OAAO,qBAAA,CAAsB,QAAQ,CAAA,CAAE,IAAA;AAAA,EACzC;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,IAAA,OAAO,4BAA4B,QAAQ,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,MAAM,CAAA,GAAI,QAAA;AAGV,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AAC5B,MAAA,OAAO,2BAAA,CAA4B,EAAE,OAAO,CAAA;AAAA,IAC9C;AAGA,IAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,MAAA,OAAO,CAAA,CAAE,OAAA;AAAA,IACX;AAGA,IAAA,IAAI,CAAA,CAAE,sBAAsB,MAAA,EAAW;AACrC,MAAA,IAAI,OAAO,CAAA,CAAE,iBAAA,KAAsB,QAAA,EAAU;AAC3C,QAAA,OAAO,CAAA,CAAE,iBAAA;AAAA,MACX;AACA,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,iBAAiB,CAAA;AAAA,IAC3C;AAGA,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,MAAA,OAAO,CAAA,CAAE,IAAA;AAAA,IACX;AAGA,IAAA,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EACzB;AAGA,EAAA,IACE,OAAO,aAAa,QAAA,IACpB,OAAO,aAAa,SAAA,IACpB,OAAO,aAAa,QAAA,EACpB;AACA,IAAA,OAAO,OAAO,QAAQ,CAAA;AAAA,EACxB;AAGA,EAAA,OAAO,EAAA;AACT;AAKA,SAAS,qBAAqB,KAAA,EAAiD;AAC7E,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC9C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OACE,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAClB,OAAO,CAAA,CAAE,OAAA,KAAY,SAAA,IACrB,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA,IAC7B,EAAE,GAAA,KAAQ,MAAA;AAEd;AAKA,SAAS,iBAAiB,KAAA,EAAyC;AACjE,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC9C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,KAAA;AAEV,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA;AAChC;AAKA,SAAS,4BAA4B,OAAA,EAA4B;AAC/D,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC9C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,OAAO,CAAA,CAAE,SAAS,QAAA,EAAU;AACnD,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,EAC5B;AAGA,EAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAC/B;;;ACtPO,IAAMC,YAAAA,GAAc,WAAA;AAWpB,SAAS,qBAAqB,QAAA,EAA2B;AAC9D,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AAC/C,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AACnD,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,UAAA,EAAY,MAAM,CAAA;AAC7C;AAQO,SAAS,kBAAkB,QAAA,EAA2B;AAC3D,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AAC/C,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AACzC;AAQO,SAAS,gBAAgB,QAAA,EAA4B;AAC1D,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,QAAA;AAGV,EAAA,IAAI,CAAA,CAAE,YAAY,IAAA,EAAM;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,IAAS,KAAK,OAAO,CAAA,CAAE,QAAQ,QAAA,IAAY,CAAA,CAAE,QAAQ,IAAA,EAAM;AAC7D,IAAA,MAAM,MAAM,CAAA,CAAE,GAAA;AACd,IAAA,OAAO,IAAI,OAAA,KAAY,IAAA;AAAA,EACzB;AAEA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,oBAAoB,QAAA,EAA2B;AAC7D,EAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAA;AAAA,EACT;AAGA,EAAA,OAAOA,aAAY,QAAQ,CAAA;AAC7B;AAiBO,SAAS,oBAAoB,IAAA,EAAsB;AACxD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACxC;;;AC9FO,SAAS,gBAAA,CACd,QACA,QAAA,EACkB;AAClB,EAAA,MAAM,SAAA,GAAY,kBAAkB,MAAM,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,kBAAkB,QAAQ,CAAA;AAE9C,EAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,CAAA,sCAAA,CAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,mBAAmB,SAAS,CAAA;AAAA,MACpC,QAAA,EAAU,mBAAmB,WAAW;AAAA;AAC1C,GACF;AACF;AAKA,SAAS,kBAAA,CAAmB,GAAA,EAAa,SAAA,GAAY,GAAA,EAAa;AAChE,EAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,iBAAA;AACnC;;;ACtBO,SAAS,cAAA,CACd,QAAA,EACA,MAAA,EACA,OAAA,GAAkC,EAAC,EACjB;AAElB,EAAA,MAAM,eAAA,GAAkB,oBAAoB,QAAQ,CAAA;AAIpD,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,eAAA,KAAoB,IAAA,EAAM;AAKhD,EAAA,IAAI;AAEF,IAAA,MAAA,CAAO,MAAM,eAAe,CAAA;AAE5B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,QAAA,GAAW,KAAA;AACjB,IAAA,MAAM,MAAA,GAAS,gBAAgB,QAAQ,CAAA;AAEvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,mCAAmC,MAAM,CAAA,CAAA;AAAA,MAClD,OAAA,EAAS;AAAA,QACP,QAAQ,QAAA,CAAS;AAAA;AACnB,KACF;AAAA,EACF;AACF;AAWA,SAAS,oBAAoB,QAAA,EAA4B;AACvD,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAW;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5D,IAAA,MAAM,CAAA,GAAI,QAAA;AAGV,IAAA,IAAI,mBAAA,IAAuB,CAAA,IAAK,CAAA,CAAE,iBAAA,KAAsB,MAAA,EAAW;AACjE,MAAA,OAAO,CAAA,CAAE,iBAAA;AAAA,IACX;AAGA,IAAA,IAAI,SAAS,CAAA,IAAK,MAAA,IAAU,KAAK,SAAA,IAAa,CAAA,IAAK,mBAAmB,CAAA,EAAG;AAEvE,MAAA,IAAI,CAAA,CAAE,sBAAsB,MAAA,EAAW;AACrC,QAAA,OAAO,CAAA,CAAE,iBAAA;AAAA,MACX;AAEA,MAAA,MAAM,OAAO,CAAA,CAAE,IAAA;AACf,MAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,QAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,aAAa,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,EAAG;AAE9C,MAAA,MAAM,IAAA,GAAOA,aAAY,QAAQ,CAAA;AACjC,MAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,QAAA;AAAA,IAC/B;AAGA,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,YAAA,CAAa,QAAQ,CAAA,IAAK,QAAA;AAAA,EACnC;AAGA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,aAAa,IAAA,EAAuB;AAC3C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,EAAA,IACE,EAAE,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,UAAA,CAAW,GAAG,CAAA,CAAA,IACnD,EAAE,QAAQ,QAAA,CAAS,GAAG,KAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,CAAA,EAC/C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,gBAAgB,KAAA,EAAyB;AAChD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACzC,IAAA,MAAM/B,KAAAA,GAAO,MAAM,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAC5D,IAAA,OAAO,CAAA,EAAGA,KAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,EAClC,CAAC,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;;;AClIO,SAAS,YAAA,CACd,QAAA,EACA,QAAA,EACA,OAAA,GAAgC,EAAC,EACf;AAClB,EAAA,MAAM,EAAE,aAAA,GAAgB,IAAA,EAAK,GAAI,OAAA;AAGjC,EAAA,MAAM,kBAAkB,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAGtE,EAAA,MAAM,IAAA,GAAO+B,aAAY,QAAQ,CAAA;AAGjC,EAAA,MAAM,WAAA,GAAc,aAAA,GAAgB,IAAA,GAAO,IAAA,CAAK,WAAA,EAAY;AAG5D,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,aAAa,eAAA,EAAiB;AACvC,IAAA,MAAM,gBAAA,GAAmB,aAAA,GACrB,SAAA,GACA,SAAA,CAAU,WAAA,EAAY;AAE1B,IAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC3C,MAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,SACE,eAAA,CAAgB,MAAA,KAAW,IACvB,CAAA,+BAAA,CAAA,GACA,CAAA,sBAAA,EAAyB,gBAAgB,MAAM,CAAA,oBAAA;AAAA,KACvD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EACE,QAAQ,MAAA,KAAW,CAAA,GACf,6CAA6C,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GACvD,CAAA,oBAAA,EAAuB,OAAA,CAAQ,MAAM,CAAA,sBAAA,EAAyB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IAC3G,OAAA,EAAS;AAAA,MACP,OAAA;AAAA,MACA,YAAY,IAAA,CAAK,MAAA;AAAA,MACjB,WAAA,EAAaC,oBAAmB,IAAI;AAAA;AACtC,GACF;AACF;AAKA,SAASA,mBAAAA,CAAmB,GAAA,EAAa,SAAA,GAAY,GAAA,EAAa;AAChE,EAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,iBAAA;AACnC;;;ACrDO,SAAS,eAAA,CACd,QAAA,EACA,QAAA,EACA,OAAA,GAAmC,EAAC,EAClB;AAClB,EAAA,MAAM,EAAE,aAAA,GAAgB,IAAA,EAAK,GAAI,OAAA;AACjC,EAAA,MAAM,kBAAkB,CAAC,aAAA;AAGzB,EAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAGlE,EAAA,MAAM,IAAA,GAAOD,aAAY,QAAQ,CAAA;AAGjC,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,EAAS,eAAe,CAAA;AAC/C,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG;AACrB,MAAA,SAAA,CAAU,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,SACE,WAAA,CAAY,MAAA,KAAW,IACnB,CAAA,wBAAA,CAAA,GACA,CAAA,qBAAA,EAAwB,YAAY,MAAM,CAAA,SAAA;AAAA,KAClD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,SACE,SAAA,CAAU,MAAA,KAAW,CAAA,GACjB,CAAA,iCAAA,EAAoC,UAAU,CAAC,CAAC,CAAA,CAAA,GAChD,CAAA,wBAAA,EAA2B,UAAU,MAAM,CAAA,WAAA,EAAc,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACnF,OAAA,EAAS;AAAA,MACP,SAAA;AAAA,MACA,YAAY,IAAA,CAAK,MAAA;AAAA,MACjB,WAAA,EAAaC,oBAAmB,IAAI;AAAA;AACtC,GACF;AACF;AAKA,SAAS,QAAA,CAAS,SAA0B,eAAA,EAAkC;AAC5E,EAAA,IAAI,mBAAmB,MAAA,EAAQ;AAE7B,IAAA,IAAI,mBAAmB,CAAC,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACnD,MAAA,OAAO,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,KAAA,GAAQ,kBAAkB,GAAA,GAAM,EAAA;AACtC,EAAA,OAAO,IAAI,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA;AAClC;AAKA,SAAS,gBAAgB,OAAA,EAAkC;AACzD,EAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,IAAA,OAAO,QAAQ,QAAA,EAAS;AAAA,EAC1B;AACA,EAAA,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AACpB;AAKA,SAASA,mBAAAA,CAAmB,GAAA,EAAa,SAAA,GAAY,GAAA,EAAa;AAChE,EAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,iBAAA;AACnC;;;ACpFO,SAAS,aAAA,CACd,QAAA,EACA,QAAA,GAAwC,IAAA,EACtB;AAClB,EAAA,MAAM,aAAA,GAAgB,gBAAgB,QAAQ,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,aAAA,GAAgB,mBAAA,CAAoB,QAAQ,CAAA,GAAI,EAAA;AAGrE,EAAA,IAAI,OAAO,aAAa,SAAA,EAAW;AACjC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,IAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,4CAAA;AAAA,QACT,OAAA,EAAS;AAAA,UACP,WAAA,EAAaA,mBAAAA,CAAmBD,YAAAA,CAAY,QAAQ,CAAC;AAAA;AACvD,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,IAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,CAAA,4CAAA,EAA+CC,mBAAAA,CAAmB,YAAY,CAAC,CAAA,CAAA,CAAA;AAAA,QACxF,OAAA,EAAS;AAAA,UACP;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,mBAAmB,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAGvE,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,CAAA,8BAAA,EAAiC,gBAAA,CAAiB,CAAC,CAAC,CAAA,iBAAA,CAAA;AAAA,MAC7D,OAAA,EAAS;AAAA,QACP,WAAA,EAAaA,mBAAAA,CAAmBD,YAAAA,CAAY,QAAQ,CAAC;AAAA;AACvD,KACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAU,gBAAA,CAAiB,IAAA;AAAA,IAAK,CAAC,QACrC,YAAA,CAAa,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,aAAa;AAAA,GACvD;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EACE,iBAAiB,MAAA,KAAW,CAAA,GACxB,mCAAmC,gBAAA,CAAiB,CAAC,CAAC,CAAA,CAAA,CAAA,GACtD,CAAA,uCAAA,EAA0C,iBAAiB,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IAChG,OAAA,EAAS;AAAA,MACP,kBAAA,EAAoB,YAAA;AAAA,MACpB,iBAAA,EAAmB;AAAA;AACrB,GACF;AACF;AAKA,SAASC,mBAAAA,CAAmB,GAAA,EAAa,SAAA,GAAY,GAAA,EAAa;AAChE,EAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,iBAAA;AACnC;;;AC9FO,SAAS,YAAA,CACd,UACA,OAAA,EACkB;AAClB,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,OAAA;AAG/B,EAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,MAAA,EAAW;AACpD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,qBAAqB,QAAQ,CAAA;AAChD,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,QAAA,KAAa,MAAA,IAAa,UAAA,GAAa,QAAA,EAAU;AACnD,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,kBAAkB,WAAA,CAAY,UAAU,CAAC,CAAA,oBAAA,EAAuB,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA;AAAA,KACvF;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,KAAa,MAAA,IAAa,UAAA,GAAa,QAAA,EAAU;AACnD,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,kBAAkB,WAAA,CAAY,UAAU,CAAC,CAAA,mBAAA,EAAsB,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA;AAAA,KACtF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,CAAA,eAAA,EAAkB,WAAA,CAAY,UAAU,CAAC,CAAA,kBAAA,CAAA;AAAA,MAClD,OAAA,EAAS;AAAA,QACP,WAAA,EAAa;AAAA;AACf,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACzB,OAAA,EAAS;AAAA,MACP,WAAA,EAAa,UAAA;AAAA,MACb,QAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAKA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,EACjB;AACA,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM;AACvB,IAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;;;AClEA,SAAS,mBAAmB,KAAA,EAAkD;AAC5E,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,SAAA,IAAa,KAAA,IACb,WAAA,IAAe,KAAA,IACf,KAAA,CAAM,OAAA,CAAS,KAAA,CAAkC,SAAS,CAAA;AAE9D;AAKA,SAAS,iBACP,CAAA,EAC4C;AAC5C,EAAA,OACE,OAAO,CAAA,KAAM,QAAA,IACb,CAAA,KAAM,IAAA,IACN,cAAc,CAAA,IACd,OAAQ,CAAA,CAA8B,UAAU,CAAA,KAAM,QAAA;AAE1D;AAEA,SAAS,YAAA,CACP,QACA,QAAA,EACS;AACT,EAAA,OAAO,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAChD,IAAA,MAAM,SAAA,GAAY,OAAO,CAAC,CAAA;AAG1B,IAAA,IAAI,gBAAA,CAAiB,CAAC,CAAA,EAAG;AACvB,MAAA,IAAI,OAAO,SAAA,KAAc,QAAA,EAAU,OAAO,KAAA;AAC1C,MAAA,MAAM,KAAK,IAAI,MAAA,CAAO,CAAA,CAAE,QAAA,EAAU,EAAE,MAAM,CAAA;AAC1C,MAAA,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,IAC1B;AAEA,IAAA,IACE,OAAO,MAAM,QAAA,IACb,CAAA,KAAM,QACN,OAAO,SAAA,KAAc,QAAA,IACrB,SAAA,KAAc,IAAA,EACd;AACA,MAAA,OAAO,YAAA;AAAA,QACL,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAIA,IAAA,OAAO,KAAK,SAAA,CAAU,SAAS,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EACvD,CAAC,CAAA;AACH;AAEA,SAAS,gBAAA,CACP,MAAA,EACA,QAAA,EACA,UAAA,GAAa,CAAA,EACL;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC/C,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,CAAS,IAAA,EAAM;AACjC,IAAA,IACE,QAAA,CAAS,SAAA,KAAc,MAAA,IACvB,CAAC,YAAA,CAAa,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,QAAA,CAAS,SAAS,CAAA,EACtD;AACA,MAAA;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAA;AACT;AAQO,SAAS,iBAAA,CACd,UACA,WAAA,EACkB;AAClB,EAAA,IAAI,CAAC,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AACjC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EACE;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,QAAA,CAAS,SAAA;AAGxB,EAAA,MAAM,aAAA,GAAgB,YAAY,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,KAAK,CAAA;AAC1E,EAAA,MAAM,sBAAsB,aAAA,CAAc,MAAA;AAAA,IACxC,CAAC,QAAA,KAAa,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,CAAA,KAAM;AAAA,GACvD,CAAE,MAAA;AACF,EAAA,MAAM,SACJ,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,mBAAA,GAAsB,cAAc,MAAA,GAAS,CAAA;AAK1E,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACjE,EAAA,MAAM,YACJ,MAAA,CAAO,MAAA,GAAS,CAAA,GACZ,MAAA,CAAO,OAAO,CAAC,CAAA,KAAM,YAAA,CAAa,GAAA,CAAI,EAAE,IAAI,CAAC,CAAA,CAAE,MAAA,GAAS,OAAO,MAAA,GAC/D,CAAA;AAEN,EAAA,MAAM,OAAA,GAAU,EAAE,SAAA,EAAW,MAAA,EAAO;AAEpC,EAAA,MAAM,KAAA,GAAQ,YAAY,KAAA,IAAS,KAAA;AAEnC,EAAA,IAAI,UAAU,QAAA,EAAU;AAEtB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,KAAA,MAAW,QAAA,IAAY,YAAY,KAAA,EAAO;AACxC,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA;AACzD,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAI,QAAA,CAAS,aAAa,KAAA,EAAO;AAC/B,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,KAAA;AAAA,YACN,OAAA,EAAS,CAAA,eAAA,EAAkB,QAAA,CAAS,IAAI,sDAAsD,UAAU,CAAA,uBAAA,CAAA;AAAA,YACxG;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,GAAA,GAAM,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,QAAA,GAAW,YAAY,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,KAAK,CAAA;AACrE,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,CAAA;AAC7C,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,MAAM,QAAA,GACJ,QAAA,CAAS,SAAA,KAAc,MAAA,GACnB,CAAA,WAAA,EAAc,KAAK,SAAA,CAAU,QAAA,CAAS,SAAS,CAAC,CAAA,CAAA,GAChD,EAAA;AACN,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,OAAA,EAAS,CAAA,eAAA,EAAkB,QAAA,CAAS,IAAI,IAAI,QAAQ,CAAA,6BAAA,CAAA;AAAA,UACpD;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,cAAc,IAAA,EAAM;AAClC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AACjE,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC5D,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,CAAA,uBAAA,EAA0B,KAAK,CAAA,OAAA,EAAU,CAAC,GAAG,YAAY,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAA,EAAI,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,YAAA,CAAA;AAAA,QACnG;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,kCAAkC,OAAA,EAAQ;AAC1E;AAQO,SAAS,qBAAA,CACd,UACA,OAAA,EACkB;AAClB,EAAA,IAAI,CAAC,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AACjC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EACE;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,CAAU,MAAA;AACjC,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAM,GAAI,OAAA;AAE5B,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,KAAA,EAAO;AAC1C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,CAAA,iBAAA,EAAoB,KAAK,CAAA,uBAAA,EAA0B,KAAK,CAAA;AAAA,KACnE;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,GAAA,EAAK;AACpC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,CAAA,kBAAA,EAAqB,GAAG,CAAA,uBAAA,EAA0B,KAAK,CAAA;AAAA,KAClE;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,GAAA,EAAK;AACpC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,CAAA,iBAAA,EAAoB,GAAG,CAAA,uBAAA,EAA0B,KAAK,CAAA;AAAA,KACjE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA;AAAA,IACN,OAAA,EAAS,oBAAoB,KAAK,CAAA,0BAAA;AAAA,GACpC;AACF;;;ACpOO,IAAM,gBAAA,GAAkD;AAAA,EAC7D,WAAA,EACE,kgBAAA;AAAA,EAQF,YAAA,EACE,wdAAA;AAAA,EAOF,YAAA,EACE,0jBAAA;AAAA,EAQF,uBAAA,EACE,2kBAAA;AAAA,EAQF,WAAA,EACE;AAOJ;AAQO,SAAS,gBAAgB,CAAA,EAAgC;AAC9D,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,IAAK,gBAAA;AACvC;AAOO,SAAS,cAAc,MAAA,EAA4B;AACxD,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,iBAAiB,MAAM,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;;;ACzEO,IAAM,mBAAA,GAAsBC,EAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,EAAE,OAAA,EAAQ;AAAA,EAChB,KAAA,EAAOA,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC9B,SAAA,EAAWA,EAAE,MAAA;AACf,CAAC,CAAA;;;ACFM,SAAS,oBAAA,CAAqB,MAAA,GAAsB,EAAC,EAAU;AACpE,EAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,mBAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,gDAAgD,YAAY,CAAA,sBAAA;AAAA,KAC9D;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,0BAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,GAAA;AACtC,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CAAS,SAAA,EAAW,SAAA,EAAW,MAAA,EAA8B;AACjE,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI;AAEF,QAAA,eAAA,GAAkB,MAAM,OAAO,mBAAmB,CAAA;AAAA,MACpD,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA;AAAA,gBAAA,EAEqB,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,SACvE;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,OAAA,CAAQ,EAAE,QAAQ,CAAA;AACrD,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,MAAM,CAAA;AAE5D,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO;AAAA,QAC5C,KAAA;AAAA,QACA,UAAA,EAAY,SAAA;AAAA,QACZ,WAAA;AAAA,QACA,MAAA,EACE,+HAAA;AAAA,QACF,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ;AAAA,OAC7C,CAAA;AACD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAEhC,MAAA,MAAM,SAAA,GAAa,SAAS,OAAA,CAAkB,IAAA;AAAA,QAC5C,CAAC,CAAA,KAAW,CAAA,CAAE,IAAA,KAAS;AAAA,OACzB;AACA,MAAA,MAAM,IAAA,GAAQ,WAAW,IAAA,IAAmB,EAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,mBAAmB,IAAI,CAAA;AAEtC,MAAA,OAAO;AAAA,QACL,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,KAAA,EAAO;AAAA,UACL,WAAA,EAAc,QAAA,CAAS,KAAA,EAAO,YAAA,IAA2B,CAAA;AAAA,UACzD,YAAA,EAAe,QAAA,CAAS,KAAA,EAAO,aAAA,IAA4B,CAAA;AAAA,UAC3D,YAAA,EAAc,CAAA;AAAA,UACd;AAAA;AACF,OACF;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAAS,gBAAA,CACP,SAAA,EACA,SAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,YAAA,GACJ,OAAO,SAAA,KAAc,QAAA,GACjB,YACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAEvC,EAAA,MAAM,YAAA,GACJ,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,SAChC,OAAO,SAAA,KAAc,QAAA,GACnB,SAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,GACnC,IAAA;AAEN,EAAA,OACE,CAAA;AAAA,EAAY,MAAM;;AAAA;AAAA,EACO,YAAY;AAAA;;AAAA;AAAA,EACd,gBAAgB,wBAAwB;AAAA;;AAAA,uFAAA,CAAA;AAGnE;AAEA,SAAS,mBAAmB,IAAA,EAI1B;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CACb,OAAA,CAAQ,aAAA,EAAe,EAAE,EACzB,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,IAAA,EAAK;AAER,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,IAAI,CAAA,CAAE,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,SAAA,CAAU,MAAM,CAAA;AACnD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4EAAA,EAA+E,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC;AAAA,mBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,KACjK;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;;;AC9GO,SAAS,0BAAA,CAA2B,MAAA,GAAsB,EAAC,EAAU;AAC1E,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,0BAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,GAAA;AACtC,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CAAS,SAAA,EAAW,SAAA,EAAW,MAAA,EAA8B;AACjE,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AAEF,QAAA,YAAA,GAAe,MAAM,OAAO,0BAA0B,CAAA;AAAA,MACxD,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA;AAAA,gBAAA,EAEqB,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,SACvE;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,eAAA,CAAgB;AAAA,QAC9C,SAAA,EACE,OAAA,CAAQ,GAAA,CAAI,qBAAA,IAAyB,QAAQ,GAAA,CAAI,mBAAA;AAAA,QACnD,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,sBAAA,IAA0B;AAAA,OAC/C,CAAA;AAED,MAAA,MAAM,MAAA,GAASC,iBAAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,MAAM,CAAA;AAE5D,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO;AAAA,QAC5C,KAAA;AAAA,QACA,UAAA,EAAY,SAAA;AAAA,QACZ,WAAA;AAAA,QACA,MAAA,EACE,+HAAA;AAAA,QACF,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ;AAAA,OAC7C,CAAA;AACD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAEhC,MAAA,MAAM,SAAA,GAAa,SAAS,OAAA,CAAkB,IAAA;AAAA,QAC5C,CAAC,CAAA,KAAW,CAAA,CAAE,IAAA,KAAS;AAAA,OACzB;AACA,MAAA,MAAM,IAAA,GAAQ,WAAW,IAAA,IAAmB,EAAA;AAC5C,MAAA,MAAM,MAAA,GAASC,oBAAmB,IAAI,CAAA;AAEtC,MAAA,OAAO;AAAA,QACL,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,KAAA,EAAO;AAAA,UACL,WAAA,EAAc,QAAA,CAAS,KAAA,EAAO,YAAA,IAA2B,CAAA;AAAA,UACzD,YAAA,EAAe,QAAA,CAAS,KAAA,EAAO,aAAA,IAA4B,CAAA;AAAA,UAC3D,YAAA,EAAc,CAAA;AAAA,UACd;AAAA;AACF,OACF;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAASD,iBAAAA,CACP,SAAA,EACA,SAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,YAAA,GACJ,OAAO,SAAA,KAAc,QAAA,GACjB,YACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAEvC,EAAA,MAAM,YAAA,GACJ,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,SAChC,OAAO,SAAA,KAAc,QAAA,GACnB,SAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,GACnC,IAAA;AAEN,EAAA,OACE,CAAA;AAAA,EAAY,MAAM;;AAAA;AAAA,EACO,YAAY;AAAA;;AAAA;AAAA,EACd,gBAAgB,wBAAwB;AAAA;;AAAA,uFAAA,CAAA;AAGnE;AAEA,SAASC,oBAAmB,IAAA,EAI1B;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CACb,OAAA,CAAQ,aAAA,EAAe,EAAE,EACzB,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,IAAA,EAAK;AAER,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,IAAI,CAAA,CAAE,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,SAAA,CAAU,MAAM,CAAA;AACnD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4EAAA,EAA+E,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC;AAAA,mBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,KACjK;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;ACnGO,SAAS,uBAAuB,MAAA,EAA4B;AACjE,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,0BAAA;AAC9B,EAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,GAAA;AAC5C,EAAA,MAAM,oBAAoB,MAAA,CAAO,iBAAA;AAEjC,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CACJ,SAAA,EACA,SAAA,EACA,MAAA,EACsB;AAEtB,MAAA,MAAM,YAAA,GACJ,OAAO,SAAA,KAAc,QAAA,GACjB,YACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AACvC,MAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,UAAA,CAAW,YAAA,EAAc,MAAM,CAAA;AAGjE,MAAA,IACE,iBAAA,KAAsB,MAAA,IACtB,kBAAA,GAAqB,iBAAA,EACrB;AACA,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAO,CAAA;AAAA,UACP,SAAA,EAAW,CAAA,kBAAA,EAAqB,kBAAkB,CAAA,sCAAA,EAAyC,iBAAiB,CAAA,OAAA,CAAA;AAAA,UAC5G,kBAAA;AAAA,UACA,wBAAA,EAA0B;AAAA,SAC5B;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAASD,iBAAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,MAAM,CAAA;AAE5D,MAAA,IAAI;AAGF,QAAA,IAAI,aAAA;AAkBJ,QAAA,WAAA,MAAiB,WAAW,KAAA,CAAM;AAAA,UAChC,MAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,KAAA;AAAA,YACA,YAAA;AAAA;AAAA,YAEA,OAAO,EAAC;AAAA;AAAA,YAER,cAAA,EAAgB,mBAAA;AAAA,YAChB,+BAAA,EAAiC,IAAA;AAAA;AAAA,YAEjC,cAAc,iBAAA,EAAkB;AAAA;AAAA,YAEhC,QAAA,EAAU;AAAA;AACZ,SACD,CAAA,EAAG;AAEF,UAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,YAAA,aAAA,GAAgB,OAAA;AAAA,UAClB;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,aAAA,EAAe;AAClB,UAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,QACpE;AAGA,QAAA,IACE,aAAA,CAAc,OAAA,KAAY,SAAA,IAC1B,aAAA,CAAc,QAAQ,MAAA,EACtB;AACA,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,wBAAA,EAA2B,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,WAC5D;AAAA,QACF;AAGA,QAAA,MAAM,YAAA,GAAe,cAAc,MAAA,IAAU,EAAA;AAG7C,QAAA,MAAM,MAAA,GAASC,oBAAmB,YAAY,CAAA;AAG9C,QAAA,MAAM,KAAA,GAAsB;AAAA,UAC1B,WAAA,EAAa,aAAA,CAAc,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,UAClD,YAAA,EAAc,aAAA,CAAc,KAAA,EAAO,aAAA,IAAiB,CAAA;AAAA,UACpD,YAAA,EAAc,cAAc,cAAA,IAAkB,CAAA;AAAA,UAC9C,UAAA,EAAY,cAAc,WAAA,IAAe,CAAA;AAAA,UACzC,eAAe,aAAA,CAAc,eAAA;AAAA,UAC7B,oBAAA,EAAsB,cAAc,KAAA,EAAO,uBAAA;AAAA,UAC3C,wBAAA,EACE,cAAc,KAAA,EAAO;AAAA,SACzB;AAEA,QAAA,OAAO;AAAA,UACL,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,KAAA;AAAA,UACA,kBAAA;AAAA,UACA,wBAAA,EAA0B;AAAA,SAC5B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,yCAAyC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,SACjG;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AAKA,SAAS,iBAAA,GAA4B;AACnC,EAAA,OACE,kRAAA;AAIJ;AAKA,SAASD,iBAAAA,CACP,SAAA,EACA,SAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,YAAA,GACJ,OAAO,SAAA,KAAc,QAAA,GACjB,YACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAEvC,EAAA,MAAM,YAAA,GACJ,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,SAChC,OAAO,SAAA,KAAc,QAAA,GACnB,SAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,GACnC,IAAA;AAEN,EAAA,MAAM,QAAuB,EAAC;AAE9B,EAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,EAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,EAAA,KAAA,CAAM,KAAK,4BAA4B,CAAA;AACvC,EAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,EAAA,KAAA,CAAM,KAAK,6BAA6B,CAAA;AAExC,EAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AACjC,EAAA,KAAA,CAAM,IAAA,CAAK,gBAAgB,wBAAwB,CAAA;AACnD,EAAA,KAAA,CAAM,KAAK,2BAA2B,CAAA;AAEtC,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,oDAAA,IACG,YAAA,KAAiB,IAAA,GACd,qDAAA,GACA,EAAA,CAAA,GACJ;AAAA,GACJ;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAMA,SAASC,oBAAmB,IAAA,EAI1B;AACA,EAAA,IAAI,QAAA,GAAW,KAAK,IAAA,EAAK;AAGzB,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,EAAG;AAClC,IAAA,QAAA,GAAW,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,EAAG;AAC9B,IAAA,QAAA,GAAW,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5B,IAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACjC;AACA,EAAA,QAAA,GAAW,SAAS,IAAA,EAAK;AAEzB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AAGN,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,0BAA0B,CAAA;AAC3D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,IAAI,CAAA,CAAE,CAAA;AAAA,IACnE;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,SAAA,CAAU,MAAM,CAAA;AACnD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4EAAA,EAA+E,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC;AAAA,mBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,KAClK;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;;;AC3OO,SAAS,iBAAA,CAAkB,MAAA,GAAsB,EAAC,EAAU;AACjE,EAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,gBAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,6CAA6C,YAAY,CAAA,sBAAA;AAAA,KAC3D;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,QAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,GAAA;AACtC,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CAAS,SAAA,EAAW,SAAA,EAAW,MAAA,EAA8B;AAGjE,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AAEF,QAAA,YAAA,GAAe,MAAM,OAAO,QAAQ,CAAA;AAAA,MACtC,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA;AAAA,gBAAA,EACqB,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,SACvE;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,IAAI,YAAA,CAAa,OAAA,CAAQ,EAAE,QAAQ,CAAA;AAClD,MAAA,MAAM,MAAA,GAASD,iBAAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,MAAM,CAAA;AAE5D,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,QACtD,KAAA;AAAA,QACA,UAAA,EAAY,SAAA;AAAA,QACZ,WAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EACE;AAAA,WACJ;AAAA,UACA,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAA;AAAO;AAClC,OACD,CAAA;AACD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAEhC,MAAA,MAAM,OACH,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,EAAG,QAAQ,OAAA,IAChC,EAAA;AACF,MAAA,MAAM,MAAA,GAASC,oBAAmB,IAAI,CAAA;AAEtC,MAAA,OAAO;AAAA,QACL,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,KAAA,EAAO;AAAA,UACL,WAAA,EACG,UAAA,CAAW,KAAA,EAAO,aAAA,IAAwC,CAAA;AAAA,UAC7D,YAAA,EACG,UAAA,CAAW,KAAA,EAAO,iBAAA,IAA4C,CAAA;AAAA,UACjE,YAAA,EAAc,CAAA;AAAA,UACd;AAAA;AACF,OACF;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAASD,iBAAAA,CACP,SAAA,EACA,SAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,YAAA,GACJ,OAAO,SAAA,KAAc,QAAA,GACjB,YACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAEvC,EAAA,MAAM,YAAA,GACJ,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,SAChC,OAAO,SAAA,KAAc,QAAA,GACnB,SAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,GACnC,IAAA;AAEN,EAAA,OACE,CAAA;AAAA,EAAY,MAAM;;AAAA;AAAA,EACO,YAAY;AAAA;;AAAA;AAAA,EACd,gBAAgB,wBAAwB;AAAA;;AAAA,uFAAA,CAAA;AAGnE;AAEA,SAASC,oBAAmB,IAAA,EAI1B;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CACb,OAAA,CAAQ,aAAA,EAAe,EAAE,EACzB,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,IAAA,EAAK;AAER,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,IAAI,CAAA,CAAE,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,SAAA,CAAU,MAAM,CAAA;AACnD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4EAAA,EAA+E,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC;AAAA,mBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,KACjK;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;;;ACtHO,SAAS,iBAAA,CAAkB,MAAA,GAAsB,EAAC,EAAU;AACjE,EAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,gBAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,6CAA6C,YAAY,CAAA,sBAAA;AAAA,KAC3D;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,kBAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,GAAA;AAEtC,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CAAS,SAAA,EAAW,SAAA,EAAW,MAAA,EAA8B;AAEjE,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AAEF,QAAA,YAAA,GAAe,MAAM,OAAO,uBAAuB,CAAA;AAAA,MACrD,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA;AAAA,gBAAA,EACqB,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,SACvE;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,CAAa,kBAAA,CAAmB,MAAM,CAAA;AACxD,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB;AAAA,QACtC,KAAA;AAAA,QACA,gBAAA,EAAkB;AAAA,UAChB,eAAA,EAAiB,SAAA;AAAA,UACjB,WAAA,EAAa;AAAA,SACf;AAAA,QACA,iBAAA,EACE;AAAA,OACH,CAAA;AAED,MAAA,MAAM,YAAA,GACJ,OAAO,SAAA,KAAc,QAAA,GACjB,YACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAEvC,MAAA,MAAM,YAAA,GACJ,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,SAChC,OAAO,SAAA,KAAc,QAAA,GACnB,SAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,GACnC,IAAA;AAEN,MAAA,MAAM,MAAA,GACJ,CAAA;AAAA,EAAY,MAAM;;AAAA;AAAA,EACO,YAAY;AAAA;;AAAA;AAAA,EACd,gBAAgB,wBAAwB;AAAA;;AAAA,uFAAA,CAAA;AAGjE,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB,MAAM,CAAA;AAClD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAEhC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,OAAA,GAAU,IAAA,CACb,OAAA,CAAQ,aAAA,EAAe,EAAE,EACzB,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,IAAA,EAAK;AAER,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI;AACF,QAAA,SAAA,GAAY,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,IAAI,CAAA,CAAE,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,SAAA,CAAU,SAAS,CAAA;AAC1D,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,4EAAA,EAA+E,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC;AAAA,mBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,SACrK;AAAA,MACF;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,KAAc,UAAA,CAAW,IAAA;AAE9C,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,WAAA,EACG,MAAA,CAAO,QAAA,CAAS,aAAA,EAAe,gBAAA,IAEd,CAAA;AAAA,UACpB,YAAA,EACG,MAAA,CAAO,QAAA,CAAS,aAAA,EAAe,oBAAA,IAEd,CAAA;AAAA,UACpB,YAAA,EAAc,CAAA;AAAA,UACd;AAAA;AACF,OACF;AAAA,IACF;AAAA,GACF;AACF;;;ACpEO,SAAS,WAAA,CAAY,MAAA,GAAsB,EAAC,EAAU;AAC3D,EAAA,MAAM,QAAA,GAAyB,OAAO,QAAA,IAAY,WAAA;AAElD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,WAAA;AACH,MAAA,OAAO,qBAAqB,MAAM,CAAA;AAAA,IAEpC,KAAK,kBAAA;AACH,MAAA,OAAO,2BAA2B,MAAM,CAAA;AAAA,IAE1C,KAAK,qBAAA;AACH,MAAA,OAAO,uBAAuB,MAAM,CAAA;AAAA,IAEtC,KAAK,QAAA;AACH,MAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,IAEjC,KAAK,QAAA;AACH,MAAA,OAAO,kBAAkB,MAAM,CAAA;AAAA,IAEjC;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA;AAErE;;;ACPA,IAAM,QAAA,uBAAe,GAAA,EAAiC;AAiC/C,SAAS,aAAA,CACd9B,QACA,QAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAIA,MAAI,CAAA;AAClC,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,UAAUA,MAAI,CAAA,4GAAA;AAAA,KAEhB;AAAA,EACF;AACA,EAAA,QAAA,CAAS,GAAA,CAAIA,QAAM,QAAQ,CAAA;AAC7B;AASO,SAAS,mBAAmBA,MAAAA,EAAmC;AACpE,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAIA,MAAI,CAAA;AAClC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,SAAA,GACJ,QAAA,CAAS,IAAA,GAAO,CAAA,GACZ,sBAAsB,CAAC,GAAG,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACrD,4BAAA;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,OAAA,EAAUA,MAAI,CAAA,oBAAA,EAAuB,SAAS,CAAA,mDAAA;AAAA,KAEhD;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,kBAAA,GAA2B;AACzC,EAAA,QAAA,CAAS,KAAA,EAAM;AACjB;;;AChDA,SAAS,aAAA,CAAc,QAAkB,IAAA,EAAsB;AAC7D,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG,OAAO,CAAA;AAC/B,EAAA,MAAM,QAAA,GACJ,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAA,CAAO,CAAA,GAAI,IAAA,KAAS,CAAA,EAAG,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA;AAC/D,EAAA,OAAO,IAAA,CAAK,KAAK,QAAQ,CAAA;AAC3B;AAEA,eAAsB,aAAA,CACpB,UACA,MAAA,EAC2B;AAC3B,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,SAAA;AAAA,IACP,MAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA,GAAY,GAAA;AAAA,IACZ,IAAA,GAAO,CAAA;AAAA,IACP,QAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAA;AAGJ,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,mBAAmB,SAAS,CAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,QAAA,EAAU,aAAa,KAAA,CAAS,CAAA;AAEnE,MAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAC1B,MAAA,MAAM,SAAS,KAAA,IAAS,SAAA;AAExB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,SACL,CAAA,cAAA,EAAiB,SAAS,uBAAuB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GACjE,CAAA,cAAA,EAAiB,SAAS,CAAA,oBAAA,EAAuB,KAAA,CAAM,QAAQ,CAAC,CAAC,gBAAgB,SAAS,CAAA,GAAA,EAAM,WAAA,CAAY,SAAA,IAAa,EAAE,CAAA;AAAA,OACjI;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,CAAA,cAAA,EAAiB,SAAS,CAAA,SAAA,EAAY,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OACjG;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EACE;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,cAAc,MAAM,CAAA;AAE3C,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,GAAI,QAAA,KAAa,MAAA,IAAa,EAAE,QAAA,EAAS;AAAA,IACzC,GAAI,KAAA,KAAU,MAAA,IAAa,EAAE,KAAA,EAAM;AAAA,IACnC,GAAI,YAAA,KAAiB,MAAA,IAAa,EAAE,YAAA,EAAa;AAAA,IACjD,GAAI,SAAA,KAAc,MAAA,IAAa,EAAE,SAAA,EAAU;AAAA,IAC3C,GAAI,WAAA,KAAgB,MAAA,IAAa,EAAE,WAAA,EAAY;AAAA,IAC/C,GAAI,YAAA,KAAiB,MAAA,IAAa,EAAE,YAAA,EAAa;AAAA,IACjD,GAAI,iBAAA,KAAsB,MAAA,IAAa,EAAE,iBAAA;AAAkB,GAC7D;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,YAAY,WAAW,CAAA;AAErC,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,aAAA;AAEJ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,QAAA;AAAA,QAC9B,QAAA;AAAA,QACA,SAAA,IAAa,IAAA;AAAA,QACb;AAAA,OACF;AACA,MAAA,MAAA,CAAO,KAAK,WAAA,CAAY,KAAA,KAAU,WAAA,CAAY,IAAA,GAAO,IAAM,CAAA,CAAI,CAAA;AAC/D,MAAA,aAAA,GAAgB,WAAA,CAAY,SAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA;AAC7D,IAAA,MAAM,SAAS,SAAA,IAAa,SAAA;AAC5B,IAAA,MAAM,UACJ,IAAA,GAAO,CAAA,GACH,aAAa,IAAI,CAAA,QAAA,EAAW,OAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA,GACtE,EAAA;AAEN,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAA,GAAS,aAAA,CAAc,QAAQ,SAAS,CAAA;AACxC,MAAA,YAAA,GAAe,MAAA,GAAS,GAAA;AAExB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,+DACa,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,aAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,gCAAA;AAAA,SAEvF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,SACL,CAAA,wBAAA,EAA2B,SAAA,CAAU,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAA,CAAA,GACzD,2BAA2B,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,EAAA,EAAK,aAAA,IAAiB,EAAE,CAAA,CAAA;AAAA,MAC/G,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,SAAA;AAAA,QACP,SAAA,EAAW,aAAA;AAAA,QACX,eAAe,QAAA,IAAY,WAAA;AAAA,QAC3B,UAAA,EAAY,KAAA;AAAA,QACZ,GAAI,OAAO,CAAA,IAAK;AAAA,UACd,MAAA;AAAA,UACA,WAAA,EAAa,MAAA;AAAA,UACb;AAAA;AACF;AACF,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,2BAA2B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KACtF;AAAA,EACF;AACF;;;ACpJO,IAAM,kBAAA,GAAqB;AAAA;AAAA,EAEhC,SAAA,EAAW,WAAA;AAAA;AAAA,EAEX,IAAA,EAAM,MAAA;AAAA;AAAA,EAEN,QAAA,EAAU,UAAA;AAAA;AAAA,EAEV,SAAA,EAAW,UAAA;AAAA;AAAA,EAEX,GAAA,EAAK;AACP;;;ACzEA,IAAM,uBAAA,GAA0B,GAAA;AAEhC,SAAS,eAAA,CACP,OAAA,EACA,EAAA,EACA,MAAA,EACY;AACZ,EAAA,IAAI,KAAA;AACJ,EAAA,OAAO,QAAQ,IAAA,CAAK;AAAA,IAClB,OAAA;AAAA,IACA,IAAI,OAAA,CAAe,CAAC,CAAA,EAAG,MAAA,KAAW;AAChC,MAAA,KAAA,GAAQ,UAAA;AAAA,QACN,MACE,MAAA;AAAA,UACE,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,kBAAA,EAAqB,EAAE,CAAA,EAAA,CAAI;AAAA,SAC/D;AAAA,QACF;AAAA,OACF;AAAA,IACF,CAAC;AAAA,GACF,CAAA,CAAE,OAAA,CAAQ,MAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AACtC;AAIA,IAAI,QAAA,GAEO,IAAA;AAGX,IAAI;AAEF,EAAA,MAAM,UAAA,GAAa,UAAQ,kBAAkB,CAAA;AAC7C,EAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,IAAQ,UAAA,CAAW,KAAK,IAAA,EAAM;AACzD,IAAA,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EACtD;AAEF,CAAA,CAAA,MAAQ;AAER;AAmHO,SAAS,gBAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,MAAA;AACtC,EAAA,MAAM,UAAU,OAAA,EAAS,OAAA;AACzB,EAAA,MAAM,WAAA,GAAc,SAAS,aAAA,IAAiB,uBAAA;AAE9C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MAEA,MAAM,SAAA,GAAkC;AACtC,QAAA,MAAM,SAAS,MAAM,eAAA;AAAA,UACnB,OAAO,SAAA,EAAU;AAAA,UACjB,WAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,OAAO,MAAA,CAAO,KAAA;AAAA,MAChB,CAAA;AAAA,MAEA,MAAM,QAAA,CACJA,MAAAA,EACA,IAAA,EACyB;AACzB,QAAA,MAAM,SAAS,MAAM,eAAA;AAAA,UACnB,OAAO,QAAA,CAAS;AAAA,YACd,IAAA,EAAAA,MAAAA;AAAA,YACA,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,UACD,WAAA;AAAA,UACA,aAAaA,MAAI,CAAA,EAAA;AAAA,SACnB;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,MAEA,aAAA,GAAgB;AACd,QAAA,MAAM,aAAA,GAAgB,OAAO,gBAAA,EAAiB;AAC9C,QAAA,IAAI,CAAC,aAAA,EAAe;AAClB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OAAO;AAAA,UACL,MAAM,aAAA,CAAc,IAAA;AAAA,UACpB,SAAS,aAAA,CAAc;AAAA,SACzB;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IAEA,MAAM,SAAA,GAAkC;AACtC,MAAA,MAAM,UAAU,YAAY;AAC1B,QAAA,MAAM,SAAS,MAAM,eAAA;AAAA,UACnB,OAAO,SAAA,EAAU;AAAA,UACjB,WAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAGrB,QAAA,MAAM,QAAA,CAAS,OAAO,gBAAA,EAAkB;AAAA,UACtC,WAAA,EAAa,kBAAA;AAAA,UACb,MAAM,IAAA,CAAK,SAAA;AAAA,YACT;AAAA,cACE,SAAA,EAAW,WAAA;AAAA,cACX,WAAW,KAAA,CAAM,MAAA;AAAA,cACjB,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,gBACvB,MAAM,CAAA,CAAE,IAAA;AAAA,gBACR,aAAa,CAAA,CAAE;AAAA,eACjB,CAAE;AAAA,aACJ;AAAA,YACA,IAAA;AAAA,YACA;AAAA;AACF,SACD,CAAA;AAED,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAGA,MAAA,OACE,QAAA,GAAW,QAAA,CAAS,kBAAA,EAAoB,OAAO,IAAI,OAAA,EAAQ;AAAA,IAE/D,CAAA;AAAA,IAEA,MAAM,QAAA,CACJA,MAAAA,EACA,IAAA,EACyB;AACzB,MAAA,MAAM,UAAU,YAAY;AAC1B,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,QAAA,MAAM,SAAS,MAAM,eAAA;AAAA,UACnB,OAAO,QAAA,CAAS;AAAA,YACd,IAAA,EAAAA,MAAAA;AAAA,YACA,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,UACD,WAAA;AAAA,UACA,aAAaA,MAAI,CAAA,EAAA;AAAA,SACnB;AACA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAGhC,QAAA,MAAM,QAAA,CAAS,MAAA,CAAO,CAAA,SAAA,EAAYA,MAAI,CAAA,CAAA,EAAI;AAAA,UACxC,WAAA,EAAa,kBAAA;AAAA,UACb,MAAM,IAAA,CAAK,SAAA;AAAA,YACT;AAAA,cACE,SAAA,EAAW,UAAA;AAAA,cACX,QAAA,EAAUA,MAAAA;AAAA,cACV,IAAA;AAAA,cACA,MAAA;AAAA,cACA,UAAA;AAAA,cACA,OAAA,EAAS,OAAO,OAAA,IAAW,KAAA;AAAA,cAC3B,QAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,IAAA;AAAA,YACA;AAAA;AACF,SACD,CAAA;AAED,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAGA,MAAA,OACE,WAAW,QAAA,CAAS,CAAA,eAAA,EAAkBA,MAAI,CAAA,EAAA,CAAA,EAAM,OAAO,IAAI,OAAA,EAAQ;AAAA,IAEvE,CAAA;AAAA,IAEA,aAAA,GAAgB;AACd,MAAA,MAAM,aAAA,GAAgB,OAAO,gBAAA,EAAiB;AAC9C,MAAA,MAAM,SAAS,aAAA,GACX;AAAA,QACE,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,SAAS,aAAA,CAAc;AAAA,OACzB,GACA,IAAA;AAGJ,MAAA,QAAA,CACG,OAAO,iBAAA,EAAmB;AAAA,QACzB,WAAA,EAAa,kBAAA;AAAA,QACb,MAAM,IAAA,CAAK,SAAA;AAAA,UACT;AAAA,YACE,SAAA,EAAW,eAAA;AAAA,YACX,UAAA,EAAY;AAAA,WACd;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACD,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,GAAG,CAAA;AAAA,MACjE,CAAC,CAAA;AAEH,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AACF;;;AChUO,SAAS,mBAAA,CAEd,UACA,QAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAM;AACb,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAO,MAAA,CAAO,IAAA,GACV,4CAAA,GACA,MAAA,CAAO,OAAA;AAAA,MACb;AACA,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF;AACF;;;AChBO,SAAS,iBAAA,CAEd,QAAA,EACA,MAAA,EACA,OAAA,GAAkC,EAAC,EACnC;AACA,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAM;AACb,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAO,MAAA,CAAO,IAAA,GACV,mDAAA,GACA,MAAA,CAAO,OAAA;AAAA,MACb;AACA,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF;AACF;;;ACpBO,SAAS,iBAAA,CAEd,QAAA,EACA,QAAA,EACA,OAAA,GAAgC,EAAC,EACjC;AACA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAM;AACb,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,MAAM,cAAc,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GACtC,SAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA,GACvC,IAAI,QAAQ,CAAA,CAAA,CAAA;AAChB,QAAA,OAAO,MAAA,CAAO,IAAA,GACV,CAAA,iCAAA,EAAoC,WAAW,iBAC/C,MAAA,CAAO,OAAA;AAAA,MACb;AACA,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF;AACF;;;ACtBO,SAAS,kBAAA,CAEd,QAAA,EACA,QAAA,EACA,OAAA,GAAmC,EAAC,EACpC;AACA,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA;AAE1D,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAM;AACb,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAO,MAAA,CAAO,IAAA,GACV,uDAAA,GACA,MAAA,CAAO,OAAA;AAAA,MACb;AACA,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF;AACF;ACjBA,IAAM,iBAAA,GAGF;AAAA,EACF,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,gBAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EACE,+EAAA;AAAA,IACF,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAA,EACE,8EAAA;AAAA,IACF,WAAA,EAAa;AAAA,GACf;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,oBAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,2DAAA;AAAA,IACT,WAAA,EAAa;AAAA;AAEjB,CAAA;AAKA,SAAS,iBACP,SAAA,EACiE;AACjE,EAAA,OACE,OAAO,SAAA,KAAc,QAAA,IACrB,SAAA,KAAc,QACd,SAAA,IAAa,SAAA;AAEjB;AAKA,SAAS,wBACP,SAAA,EACmC;AACnC,EAAA,OACE,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,QAAQ,QAAA,IAAY,SAAA;AAEvE;AAUA,SAAS,eAAA,CACP,OACA,UAAA,EACQ;AACR,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAElC,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,MAAM,OAAA,GAAU,kBAAkB,SAAS,CAAA;AAC3C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,MAC9D;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,SAAA,CAAU,mBAAmB,MAAA,EAAQ;AACvC,QAAA,OAAA,GAAU,SAAA,CAAU,OAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,IAAI;AACF,UAAA,OAAA,GAAU,IAAI,MAAA,CAAO,SAAA,CAAU,OAAA,EAAS,GAAG,CAAA;AAAA,QAC7C,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,4CAAA,EAA+C,UAAU,OAAO,CAAA,cAAA;AAAA,WAClE;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,UAAU,WAAA,IAAe,aAAA;AAC7C,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,WAAW,CAAA;AAC5C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,uBAAA,CAAwB,SAAS,CAAA,EAAG;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AACzC,QAAA,YAAA,CAAa,MAAA,EAAQ,UAAU,MAAM,CAAA;AACrC,QAAA,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAA,CAAa,KAAc,KAAA,EAAuB;AACzD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAWL,SAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,GAAmB,GAAA;AAGvB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACzC,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,MAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,QAAA,OAAA,GAAW,QAAoC,GAAG,CAAA;AAAA,MACpD;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACtC,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,OAAQ,QAAoC,OAAO,CAAA;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;AAeA,eAAsB,mBAAA,CAEpB,QAAA,EACAK,MAAAA,EACA,UAAA,GAAkC,EAAC,EACgB;AAEnD,EAAA,IAAI,OAAA,GAAU0B,aAAY,QAAQ,CAAA;AAGlC,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAA,GAAU,eAAA,CAAgB,SAAS,UAAU,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,KAAK,KAAA,EAAO;AAGd,IAAA,IAAI;AAEF,MAAA,MAAMK,QAAA,CAAW,OAAO,CAAA,CAAE,eAAA,CAAgB/B,MAAI,CAAA;AAE9C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,MACP,CAAA,yCAAA,EAA4CA,MAAI,CAAA,aAAA;AAAA,OACpD;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,OAAA,EAAS,MAAM,CAAA,kCAAA,EAAqCA,MAAI,CAAA,aAAA;AAAA,OAC1D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI;AAGF,IAAA,MAAM+B,QAAA,CAAW,OAAO,CAAA,CAAE,eAAA,CAAgB/B,MAAI,CAAA;AAC9C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,MAAM,CAAA,2BAAA,EAA8BA,MAAI,CAAA,CAAA;AAAA,KACnD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,SAAS,MACP,KAAA,YAAiB,QACb,KAAA,CAAM,OAAA,GACN,qCAAqCA,MAAI,CAAA,CAAA;AAAA,KACjD;AAAA,EACF;AACF;;;ACxNO,SAAS,aAAA,CAEd,QAAA,EACA,QAAA,GAAwC,IAAA,EACxC;AAEA,EAAA,MAAM,iBAAA,GAAoB,KAAK,KAAA,GAC3B,OAAO,aAAa,SAAA,GAClB,CAAC,WACD,KAAA,GACF,QAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,iBAAiB,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,KAAA,GAAQ,CAAC,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AAAA,IACzC,SAAS,MAAM;AACb,MAAA,IAAI,KAAK,KAAA,EAAO;AAEd,QAAA,IAAI,OAAO,aAAa,SAAA,EAAW;AACjC,UAAA,OAAO,MAAA,CAAO,OACV,kDAAA,GACA,sCAAA;AAAA,QACN;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,QAAQ,IACtC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,GAClB,QAAA;AACJ,QAAA,OAAO,MAAA,CAAO,IAAA,GACV,CAAA,2CAAA,EAA8C,WAAW,kBACzD,MAAA,CAAO,OAAA;AAAA,MACb;AACA,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF;AACF;;;AC3BA,IAAM,yBAAA,GAA4B,GAAA;AAKlC,eAAe,cAAA,CACb,QAAA,EACA,MAAA,EACA,OAAA,EAC6C;AAC7C,EAAA,MAAM;AAAA,IACJ,SAAA,GAAY,IAAA;AAAA,IACZ,gBAAA,GAAmB,yBAAA;AAAA,IACnB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,QAAA,EAAU;AAAA,IAC/C,GAAI,MAAA,KAAW,MAAA,IAAa,EAAE,MAAA,EAAO;AAAA,IACrC,WAAW,SAAA,IAAa,MAAA;AAAA,IACxB,SAAA,EAAW,gBAAA;AAAA,IACX,GAAI,IAAA,KAAS,MAAA,IAAa,EAAE,IAAA,EAAK;AAAA,IACjC,GAAI,QAAA,KAAa,MAAA,IAAa,EAAE,QAAA,EAAS;AAAA,IACzC,GAAI,KAAA,KAAU,MAAA,IAAa,EAAE,KAAA,EAAM;AAAA,IACnC,GAAI,KAAA,KAAU,MAAA,IAAa,EAAE,KAAA;AAAM,GACpC,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,EAAM,UAAA,CAAW,IAAA,EAAM,OAAA,EAAS,WAAW,OAAA,EAAQ;AAC9D;AAUA,eAAsB,eAAA,CAEpB,QAAA,EACA,eAAA,EAIA,YAAA,EACmD;AAEnD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC5B,eAAA,CAAgB,GAAA,CAAI,OAAO,WAAA,KAAgB;AACzC,QAAA,MAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,GAAG,MAAK,GAAI,WAAA;AAC/B,QAAA,OAAO,cAAA,CAAe,QAAA,EAAU,CAAA,EAAG,IAAI,CAAA;AAAA,MACzC,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,YAAY,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC7C,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AAChD,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,cAAA,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAEvD,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,MAAM,CAAC,SAAA;AAAA,QACP,SAAS,MACP,SAAA,GACI,oCAAoC,OAAO,CAAA,CAAA,GAC3C,8BAA8B,OAAO,CAAA;AAAA,OAC7C;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,MAAM,CAAA,EAAG,OAAO;AAAA,EAAK,OAAO,CAAA;AAAA,KACvC;AAAA,EACF;AAGA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,OAAA;AAEJ,EAAA,IACE,OAAO,oBAAoB,QAAA,IAC1B,OAAO,oBAAoB,QAAA,IAC1B,eAAA,KAAoB,IAAA,IACpB,MAAA,IAAU,eAAA,EACZ;AACA,IAAA,MAAA,GAAS,eAAA;AACT,IAAA,OAAA,GAAU,gBAAgB,EAAC;AAAA,EAC7B,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,eAAA;AAAA,EACZ;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,QAAA,EAAU,QAAQ,OAAO,CAAA;AAE7D,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,CAAC,MAAA,CAAO,IAAA;AAAA,MACd,OAAA,EAAS,MACP,MAAA,CAAO,IAAA,GACH,CAAA,gDAAA,CAAA,GACA,CAAA,mCAAA;AAAA,KACR;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,GACxB;AACF;;;ACrHO,SAAS,sBAAA,CAEd,UACA,OAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAE7C,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAM;AACb,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAO,MAAA,CAAO,IAAA,GACV,4DAAA,GACA,MAAA,CAAO,OAAA;AAAA,MACb;AACA,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF;AACF;;;AChBA,SAAS,gBAAgB,MAAA,EAAoD;AAC3E,EAAA,IAAI,OAAO,WAAW,SAAA,EAAW;AAC/B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,SAAS,kBAAA,GAAqB;AAAA,KACzC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAiCA,eAAsB,sBAAA,CAEpB,QAAA,EACA,SAAA,EACA,WAAA,EACmD;AACnD,EAAA,MAAM,uBAAuB,WAAA,IAAe,kBAAA;AAE5C,EAAA,IAAI;AAEF,IAAA,MAAM,IAAA,GAAO0B,aAAY,QAAQ,CAAA;AAGjC,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,QAAA,EAAU,IAAI,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AAGxC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,CAAC,MAAA,CAAO,IAAA;AAAA,QACd,OAAA,EAAS,MACP,MAAA,CAAO,IAAA,GACH,oCAAoC,oBAAoB,CAAA,CAAA,GACxD,6BAA6B,oBAAoB,CAAA,YAAA;AAAA,OACzD;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,MACP,MAAA,CAAO,IAAA,GACF,MAAA,CAAO,OAAA,IAAW,CAAA,mBAAA,EAAsB,oBAAoB,CAAA,CAAA,GAC5D,MAAA,CAAO,OAAA,IACR,CAAA,6BAAA,EAAgC,oBAAoB,CAAA;AAAA,KAC5D;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,KAAA;AAAA;AAAA,MACX,OAAA,EAAS,MAAM,CAAA,uBAAA,EAA0B,YAAY,CAAA;AAAA,KACvD;AAAA,EACF;AACF;;;ACvFO,SAAS,eAAA,CAEd,UACA,WAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,QAAA,EAAU,WAAW,CAAA;AAEtD,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,GACxB;AACF;;;ACXO,SAAS,mBAAA,CAEd,UACA,OAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,QAAA,EAAU,OAAO,CAAA;AAEtD,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,GACxB;AACF;;;ACmBO,IAAM,MAAA,GAASK,SAAW,MAAA,CAAO;AAAA,EACtC,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,sBAAA;AAAA,EACA,sBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC;;;ACzCD,wBAAA,EAAA;AA8CO,IAAM,IAAA,GAAOrB,OAAK,MAAA,CAAoB;AAAA;AAAA;AAAA;AAAA,EAI3C,gBAAA,EAAkB;AAAA;AAAA,IAEhB,OAAO,EAAC,EAAG,GAAA,KAAQ;AAEjB,MAAA,MAAM,KAAA,GAAyB,EAAE,gBAAA,EAAkB,MAAA,EAAO;AAC1D,MAAA,MAAM,IAAI,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,EAAE,OAAO,MAAA;AAAO,GAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,WAAW,OAAO,EAAE,gBAAA,EAAiB,EAAG,KAAK,QAAA,KAAa;AAExD,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,GAAA;AACnC,IAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAE5B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,8CAAA,EAAiD,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,6EAAA;AAAA,OAExE;AAAA,IACF;AAGA,IAAA,IAAI,gBAAA,GAA6B,MAAA;AAGjC,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,SAAS,CAAA,GAAI,SAAA,GAAY,IAAA;AAGzD,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,aAAA,EAAe;AAC1C,MAAA,YAAA,GAAe,IAAI,6BAAA,CAA8B;AAAA,QAC/C,WAAA,EAAa,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,aAAA;AAAA,QACnC,WAAA,EACE,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,WAAA,IACtB,sCAAA;AAAA,QACF,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,QAChC,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM;AAAA,OACrC,CAAA;AACD,MAAA,gBAAA,GAAmB,OAAA;AAAA,IACrB;AAGA,IAAA,IAAI,eAAA,GAAkB,SAAA;AAGtB,IAAA,IAAI,UAAA,EAAY,MAAM,WAAA,EAAa;AACjC,MAAA,gBAAA,GAAmB,WAAA;AAAA,IACrB;AAIA,IAAA,IACE,UAAA,IACA,CAAC,UAAA,CAAW,IAAA,EAAM,eAClB,CAAC,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,aAAA,EACzB;AACA,MAAA,MAAM,SAAA,GAAY,IAAI,cAAA,CAAe;AAAA,QACnC,cAAc,UAAA,CAAW;AAAA,OAC1B,CAAA;AAGD,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,iBAAA,EAAkB;AAEtD,MAAA,IAAI,WAAA,EAAa;AAEf,QAAA,eAAA,GAAkB;AAAA,UAChB,GAAG,UAAA;AAAA,UACH,IAAA,EAAM;AAAA,YACJ,GAAG,UAAA,CAAW,IAAA;AAAA,YACd,aAAa,WAAA,CAAY;AAAA;AAC3B,SACF;AAEA,QAAA,gBAAA,GAAmB,OAAA;AAAA,MACrB;AAAA,IACF;AAGA,IAAA,gBAAA,CAAiB,gBAAA,GAAmB,gBAAA;AAGpC,IAAA,MAAM,MAAA,GAAS,MAAM,wBAAA,CAAyB,eAAA,EAAiB;AAAA,MAC7D,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,8BAAA;AAAA,QACN,SAAS,eAAA,CAAY;AAAA,OACvB;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,IAAI,MAAM,CAAA;AAAA,IAClB,CAAA,SAAE;AAEA,MAAA,MAAM,eAAe,MAAM,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAK,OAAO,EAAE,WAAW,gBAAA,EAAiB,EAAG,KAAK,QAAA,KAAa;AAC7D,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,GAAA;AACnC,IAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,SAAA,EAAW,QAAA,EAAU;AAAA,MAChD,UAAU,gBAAA,CAAiB,gBAAA;AAAA,MAC3B,OAAA,EAAS,SAAS,OAAA,CAAQ,IAAA;AAAA,MAC1B,aAAA,EAAe,UAAU,SAAA,EAAW;AAAA,KACrC,CAAA;AACD,IAAA,MAAM,IAAI,GAAG,CAAA;AAAA,EACf;AACF,CAAC;;;ACnLD,wBAAA,EAAA;AAWA,IAAM,0BAAN,MAA6D;AAAA,EAC1C,WAAA;AAAA,EAEjB,YAAY,WAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EAEA,IAAI,WAAA,GAAsB;AACxB,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AAAA,EAEA,IAAI,cAAA,GAAiB;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,EAAC;AAAA,MAChB,0BAAA,EAA4B,MAAA;AAAA,MAC5B,aAAa,EAAC;AAAA,MACd,gBAAgB,EAAC;AAAA,MACjB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,GAAoB;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,GAAS;AACb,IAAA,OAAO;AAAA,MACL,cAAc,IAAA,CAAK,WAAA;AAAA,MACnB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAAA,EAElC;AAAA,EAEA,MAAM,uBAAA,GAAyC;AAC7C,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,gBAAA,GAAkC;AACtC,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,YAAA,GAAgC;AACpC,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACF,CAAA;AA2BO,IAAMsB,KAAAA,GAAOtB,OAAK,MAAA,CAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/C,eAAA,EAAiB,OAAO,EAAC,EAAG,GAAA,KAAQ;AAClC,IAAA,MAAM,aAAa,oBAAA,EAAqB;AAExC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAS,CAAA;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAM,QAAA,GAAW,IAAI,uBAAA,CAAwB,UAAA,CAAW,WAAW,CAAA;AACnE,MAAA,MAAM,IAAI,QAAQ,CAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,UAAA,CAAW,KAAK,CAAA;AACrD,MAAA,MAAM,IAAI,QAAQ,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,MAAS,CAAA;AAAA,EACrB;AACF,CAAC;AAKD,SAAS,oBACP,WAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,YAAY,aAAA,EAAe;AAC9B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAsD;AAAA,IAC1D,aAAa,WAAA,CAAY,aAAA;AAAA,IACzB,WAAA,EACE,YAAY,WAAA,IAAe,sCAAA;AAAA,IAC7B,UAAU,WAAA,CAAY,QAAA;AAAA,IACtB,cAAc,WAAA,CAAY;AAAA,GAC5B;AAEA,EAAA,OAAO,IAAI,8BAA8B,cAAc,CAAA;AACzD;AAOA,SAAS,oBAAA,GAAkD;AAEzD,EAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,CAAI,gBAAA;AAChC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,EAAE,WAAA,EAAY;AAAA,EACvB;AAGA,EAAA,MAAM,cAAA,GAAiB,QAAQ,GAAA,CAAI,oBAAA;AACnC,EAAA,MAAM,aAAA,GAAgB,QAAQ,GAAA,CAAI,mBAAA;AAElC,EAAA,IAAI,kBAAkB,aAAA,EAAe;AACnC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,WAAW,cAAA,IAAkB,EAAA;AAAA,QAC7B,aAAA;AAAA,QACA,QAAA,EAAU,QAAQ,GAAA,CAAI,mBAAA;AAAA,QACtB,YAAA,EAAc,QAAQ,GAAA,CAAI,uBAAA;AAAA,QAC1B,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,MAAM,GAAG,CAAA;AAAA,QAC/C,QAAA,EAAU,QAAQ,GAAA,CAAI;AAAA;AACxB,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;ACmIA,IAAM,mBAAA,GAAsBkB,EAAE,MAAA,CAAO;AAAA,EACnC,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,OAAO,SAAA,EAAW,SAAS,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAChE,QAAA,EAAUA,EACP,IAAA,CAAK;AAAA,IACJ,QAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD,EACA,QAAA,EAAS;AAAA,EACZ,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,GAAA,EAAKA,EACF,MAAA,CAAO;AAAA,IACN,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,IAClB,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IACxB,YAAA,EAAcA,EAAE,IAAA,CAAK,CAAC,eAAe,MAAM,CAAC,EAAE,QAAA,EAAS;AAAA,IACvD,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC9B,EACA,QAAA;AACL,CAAC,CAAA;AAKD,IAAM,uBAAA,GAA0BA,EAAE,KAAA,CAAM;AAAA;AAAA,EAEtCA,CAAAA,CAAE,KAAK,CAAC,WAAA,EAAa,QAAQ,UAAA,EAAY,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA;AAAA,EAE3DA,EAAE,MAAA,CAAO;AAAA,IACP,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,IAClB,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAClC,CAAA;AAAA;AAAA,EAEDA,EAAE,MAAA,CAAO;AAAA,IACP,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ;AAAA,GAC3B;AACH,CAAC,CAAA;AAKD,IAAM,uBAAA,GAA0BA,EAC7B,MAAA,CAAO;AAAA,EACN,OAAOA,CAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EAClC,MAAA,EAAQA,EACL,KAAA,CAAM;AAAA,IACLA,EAAE,IAAA,CAAK;AAAA,MACL,aAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,uBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACDA,CAAAA,CAAE,MAAA,CAAO,EAAE,IAAA,EAAMA,CAAAA,CAAE,QAAO,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG;AAAA,GACrC,EACA,QAAA,EAAS;AAAA,EACZ,SAAA,EAAWA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAChC,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC7C,IAAA,EAAMA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACvC,QAAA,EAAUA,EACP,IAAA,CAAK;AAAA,IACJ,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,qBAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,EACA,QAAA,EAAS;AAAA,EACZ,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,SAAA,EAAWA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAChD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC/C,cAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC7C,iBAAA,EAAmBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA;AACjD,CAAC,CAAA,CACA,OAAO,CAAC,IAAA,KAAS,KAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,MAAA,KAAW,MAAA,EAAW;AAAA,EACvE,OAAA,EAAS;AACX,CAAC,CAAA;AAKH,IAAM,qBAAA,GAAwBA,EAAE,MAAA,CAAO;AAAA,EACrC,QAAA,EAAUA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,YAAA,EAAcA,CAAAA,CAAE,KAAA,CAAM,CAACA,EAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EAClE,cAAA,EAAgBA,CAAAA,CAAE,KAAA,CAAM,CAACA,EAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EACpE,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,kBAAA,EAAoBA,CAAAA,CAAE,KAAA,CAAM,uBAAuB,EAAE,QAAA,EAAS;AAAA,EAC9D,SAASA,CAAAA,CAAE,KAAA,CAAM,CAACA,CAAAA,CAAE,OAAA,IAAWA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,MAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EAC1E,WAAA,EAAaA,CAAAA,CACV,KAAA,CAAM,CAAC,yBAAyBA,CAAAA,CAAE,KAAA,CAAM,uBAAuB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAC,EACxE,QAAA,EAAS;AAAA,EACZ,YAAA,EAAcA,EACX,MAAA,CAAO;AAAA,IACN,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC9B,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC/B,EACA,QAAA,EAAS;AAAA,EACZ,cAAA,EAAgBA,EACb,MAAA,CAAO;AAAA,IACN,OAAOA,CAAAA,CAAE,KAAA;AAAA,MACPA,EAAE,MAAA,CAAO;AAAA,QACP,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,QACf,SAAA,EAAWA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,QACtD,QAAA,EAAUA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,OAChC;AAAA,KACH;AAAA,IACA,KAAA,EAAOA,EAAE,IAAA,CAAK,CAAC,UAAU,KAAK,CAAC,EAAE,QAAA,EAAS;AAAA,IAC1C,SAAA,EAAWA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GACjC,EACA,QAAA,EAAS;AAAA,EACZ,aAAA,EAAeA,EACZ,MAAA,CAAO;AAAA,IACN,GAAA,EAAKA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,IACtC,GAAA,EAAKA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,IACtC,KAAA,EAAOA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA;AAAS,GACzC,EACA,QAAA;AACL,CAAC,CAAA;AAOM,IAAM,cAAA,GAAiBA,EAAE,MAAA,CAAO;AAAA,EACrC,IAAIA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,sBAAsB,CAAA;AAAA,EAC5C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,IAAA,EAAMA,EAAE,IAAA,CAAK,CAAC,UAAU,UAAU,CAAC,EAAE,QAAA,EAAS;AAAA,EAC9C,QAAA,EAAUA,EAAE,MAAA,EAAO,CAAE,IAAI,CAAA,EAAG,4BAA4B,EAAE,QAAA,EAAS;AAAA,EACnE,IAAA,EAAMA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACjD,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,aAAA,EAAe,oBAAoB,QAAA,EAAS;AAAA,EAC5C,QAAA,EAAUA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACrD,UAAA,EAAYA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC7C,iBAAA,EAAmBA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACrD,SAAA,EAAWA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC5C,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACrC,MAAMA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACnC,MAAA,EAAQ,sBAAsB,QAAA;AAChC,CAAC;AAKM,IAAM,iBAAA,GAAoBA,EAAE,MAAA,CAAO;AAAA,EACxC,MAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,wBAAwB,CAAA;AAAA,EAChD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,OAAOA,CAAAA,CAAE,KAAA,CAAM,cAAc,CAAA,CAAE,GAAA,CAAI,GAAG,qCAAqC,CAAA;AAAA,EAC3E,QAAA,EAAUA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC9C,CAAC;AAcM,SAAS,iBAAiB,QAAA,EAA6B;AAC5D,EAAA,OAAO,cAAA,CAAe,MAAM,QAAQ,CAAA;AACtC;AASO,SAAS,oBAAoB,OAAA,EAAyC;AAC3E,EAAA,OAAO,iBAAA,CAAkB,MAAM,OAAO,CAAA;AACxC;ACxcA,eAAsB,eAAA,CACpB,QAAA,EACA,OAAA,GAA8B,EAAC,EACT;AACtB,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,GAAW,IAAA,EAAK,GAAI,OAAA;AAErC,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAMK,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACrD,IAAA,MAAM,OAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAGhD,IAAA,MAAM,iBAAA,GAA2C,QAAA,GAC7C,mBAAA,CAAoB,OAAO,CAAA,GAC1B,OAAA;AAGL,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,GAAG,iBAAA;AAAA,MACH,OAAA,EAAS,WAAW;AAAC,KACvB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA,OACzD;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAwBO,SAAS,yBAAA,CACd,IAAA,EACA,OAAA,GAA8B,EAAC,EAClB;AACb,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,GAAW,IAAA,EAAK,GAAI,OAAA;AAGrC,EAAA,MAAM,iBAAA,GAA2C,QAAA,GAC7C,mBAAA,CAAoB,IAAI,CAAA,GACvB,IAAA;AAGL,EAAA,MAAM,OAAA,GAAuB;AAAA,IAC3B,GAAG,iBAAA;AAAA,IACH,OAAA,EAAS,WAAW;AAAC,GACvB;AAEA,EAAA,OAAO,OAAA;AACT;;;ACtFA,SAAS,kBAAA,CAAmB,KAAc,QAAA,EAA0B;AAClE,EAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAG3D,EAAA,IACE,IAAI,QAAA,CAAS,oBAAoB,KACjC,GAAA,CAAI,QAAA,CAAS,sBAAsB,CAAA,EACnC;AACA,IAAA,OACE,CAAA;AAAA,yCAAA,EAC4C,QAAQ,CAAA,wDAAA,CAAA;AAAA,EAExD;AAGA,EAAA,IACE,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAClB,IAAI,QAAA,CAAS,cAAc,CAAA,IAC3B,GAAA,CAAI,SAAS,SAAS,CAAA,IACtB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EACtB;AACA,IAAA,OACE,CAAA;AAAA,uGAAA,CAAA;AAAA,EAGJ;AAGA,EAAA,IACE,IAAI,QAAA,CAAS,KAAK,KAClB,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,IACvB,GAAA,CAAI,aAAY,CAAE,QAAA,CAAS,OAAO,CAAA,IACjC,GAAA,CAAI,aAAY,CAAE,QAAA,CAAS,WAAW,CAAA,EACxC;AACA,IAAA,OACE,CAAA;AAAA,mHAAA,CAAA;AAAA,EAGJ;AAGA,EAAA,IACE,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,IACxB,GAAA,CAAI,QAAA,CAAS,cAAc,CAAA,IAC3B,GAAA,CAAI,QAAA,CAAS,cAAc,CAAA,EAC3B;AACA,IAAA,OACE,CAAA;AAAA,wGAAA,CAAA;AAAA,EAGJ;AAGA,EAAA,IACE,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAClB,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,YAAY,CAAA,IACvC,GAAA,CAAI,QAAA,CAAS,mBAAmB,CAAA,EAChC;AACA,IAAA,OACE,CAAA;AAAA,kFAAA,CAAA;AAAA,EAGJ;AAGA,EAAA,OAAO,+BAA+B,GAAG,CAAA,CAAA;AAC3C;AAIA,eAAe,SAAA,CAAU,UAAuB,KAAA,EAA6B;AAC3E,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAO,gBAAgB,CAAA;AAChD,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,mBAAmB,CAAA;AACtD,MAAA,OAAO,UAAU,KAAK,CAAA;AAAA,IACxB;AAAA,IACA,KAAK,kBAAA,EAAoB;AAKvB,MAAA,MAAM,EAAE,qBAAA,EAAsB,GAC5B,MAAM,OAAO,iCAAiC,CAAA;AAChD,MAAA,MAAM,kBAAkB,qBAAA,CAAsB;AAAA,QAC5C,OAAA,EAAS,QAAQ,GAAA,CAAI,qBAAA;AAAA,QACrB,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,sBAAA,IAA0B;AAAA,OACjD,CAAA;AACD,MAAA,OAAQ,gBAAsD,KAAK,CAAA;AAAA,IACrE;AAAA,IACA,KAAK,QAAA,EAAU;AAEb,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAO,gBAAgB,CAAA;AAChD,MAAA,OAAQ,OAAe,KAAK,CAAA;AAAA,IAC9B;AAAA,IACA,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAO,iBAAiB,CAAA;AAClD,MAAA,OAAQ,QAAgB,KAAK,CAAA;AAAA,IAC/B;AAAA,IACA,KAAK,OAAA,EAAS;AAEZ,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,eAAe,CAAA;AAC9C,MAAA,OAAQ,MAAc,KAAK,CAAA;AAAA,IAC7B;AAAA,IACA,KAAK,UAAA,EAAY;AAEf,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,kBAAkB,CAAA;AACpD,MAAA,OAAQ,SAAiB,KAAK,CAAA;AAAA,IAChC;AAAA,IACA,KAAK,YAAA,EAAc;AAEjB,MAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAM,OAAO,6BAA6B,CAAA;AACjE,MAAA,OAAQ,WAAmB,KAAK,CAAA;AAAA,IAClC;AAAA,IACA,KAAK,KAAA,EAAO;AAEV,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,OAAO,aAAa,CAAA;AAC1C,MAAA,OAAQ,IAAY,KAAK,CAAA;AAAA,IAC3B;AAAA,IACA;AACE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,oCAAA,EAAuC,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,OACzD;AAAA;AAEN;AAEA,SAAS,aAAa,QAAA,EAA+B;AACnD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,4BAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,sBAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAQO,SAAS,wBAAA,GAA6C;AAC3D,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,CACJ,GAAA,EACA,QAAA,EACA,MAAA,EACkC;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,YAAA,EAAc,WAAA,EAAY,GAAI,MAAM,OAAO,IAAI,CAAA;AAIvD,QAAA,MAAM,EAAE,UAAA,EAAA3B,WAAAA,EAAW,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,UAAA,EAAA,EAAA,YAAA,CAAA,CAAA;AAE7B,QAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,UAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,QAC1D;AAEA,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,IAAS,YAAA,CAAa,OAAO,QAAQ,CAAA;AAC5D,QAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,MAAA,CAAO,UAAU,OAAO,CAAA;AAGtD,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,SAAA,EAAU;AACrC,QAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,QAAA,MAAM,eAA8B,EAAC;AASrC,QAAA,MAAM,QAA6B,EAAC;AACpC,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AAEzB,UAAA,MAAM,SAAA,GAAY;AAAA,YAChB,IAAA,EAAM,QAAA;AAAA,YACN,GAAI,OAAA,CAAQ;AAAA,WACd;AACA,UAAA,KAAA,CAAM,QAAQ,CAAA,GAAI;AAAA,YAChB,WAAA,EAAa,QAAQ,WAAA,IAAe,EAAA;AAAA,YACpC,WAAA,EAAaA,YAAW,SAAS,CAAA;AAAA,YACjC,OAAA,EAAS,OAAO,IAAA,KAAkC;AAChD,cAAA,MAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAC1B,cAAA,MAAM4B,OAAAA,GAAS,MAAM,GAAA,CAAI,QAAA,CAAS,UAAU,IAAI,CAAA;AAChD,cAAA,aAAA,IAAiB,IAAA,CAAK,KAAI,GAAI,QAAA;AAE9B,cAAA,YAAA,CAAa,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAM,CAAA;AACrD,cAAA,OAAO,YAAYA,OAAM,CAAA;AAAA,YAC3B;AAAA,WACF;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,OAAO,YAAA,IAAgB,EAAA;AACxC,QAAA,MAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAE1B,QAAA,MAAM,MAAA,GAAS,MAAO,YAAA,CAAqB;AAAA,UACzC,KAAA;AAAA,UACA,MAAA,EAAQ,QAAA;AAAA,UACR,KAAA;AAAA,UACA,QAAA,EAAU,YAAY,QAAQ,CAAA;AAAA,UAC9B,WAAA,EAAa,OAAO,WAAA,IAAe,CAAA;AAAA,UACnC,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AAED,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA;AACrC,QAAA,MAAM,gBAAgB,eAAA,GAAkB,aAAA;AAExC,QAAA,MAAM,uBAAuB,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,UACnE,IAAA,EAAO,IAAA,CAAK,SAAA,EAAW,MAAA,GAAS,IAAI,MAAA,GAAS,WAAA;AAAA,UAG7C,OAAA,EACE,IAAA,CAAK,SAAA,EAAW,MAAA,GAAS,CAAA,GACrB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA,GAC9B,IAAA,CAAK,IAAA,IAAQ;AAAA,SACtB,CAAE,CAAA;AAEF,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW,YAAA;AAAA,UACX,UAAU,MAAA,CAAO,IAAA;AAAA,UACjB,QAAA;AAAA,UACA,aAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,WAAW,EAAC;AAAA,UACZ,KAAA,EAAO,kBAAA,CAAmB,GAAA,EAAK,MAAA,CAAO,YAAY,SAAS;AAAA,SAC7D;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;;;AC/QO,SAAS,gBAAgB,MAAA,EAAyC;AACvE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AACxE,EAAA,MAAM,YAA2B,EAAC;AAClC,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,sBAGD,EAAC;AAEN,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AAEN,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,IAAe,KAAA,CAAM,SAAS,OAAA,EAAS;AACxD,MAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS;AACzC,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,IAAA,EAAM;AAC3C,UAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AACtB,UAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AAClD,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,IAAA,EAAM,QAAA,GAAW,QAAA,CAAS,CAAC,CAAA,GAAK,OAAA;AAAA,YAChC,SAAA,EAAW,KAAA,CAAM,KAAA,IAAS,EAAC;AAAA,YAC3B,IAAI,KAAA,CAAM;AAAA,WACX,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,EAAM;AACvC,UAAA,SAAA,CAAU,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,EAAS;AACnD,MAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS;AACzC,QAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAChC,UAAA,MAAM,OAAA,GACJ,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GACrB,MAAM,OAAA,GACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA;AAClC,UAAA,mBAAA,CAAoB,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,IAAA,KAAS,QAAA,IAAY,OAAO,KAAA,CAAM,WAAW,QAAA,EAAU;AAC/D,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,SAAA,CAAU,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,aAAa,IAAA,EAAM;AACtD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA;AAAA,QACA,OACE,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GACpB,MAAM,MAAA,GACN;AAAA,OACR;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAElC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,mBAAA,CAAoB,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,UAAU,CAAA;AAAA,EACnE;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,SAAA;AAAA,IACA,UAAU,QAAA,IAAY,MAAA;AAAA,IACtB,mBAAA,EACE,mBAAA,CAAoB,MAAA,GAAS,CAAA,GAAI,mBAAA,GAAsB;AAAA,GAC3D;AACF;AAGO,SAAS,iBAAiB,KAAA,EAIe;AAC9C,EAAA,OAAO,CAAC,MAAA,KAA4C;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAE9B,IAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,SAAS,CAAA;AACzD,IAAA,MAAM,SAAA,GAA2B,MAAM,OAAA,CAAQ,YAAY,IACvD,YAAA,CAAa,GAAA,CAAI,CAAC,EAAA,MAAiC;AAAA,MACjD,MAAM,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,GAAW,GAAG,IAAA,GAAO,EAAA;AAAA,MAC9C,SAAA,EAAY,EAAA,CAAG,SAAA,IAAa,EAAA,CAAG,QAAQ;AAAC,KAC1C,CAAE,IACF,EAAC;AAEL,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,QAAQ,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,GAClB,OAAA,CAAQ,eAAe,IAAA,EAAM,KAAA,CAAM,OAAO,CAAC,CAAA,GAC3C,IAAA;AAEJ,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW;AAAA,KACtD;AAAA,EACF,CAAA;AACF;AAmBA,SAAS,cAAA,CAAe,KAA8BvC,KAAAA,EAAuB;AAC3E,EAAA,OAAOA,MAAK,KAAA,CAAM,GAAG,EAAE,MAAA,CAAgB,CAAC,SAAS,GAAA,KAAQ;AACvD,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAO,OAAA,KAAY,QAAA,EAAU;AACnD,MAAA,OAAQ,QAAoC,GAAG,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,MAAA;AAAA,EACT,GAAG,GAAG,CAAA;AACR;;;ACrIA,IAAM,eAAA,GAAkB,IAAA;AACxB,IAAM,UAAA,GAAa,KAAK,IAAA,GAAO,IAAA;AAKxB,SAAS,UACd,MAAA,EAC6C;AAC7C,EAAA,QAAQ,UAAU,aAAA;AAAe,IAC/B,KAAK,aAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,gBAAA,CAAiB;AAAA,QACtB,SAAA,EAAW,WAAA;AAAA,QACX,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS;AAAA,OACV,CAAA;AAAA;AAEP;AAKO,SAAS,eAAA,CAAgB,MAAgB,QAAA,EAA4B;AAC1E,EAAA,OAAO,IAAA,CAAK,IAAI,CAAC,GAAA,KAAQ,IAAI,OAAA,CAAQ,mBAAA,EAAqB,QAAQ,CAAC,CAAA;AACrE;AAUA,eAAsB,UAAA,CACpB,WACA,QAAA,EACkC;AAClC,EAAA,MAAM,OAAA,GAAU,UAAU,OAAA,IAAW,eAAA;AACrC,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AAErD,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAMuC,OAAAA,GAAS,MAAM,YAAA,CAAa,SAAA,CAAU,SAAS,IAAA,EAAM,EAAE,SAAS,CAAA;AACtE,IAAA,MAAA,GAASA,OAAAA,CAAO,MAAA;AAAA,EAClB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC7B,IAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAE/D,IAAA,IAAI,QAAQ,QAAA,CAAS,SAAS,KAAK,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AAChE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAW,EAAC;AAAA,QACZ,KAAA,EACE,CAAA,yBAAA,EAA4B,OAAO,CAAA,WAAA,EAAc,OAAO,CAAA,oDAAA;AAAA,OAE5D;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,WAAW,EAAC;AAAA,MACZ,KAAA,EAAO,4BAA4B,OAAO,CAAA;AAAA,KAC5C;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,SAAA,CAAU,YAAY,CAAA;AAE9C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,MAAM,CAAA;AAAA,EACvB,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,WAAW,EAAC;AAAA,MACZ,KAAA,EACE,oCAAoC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,0BAAA,EACrD,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,KACvD;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,yBAAyB,MAAM,CAAA;AACvD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,WAAW,EAAC;AAAA,MACZ,KAAA,EAAO,qCAAqC,eAAe,CAAA;AAAA,KAC7D;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,yBAAyB,MAAA,EAAgC;AACvE,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AACjD,IAAA,OAAO,CAAA,qBAAA,EAAwB,OAAO,MAAM,CAAA,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA;AAEZ,EAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,SAAA,EAAW;AACpC,IAAA,OAAO,CAAA,iCAAA,EAAoC,OAAO,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,EAC/D;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,IAAA,OAAO,CAAA,kCAAA,EAAqC,OAAO,GAAA,CAAI,SAAS,CAAA,CAAA;AAAA,EAClE;AAEA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA;AAC1B,IAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU;AAC/B,MAAA,OAAO,CAAA,UAAA,EAAa,CAAC,CAAA,6BAAA,EAAgC,OAAO,GAAG,IAAI,CAAA,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,SAAA,KAAc,QAAA,IAAY,EAAA,CAAG,cAAc,IAAA,EAAM;AAC7D,MAAA,OAAO,CAAA,UAAA,EAAa,CAAC,CAAA,mCAAA,EAAsC,OAAO,GAAG,SAAS,CAAA,CAAA;AAAA,IAChF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AASA,SAAS,YAAA,CACP,OAAA,EACA,IAAA,EACA,OAAA,EAC6C;AAC7C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC/B,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM;AAAA,MACjC,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,CAAA;AAGD,IAAA,KAAA,CAAM,MAAM,GAAA,EAAI;AAEhB,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACzC,MAAA,UAAA,IAAc,KAAA,CAAM,MAAA;AACpB,MAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACzC,MAAA,UAAA,IAAc,KAAA,CAAM,MAAA;AACpB,MAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAA,CAAQ,OAAO,IAAI,CAAC,CAAA;AAAA,IAClE,CAAA,EAAG,QAAQ,OAAO,CAAA;AAElB,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,SAAS,OAAO,CAAA;AAC3D,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,SAAS,OAAO,CAAA;AAE3D,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,MAAA;AAAA,UACE,IAAI,KAAA;AAAA,YACF,CAAA,8BAAA,EAAiC,IAAA,IAAQ,MAAM,CAAA,CAAA,IAC5C,MAAA,GAAS;AAAA,QAAA,EAAa,MAAM,CAAA,CAAA,GAAK,EAAA;AAAA;AACtC,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAAA,QAAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACxKA,IAAM,qBAAuC,wBAAA,EAAyB;AAEtE,IAAM,YAAA,GAA8B;AAAA,EAClC,QAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,oBAAoB,IAAI,GAAA;AAAA,EAC5B,aAAa,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,EAAG,kBAAkB,CAAC;AACjD,CAAA;AAoCA,eAAsB,eAAA,CACpB,GAAA,EACA,QAAA,EACA,MAAA,EACkC;AAClC,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,KAAA;AAEpC,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,IAAI,CAAC,OAAO,GAAA,EAAK;AACf,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,uHAAA;AAAA,OAEF;AAAA,IACF;AACA,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,GAAA,EAAK,QAAQ,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,QAAA,KAAa,SAAA,IAAa,QAAA,KAAa,SAAA,EAAW;AACpD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,cAAc,QAAQ,CAAA,6DAAA;AAAA,KAExB;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mEAAA,EACgB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACzC;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACvD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,sBAAA,EAAyB,OAAO,MAAA,CAAO,QAAQ,CAAC,CAAA,aAAA,EAChC,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACzC;AAAA,EACF;AACA,EAAA,OAAO,SAAA,CAAU,QAAA,CAAS,GAAA,EAAK,QAAA,EAAU,MAAM,CAAA;AACjD;AAQO,SAAS,oBAAoB,QAAA,EAAgC;AAClE,EAAA,OAAO,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AACvC;AAQO,SAAS,4BAA4B,QAAA,EAA+B;AACzE,EAAA,MAAM,UAAA,GAAmD;AAAA,IACvD,MAAA,EAAQ,+BAAA;AAAA,IACR,SAAA,EAAW,kCAAA;AAAA,IACX,MAAA,EAAQ,+BAAA;AAAA,IACR,KAAA,EAAO,8BAAA;AAAA,IACP,OAAA,EAAS,gCAAA;AAAA,IACT,QAAA,EAAU,iCAAA;AAAA,IACV,UAAA,EAAY,4CAAA;AAAA,IACZ,GAAA,EAAK,4BAAA;AAAA,IACL,kBAAA,EACE;AAAA,GACJ;AAEA,EAAA,MAAM,GAAA,GAAM,WAAW,QAAQ,CAAA;AAC/B,EAAA,OAAO,GAAA,GACH,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAA,GAC7C,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAC3C;ACpIA,eAAsB,YAAA,CACpB,MAAA,EACA,QAAA,EACA,OAAA,GAA+B,EAAC,EACjB;AACf,EAAA,MAAM,EAAE,aAAA,GAAgB,IAAA,EAAK,GAAI,OAAA;AAEjC,EAAA,MAAM,SAAS,aAAA,GACX;AAAA,IACE,GAAG,MAAA;AAAA,IACH,WAAA,EAAa,OAAO,WAAA,CAAY,GAAA;AAAA,MAC9B,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,MAAK,KAAM;AAAA;AACxC,GACF,GACA,MAAA;AAEJ,EAAA,MAAMgC,MAAMC,OAAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAClD,EAAA,MAAMC,SAAAA,CAAU,UAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,GAAG,MAAM,CAAA;AACnE;AASA,eAAsB,aACpB,QAAA,EAC2B;AAC3B,EAAA,MAAM,GAAA,GAAM,MAAMJ,QAAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAC3C,EAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB;AAMO,SAAS,qBACd,QAAA,EACsB;AACtB,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAqB;AACrC,EAAA,KAAA,MAAW,MAAA,IAAU,SAAS,WAAA,EAAa;AACzC,IAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,IAAI,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,GAAA;AACT;ACtEA,IAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAYxC,eAAsB,eAAA,CACpB,MACA,IAAA,EACyB;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AAC7C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAQ,MAAA,CAAO;AAAA,KACjB;AAAA,EACF,SAAS,GAAA,EAAc;AACrB,IAAA,MAAM,OAAA,GAAU,GAAA;AAChB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC5B;AAAA,EACF;AACF;;;ACgPA,eAAe,eAAA,CACb,UACA,GAAA,EACgD;AAChD,EAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,QAAA;AAE9B,EAAA,IAAI;AACF,IAAA,IAAI,SAAS,UAAA,EAAY;AAEvB,MAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,SAAS,EAAE,CAAA,wCAAA;AAAA,SAC1B;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,SAAS,aAAA,EAAe;AAC3B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,SAAS,EAAE,CAAA,6CAAA;AAAA,SAC1B;AAAA,MACF;AAEA,MAAA,MAAM,mBAAmB,MAAM,eAAA;AAAA,QAC7B,GAAA;AAAA,QACA,QAAA,CAAS,QAAA;AAAA,QACT,QAAA,CAAS;AAAA,OACX;AAEA,MAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC7B,QAAA,MAAM,IAAI,KAAA,CAAM,gBAAA,CAAiB,KAAA,IAAS,4BAA4B,CAAA;AAAA,MACxE;AAEA,MAAA,OAAO,EAAE,UAAU,gBAAA,EAAiB;AAAA,IACtC,CAAA,MAAO;AAEL,MAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,SAAS,EAAE,CAAA,sCAAA;AAAA,SAC1B;AAAA,MACF;AACA,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,UAAA,EAAa,SAAS,EAAE,CAAA,kCAAA;AAAA,SAC1B;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,SAAS,QAAA,CAAS,QAAA,EAAU,SAAS,IAAI,CAAA;AAClE,MAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAAA,IAC5B;AAAA,EACF,SAAS,GAAA,EAAK;AAIZ,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA;AAAA,MACV,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,KACxD;AAAA,EACF;AACF;AAKA,SAAS,WAAA,CACP,OACA,YAAA,EACS;AACT,EAAA,OACE,CAAC,KAAA,IACD,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,KAAA;AAAA,IAC1B,CAAC,MAAA,KAAW,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO;AAAA,GAC7C;AAEJ;AA2BA,eAAe,yBAAA,CACb,WAAA,EACA,QAAA,EACA,MAAA,EAC6B;AAC7B,EAAA,MAAM,UAA0C,EAAC;AACjD,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,UAAA;AAGJ,EAAA,IAAI,WAAA,CAAY,aAAa,MAAA,EAAW;AACtC,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,QAAA,EAAU,WAAA,CAAY,QAAQ,CAAA;AAClE,IAAA,OAAA,CAAQ,KAAA,GAAQ;AAAA,MACd,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,WAAW,MAAA,EAAW;AACpC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,GAAU,WAAA,CAAY,MAAM,CAAA;AAClD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAA,CAAQ,MAAA,GAAS;AAAA,QACf,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,CAAA,QAAA,EAAW,WAAA,CAAY,MAAM,CAAA,+BAAA;AAAA,OACxC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,EAAU,MAAM,CAAA;AAClD,MAAA,OAAA,CAAQ,MAAA,GAAS;AAAA,QACf,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,SAAS,UAAA,CAAW;AAAA,OACtB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,iBAAiB,MAAA,EAAW;AAC1C,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,QAAA,EAAU,WAAA,CAAY,YAAY,CAAA;AAClE,IAAA,OAAA,CAAQ,YAAA,GAAe;AAAA,MACrB,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,mBAAmB,MAAA,EAAW;AAC5C,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,QAAA,EAAU,WAAA,CAAY,cAAc,CAAA;AACvE,IAAA,OAAA,CAAQ,KAAA,GAAQ;AAAA,MACd,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,YAAY,MAAA,EAAW;AACrC,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,QAAA,EAAU,WAAA,CAAY,OAAO,CAAA;AAC9D,IAAA,OAAA,CAAQ,KAAA,GAAQ;AAAA,MACd,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,iBAAiB,MAAA,EAAW;AAC1C,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,QAAA,EAAU,WAAA,CAAY,YAAY,CAAA;AAClE,IAAA,OAAA,CAAQ,IAAA,GAAO;AAAA,MACb,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,mBAAmB,MAAA,EAAW;AAC5C,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,QAAA,EAAU,WAAA,CAAY,cAAc,CAAA;AACzE,IAAA,OAAA,CAAQ,cAAA,GAAiB;AAAA,MACvB,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW;AAAA,KACtB;AACA,IAAA,aAAA,GAAgB,WAAW,OAAA,EAAS,SAAA;AACpC,IAAA,UAAA,GAAa,WAAW,OAAA,EAAS,MAAA;AAAA,EACnC;AAGA,EAAA,IAAI,WAAA,CAAY,kBAAkB,MAAA,EAAW;AAC3C,IAAA,MAAM,UAAA,GAAa,qBAAA;AAAA,MACjB,QAAA;AAAA,MACA,WAAA,CAAY;AAAA,KACd;AACA,IAAA,OAAA,CAAQ,aAAA,GAAgB;AAAA,MACtB,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,SAAS,UAAA,CAAW;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,gBAAgB,MAAA,EAAW;AACzC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,WAAW,IACtD,WAAA,CAAY,WAAA,GACZ,CAAC,WAAA,CAAY,WAAW,CAAA;AAE5B,IAAA,MAAM,kBAAA,GAAqB,MAAM,OAAA,CAAQ,GAAA;AAAA,MACvC,YAAA,CAAa,GAAA,CAAI,OAAO,WAAA,KAAgB;AACtC,QAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,IAAA,IAAQ,MAAA,CAAO,SAAA,IAAa,CAAA;AAC9D,QAAA,MAAM,qBACJ,WAAA,CAAY,SAAA,KAAc,MAAA,GACtB,WAAA,CAAY,YACZ,MAAA,CAAO,eAAA;AACb,QAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,QAAA,EAAU;AAAA,UAC/C,GAAG,WAAA;AAAA,UACH,SAAA,EAAW,kBAAA;AAAA,UACX,IAAA,EAAM;AAAA,SACP,CAAA;AAED,QAAA,MAAM,SAAA,GACJ,YAAY,KAAA,KACX,OAAO,YAAY,MAAA,KAAW,QAAA,GAC3B,YAAY,MAAA,GACZ,MAAA,CAAA;AAEN,QAAA,OAAO;AAAA,UACL,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,KAAA,EAAO,WAAW,OAAA,EAAS,KAAA;AAAA,UAC3B,SAAA,EAAW,WAAW,OAAA,EAAS,SAAA;AAAA,UAC/B,SAAA;AAAA,UACA,aAAA,EAAe,WAAW,OAAA,EAAS,aAAA;AAAA,UAGnC,UAAA,EAAY,WAAW,OAAA,EAAS;AAAA,SAClC;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AAEnC,MAAA,OAAA,CAAQ,KAAA,GAAQ,mBAAmB,CAAC,CAAA;AAAA,IACtC,CAAA,MAAO;AAEL,MAAA,MAAM,YAAY,kBAAA,CAAmB,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACxD,MAAA,MAAM,YAAY,kBAAA,CAAmB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AAE3D,MAAA,OAAA,CAAQ,KAAA,GAAQ;AAAA,QACd,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,mBAAmB,MAAM,CAAA,cAAA,CAAA;AAAA,QAClD,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,aAAa,MAAA,EAAW;AACtC,IAAA,IAAI,CAAC,OAAO,gBAAA,EAAkB;AAC5B,MAAA,OAAA,CAAQ,QAAA,GAAW;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI;AAKF,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,kBAAA,IAAsB,EAAC;AAEtD,QAAA,MAAO,MAAA,CAAO,gBAAA,CAAiB,QAAQ,CAAA,CAAU,mBAAA;AAAA,UAC/C,WAAA,CAAY,QAAA;AAAA,UACZ;AAAA,SACF;AACA,QAAA,OAAA,CAAQ,QAAA,GAAW;AAAA,UACjB,IAAA,EAAM,IAAA;AAAA,UACN,OAAA,EAAS,CAAA,kBAAA,EAAqB,WAAA,CAAY,QAAQ,CAAA,CAAA;AAAA,SACpD;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,QAAA,GAAW;AAAA,UACjB,IAAA,EAAM,KAAA;AAAA,UACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,YAAA,EAAc,OAAA,EAAS,aAAA,EAAe,UAAA,EAAW;AAC5D;AAKA,SAAS,aAAa,QAAA,EAAqC;AACzD,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,IAAI,QAAA,CAAS,WAAA,EAAa,OAAA,CAAQ,WAAA,GAAc,QAAA,CAAS,WAAA;AAEzD,EAAA,IAAI,QAAA,CAAS,SAAS,UAAA,EAAY;AAChC,IAAA,IAAI,QAAA,CAAS,QAAA,EAAU,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,QAAA;AACnD,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAA,OAAA,CAAQ,aAAA,GAAgB;AAAA,QACtB,QAAA,EAAU,SAAS,aAAA,CAAc,QAAA;AAAA,QACjC,GAAI,QAAA,CAAS,aAAA,CAAc,KAAA,KAAU,MAAA,IAAa;AAAA,UAChD,KAAA,EAAO,SAAS,aAAA,CAAc;AAAA;AAChC,OACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAI,QAAA,CAAS,IAAA,EAAM,OAAA,CAAQ,IAAA,GAAO,QAAA,CAAS,IAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,0BACP,KAAA,EACkC;AAClC,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,SAAA,IAAa,KAAA,IACb,WAAA,IAAe,KAAA,IACf,KAAA,CAAM,OAAA,CAAS,KAAA,CAAkC,SAAS,CAAA;AAE9D;AAMA,eAAe,kBAAA,CACb,QAAA,EACA,OAAA,EACA,OAAA,EACyB;AACzB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,EAAE,UAAU,KAAA,EAAM,GAAI,MAAM,eAAA,CAAgB,QAAA,EAAU,QAAQ,GAAG,CAAA;AAGvE,EAAA,IAAI,qBAAqD,EAAC;AAC1D,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,CAAC,KAAA,IAAS,QAAA,CAAS,MAAA,EAAQ;AAC7B,IAAA,MAAM;AAAA,MACJ,YAAA;AAAA,MACA,aAAA,EAAe,EAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACd,GAAI,MAAM,yBAAA,CAA0B,QAAA,CAAS,QAAQ,QAAA,EAAU;AAAA,MAC7D,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,kBAAkB,OAAA,CAAQ,MAAA;AAAA,MAC1B,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,iBAAiB,QAAA,CAAS;AAAA,KAC3B,CAAA;AACD,IAAA,kBAAA,GAAqB,YAAA;AACrB,IAAA,aAAA,GAAgB,EAAA;AAChB,IAAA,UAAA,GAAa,EAAA;AAGb,IAAA,IACE,SAAS,MAAA,CAAO,cAAA,KAAmB,MAAA,IACnC,yBAAA,CAA0B,QAAQ,CAAA,EAClC;AACA,MAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,QACxB,QAAA,CAAS,OAAO,cAAA,CAAe,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,OACxD;AACA,MAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,QACxB,QAAA,CAAS,MAAA,CAAO,cAAA,CAAe,KAAA,CAC5B,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,KAAK,CAAA,CAClC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,OACtB;AACA,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAEjE,MAAA,YAAA,GAAe;AAAA,QACb,KAAA,EAAO,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UACvC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,QAAQ,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,IAAI,IAAI,UAAA,GAAa;AAAA,SACtD,CAAE,CAAA;AAAA,QACF,MAAA,EAAQ,MAAM,IAAA,CAAK,aAAa,EAC7B,MAAA,CAAO,CAACjC,WAAS,CAAC,WAAA,CAAY,IAAIA,MAAI,CAAC,EACvC,GAAA,CAAI,CAACA,YAAU,EAAE,IAAA,EAAAA,QAAK,CAAE;AAAA,OAC7B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,IAAI,QAAA,CAAS,EAAA;AAAA,IACb,WAAA,EAAa,QAAQ,WAAA,IAAe,aAAA;AAAA,IACpC,UACE,QAAA,CAAS,QAAA,IAAY,IAAA,GAAO,UAAA,GAAc,SAAS,QAAA,IAAY,SAAA;AAAA,IACjE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,WAAA,CAAY,KAAA,EAAO,kBAAkB,CAAA;AAAA,IAC3C,OAAA,EAAS,aAAa,QAAQ,CAAA;AAAA,IAC9B,QAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA,EAAc,kBAAA;AAAA,IACd,QAAA,EAAU,QAAQ,GAAA,CAAI,QAAA;AAAA,IACtB,OAAA,EAAS,QAAQ,GAAA,CAAI,OAAA;AAAA,IACrB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,aAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAUA,SAAS,sBAAsB,GAAA,EAAuB;AACpD,EAAA,IAAIA,MAAAA;AACJ,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,IAAA,GAAe,EAAA;AAEnB,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAAA,SAAO,GAAA,CAAI,IAAA;AACX,IAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,WAAA,EAAY;AAC9B,IAAA,IAAA,GAAA,CAAS,GAAA,CAA8B,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY;AAAA,EACjE,CAAA,MAAA,IAAW,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,IAAA,GAAA,GAAM,IAAI,WAAA,EAAY;AAAA,EACxB,CAAA,MAAO;AACL,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OACEA,MAAAA,KAAS,YAAA,IACT,GAAA,CAAI,QAAA,CAAS,YAAY,CAAA,IACzB,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,IACxB,GAAA,CAAI,QAAA,CAAS,cAAc,CAAA,IAC3B,GAAA,CAAI,QAAA,CAAS,YAAY,CAAA,IACzB,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAClB,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAClB,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA;AAAA,EAEtB,GAAA,CAAI,QAAA,CAAS,oBAAoB,CAAA,IACjC,GAAA,CAAI,QAAA,CAAS,yBAAyB,CAAA,IACtC,GAAA,CAAI,QAAA,CAAS,wBAAwB,CAAA,IACrC,IAAI,QAAA,CAAS,yBAAyB,CAAA,IACtC,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,IACxB,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,IAC1B,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,IACzB,IAAA,CAAK,SAAS,cAAc,CAAA;AAEhC;AAsBA,eAAsB,WAAA,CACpB,QAAA,EACA,OAAA,EACA,OAAA,GAA2B,EAAC,EACH;AACzB,EAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,CAAA;AAE1C,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAO,kBAAA,CAAmB,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD;AAGA,EAAA,MAAM,mBAAsC,EAAC;AAC7C,EAAA,IAAI,UAAA,GAAoC,IAAA;AAExC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,QAAA,EAAU,SAAS,OAAO,CAAA;AAClE,MAAA,UAAA,GAAa,MAAA;AAGb,MAAA,MAAM,aACJ,MAAA,CAAO,KAAA,IAAS,IAAA,IAAQ,qBAAA,CAAsB,OAAO,KAAK,CAAA;AAC5D,MAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,QACpB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,qBAAA,EAAuB,UAAA;AAAA,QACvB,cAAc,MAAA,CAAO;AAAA,OACtB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AAEZ,MAAA,MAAM,eAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACpE,MAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,QACpB,IAAA,EAAM,KAAA;AAAA,QACN,UAAA,EAAY,CAAA;AAAA,QACZ,KAAA,EAAO,YAAA;AAAA,QACP,qBAAA,EAAuB,sBAAsB,GAAG;AAAA,OACjD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,qBAAqB,CAAA;AAC1E,EAAA,MAAM,mBAAmB,gBAAA,CAAiB,MAAA;AAAA,IACxC,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE;AAAA,GACZ;AACA,EAAA,MAAM,YAAY,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AACzD,EAAA,MAAM,oBACJ,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,iBAAiB,MAAA,GAAS,CAAA;AACtE,EAAA,MAAM,uBAAA,GAA0B,YAAY,MAAA,GAAS,UAAA;AACrD,EAAA,MAAM,SAAA,GAAY,SAAS,iBAAA,IAAqB,CAAA;AAGhD,EAAA,MAAM,aAA6B,UAAA,IAAc;AAAA,IAC/C,IAAI,QAAA,CAAS,EAAA;AAAA,IACb,WAAA,EAAa,QAAQ,WAAA,IAAe,aAAA;AAAA,IACpC,UACE,QAAA,CAAS,QAAA,IAAY,IAAA,GAAO,UAAA,GAAc,SAAS,QAAA,IAAY,SAAA;AAAA,IACjE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,gBAAA,CAAiB,CAAC,CAAA,EAAG,KAAA;AAAA,IAC5B,cAAc,EAAC;AAAA,IACf,QAAA,EAAU,QAAQ,GAAA,CAAI,QAAA;AAAA,IACtB,OAAA,EAAS,QAAQ,GAAA,CAAI,OAAA;AAAA,IACrB,UAAA,EAAY,CAAA;AAAA,IACZ,MAAM,QAAA,CAAS;AAAA,GACjB;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH,MAAM,iBAAA,IAAqB,SAAA;AAAA,IAC3B,iBAAA;AAAA,IACA,mBAAA,EAAqB,QAAA,CAAS,SAAA,EAAW,gBAAA,CAAiB,MAAM,CAAA;AAAA,IAChE,uBAAA;AAAA,IACA,gBAAA;AAAA,IACA,0BAA0B,WAAA,CAAY,MAAA;AAAA,IACtC,UAAA,EAAY,iBAAiB,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC;AAAA,GACvE;AACF;AAUA,SAAS,QAAA,CACP,GACA,CAAA,EAC8C;AAC9C,EAAA,IAAI,CAAA,GAAI,GAAG,OAAO,MAAA;AAClB,EAAA,MAAM4B,EAAAA,GAAI,IAAA;AACV,EAAA,MAAMU,MAAKV,EAAAA,GAAIA,EAAAA;AACf,EAAA,MAAM,SAAI,CAAA,GAAIU,GAAAA;AACd,EAAA,MAAM,OAAA,GAAA,CAAM,CAAA,GAAIA,GAAAA,GAAK,CAAA,IAAK,MAAA;AAC1B,EAAA,MAAM,SAASV,EAAAA,GAAI,IAAA,CAAK,KAAM,OAAA,IAAM,CAAA,GAAI,WAAO,MAAC,CAAA;AAChD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAK,MAAM,CAAA;AAAA,IAC9B,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAK,MAAM;AAAA,GAChC;AACF;AAMA,eAAe,kBAAA,CACb,OACA,KAAA,EACc;AAEd,EAAA,MAAM,OAAA,GAAe,IAAI,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAC3C,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,eAAe,MAAA,GAAS;AAItB,IAAA,OAAO,KAAA,GAAQ,MAAM,MAAA,EAAQ;AAC3B,MAAA,MAAM,CAAA,GAAI,KAAA,EAAA;AACV,MAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,CAAA,EAAG;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,MAAM,CAAA;AAChD,EAAA,MAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAA,EAAY,EAAG,MAAM,CAAC,CAAA;AAC7D,EAAA,OAAO,OAAA;AACT;AAmCA,eAAe,UAAA,GAA0C;AACvD,EAAA,MAAM,SAAS,MAAM,eAAA,CAAgB,OAAO,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AACjE,EAAA,OAAO,OAAO,MAAA,KAAW,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,MAAK,GAAI,MAAA;AACtD;AAEA,eAAsB,cAAA,CACpB,SACA,OAAA,EAC2B;AAC3B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA,GAAgB,KAAA;AAAA,IAChB,WAAA,GAAc,CAAA;AAAA,IACd,oBAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,yBAAA,GAA4B,IAAA;AAAA,IAC5B,mBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,OAAA,CAAQ,OAAA;AAAA,IACX,GAAG;AAAA,GACL;AAGA,EAAA,MAAM,UAAA,GACJ,cAAc,UAAA,CAAW,MAAA,GAAS,IAC9B,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,CAAW,SAAS,CAAC,CAAC,CAAC,CAAA,GACvE,OAAA,CAAQ,KAAA;AAGd,EAAA,MAAM,mBAAA,GAAsB,UAAA,CAAW,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM;AACxD,IAAA,MAAM,mBAAA,GACJ,EAAE,IAAA,KAAS,UAAA,GACN,EAAE,UAAA,IAAc,oBAAA,IAAwB,CAAA,GACxC,CAAA,CAAE,UAAA,IAAc,CAAA;AACvB,IAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,WAAA,IAAe,IAAA,EAAM,OAAO,GAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,WAAW,CAAA,GAC7C,CAAA,CAAE,MAAA,CAAO,WAAA,GACT,CAAC,CAAA,CAAE,OAAO,WAAW,CAAA;AACzB,IAAA,MAAM,YAAY,MAAA,CAAO,MAAA;AAAA,MACvB,CAAC,GAAG,CAAA,KAAM,CAAA,IAAK,EAAE,IAAA,IAAQ,CAAA,CAAE,aAAa,gBAAA,IAAoB,CAAA,CAAA;AAAA,MAC5D;AAAA,KACF;AACA,IAAA,OAAO,MAAM,mBAAA,GAAsB,SAAA;AAAA,EACrC,GAAG,CAAC,CAAA;AAEJ,EAAA,IAAI,sBAAsB,EAAA,EAAI;AAC5B,IAAA,SAAA;AAAA,MACE,6CAA6C,mBAAmB,CAAA,uDAAA;AAAA,KAClE;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,aAAa,YAAY;AAGrD,IAAA,MAAM,cAAA,GACJ,QAAA,CAAS,IAAA,KAAS,UAAA,IAClB,SAAS,UAAA,KAAe,MAAA,IACxB,oBAAA,KAAyB,MAAA,GACrB,EAAE,GAAG,QAAA,EAAU,UAAA,EAAY,sBAAqB,GAChD,QAAA;AAON,IAAA,IAAI,QAAA,CAAS,SAAS,UAAA,EAAY;AAChC,MAAA,MAAM,mBAAA,GAAsB,eAAe,UAAA,IAAc,CAAA;AACzD,MAAA,IAAI,mBAAA,GAAsB,CAAA,IAAK,mBAAA,GAAsB,EAAA,EAAI;AACvD,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,+BAAA,EAAkC,QAAA,CAAS,EAAE,CAAA,WAAA,EAAc,mBAAmB,CAAA,sIAAA;AAAA,SAEhF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GACJ,cAAA,CAAe,SAAA,KAAc,MAAA,IAAa,gBAAA,KAAqB,MAAA,GAC3D,EAAE,GAAG,cAAA,EAAgB,SAAA,EAAW,gBAAA,EAAiB,GACjD,cAAA;AAEN,IAAA,MAAMM,OAAAA,GAAS,MAAM,WAAA,CAAY,aAAA,EAAe,OAAA,EAAS;AAAA,MACvD,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,eAAeA,OAAM,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAOA,OAAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,WAAA,KAAgB,KAAK,aAAA,EAAe;AAEtC,IAAA,WAAA,GAAc,EAAC;AACf,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAMA,OAAAA,GAAS,MAAM,IAAA,EAAK;AAC1B,MAAA,WAAA,CAAY,KAAKA,OAAM,CAAA;AACvB,MAAA,IAAI,aAAA,IAAiB,CAACA,OAAAA,CAAO,IAAA,EAAM;AAAA,IACrC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,WAAA,GAAc,MAAM,kBAAA,CAAmB,KAAA,EAAO,WAAW,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,QAAQ,WAAA,CAAY,MAAA;AAC1B,EAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA;AAEjD,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI,CAAC,UAAA,EAAY,CAAC,CAAA;AAElD,EAAA,MAAM,QAAA,GAA4B;AAAA,IAChC,OAAA;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,gBAAgB,eAAA,CAAY,OAAA;AAAA,IAC5B,GAAI,YAAA,KAAiB,MAAA,IAAa,EAAE,YAAA,EAAa;AAAA,IACjD,GAAI,UAAA,KAAe,MAAA,IAAa,EAAE,UAAA;AAAW,GAC/C;AAEA,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAQ,KAAA,GAAQ,MAAA;AAAA,IAChB,WAAA;AAAA,IACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB;AAAA,GACF;AAGA,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,mBAAmB,CAAA;AACvD,MAAA,MAAM,mBACJ,QAAA,CAAS,KAAA,GAAQ,IAAI,QAAA,CAAS,MAAA,GAAS,SAAS,KAAA,GAAQ,CAAA;AAC1D,MAAA,MAAM,WAAA,GAAc,qBAAqB,QAAQ,CAAA;AAEjD,MAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA,CAAY,IAAI,CAAC,EAAA,KAAO,GAAG,EAAE,CAAA;AAC3D,MAAA,MAAM,iBAAiB,cAAA,CAAe,MAAA;AAAA,QACpC,CAAC,EAAA,KAAO,CAAC,WAAA,CAAY,IAAI,EAAE;AAAA,OAC7B,CAAE,MAAA;AACF,MAAA,MAAM,iBACJ,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,GAAiB,eAAe,MAAA,GAAS,CAAA;AACvE,MAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,yCAAA,EAA4C,cAAc,CAAA,IAAA,EAAO,cAAA,CAAe,MAAM,WAChF,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,GAAG,CAAC,CAAA,+HAAA;AAAA,SAExC;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,EAAA,IAAM,OAAO,WAAA,EAAa;AACnC,QAAA,MAAM,YAAA,GAAe,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAC1C,QAAA,IAAI,iBAAiB,KAAA,CAAA,EAAW;AAC9B,UAAA,EAAA,CAAG,YAAA,GAAe,YAAA;AAAA,QACpB;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,WAAA,GAAc,OAAO,WAAA,CAAY,MAAA;AAAA,QACtC,CAAC,EAAA,KAAO,EAAA,CAAG,YAAA,KAAiB,IAAA,IAAQ,CAAC,EAAA,CAAG;AAAA,OAC1C,CAAE,MAAA;AACF,MAAA,MAAA,CAAO,YAAA,GAAe,OAAO,WAAA,CAAY,MAAA;AAAA,QACvC,CAAC,EAAA,KAAO,EAAA,CAAG,YAAA,KAAiB,SAAS,EAAA,CAAG;AAAA,OAC1C,CAAE,MAAA;AACF,MAAA,MAAA,CAAO,aAAA,GACL,OAAO,KAAA,GAAQ,CAAA,GAAI,OAAO,MAAA,GAAS,MAAA,CAAO,QAAQ,gBAAA,GAAmB,CAAA;AAAA,IACzE,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,iDAAA,EAAoD,mBAAmB,CAAA,EAAA,EAClE,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OACvD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,eAAe,WAAA,CAAY,MAAA;AAAA,IAC/B,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,KAAkB,MAAA,IAAa,EAAE,UAAA,KAAe;AAAA,GAC3D;AACA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,OAAA,GACJ,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAA,EAAI,CAAC,CAAA,GAC3D,YAAA,CAAa,MAAA;AACf,IAAA,MAAM,SAAA,GACJ,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,UAAA,IAAc,CAAA,CAAA,EAAI,CAAC,CAAA,GACxD,YAAA,CAAa,MAAA;AACf,IAAA,MAAA,CAAO,oBAAA,GAAuB,OAAA;AAC9B,IAAA,MAAA,CAAO,iBAAA,GAAoB,SAAA;AAC3B,IAAA,MAAA,CAAO,aAAA,GACL,UAAU,SAAA,GAAY,CAAA,GACjB,IAAI,OAAA,GAAU,SAAA,IAAc,UAAU,SAAA,CAAA,GACvC,CAAA;AAAA,EACR;AAGA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,YAAA,CAAa,QAAQ,aAAA,EAAe;AAAA,MACxC,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,kBAAA,EAAoB;AAAA,MAChD,WAAA,EAAa,kBAAA;AAAA,MACb,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,CAAK,UAAU,EAAE,WAAA,EAAa,CAAC;AAAA,KAClD,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KAGF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACthCA,eAAsB,mBAAA,CACpB,OAAA,EACA,QAAA,EACA,QAAA,EACiC;AACjC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC3C,cAAA,CAAe,SAAS,QAAQ,CAAA;AAAA,IAChC,cAAA,CAAe,SAAS,QAAQ;AAAA,GACjC,CAAA;AAGD,EAAA,MAAM,OAAO,IAAI,GAAA;AAAA,IACf,OAAA,CAAQ,YAAY,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC;AAAA,GAC1C;AACA,EAAA,MAAM,OAAO,IAAI,GAAA;AAAA,IACf,OAAA,CAAQ,YAAY,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC;AAAA,GAC1C;AAGA,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AAE9D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,MAAM,QAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACrB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAErB,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,EAAM;AACpB,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,IAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,IAAQ,CAAC,EAAE,IAAA,EAAM;AAC5B,MAAA,OAAA,GAAU,QAAA;AACV,MAAA,KAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,CAAC,CAAA,CAAE,IAAA,IAAQ,EAAE,IAAA,EAAM;AAC5B,MAAA,OAAA,GAAU,QAAA;AACV,MAAA,KAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,WAAA;AACV,MAAA,QAAA,EAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,OAAA,EAAS,SAAS,CAAA,EAAG,OAAA,EAAS,GAAG,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,EAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,GAAQ,IAAA;AAErC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAQ,OAAA,CAAQ,IAAA;AAAA,IACzB,KAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA,EAAkB,KAAA,GAAQ,CAAA,GAAI,QAAA,GAAW,KAAA,GAAQ,CAAA;AAAA,IACjD,QAAA,EAAU,YAAA,GAAe,CAAA,GAAI,KAAA,GAAQ,YAAA,GAAe,CAAA;AAAA,IACpD,QAAA,EAAU,YAAA,GAAe,CAAA,GAAI,KAAA,GAAQ,YAAA,GAAe,CAAA;AAAA,IACpD,OAAA,EAAS,YAAA,GAAe,CAAA,GAAI,IAAA,GAAO,YAAA,GAAe,CAAA;AAAA,IAClD,KAAA;AAAA,IACA,aAAA,EAAe,OAAA;AAAA,IACf,aAAA,EAAe,OAAA;AAAA,IACf,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,GAC3B;AACF;;;ACnBA,eAAsB,oBAAA,CACpB,GAAA,EACA,OAAA,GAAiC,IACjC,QAAA,EAC+B;AAC/B,EAAA,MAAM;AAAA,IACJ,gBAAgB,EAAC;AAAA,IACjB,eAAA,GAAkB,IAAA;AAAA,IAClB,eAAA,GAAkB,IAAA;AAAA,IAClB,cAAA,GAAiB,IAAA;AAAA,IACjB,YAAA,GAAe;AAAA,GACjB,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAgC,EAAC;AACvC,EAAA,MAAM,GAAA,GAAyB;AAAA,IAC7B,UAAA,EAAY,IAAA;AAAA,IACZ,YAAA,EAAc,IAAA;AAAA,IACd,OAAO,EAAC;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAGA,EAAA,MAAM,UAAA,GAAa,IAAI,aAAA,EAAc;AACrC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,GAAA,CAAI,UAAA,GAAa,UAAA;AAAA,EACnB;AAGA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,qBAAA;AAAA,MACN,MAAM,UAAA,KAAe,IAAA;AAAA,MACrB,OAAA,EAAS,UAAA,GACL,CAAA,aAAA,EAAgB,UAAA,CAAW,IAAA,IAAQ,SAAS,CAAA,EAAA,EAAK,UAAA,CAAW,OAAA,IAAW,SAAS,CAAA,CAAA,GAChF;AAAA,KACL,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,MAAA,CAAO,qBAAA,EAAsB;AACtD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,GAAA,CAAI,YAAA,GAAe,YAAA;AAAA,EACrB;AAGA,EAAA,MAAA,CAAO,IAAA,CAAK;AAAA,IACV,IAAA,EAAM,oBAAA;AAAA,IACN,MAAM,YAAA,KAAiB,MAAA;AAAA,IACvB,SAAS,YAAA,GACL,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,YAAY,CAAC,CAAA,CAAA,GACxD;AAAA,GACL,CAAA;AAGD,EAAA,IAAI,QAAgB,EAAC;AACrB,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,MAAM,IAAI,SAAA,EAAU;AAC5B,IAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,qBAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS,CAAA,mBAAA,EAAsB,KAAA,CAAM,MAAM,CAAA,MAAA;AAAA,KAC5C,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,qBAAA;AAAA,MACN,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,qBAAqB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACrF,CAAA;AACD,IAAA,MAAMK,QAAO,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC/C,IAAA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EAC7B;AAGA,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAClD,IAAA,MAAM,YAAA,GAAe,cAAc,MAAA,CAAO,CAACvC,WAAS,CAAC,SAAA,CAAU,GAAA,CAAIA,MAAI,CAAC,CAAA;AAExE,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,wBAAA;AAAA,MACN,IAAA,EAAM,aAAa,MAAA,KAAW,CAAA;AAAA,MAC9B,OAAA,EACE,YAAA,CAAa,MAAA,KAAW,CAAA,GACpB,CAAA,IAAA,EAAO,aAAA,CAAc,MAAM,CAAA,2BAAA,CAAA,GAC3B,CAAA,wBAAA,EAA2B,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACzD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,eAAA,IAAmB,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,MAAM,eAA8B,EAAC;AAErC,IAAA,KAAA,MAAWE,SAAQ,KAAA,EAAO;AAExB,MAAA,IAAI,CAACA,MAAK,IAAA,EAAM;AACd,QAAA,YAAA,CAAa,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAChD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAACA,MAAK,WAAA,EAAa;AACrB,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAGA,KAAAA,CAAK,IAAI,CAAA,qBAAA,CAAuB,CAAA;AACrD,QAAA;AAAA,MACF;AAGA,MAAA,IAAIA,KAAAA,CAAK,WAAA,CAAY,IAAA,KAAS,QAAA,EAAU;AACtC,QAAA,YAAA,CAAa,IAAA;AAAA,UACX,CAAA,EAAGA,MAAK,IAAI,CAAA,0CAAA,EAA6C,OAAOA,KAAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA,CAAA;AAAA,SACxF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,oBAAA;AAAA,MACN,IAAA,EAAM,aAAa,MAAA,KAAW,CAAA;AAAA,MAC9B,SACE,YAAA,CAAa,MAAA,KAAW,IACpB,CAAA,IAAA,EAAO,KAAA,CAAM,MAAM,CAAA,yBAAA,CAAA,GACnB,CAAA;AAAA,EAAA,EAA4B,YAAA,CAAa,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,KAC5D,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,cAAA,IAAkB,cAAc,SAAA,EAAW;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,MAAM,GAAA,CAAI,MAAA,CAAO,aAAA,EAAc;AACvD,MAAA,GAAA,CAAI,YAAY,eAAA,CAAgB,SAAA;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,yBAAA;AAAA,QACN,IAAA,EAAM,IAAA;AAAA,QACN,OAAA,EAAS,CAAA,uBAAA,EAA0B,eAAA,CAAgB,SAAA,CAAU,MAAM,CAAA,UAAA;AAAA,OACpE,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,yBAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACzF,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,IAAgB,cAAc,OAAA,EAAS;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,MAAM,GAAA,CAAI,MAAA,CAAO,WAAA,EAAY;AACnD,MAAA,GAAA,CAAI,UAAU,aAAA,CAAc,OAAA;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,uBAAA;AAAA,QACN,IAAA,EAAM,IAAA;AAAA,QACN,OAAA,EAAS,CAAA,qBAAA,EAAwB,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA,QAAA;AAAA,OAC9D,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,uBAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS,uBAAuB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACvF,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAMgC,UAAS,MAAM,GAAA,CAAI,QAAA,CAAS,sBAAA,EAAwB,EAAE,CAAA;AAE5D,IAAA,MAAM,QAAA,GAAWA,QAAO,OAAA,KAAY,IAAA;AACpC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,4BAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,WACL,8CAAA,GACA;AAAA,KACL,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,4BAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAE/C,EAAA,MAAM,MAAA,GAA+B,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAGzD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,QAAA,CAAS,OAAO,wBAAA,EAA0B;AAAA,MAC9C,WAAA,EAAa,kBAAA;AAAA,MACb,MAAM,IAAA,CAAK,SAAA;AAAA,QACT;AAAA,UACE,SAAA,EAAW,mBAAA;AAAA,UACX,IAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAY,GAAA,CAAI,UAAA;AAAA,UAChB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,SAAA,EAAW,IAAI,KAAA,CAAM,MAAA;AAAA,UACrB,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,SAAS,GAAA,CAAI;AAAA,SACf;AAAA,QACA,IAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,mBAAmB,YAAA,EAA0C;AACpE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC1C,EAAA,IAAI,YAAA,CAAa,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAClD,EAAA,IAAI,YAAA,CAAa,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAC9C,EAAA,IAAI,YAAA,CAAa,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAC9C,EAAA,IAAI,YAAA,CAAa,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA;AACtD,EAAA,IAAI,YAAA,CAAa,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA;AACxD,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,eAAA;AAC/C","file":"index.js","sourcesContent":["/**\n * OAuth client provider implementation for MCP SDK\n *\n * Implements the MCP SDK's OAuthClientProvider interface using file-based storage\n * for integration with Playwright's auth state pattern.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport type {\n OAuthClientMetadata,\n OAuthClientInformationFull,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\nimport type { StoredOAuthState } from './types.js';\n\n/**\n * Configuration for the Playwright OAuth client provider\n */\nexport interface PlaywrightOAuthClientProviderConfig {\n /**\n * Path to the auth state file (e.g., playwright/.auth/oauth-state.json)\n */\n storagePath: string;\n\n /**\n * OAuth redirect URI for callback\n */\n redirectUri: string;\n\n /**\n * Client metadata for DCR or display\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n\n /**\n * Pre-registered client ID (if not using DCR)\n */\n clientId?: string;\n\n /**\n * Pre-registered client secret (if not using DCR)\n */\n clientSecret?: string;\n}\n\n/**\n * OAuth client provider that implements the MCP SDK's OAuthClientProvider interface\n *\n * Uses file-based storage for integration with Playwright's auth state pattern.\n * Auth state is persisted to disk so it can be reused across test runs.\n *\n * @example\n * ```typescript\n * const provider = new PlaywrightOAuthClientProvider({\n * storagePath: 'playwright/.auth/oauth-state.json',\n * redirectUri: 'http://localhost:3000/callback',\n * });\n *\n * const transport = new StreamableHTTPClientTransport(serverUrl, {\n * authProvider: provider,\n * });\n * ```\n */\nexport class PlaywrightOAuthClientProvider implements OAuthClientProvider {\n private readonly config: PlaywrightOAuthClientProviderConfig;\n private cachedState: StoredOAuthState | null = null;\n private stateParam: string | null = null;\n\n constructor(config: PlaywrightOAuthClientProviderConfig) {\n this.config = config;\n }\n\n /**\n * The URL to redirect the user agent to after authorization\n */\n get redirectUrl(): string {\n return this.config.redirectUri;\n }\n\n /**\n * Metadata about this OAuth client\n */\n get clientMetadata(): OAuthClientMetadata {\n return {\n redirect_uris: [this.config.redirectUri],\n token_endpoint_auth_method: this.config.clientSecret\n ? 'client_secret_basic'\n : 'none',\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n client_name: '@gleanwork/mcp-server-tester',\n ...this.config.clientMetadata,\n };\n }\n\n /**\n * Returns an OAuth2 state parameter\n */\n state(): string {\n if (!this.stateParam) {\n this.stateParam = this.generateRandomString(32);\n }\n return this.stateParam;\n }\n\n /**\n * Loads information about this OAuth client\n */\n async clientInformation(): Promise<OAuthClientInformationFull | undefined> {\n // If we have a pre-registered client, return it\n if (this.config.clientId) {\n return {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n redirect_uris: [this.config.redirectUri],\n };\n }\n\n // Otherwise, try to load from storage (DCR result)\n const state = await this.loadState();\n if (state?.clientInfo) {\n return {\n client_id: state.clientInfo.clientId,\n client_secret: state.clientInfo.clientSecret,\n client_id_issued_at: state.clientInfo.clientIdIssuedAt,\n client_secret_expires_at: state.clientInfo.clientSecretExpiresAt,\n redirect_uris: [this.config.redirectUri],\n };\n }\n\n return undefined;\n }\n\n /**\n * Saves client information from Dynamic Client Registration\n */\n async saveClientInformation(\n clientInformation: OAuthClientInformationFull\n ): Promise<void> {\n const state = (await this.loadState()) ?? this.createEmptyState();\n state.clientInfo = {\n clientId: clientInformation.client_id,\n clientSecret: clientInformation.client_secret,\n clientIdIssuedAt: clientInformation.client_id_issued_at,\n clientSecretExpiresAt: clientInformation.client_secret_expires_at,\n };\n await this.saveState(state);\n }\n\n /**\n * Loads any existing OAuth tokens for the current session\n */\n async tokens(): Promise<OAuthTokens | undefined> {\n const state = await this.loadState();\n if (state?.tokens) {\n return {\n access_token: state.tokens.accessToken,\n token_type: state.tokens.tokenType,\n refresh_token: state.tokens.refreshToken,\n expires_in: state.tokens.expiresAt\n ? Math.floor((state.tokens.expiresAt - Date.now()) / 1000)\n : undefined,\n };\n }\n return undefined;\n }\n\n /**\n * Stores new OAuth tokens for the current session\n *\n * The code verifier is cleared after a successful token exchange — it is\n * single-use per PKCE spec and must not persist beyond the exchange.\n */\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n const state = (await this.loadState()) ?? this.createEmptyState();\n state.tokens = {\n accessToken: tokens.access_token,\n tokenType: tokens.token_type,\n refreshToken: tokens.refresh_token,\n expiresAt: tokens.expires_in\n ? Date.now() + tokens.expires_in * 1000\n : undefined,\n };\n // Clear codeVerifier after successful token exchange — it's single-use per PKCE spec\n delete state.codeVerifier;\n await this.saveState(state);\n }\n\n /**\n * Invoked to redirect the user agent to the given URL\n *\n * In a testing context, this is typically handled by Playwright automation.\n * This implementation throws an error to signal that the caller needs to\n * handle the redirect externally.\n */\n async redirectToAuthorization(authorizationUrl: URL): Promise<void> {\n // In a test context, the authorization flow should be handled externally\n // by Playwright automation (e.g., in globalSetup)\n throw new Error(\n `OAuth authorization required. Redirect to: ${authorizationUrl.toString()}\\n` +\n 'In a testing context, use performOAuthSetup() in your Playwright globalSetup ' +\n 'to complete the OAuth flow before running tests.'\n );\n }\n\n /**\n * Saves a PKCE code verifier for the current session\n */\n async saveCodeVerifier(codeVerifier: string): Promise<void> {\n const state = (await this.loadState()) ?? this.createEmptyState();\n state.codeVerifier = codeVerifier;\n await this.saveState(state);\n }\n\n /**\n * Loads the PKCE code verifier for the current session\n */\n async codeVerifier(): Promise<string> {\n const state = await this.loadState();\n if (!state?.codeVerifier) {\n throw new Error('No code verifier found in auth state');\n }\n return state.codeVerifier;\n }\n\n /**\n * Invalidates the specified credentials\n */\n async invalidateCredentials(\n scope: 'all' | 'client' | 'tokens' | 'verifier'\n ): Promise<void> {\n const state = await this.loadState();\n if (!state) {\n return;\n }\n\n switch (scope) {\n case 'all':\n await this.deleteState();\n break;\n case 'client':\n delete state.clientInfo;\n await this.saveState(state);\n break;\n case 'tokens':\n delete state.tokens;\n await this.saveState(state);\n break;\n case 'verifier':\n delete state.codeVerifier;\n await this.saveState(state);\n break;\n }\n }\n\n // ---- Private helper methods ----\n\n private async loadState(): Promise<StoredOAuthState | null> {\n if (this.cachedState) {\n return this.cachedState;\n }\n\n try {\n const content = await fs.readFile(this.config.storagePath, 'utf-8');\n this.cachedState = JSON.parse(content) as StoredOAuthState;\n return this.cachedState;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n }\n\n private async saveState(state: StoredOAuthState): Promise<void> {\n state.savedAt = Date.now();\n this.cachedState = state;\n\n // Ensure directory exists\n const dir = path.dirname(this.config.storagePath);\n await fs.mkdir(dir, { recursive: true, mode: 0o700 });\n\n await fs.writeFile(\n this.config.storagePath,\n JSON.stringify(state, null, 2),\n { encoding: 'utf-8', mode: 0o600 }\n );\n }\n\n private async deleteState(): Promise<void> {\n this.cachedState = null;\n try {\n await fs.unlink(this.config.storagePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n private createEmptyState(): StoredOAuthState {\n return {\n savedAt: Date.now(),\n };\n }\n\n private generateRandomString(length: number): string {\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n const randomValues = new Uint8Array(length);\n crypto.getRandomValues(randomValues);\n for (let i = 0; i < length; i++) {\n const randomValue = randomValues[i] ?? 0;\n result += chars[randomValue % chars.length];\n }\n return result;\n }\n}\n\n/**\n * Loads OAuth state from a single file (Playwright auth pattern)\n *\n * This function reads from Playwright's single-file auth state format,\n * typically created by `performOAuthSetup` in globalSetup.\n *\n * **Note:** This does NOT work with tokens stored by the CLI (`mcp-server-tester login`).\n * For CLI-stored tokens, use `loadTokens(serverUrl)` instead.\n *\n * @param storagePath - Path to the auth state file (e.g., 'playwright/.auth/oauth-state.json')\n * @returns The stored OAuth state, or null if not found\n *\n * @example\n * ```typescript\n * // Load Playwright auth state\n * const state = await loadOAuthState('playwright/.auth/oauth-state.json');\n * ```\n */\nexport async function loadOAuthState(\n storagePath: string\n): Promise<StoredOAuthState | null> {\n try {\n const content = await fs.readFile(storagePath, 'utf-8');\n return JSON.parse(content) as StoredOAuthState;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Saves OAuth state to a single file (Playwright auth pattern)\n *\n * This function writes to Playwright's single-file auth state format.\n * Used by `performOAuthSetup` in globalSetup.\n *\n * **Note:** This does NOT work with the CLI storage format (`mcp-server-tester login`).\n * For programmatic token injection compatible with CLI, use `injectTokens(serverUrl, tokens)`.\n *\n * @param storagePath - Path to the auth state file (e.g., 'playwright/.auth/oauth-state.json')\n * @param state - The OAuth state to save\n *\n * @example\n * ```typescript\n * // Save Playwright auth state\n * await saveOAuthState('playwright/.auth/oauth-state.json', {\n * tokens: { accessToken: '...', tokenType: 'Bearer' },\n * savedAt: Date.now(),\n * });\n * ```\n */\nexport async function saveOAuthState(\n storagePath: string,\n state: StoredOAuthState\n): Promise<void> {\n state.savedAt = Date.now();\n\n // Ensure directory exists\n const dir = path.dirname(storagePath);\n await fs.mkdir(dir, { recursive: true, mode: 0o700 });\n\n await fs.writeFile(storagePath, JSON.stringify(state, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","/**\n * Symbol used for identifying AI SDK Error instances.\n * Enables checking if an error is an instance of AISDKError across package versions.\n */\nconst marker = 'vercel.ai.error';\nconst symbol = Symbol.for(marker);\n\n/**\n * Custom error class for AI SDK related errors.\n * @extends Error\n */\nexport class AISDKError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n * The underlying cause of the error, if any.\n */\n readonly cause?: unknown;\n\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name,\n message,\n cause,\n }: {\n name: string;\n message: string;\n cause?: unknown;\n }) {\n super(message);\n\n this.name = name;\n this.cause = cause;\n }\n\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error: unknown): error is AISDKError {\n return AISDKError.hasMarker(error, marker);\n }\n\n protected static hasMarker(error: unknown, marker: string): boolean {\n const markerSymbol = Symbol.for(marker);\n return (\n error != null &&\n typeof error === 'object' &&\n markerSymbol in error &&\n typeof error[markerSymbol] === 'boolean' &&\n error[markerSymbol] === true\n );\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_APICallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class APICallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly requestBodyValues: unknown;\n readonly statusCode?: number;\n\n readonly responseHeaders?: Record<string, string>;\n readonly responseBody?: string;\n\n readonly isRetryable: boolean;\n readonly data?: unknown;\n\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null &&\n (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500), // server error\n data,\n }: {\n message: string;\n url: string;\n requestBodyValues: unknown;\n statusCode?: number;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n cause?: unknown;\n isRetryable?: boolean;\n data?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n\n static isInstance(error: unknown): error is APICallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_EmptyResponseBodyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class EmptyResponseBodyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'Empty response body' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is EmptyResponseBodyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A function argument is invalid.\n */\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly argument: string;\n\n constructor({\n message,\n cause,\n argument,\n }: {\n argument: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.argument = argument;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_JSONParseError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class JSONParseError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly text: string;\n\n constructor({ text, cause }: { text: string; cause: unknown }) {\n super({\n name,\n message:\n `JSON parsing failed: ` +\n `Text: ${text}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.text = text;\n }\n\n static isInstance(error: unknown): error is JSONParseError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadAPIKeyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadAPIKeyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadAPIKeyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadSettingError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadSettingError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadSettingError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_TypeValidationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport interface TypeValidationContext {\n /**\n * Field path in dot notation (e.g., \"message.metadata\", \"message.parts[3].data\")\n */\n field?: string;\n\n /**\n * Entity name (e.g., tool name, data type name)\n */\n entityName?: string;\n\n /**\n * Entity identifier (e.g., message ID, tool call ID)\n */\n entityId?: string;\n}\n\nexport class TypeValidationError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly value: unknown;\n readonly context?: TypeValidationContext;\n\n constructor({\n value,\n cause,\n context,\n }: {\n value: unknown;\n cause: unknown;\n context?: TypeValidationContext;\n }) {\n let contextPrefix = 'Type validation failed';\n\n if (context?.field) {\n contextPrefix += ` for ${context.field}`;\n }\n\n if (context?.entityName || context?.entityId) {\n contextPrefix += ' (';\n const parts: string[] = [];\n if (context.entityName) {\n parts.push(context.entityName);\n }\n if (context.entityId) {\n parts.push(`id: \"${context.entityId}\"`);\n }\n contextPrefix += parts.join(', ');\n contextPrefix += ')';\n }\n\n super({\n name,\n message:\n `${contextPrefix}: ` +\n `Value: ${JSON.stringify(value)}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.value = value;\n this.context = context;\n }\n\n static isInstance(error: unknown): error is TypeValidationError {\n return AISDKError.hasMarker(error, marker);\n }\n\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value and context, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @param {TypeValidationContext} params.context - Optional context about what is being validated.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n context,\n }: {\n value: unknown;\n cause: unknown;\n context?: TypeValidationContext;\n }): TypeValidationError {\n if (\n TypeValidationError.isInstance(cause) &&\n cause.value === value &&\n cause.context?.field === context?.field &&\n cause.context?.entityName === context?.entityName &&\n cause.context?.entityId === context?.entityId\n ) {\n return cause;\n }\n\n return new TypeValidationError({ value, cause, context });\n }\n}\n","/**\n * EventSource/Server-Sent Events parser\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html\n */\nimport {ParseError} from './errors.ts'\nimport type {EventSourceParser, ParserCallbacks} from './types.ts'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction noop(_arg: unknown) {\n // intentional noop\n}\n\n/**\n * Creates a new EventSource parser.\n *\n * @param callbacks - Callbacks to invoke on different parsing events:\n * - `onEvent` when a new event is parsed\n * - `onError` when an error occurs\n * - `onRetry` when a new reconnection interval has been sent from the server\n * - `onComment` when a comment is encountered in the stream\n *\n * @returns A new EventSource parser, with `parse` and `reset` methods.\n * @public\n */\nexport function createParser(callbacks: ParserCallbacks): EventSourceParser {\n if (typeof callbacks === 'function') {\n throw new TypeError(\n '`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?',\n )\n }\n\n const {onEvent = noop, onError = noop, onRetry = noop, onComment} = callbacks\n\n let incompleteLine = ''\n\n let isFirstChunk = true\n let id: string | undefined\n let data = ''\n let eventType = ''\n\n function feed(newChunk: string) {\n // Strip any UTF8 byte order mark (BOM) at the start of the stream\n const chunk = isFirstChunk ? newChunk.replace(/^\\xEF\\xBB\\xBF/, '') : newChunk\n\n // If there was a previous incomplete line, append it to the new chunk,\n // so we may process it together as a new (hopefully complete) chunk.\n const [complete, incomplete] = splitLines(`${incompleteLine}${chunk}`)\n\n for (const line of complete) {\n parseLine(line)\n }\n\n incompleteLine = incomplete\n isFirstChunk = false\n }\n\n function parseLine(line: string) {\n // If the line is empty (a blank line), dispatch the event\n if (line === '') {\n dispatchEvent()\n return\n }\n\n // If the line starts with a U+003A COLON character (:), ignore the line.\n if (line.startsWith(':')) {\n if (onComment) {\n onComment(line.slice(line.startsWith(': ') ? 2 : 1))\n }\n return\n }\n\n // If the line contains a U+003A COLON character (:)\n const fieldSeparatorIndex = line.indexOf(':')\n if (fieldSeparatorIndex !== -1) {\n // Collect the characters on the line before the first U+003A COLON character (:),\n // and let `field` be that string.\n const field = line.slice(0, fieldSeparatorIndex)\n\n // Collect the characters on the line after the first U+003A COLON character (:),\n // and let `value` be that string. If value starts with a U+0020 SPACE character,\n // remove it from value.\n const offset = line[fieldSeparatorIndex + 1] === ' ' ? 2 : 1\n const value = line.slice(fieldSeparatorIndex + offset)\n\n processField(field, value, line)\n return\n }\n\n // Otherwise, the string is not empty but does not contain a U+003A COLON character (:)\n // Process the field using the whole line as the field name, and an empty string as the field value.\n // 👆 This is according to spec. That means that a line that has the value `data` will result in\n // a newline being added to the current `data` buffer, for instance.\n processField(line, '', line)\n }\n\n function processField(field: string, value: string, line: string) {\n // Field names must be compared literally, with no case folding performed.\n switch (field) {\n case 'event':\n // Set the `event type` buffer to field value\n eventType = value\n break\n case 'data':\n // Append the field value to the `data` buffer, then append a single U+000A LINE FEED(LF)\n // character to the `data` buffer.\n data = `${data}${value}\\n`\n break\n case 'id':\n // If the field value does not contain U+0000 NULL, then set the `ID` buffer to\n // the field value. Otherwise, ignore the field.\n id = value.includes('\\0') ? undefined : value\n break\n case 'retry':\n // If the field value consists of only ASCII digits, then interpret the field value as an\n // integer in base ten, and set the event stream's reconnection time to that integer.\n // Otherwise, ignore the field.\n if (/^\\d+$/.test(value)) {\n onRetry(parseInt(value, 10))\n } else {\n onError(\n new ParseError(`Invalid \\`retry\\` value: \"${value}\"`, {\n type: 'invalid-retry',\n value,\n line,\n }),\n )\n }\n break\n default:\n // Otherwise, the field is ignored.\n onError(\n new ParseError(\n `Unknown field \"${field.length > 20 ? `${field.slice(0, 20)}…` : field}\"`,\n {type: 'unknown-field', field, value, line},\n ),\n )\n break\n }\n }\n\n function dispatchEvent() {\n const shouldDispatch = data.length > 0\n if (shouldDispatch) {\n onEvent({\n id,\n event: eventType || undefined,\n // If the data buffer's last character is a U+000A LINE FEED (LF) character,\n // then remove the last character from the data buffer.\n data: data.endsWith('\\n') ? data.slice(0, -1) : data,\n })\n }\n\n // Reset for the next event\n id = undefined\n data = ''\n eventType = ''\n }\n\n function reset(options: {consume?: boolean} = {}) {\n if (incompleteLine && options.consume) {\n parseLine(incompleteLine)\n }\n\n isFirstChunk = true\n id = undefined\n data = ''\n eventType = ''\n incompleteLine = ''\n }\n\n return {feed, reset}\n}\n\n/**\n * For the given `chunk`, split it into lines according to spec, and return any remaining incomplete line.\n *\n * @param chunk - The chunk to split into lines\n * @returns A tuple containing an array of complete lines, and any remaining incomplete line\n * @internal\n */\nfunction splitLines(chunk: string): [complete: Array<string>, incomplete: string] {\n /**\n * According to the spec, a line is terminated by either:\n * - U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair\n * - a single U+000A LINE FEED(LF) character not preceded by a U+000D CARRIAGE RETURN(CR) character\n * - a single U+000D CARRIAGE RETURN(CR) character not followed by a U+000A LINE FEED(LF) character\n */\n const lines: Array<string> = []\n let incompleteLine = ''\n let searchIndex = 0\n\n while (searchIndex < chunk.length) {\n // Find next line terminator\n const crIndex = chunk.indexOf('\\r', searchIndex)\n const lfIndex = chunk.indexOf('\\n', searchIndex)\n\n // Determine line end\n let lineEnd = -1\n if (crIndex !== -1 && lfIndex !== -1) {\n // CRLF case\n lineEnd = Math.min(crIndex, lfIndex)\n } else if (crIndex !== -1) {\n // CR at the end of a chunk might be part of a CRLF sequence that spans chunks,\n // so we shouldn't treat it as a line terminator (yet)\n if (crIndex === chunk.length - 1) {\n lineEnd = -1\n } else {\n lineEnd = crIndex\n }\n } else if (lfIndex !== -1) {\n lineEnd = lfIndex\n }\n\n // Extract line if terminator found\n if (lineEnd === -1) {\n // No terminator found, rest is incomplete\n incompleteLine = chunk.slice(searchIndex)\n break\n } else {\n const line = chunk.slice(searchIndex, lineEnd)\n lines.push(line)\n\n // Move past line terminator\n searchIndex = lineEnd + 1\n if (chunk[searchIndex - 1] === '\\r' && chunk[searchIndex] === '\\n') {\n searchIndex++\n }\n }\n }\n\n return [lines, incompleteLine]\n}\n","/**\n * The type of error that occurred.\n * @public\n */\nexport type ErrorType = 'invalid-retry' | 'unknown-field'\n\n/**\n * Error thrown when encountering an issue during parsing.\n *\n * @public\n */\nexport class ParseError extends Error {\n /**\n * The type of error that occurred.\n */\n type: ErrorType\n\n /**\n * In the case of an unknown field encountered in the stream, this will be the field name.\n */\n field?: string | undefined\n\n /**\n * In the case of an unknown field encountered in the stream, this will be the value of the field.\n */\n value?: string | undefined\n\n /**\n * The line that caused the error, if available.\n */\n line?: string | undefined\n\n constructor(\n message: string,\n options: {type: ErrorType; field?: string; value?: string; line?: string},\n ) {\n super(message)\n this.name = 'ParseError'\n this.type = options.type\n this.field = options.field\n this.value = options.value\n this.line = options.line\n }\n}\n","import {createParser} from './parse.ts'\nimport type {EventSourceMessage, EventSourceParser} from './types.ts'\n\n/**\n * Options for the EventSourceParserStream.\n *\n * @public\n */\nexport interface StreamOptions {\n /**\n * Behavior when a parsing error occurs.\n *\n * - A custom function can be provided to handle the error.\n * - `'terminate'` will error the stream and stop parsing.\n * - Any other value will ignore the error and continue parsing.\n *\n * @defaultValue `undefined`\n */\n onError?: ('terminate' | ((error: Error) => void)) | undefined\n\n /**\n * Callback for when a reconnection interval is sent from the server.\n *\n * @param retry - The number of milliseconds to wait before reconnecting.\n */\n onRetry?: ((retry: number) => void) | undefined\n\n /**\n * Callback for when a comment is encountered in the stream.\n *\n * @param comment - The comment encountered in the stream.\n */\n onComment?: ((comment: string) => void) | undefined\n}\n\n/**\n * A TransformStream that ingests a stream of strings and produces a stream of `EventSourceMessage`.\n *\n * @example Basic usage\n * ```\n * const eventStream =\n * response.body\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream())\n * ```\n *\n * @example Terminate stream on parsing errors\n * ```\n * const eventStream =\n * response.body\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream({terminateOnError: true}))\n * ```\n *\n * @public\n */\nexport class EventSourceParserStream extends TransformStream<string, EventSourceMessage> {\n constructor({onError, onRetry, onComment}: StreamOptions = {}) {\n let parser!: EventSourceParser\n\n super({\n start(controller) {\n parser = createParser({\n onEvent: (event) => {\n controller.enqueue(event)\n },\n onError(error) {\n if (onError === 'terminate') {\n controller.error(error)\n } else if (typeof onError === 'function') {\n onError(error)\n }\n\n // Ignore by default\n },\n onRetry,\n onComment,\n })\n },\n transform(chunk) {\n parser.feed(chunk)\n },\n })\n }\n}\n\nexport {type ErrorType, ParseError} from './errors.ts'\nexport type {EventSourceMessage} from './types.ts'\n","export function combineHeaders(\n ...headers: Array<Record<string, string | undefined> | undefined>\n): Record<string, string | undefined> {\n return headers.reduce(\n (combinedHeaders, currentHeaders) => ({\n ...combinedHeaders,\n ...(currentHeaders ?? {}),\n }),\n {},\n ) as Record<string, string | undefined>;\n}\n","/**\n * Converts an AsyncIterator to a ReadableStream.\n *\n * @template T - The type of elements produced by the AsyncIterator.\n * @param { <T>} iterator - The AsyncIterator to convert.\n * @returns {ReadableStream<T>} - A ReadableStream that provides the same data as the AsyncIterator.\n */\nexport function convertAsyncIteratorToReadableStream<T>(\n iterator: AsyncIterator<T>,\n): ReadableStream<T> {\n let cancelled = false;\n\n return new ReadableStream<T>({\n /**\n * Called when the consumer wants to pull more data from the stream.\n *\n * @param {ReadableStreamDefaultController<T>} controller - The controller to enqueue data into the stream.\n * @returns {Promise<void>}\n */\n async pull(controller) {\n if (cancelled) return;\n try {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n /**\n * Called when the consumer cancels the stream.\n */\n async cancel(reason?: unknown) {\n cancelled = true;\n if (iterator.return) {\n try {\n await iterator.return(reason);\n } catch {\n // intentionally ignore errors during cancellation\n }\n }\n },\n });\n}\n","import {\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\n} from '@ai-sdk/provider';\n\n/**\n * Interface for mapping between custom tool names and provider tool names.\n */\nexport interface ToolNameMapping {\n /**\n * Maps a custom tool name (used by the client) to the provider's tool name.\n * If the custom tool name does not have a mapping, returns the input name.\n *\n * @param customToolName - The custom name of the tool defined by the client.\n * @returns The corresponding provider tool name, or the input name if not mapped.\n */\n toProviderToolName: (customToolName: string) => string;\n\n /**\n * Maps a provider tool name to the custom tool name used by the client.\n * If the provider tool name does not have a mapping, returns the input name.\n *\n * @param providerToolName - The name of the tool as understood by the provider.\n * @returns The corresponding custom tool name, or the input name if not mapped.\n */\n toCustomToolName: (providerToolName: string) => string;\n}\n\n/**\n * @param tools - Tools that were passed to the language model.\n * @param providerToolNames - Maps the provider tool ids to the provider tool names.\n */\nexport function createToolNameMapping({\n tools = [],\n providerToolNames,\n}: {\n /**\n * Tools that were passed to the language model.\n */\n tools:\n | Array<LanguageModelV3FunctionTool | LanguageModelV3ProviderTool>\n | undefined;\n\n /**\n * Maps the provider tool ids to the provider tool names.\n */\n providerToolNames: Record<`${string}.${string}`, string>;\n}): ToolNameMapping {\n const customToolNameToProviderToolName: Record<string, string> = {};\n const providerToolNameToCustomToolName: Record<string, string> = {};\n\n for (const tool of tools) {\n if (tool.type === 'provider' && tool.id in providerToolNames) {\n const providerToolName = providerToolNames[tool.id];\n customToolNameToProviderToolName[tool.name] = providerToolName;\n providerToolNameToCustomToolName[providerToolName] = tool.name;\n }\n }\n\n return {\n toProviderToolName: (customToolName: string) =>\n customToolNameToProviderToolName[customToolName] ?? customToolName,\n toCustomToolName: (providerToolName: string) =>\n providerToolNameToCustomToolName[providerToolName] ?? providerToolName,\n };\n}\n","/**\n * Creates a Promise that resolves after a specified delay\n * @param delayInMs - The delay duration in milliseconds. If null or undefined, resolves immediately.\n * @param signal - Optional AbortSignal to cancel the delay\n * @returns A Promise that resolves after the specified delay\n * @throws {DOMException} When the signal is aborted\n */\nexport async function delay(\n delayInMs?: number | null,\n options?: {\n abortSignal?: AbortSignal;\n },\n): Promise<void> {\n if (delayInMs == null) {\n return Promise.resolve();\n }\n\n const signal = options?.abortSignal;\n\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(createAbortError());\n return;\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayInMs);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n\nfunction createAbortError(): DOMException {\n return new DOMException('Delay was aborted', 'AbortError');\n}\n","/**\n * Extracts the headers from a response object and returns them as a key-value object.\n *\n * @param response - The response object to extract headers from.\n * @returns The headers as a key-value object.\n */\nexport function extractResponseHeaders(response: Response) {\n return Object.fromEntries<string>([...response.headers]);\n}\n","// btoa and atob need to be invoked as a function call, not as a method call.\n// Otherwise CloudFlare will throw a\n// \"TypeError: Illegal invocation: function called with incorrect this reference\"\nconst { btoa, atob } = globalThis;\n\nexport function convertBase64ToUint8Array(base64String: string) {\n const base64Url = base64String.replace(/-/g, '+').replace(/_/g, '/');\n const latin1string = atob(base64Url);\n return Uint8Array.from(latin1string, byte => byte.codePointAt(0)!);\n}\n\nexport function convertUint8ArrayToBase64(array: Uint8Array): string {\n let latin1string = '';\n\n // Note: regular for loop to support older JavaScript versions that\n // do not support for..of on Uint8Array\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n\n return btoa(latin1string);\n}\n\nexport function convertToBase64(value: string | Uint8Array): string {\n return value instanceof Uint8Array ? convertUint8ArrayToBase64(value) : value;\n}\n","import { ImageModelV3File } from '@ai-sdk/provider';\nimport { convertUint8ArrayToBase64 } from './uint8-utils';\n\n/**\n * Convert an ImageModelV3File to a URL or data URI string.\n *\n * If the file is a URL, it returns the URL as-is.\n * If the file is base64 data, it returns a data URI with the base64 data.\n * If the file is a Uint8Array, it converts it to base64 and returns a data URI.\n */\nexport function convertImageModelFileToDataUri(file: ImageModelV3File): string {\n if (file.type === 'url') return file.url;\n\n return `data:${file.mediaType};base64,${\n typeof file.data === 'string'\n ? file.data\n : convertUint8ArrayToBase64(file.data)\n }`;\n}\n","/**\n * Converts an input object to FormData for multipart/form-data requests.\n *\n * Handles the following cases:\n * - `null` or `undefined` values are skipped\n * - Arrays with a single element are appended as a single value\n * - Arrays with multiple elements are appended with `[]` suffix (e.g., `image[]`)\n * unless `useArrayBrackets` is set to `false`\n * - All other values are appended directly\n *\n * @param input - The input object to convert. Use a generic type for type validation.\n * @param options - Optional configuration object.\n * @param options.useArrayBrackets - Whether to add `[]` suffix for multi-element arrays.\n * Defaults to `true`. Set to `false` for APIs that expect repeated keys without brackets.\n * @returns A FormData object containing the input values.\n *\n * @example\n * ```ts\n * type MyInput = {\n * model: string;\n * prompt: string;\n * images: Blob[];\n * };\n *\n * const formData = convertToFormData<MyInput>({\n * model: 'gpt-image-1',\n * prompt: 'A cat',\n * images: [blob1, blob2],\n * });\n * ```\n */\nexport function convertToFormData<T extends Record<string, unknown>>(\n input: T,\n options: { useArrayBrackets?: boolean } = {},\n): FormData {\n const { useArrayBrackets = true } = options;\n const formData = new FormData();\n\n for (const [key, value] of Object.entries(input)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 1) {\n formData.append(key, value[0] as string | Blob);\n continue;\n }\n\n const arrayKey = useArrayBrackets ? `${key}[]` : key;\n for (const item of value) {\n formData.append(arrayKey, item as string | Blob);\n }\n continue;\n }\n\n formData.append(key, value as string | Blob);\n }\n\n return formData;\n}\n","import { DownloadError } from './download-error';\n\n/**\n * Default maximum download size: 2 GiB.\n *\n * `fetch().arrayBuffer()` has ~2x peak memory overhead (undici buffers the\n * body internally, then creates the JS ArrayBuffer), so very large downloads\n * risk exceeding the default V8 heap limit on 64-bit systems and terminating\n * the process with an out-of-memory error.\n *\n * Setting this limit converts an unrecoverable OOM crash into a catchable\n * `DownloadError`.\n */\nexport const DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;\n\n/**\n * Reads a fetch Response body with a size limit to prevent memory exhaustion.\n *\n * Checks the Content-Length header for early rejection, then reads the body\n * incrementally via ReadableStream and aborts with a DownloadError when the\n * limit is exceeded.\n *\n * @param response - The fetch Response to read.\n * @param url - The URL being downloaded (used in error messages).\n * @param maxBytes - Maximum allowed bytes. Defaults to DEFAULT_MAX_DOWNLOAD_SIZE.\n * @returns A Uint8Array containing the response body.\n * @throws DownloadError if the response exceeds maxBytes.\n */\nexport async function readResponseWithSizeLimit({\n response,\n url,\n maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE,\n}: {\n response: Response;\n url: string;\n maxBytes?: number;\n}): Promise<Uint8Array> {\n // Early rejection based on Content-Length header\n const contentLength = response.headers.get('content-length');\n if (contentLength != null) {\n const length = parseInt(contentLength, 10);\n if (!isNaN(length) && length > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes (Content-Length: ${length}).`,\n });\n }\n }\n\n const body = response.body;\n\n // Handle missing body (empty responses)\n if (body == null) {\n return new Uint8Array(0);\n }\n\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n totalBytes += value.length;\n\n if (totalBytes > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes.`,\n });\n }\n\n chunks.push(value);\n }\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n }\n }\n\n // Concatenate chunks into a single Uint8Array\n const result = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n","import { DownloadError } from './download-error';\nimport {\n readResponseWithSizeLimit,\n DEFAULT_MAX_DOWNLOAD_SIZE,\n} from './read-response-with-size-limit';\n\n/**\n * Download a file from a URL and return it as a Blob.\n *\n * @param url - The URL to download from.\n * @param options - Optional settings for the download.\n * @param options.maxBytes - Maximum allowed download size in bytes. Defaults to 100 MiB.\n * @param options.abortSignal - An optional abort signal to cancel the download.\n * @returns A Promise that resolves to the downloaded Blob.\n *\n * @throws DownloadError if the download fails or exceeds maxBytes.\n */\nexport async function downloadBlob(\n url: string,\n options?: { maxBytes?: number; abortSignal?: AbortSignal },\n): Promise<Blob> {\n try {\n const response = await fetch(url, {\n signal: options?.abortSignal,\n });\n\n if (!response.ok) {\n throw new DownloadError({\n url,\n statusCode: response.status,\n statusText: response.statusText,\n });\n }\n\n const data = await readResponseWithSizeLimit({\n response,\n url,\n maxBytes: options?.maxBytes ?? DEFAULT_MAX_DOWNLOAD_SIZE,\n });\n\n const contentType = response.headers.get('content-type') ?? undefined;\n return new Blob([data], contentType ? { type: contentType } : undefined);\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n\n throw new DownloadError({ url, cause: error });\n }\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","export function isAbortError(error: unknown): error is Error {\n return (\n (error instanceof Error || error instanceof DOMException) &&\n (error.name === 'AbortError' ||\n error.name === 'ResponseAborted' || // Next.js\n error.name === 'TimeoutError')\n );\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport { isAbortError } from './is-abort-error';\n\nconst FETCH_FAILED_ERROR_MESSAGES = ['fetch failed', 'failed to fetch'];\n\nconst BUN_ERROR_CODES = [\n 'ConnectionRefused',\n 'ConnectionClosed',\n 'FailedToOpenSocket',\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'EPIPE',\n];\n\nfunction isBunNetworkError(error: unknown): error is Error & { code?: string } {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const code = (error as any).code;\n if (typeof code === 'string' && BUN_ERROR_CODES.includes(code)) {\n return true;\n }\n\n return false;\n}\n\nexport function handleFetchError({\n error,\n url,\n requestBodyValues,\n}: {\n error: unknown;\n url: string;\n requestBodyValues: unknown;\n}) {\n if (isAbortError(error)) {\n return error;\n }\n\n // unwrap original error when fetch failed (for easier debugging):\n if (\n error instanceof TypeError &&\n FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())\n ) {\n const cause = (error as any).cause;\n\n if (cause != null) {\n // Failed to connect to server:\n return new APICallError({\n message: `Cannot connect to API: ${cause.message}`,\n cause,\n url,\n requestBodyValues,\n isRetryable: true, // retry when network error\n });\n }\n }\n\n if (isBunNetworkError(error)) {\n return new APICallError({\n message: `Cannot connect to API: ${error.message}`,\n cause: error,\n url,\n requestBodyValues,\n isRetryable: true,\n });\n }\n\n return error;\n}\n","export function getRuntimeEnvironmentUserAgent(\n globalThisAny: any = globalThis as any,\n): string {\n // Browsers\n if (globalThisAny.window) {\n return `runtime/browser`;\n }\n\n // Cloudflare Workers / Deno / Bun / Node.js >= 21.1\n if (globalThisAny.navigator?.userAgent) {\n return `runtime/${globalThisAny.navigator.userAgent.toLowerCase()}`;\n }\n\n // Nodes.js < 21.1\n if (globalThisAny.process?.versions?.node) {\n return `runtime/node.js/${globalThisAny.process.version.substring(0)}`;\n }\n\n if (globalThisAny.EdgeRuntime) {\n return `runtime/vercel-edge`;\n }\n\n return 'runtime/unknown';\n}\n","/**\n * Normalizes different header inputs into a plain record with lower-case keys.\n * Entries with `undefined` or `null` values are removed.\n *\n * @param headers - Input headers (`Headers`, tuples array, plain record) to normalize.\n * @returns A record containing the normalized header entries.\n */\nexport function normalizeHeaders(\n headers:\n | HeadersInit\n | Record<string, string | undefined>\n | Array<[string, string | undefined]>\n | undefined,\n): Record<string, string> {\n if (headers == null) {\n return {};\n }\n\n const normalized: Record<string, string> = {};\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value;\n });\n } else {\n if (!Array.isArray(headers)) {\n headers = Object.entries(headers);\n }\n\n for (const [key, value] of headers) {\n if (value != null) {\n normalized[key.toLowerCase()] = value;\n }\n }\n }\n\n return normalized;\n}\n","import { normalizeHeaders } from './normalize-headers';\n\n/**\n * Appends suffix parts to the `user-agent` header.\n * If a `user-agent` header already exists, the suffix parts are appended to it.\n * If no `user-agent` header exists, a new one is created with the suffix parts.\n * Automatically removes undefined entries from the headers.\n *\n * @param headers - The original headers.\n * @param userAgentSuffixParts - The parts to append to the `user-agent` header.\n * @returns The new headers with the `user-agent` header set or updated.\n */\nexport function withUserAgentSuffix(\n headers: HeadersInit | Record<string, string | undefined> | undefined,\n ...userAgentSuffixParts: string[]\n): Record<string, string> {\n const normalizedHeaders = new Headers(normalizeHeaders(headers));\n\n const currentUserAgentHeader = normalizedHeaders.get('user-agent') || '';\n\n normalizedHeaders.set(\n 'user-agent',\n [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(' '),\n );\n\n return Object.fromEntries(normalizedHeaders.entries());\n}\n","import {\n JSONSchema7,\n LanguageModelV3Message,\n LanguageModelV3Prompt,\n} from '@ai-sdk/provider';\n\nconst DEFAULT_SCHEMA_PREFIX = 'JSON schema:';\nconst DEFAULT_SCHEMA_SUFFIX =\n 'You MUST answer with a JSON object that matches the JSON schema above.';\nconst DEFAULT_GENERIC_SUFFIX = 'You MUST answer with JSON.';\n\nexport function injectJsonInstruction({\n prompt,\n schema,\n schemaPrefix = schema != null ? DEFAULT_SCHEMA_PREFIX : undefined,\n schemaSuffix = schema != null\n ? DEFAULT_SCHEMA_SUFFIX\n : DEFAULT_GENERIC_SUFFIX,\n}: {\n prompt?: string;\n schema?: JSONSchema7;\n schemaPrefix?: string;\n schemaSuffix?: string;\n}): string {\n return [\n prompt != null && prompt.length > 0 ? prompt : undefined,\n prompt != null && prompt.length > 0 ? '' : undefined, // add a newline if prompt is not null\n schemaPrefix,\n schema != null ? JSON.stringify(schema) : undefined,\n schemaSuffix,\n ]\n .filter(line => line != null)\n .join('\\n');\n}\n\nexport function injectJsonInstructionIntoMessages({\n messages,\n schema,\n schemaPrefix,\n schemaSuffix,\n}: {\n messages: LanguageModelV3Prompt;\n schema?: JSONSchema7;\n schemaPrefix?: string;\n schemaSuffix?: string;\n}): LanguageModelV3Prompt {\n const systemMessage: LanguageModelV3Message =\n messages[0]?.role === 'system'\n ? { ...messages[0] }\n : { role: 'system', content: '' };\n\n systemMessage.content = injectJsonInstruction({\n prompt: systemMessage.content,\n schema,\n schemaPrefix,\n schemaSuffix,\n });\n\n return [\n systemMessage,\n ...(messages[0]?.role === 'system' ? messages.slice(1) : messages),\n ];\n}\n","/**\n * Type guard that checks whether a value is not `null` or `undefined`.\n *\n * @template T - The type of the value to check.\n * @param value - The value to check.\n * @returns `true` if the value is neither `null` nor `undefined`, otherwise `false`.\n */\nexport function isNonNullable<T>(\n value: T | undefined | null,\n): value is NonNullable<T> {\n return value != null;\n}\n","/**\n * Checks if the given URL is supported natively by the model.\n *\n * @param mediaType - The media type of the URL. Case-sensitive.\n * @param url - The URL to check.\n * @param supportedUrls - A record where keys are case-sensitive media types (or '*')\n * and values are arrays of RegExp patterns for URLs.\n *\n * @returns `true` if the URL matches a pattern under the specific media type\n * or the wildcard '*', `false` otherwise.\n */\nexport function isUrlSupported({\n mediaType,\n url,\n supportedUrls,\n}: {\n mediaType: string;\n url: string;\n supportedUrls: Record<string, RegExp[]>;\n}): boolean {\n // standardize media type and url to lower case\n url = url.toLowerCase();\n mediaType = mediaType.toLowerCase();\n\n return (\n Object.entries(supportedUrls)\n // standardize supported url map into lowercase prefixes:\n .map(([key, value]) => {\n const mediaType = key.toLowerCase();\n return mediaType === '*' || mediaType === '*/*'\n ? { mediaTypePrefix: '', regexes: value }\n : { mediaTypePrefix: mediaType.replace(/\\*/, ''), regexes: value };\n })\n // gather all regexp pattern from matched media type prefixes:\n .filter(({ mediaTypePrefix }) => mediaType.startsWith(mediaTypePrefix))\n .flatMap(({ regexes }) => regexes)\n // check if any pattern matches the url:\n .some(pattern => pattern.test(url))\n );\n}\n","import { LoadAPIKeyError } from '@ai-sdk/provider';\n\nexport function loadApiKey({\n apiKey,\n environmentVariableName,\n apiKeyParameterName = 'apiKey',\n description,\n}: {\n apiKey: string | undefined;\n environmentVariableName: string;\n apiKeyParameterName?: string;\n description: string;\n}): string {\n if (typeof apiKey === 'string') {\n return apiKey;\n }\n\n if (apiKey != null) {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string.`,\n });\n }\n\n if (typeof process === 'undefined') {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter. Environment variables is not supported in this environment.`,\n });\n }\n\n apiKey = process.env[environmentVariableName];\n\n if (apiKey == null) {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter or the ${environmentVariableName} environment variable.`,\n });\n }\n\n if (typeof apiKey !== 'string') {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string. The value of the ${environmentVariableName} environment variable is not a string.`,\n });\n }\n\n return apiKey;\n}\n","/**\n * Loads an optional `string` setting from the environment or a parameter.\n *\n * @param settingValue - The setting value.\n * @param environmentVariableName - The environment variable name.\n * @returns The setting value.\n */\nexport function loadOptionalSetting({\n settingValue,\n environmentVariableName,\n}: {\n settingValue: string | undefined;\n environmentVariableName: string;\n}): string | undefined {\n if (typeof settingValue === 'string') {\n return settingValue;\n }\n\n if (settingValue != null || typeof process === 'undefined') {\n return undefined;\n }\n\n settingValue = process.env[environmentVariableName];\n\n if (settingValue == null || typeof settingValue !== 'string') {\n return undefined;\n }\n\n return settingValue;\n}\n","import { LoadSettingError } from '@ai-sdk/provider';\n\n/**\n * Loads a `string` setting from the environment or a parameter.\n *\n * @param settingValue - The setting value.\n * @param environmentVariableName - The environment variable name.\n * @param settingName - The setting name.\n * @param description - The description of the setting.\n * @returns The setting value.\n */\nexport function loadSetting({\n settingValue,\n environmentVariableName,\n settingName,\n description,\n}: {\n settingValue: string | undefined;\n environmentVariableName: string;\n settingName: string;\n description: string;\n}): string {\n if (typeof settingValue === 'string') {\n return settingValue;\n }\n\n if (settingValue != null) {\n throw new LoadSettingError({\n message: `${description} setting must be a string.`,\n });\n }\n\n if (typeof process === 'undefined') {\n throw new LoadSettingError({\n message:\n `${description} setting is missing. ` +\n `Pass it using the '${settingName}' parameter. ` +\n `Environment variables is not supported in this environment.`,\n });\n }\n\n settingValue = process.env[environmentVariableName];\n\n if (settingValue == null) {\n throw new LoadSettingError({\n message:\n `${description} setting is missing. ` +\n `Pass it using the '${settingName}' parameter ` +\n `or the ${environmentVariableName} environment variable.`,\n });\n }\n\n if (typeof settingValue !== 'string') {\n throw new LoadSettingError({\n message:\n `${description} setting must be a string. ` +\n `The value of the ${environmentVariableName} environment variable is not a string.`,\n });\n }\n\n return settingValue;\n}\n","/**\n * Maps a media type to its corresponding file extension.\n * It was originally introduced to set a filename for audio file uploads\n * in https://github.com/vercel/ai/pull/8159.\n *\n * @param mediaType The media type to map.\n * @returns The corresponding file extension\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types/Common_types\n */\nexport function mediaTypeToExtension(mediaType: string) {\n const [_type, subtype = ''] = mediaType.toLowerCase().split('/');\n\n return (\n {\n mpeg: 'mp3',\n 'x-wav': 'wav',\n opus: 'ogg',\n mp4: 'm4a',\n 'x-m4a': 'm4a',\n }[subtype] ?? subtype\n );\n}\n","// Licensed under BSD-3-Clause (this file only)\n// Code adapted from https://github.com/fastify/secure-json-parse/blob/783fcb1b5434709466759847cec974381939673a/index.js\n//\n// Copyright (c) Vercel, Inc. (https://vercel.com)\n// Copyright (c) 2019 The Fastify Team\n// Copyright (c) 2019, Sideway Inc, and project contributors\n// All rights reserved.\n//\n// The complete list of contributors can be found at:\n// - https://github.com/hapijs/bourne/graphs/contributors\n// - https://github.com/fastify/secure-json-parse/graphs/contributors\n// - https://github.com/vercel/ai/commits/main/packages/provider-utils/src/secure-parse-json.ts\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n//\n// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n//\n// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n//\n// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nconst suspectProtoRx = /\"__proto__\"\\s*:/;\nconst suspectConstructorRx = /\"constructor\"\\s*:/;\n\nfunction _parse(text: string) {\n // Parse normally\n const obj = JSON.parse(text);\n\n // Ignore null and non-objects\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (\n suspectProtoRx.test(text) === false &&\n suspectConstructorRx.test(text) === false\n ) {\n return obj;\n }\n\n // Scan result for proto keys\n return filter(obj);\n}\n\nfunction filter(obj: any) {\n let next = [obj];\n\n while (next.length) {\n const nodes = next;\n next = [];\n\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, '__proto__')) {\n throw new SyntaxError('Object contains forbidden prototype property');\n }\n\n if (\n Object.prototype.hasOwnProperty.call(node, 'constructor') &&\n Object.prototype.hasOwnProperty.call(node.constructor, 'prototype')\n ) {\n throw new SyntaxError('Object contains forbidden prototype property');\n }\n\n for (const key in node) {\n const value = node[key];\n if (value && typeof value === 'object') {\n next.push(value);\n }\n }\n }\n }\n return obj;\n}\n\nexport function secureJsonParse(text: string) {\n const { stackTraceLimit } = Error;\n try {\n // Performance optimization, see https://github.com/fastify/secure-json-parse/pull/90\n Error.stackTraceLimit = 0;\n } catch (e) {\n // Fallback in case Error is immutable (v8 readonly)\n return _parse(text);\n }\n\n try {\n return _parse(text);\n } finally {\n Error.stackTraceLimit = stackTraceLimit;\n }\n}\n","import { JSONSchema7, JSONSchema7Definition } from '@ai-sdk/provider';\n\n/**\n * Recursively adds additionalProperties: false to the JSON schema. This is necessary because some providers (e.g. OpenAI) do not support additionalProperties: true.\n */\nexport function addAdditionalPropertiesToJsonSchema(\n jsonSchema: JSONSchema7,\n): JSONSchema7 {\n if (\n jsonSchema.type === 'object' ||\n (Array.isArray(jsonSchema.type) && jsonSchema.type.includes('object'))\n ) {\n jsonSchema.additionalProperties = false;\n const { properties } = jsonSchema;\n if (properties != null) {\n for (const key of Object.keys(properties)) {\n properties[key] = visit(properties[key]);\n }\n }\n }\n\n if (jsonSchema.items != null) {\n jsonSchema.items = Array.isArray(jsonSchema.items)\n ? jsonSchema.items.map(visit)\n : visit(jsonSchema.items);\n }\n\n if (jsonSchema.anyOf != null) {\n jsonSchema.anyOf = jsonSchema.anyOf.map(visit);\n }\n\n if (jsonSchema.allOf != null) {\n jsonSchema.allOf = jsonSchema.allOf.map(visit);\n }\n\n if (jsonSchema.oneOf != null) {\n jsonSchema.oneOf = jsonSchema.oneOf.map(visit);\n }\n\n const { definitions } = jsonSchema;\n if (definitions != null) {\n for (const key of Object.keys(definitions)) {\n definitions[key] = visit(definitions[key]);\n }\n }\n\n return jsonSchema;\n}\n\nfunction visit(def: JSONSchema7Definition): JSONSchema7Definition {\n if (typeof def === 'boolean') return def;\n return addAdditionalPropertiesToJsonSchema(def);\n}\n","export type JsonSchema7AnyType = { $ref?: string };\n\nexport function parseAnyDef(): JsonSchema7AnyType {\n return {};\n}\n","import { ZodArrayDef, ZodFirstPartyTypeKind } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport type JsonSchema7ArrayType = {\n type: 'array';\n items?: JsonSchema7Type;\n minItems?: number;\n maxItems?: number;\n};\n\nexport function parseArrayDef(def: ZodArrayDef, refs: Refs) {\n const res: JsonSchema7ArrayType = {\n type: 'array',\n };\n if (\n def.type?._def &&\n def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny\n ) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items'],\n });\n }\n\n if (def.minLength) {\n res.minItems = def.minLength.value;\n }\n if (def.maxLength) {\n res.maxItems = def.maxLength.value;\n }\n if (def.exactLength) {\n res.minItems = def.exactLength.value;\n res.maxItems = def.exactLength.value;\n }\n return res;\n}\n","import { ZodBigIntDef } from 'zod/v3';\n\nexport type JsonSchema7BigintType = {\n type: 'integer';\n format: 'int64';\n minimum?: BigInt;\n exclusiveMinimum?: BigInt;\n maximum?: BigInt;\n exclusiveMaximum?: BigInt;\n multipleOf?: BigInt;\n};\n\nexport function parseBigintDef(def: ZodBigIntDef): JsonSchema7BigintType {\n const res: JsonSchema7BigintType = {\n type: 'integer',\n format: 'int64',\n };\n\n if (!def.checks) return res;\n\n for (const check of def.checks) {\n switch (check.kind) {\n case 'min':\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case 'max':\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n\n break;\n case 'multipleOf':\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n","export type JsonSchema7BooleanType = {\n type: 'boolean';\n};\n\nexport function parseBooleanDef(): JsonSchema7BooleanType {\n return { type: 'boolean' };\n}\n","import { ZodBrandedDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { Refs } from '../refs';\n\nexport function parseBrandedDef(_def: ZodBrandedDef<any>, refs: Refs) {\n return parseDef(_def.type._def, refs);\n}\n","import { ZodDateDef } from 'zod/v3';\nimport { Refs } from '../refs';\nimport { DateStrategy } from '../options';\n\nexport type JsonSchema7DateType =\n | {\n type: 'integer' | 'string';\n format: 'unix-time' | 'date-time' | 'date';\n minimum?: number;\n maximum?: number;\n }\n | {\n anyOf: JsonSchema7DateType[];\n };\n\nexport function parseDateDef(\n def: ZodDateDef,\n refs: Refs,\n overrideDateStrategy?: DateStrategy,\n): JsonSchema7DateType {\n const strategy = overrideDateStrategy ?? refs.dateStrategy;\n\n if (Array.isArray(strategy)) {\n return {\n anyOf: strategy.map((item, i) => parseDateDef(def, refs, item)),\n };\n }\n\n switch (strategy) {\n case 'string':\n case 'format:date-time':\n return {\n type: 'string',\n format: 'date-time',\n };\n case 'format:date':\n return {\n type: 'string',\n format: 'date',\n };\n case 'integer':\n return integerDateParser(def);\n }\n}\n\nconst integerDateParser = (def: ZodDateDef) => {\n const res: JsonSchema7DateType = {\n type: 'integer',\n format: 'unix-time',\n };\n\n for (const check of def.checks) {\n switch (check.kind) {\n case 'min':\n res.minimum = check.value;\n break;\n case 'max':\n res.maximum = check.value;\n break;\n }\n }\n\n return res;\n};\n","import { ZodDefaultDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport function parseDefaultDef(\n _def: ZodDefaultDef,\n refs: Refs,\n): JsonSchema7Type & { default: any } {\n return {\n ...parseDef(_def.innerType._def, refs),\n default: _def.defaultValue(),\n };\n}\n","import { ZodEffectsDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { parseAnyDef } from './any';\n\nexport function parseEffectsDef(\n _def: ZodEffectsDef,\n refs: Refs,\n): JsonSchema7Type | undefined {\n return refs.effectStrategy === 'input'\n ? parseDef(_def.schema._def, refs)\n : parseAnyDef();\n}\n","import { ZodEnumDef } from 'zod/v3';\n\nexport type JsonSchema7EnumType = {\n type: 'string';\n enum: string[];\n};\n\nexport function parseEnumDef(def: ZodEnumDef): JsonSchema7EnumType {\n return {\n type: 'string',\n enum: Array.from(def.values),\n };\n}\n","import { ZodIntersectionDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { JsonSchema7StringType } from './string';\n\nexport type JsonSchema7AllOfType = {\n allOf: JsonSchema7Type[];\n unevaluatedProperties?: boolean;\n};\n\nconst isJsonSchema7AllOfType = (\n type: JsonSchema7Type | JsonSchema7StringType,\n): type is JsonSchema7AllOfType => {\n if ('type' in type && type.type === 'string') return false;\n return 'allOf' in type;\n};\n\nexport function parseIntersectionDef(\n def: ZodIntersectionDef,\n refs: Refs,\n): JsonSchema7AllOfType | JsonSchema7Type | undefined {\n const allOf = [\n parseDef(def.left._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'allOf', '0'],\n }),\n parseDef(def.right._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'allOf', '1'],\n }),\n ].filter((x): x is JsonSchema7Type => !!x);\n\n const mergedAllOf: JsonSchema7Type[] = [];\n // If either of the schemas is an allOf, merge them into a single allOf\n allOf.forEach(schema => {\n if (isJsonSchema7AllOfType(schema)) {\n mergedAllOf.push(...schema.allOf);\n } else {\n let nestedSchema: JsonSchema7Type = schema;\n if (\n 'additionalProperties' in schema &&\n schema.additionalProperties === false\n ) {\n const { additionalProperties, ...rest } = schema;\n nestedSchema = rest;\n }\n mergedAllOf.push(nestedSchema);\n }\n });\n return mergedAllOf.length ? { allOf: mergedAllOf } : undefined;\n}\n","import { ZodLiteralDef } from 'zod/v3';\n\nexport type JsonSchema7LiteralType =\n | {\n type: 'string' | 'number' | 'integer' | 'boolean';\n const: string | number | boolean;\n }\n | {\n type: 'object' | 'array';\n };\n\nexport function parseLiteralDef(def: ZodLiteralDef): JsonSchema7LiteralType {\n const parsedType = typeof def.value;\n if (\n parsedType !== 'bigint' &&\n parsedType !== 'number' &&\n parsedType !== 'boolean' &&\n parsedType !== 'string'\n ) {\n return {\n type: Array.isArray(def.value) ? 'array' : 'object',\n };\n }\n\n return {\n type: parsedType === 'bigint' ? 'integer' : parsedType,\n const: def.value,\n };\n}\n","import { ZodStringDef } from 'zod/v3';\nimport { Refs } from '../refs';\n\nlet emojiRegex: RegExp | undefined = undefined;\n\n/**\n * Generated from the regular expressions found here as of 2024-05-22:\n * https://github.com/colinhacks/zod/blob/master/src/types.ts.\n *\n * Expressions with /i flag have been changed accordingly.\n */\nexport const zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email:\n /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === undefined) {\n emojiRegex = RegExp(\n '^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$',\n 'u',\n );\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr:\n /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr:\n /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url:\n /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/,\n} as const;\n\nexport type JsonSchema7StringType = {\n type: 'string';\n minLength?: number;\n maxLength?: number;\n format?:\n | 'email'\n | 'idn-email'\n | 'uri'\n | 'uuid'\n | 'date-time'\n | 'ipv4'\n | 'ipv6'\n | 'date'\n | 'time'\n | 'duration';\n pattern?: string;\n allOf?: {\n pattern: string;\n }[];\n anyOf?: {\n format: string;\n }[];\n contentEncoding?: string;\n};\n\nexport function parseStringDef(\n def: ZodStringDef,\n refs: Refs,\n): JsonSchema7StringType {\n const res: JsonSchema7StringType = {\n type: 'string',\n };\n\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case 'min':\n res.minLength =\n typeof res.minLength === 'number'\n ? Math.max(res.minLength, check.value)\n : check.value;\n break;\n case 'max':\n res.maxLength =\n typeof res.maxLength === 'number'\n ? Math.min(res.maxLength, check.value)\n : check.value;\n\n break;\n case 'email':\n switch (refs.emailStrategy) {\n case 'format:email':\n addFormat(res, 'email', check.message, refs);\n break;\n case 'format:idn-email':\n addFormat(res, 'idn-email', check.message, refs);\n break;\n case 'pattern:zod':\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n\n break;\n case 'url':\n addFormat(res, 'uri', check.message, refs);\n break;\n case 'uuid':\n addFormat(res, 'uuid', check.message, refs);\n break;\n case 'regex':\n addPattern(res, check.regex, check.message, refs);\n break;\n case 'cuid':\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case 'cuid2':\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case 'startsWith':\n addPattern(\n res,\n RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`),\n check.message,\n refs,\n );\n break;\n case 'endsWith':\n addPattern(\n res,\n RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`),\n check.message,\n refs,\n );\n break;\n case 'datetime':\n addFormat(res, 'date-time', check.message, refs);\n break;\n case 'date':\n addFormat(res, 'date', check.message, refs);\n break;\n case 'time':\n addFormat(res, 'time', check.message, refs);\n break;\n case 'duration':\n addFormat(res, 'duration', check.message, refs);\n break;\n case 'length':\n res.minLength =\n typeof res.minLength === 'number'\n ? Math.max(res.minLength, check.value)\n : check.value;\n res.maxLength =\n typeof res.maxLength === 'number'\n ? Math.min(res.maxLength, check.value)\n : check.value;\n break;\n case 'includes': {\n addPattern(\n res,\n RegExp(escapeLiteralCheckValue(check.value, refs)),\n check.message,\n refs,\n );\n break;\n }\n case 'ip': {\n if (check.version !== 'v6') {\n addFormat(res, 'ipv4', check.message, refs);\n }\n if (check.version !== 'v4') {\n addFormat(res, 'ipv6', check.message, refs);\n }\n break;\n }\n case 'base64url':\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case 'jwt':\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case 'cidr': {\n if (check.version !== 'v6') {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== 'v4') {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case 'emoji':\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case 'ulid': {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case 'base64': {\n switch (refs.base64Strategy) {\n case 'format:binary': {\n addFormat(res, 'binary' as any, check.message, refs);\n break;\n }\n\n case 'contentEncoding:base64': {\n res.contentEncoding = 'base64';\n break;\n }\n\n case 'pattern:zod': {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case 'nanoid': {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case 'toLowerCase':\n case 'toUpperCase':\n case 'trim':\n break;\n default:\n /* c8 ignore next */\n ((_: never) => {})(check);\n }\n }\n }\n\n return res;\n}\n\nfunction escapeLiteralCheckValue(literal: string, refs: Refs): string {\n return refs.patternStrategy === 'escape'\n ? escapeNonAlphaNumeric(literal)\n : literal;\n}\n\nconst ALPHA_NUMERIC = new Set(\n 'ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789',\n);\n\nfunction escapeNonAlphaNumeric(source: string) {\n let result = '';\n\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += '\\\\';\n }\n\n result += source[i];\n }\n\n return result;\n}\n\n// Adds a \"format\" keyword to the schema. If a format exists, both formats will be joined in an allOf-node, along with subsequent ones.\nfunction addFormat(\n schema: JsonSchema7StringType,\n value: Required<JsonSchema7StringType>['format'],\n message: string | undefined,\n refs: Refs,\n) {\n if (schema.format || schema.anyOf?.some(x => x.format)) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n\n if (schema.format) {\n schema.anyOf!.push({\n format: schema.format,\n });\n delete schema.format;\n }\n\n schema.anyOf!.push({\n format: value,\n ...(message &&\n refs.errorMessages && { errorMessage: { format: message } }),\n });\n } else {\n schema.format = value;\n }\n}\n\n// Adds a \"pattern\" keyword to the schema. If a pattern exists, both patterns will be joined in an allOf-node, along with subsequent ones.\nfunction addPattern(\n schema: JsonSchema7StringType,\n regex: RegExp,\n message: string | undefined,\n refs: Refs,\n) {\n if (schema.pattern || schema.allOf?.some(x => x.pattern)) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n\n if (schema.pattern) {\n schema.allOf!.push({\n pattern: schema.pattern,\n });\n delete schema.pattern;\n }\n\n schema.allOf!.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...(message &&\n refs.errorMessages && { errorMessage: { pattern: message } }),\n });\n } else {\n schema.pattern = stringifyRegExpWithFlags(regex, refs);\n }\n}\n\n// Mutate z.string.regex() in a best attempt to accommodate for regex flags when applyRegexFlags is true\nfunction stringifyRegExpWithFlags(regex: RegExp, refs: Refs): string {\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n\n // Currently handled flags\n const flags = {\n i: regex.flags.includes('i'), // Case-insensitive\n m: regex.flags.includes('m'), // `^` and `$` matches adjacent to newline characters\n s: regex.flags.includes('s'), // `.` matches newlines\n };\n\n // The general principle here is to step through each character, one at a time, applying mutations as flags require. We keep track when the current character is escaped, and when it's inside a group /like [this]/ or (also) a range like /[a-z]/. The following is fairly brittle imperative code; edit at your peril!\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = '';\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n } else if (source[i + 1] === '-' && source[i + 2]?.match(/[a-z]/)) {\n pattern += source[i];\n inCharRange = true;\n } else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n } else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n\n if (flags.m) {\n if (source[i] === '^') {\n pattern += `(^|(?<=[\\r\\n]))`;\n continue;\n } else if (source[i] === '$') {\n pattern += `($|(?=[\\r\\n]))`;\n continue;\n }\n }\n\n if (flags.s && source[i] === '.') {\n pattern += inCharGroup ? `${source[i]}\\r\\n` : `[${source[i]}\\r\\n]`;\n continue;\n }\n\n pattern += source[i];\n if (source[i] === '\\\\') {\n isEscaped = true;\n } else if (inCharGroup && source[i] === ']') {\n inCharGroup = false;\n } else if (!inCharGroup && source[i] === '[') {\n inCharGroup = true;\n }\n }\n\n try {\n new RegExp(pattern);\n } catch {\n console.warn(\n `Could not convert regex pattern at ${refs.currentPath.join(\n '/',\n )} to a flag-independent form! Falling back to the flag-ignorant source`,\n );\n return regex.source;\n }\n\n return pattern;\n}\n","import {\n ZodFirstPartyTypeKind,\n ZodMapDef,\n ZodRecordDef,\n ZodTypeAny,\n} from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { parseBrandedDef } from './branded';\nimport { JsonSchema7EnumType } from './enum';\nimport { JsonSchema7StringType, parseStringDef } from './string';\n\ntype JsonSchema7RecordPropertyNamesType =\n | Omit<JsonSchema7StringType, 'type'>\n | Omit<JsonSchema7EnumType, 'type'>;\n\nexport type JsonSchema7RecordType = {\n type: 'object';\n additionalProperties?: JsonSchema7Type | true;\n propertyNames?: JsonSchema7RecordPropertyNamesType;\n};\n\nexport function parseRecordDef(\n def: ZodRecordDef<ZodTypeAny, ZodTypeAny> | ZodMapDef,\n refs: Refs,\n): JsonSchema7RecordType {\n const schema: JsonSchema7RecordType = {\n type: 'object',\n additionalProperties:\n parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'additionalProperties'],\n }) ?? refs.allowedAdditionalProperties,\n };\n\n if (\n def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodString &&\n def.keyType._def.checks?.length\n ) {\n const { type, ...keyType } = parseStringDef(def.keyType._def, refs);\n\n return {\n ...schema,\n propertyNames: keyType,\n };\n } else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values,\n },\n };\n } else if (\n def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodBranded &&\n def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind.ZodString &&\n def.keyType._def.type._def.checks?.length\n ) {\n const { type, ...keyType } = parseBrandedDef(\n def.keyType._def,\n refs,\n ) as JsonSchema7StringType;\n\n return {\n ...schema,\n propertyNames: keyType,\n };\n }\n\n return schema;\n}\n","import { ZodMapDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { parseAnyDef } from './any';\nimport { JsonSchema7RecordType, parseRecordDef } from './record';\n\nexport type JsonSchema7MapType = {\n type: 'array';\n maxItems: 125;\n items: {\n type: 'array';\n items: [JsonSchema7Type, JsonSchema7Type];\n minItems: 2;\n maxItems: 2;\n };\n};\n\nexport function parseMapDef(\n def: ZodMapDef,\n refs: Refs,\n): JsonSchema7MapType | JsonSchema7RecordType {\n if (refs.mapStrategy === 'record') {\n return parseRecordDef(def, refs);\n }\n\n const keys =\n parseDef(def.keyType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items', 'items', '0'],\n }) || parseAnyDef();\n const values =\n parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items', 'items', '1'],\n }) || parseAnyDef();\n return {\n type: 'array',\n maxItems: 125,\n items: {\n type: 'array',\n items: [keys, values],\n minItems: 2,\n maxItems: 2,\n },\n };\n}\n","import { ZodNativeEnumDef } from 'zod/v3';\n\nexport type JsonSchema7NativeEnumType = {\n type: 'string' | 'number' | ['string', 'number'];\n enum: (string | number)[];\n};\n\nexport function parseNativeEnumDef(\n def: ZodNativeEnumDef,\n): JsonSchema7NativeEnumType {\n const object = def.values;\n const actualKeys = Object.keys(def.values).filter((key: string) => {\n return typeof object[object[key]] !== 'number';\n });\n\n const actualValues = actualKeys.map((key: string) => object[key]);\n\n const parsedTypes = Array.from(\n new Set(actualValues.map((values: string | number) => typeof values)),\n );\n\n return {\n type:\n parsedTypes.length === 1\n ? parsedTypes[0] === 'string'\n ? 'string'\n : 'number'\n : ['string', 'number'],\n enum: actualValues,\n };\n}\n","import { JsonSchema7AnyType, parseAnyDef } from './any';\n\nexport type JsonSchema7NeverType = {\n not: JsonSchema7AnyType;\n};\n\nexport function parseNeverDef(): JsonSchema7NeverType | undefined {\n return { not: parseAnyDef() };\n}\n","export type JsonSchema7NullType = {\n type: 'null';\n};\n\nexport function parseNullDef(): JsonSchema7NullType {\n return {\n type: 'null',\n };\n}\n","import {\n ZodDiscriminatedUnionDef,\n ZodLiteralDef,\n ZodTypeAny,\n ZodUnionDef,\n} from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport const primitiveMappings = {\n ZodString: 'string',\n ZodNumber: 'number',\n ZodBigInt: 'integer',\n ZodBoolean: 'boolean',\n ZodNull: 'null',\n} as const;\ntype ZodPrimitive = keyof typeof primitiveMappings;\ntype JsonSchema7Primitive =\n (typeof primitiveMappings)[keyof typeof primitiveMappings];\n\nexport type JsonSchema7UnionType =\n | JsonSchema7PrimitiveUnionType\n | JsonSchema7AnyOfType;\n\ntype JsonSchema7PrimitiveUnionType =\n | {\n type: JsonSchema7Primitive | JsonSchema7Primitive[];\n }\n | {\n type: JsonSchema7Primitive | JsonSchema7Primitive[];\n enum: (string | number | bigint | boolean | null)[];\n };\n\ntype JsonSchema7AnyOfType = {\n anyOf: JsonSchema7Type[];\n};\n\nexport function parseUnionDef(\n def: ZodUnionDef | ZodDiscriminatedUnionDef<any, any>,\n refs: Refs,\n): JsonSchema7PrimitiveUnionType | JsonSchema7AnyOfType | undefined {\n const options: readonly ZodTypeAny[] =\n def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n\n // This blocks tries to look ahead a bit to produce nicer looking schemas with type array instead of anyOf.\n if (\n options.every(\n x =>\n x._def.typeName in primitiveMappings &&\n (!x._def.checks || !x._def.checks.length),\n )\n ) {\n // all types in union are primitive and lack checks, so might as well squash into {type: [...]}\n\n const types = options.reduce((types: JsonSchema7Primitive[], x) => {\n const type = primitiveMappings[x._def.typeName as ZodPrimitive]; //Can be safely casted due to row 43\n return type && !types.includes(type) ? [...types, type] : types;\n }, []);\n\n return {\n type: types.length > 1 ? types : types[0],\n };\n } else if (\n options.every(x => x._def.typeName === 'ZodLiteral' && !x.description)\n ) {\n // all options literals\n\n const types = options.reduce(\n (acc: JsonSchema7Primitive[], x: { _def: ZodLiteralDef }) => {\n const type = typeof x._def.value;\n switch (type) {\n case 'string':\n case 'number':\n case 'boolean':\n return [...acc, type];\n case 'bigint':\n return [...acc, 'integer' as const];\n case 'object':\n if (x._def.value === null) return [...acc, 'null' as const];\n case 'symbol':\n case 'undefined':\n case 'function':\n default:\n return acc;\n }\n },\n [],\n );\n\n if (types.length === options.length) {\n // all the literals are primitive, as far as null can be considered primitive\n\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce(\n (acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n },\n [] as (string | number | bigint | boolean | null)[],\n ),\n };\n }\n } else if (options.every(x => x._def.typeName === 'ZodEnum')) {\n return {\n type: 'string',\n enum: options.reduce(\n (acc: string[], x) => [\n ...acc,\n ...x._def.values.filter((x: string) => !acc.includes(x)),\n ],\n [],\n ),\n };\n }\n\n return asAnyOf(def, refs);\n}\n\nconst asAnyOf = (\n def: ZodUnionDef | ZodDiscriminatedUnionDef<any, any>,\n refs: Refs,\n): JsonSchema7PrimitiveUnionType | JsonSchema7AnyOfType | undefined => {\n const anyOf = (\n (def.options instanceof Map\n ? Array.from(def.options.values())\n : def.options) as any[]\n )\n .map((x, i) =>\n parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'anyOf', `${i}`],\n }),\n )\n .filter(\n (x): x is JsonSchema7Type =>\n !!x &&\n (!refs.strictUnions ||\n (typeof x === 'object' && Object.keys(x).length > 0)),\n );\n\n return anyOf.length ? { anyOf } : undefined;\n};\n","import { ZodNullableDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { JsonSchema7NullType } from './null';\nimport { primitiveMappings } from './union';\n\nexport type JsonSchema7NullableType =\n | {\n anyOf: [JsonSchema7Type, JsonSchema7NullType];\n }\n | {\n type: [string, 'null'];\n };\n\nexport function parseNullableDef(\n def: ZodNullableDef,\n refs: Refs,\n): JsonSchema7NullableType | undefined {\n if (\n ['ZodString', 'ZodNumber', 'ZodBigInt', 'ZodBoolean', 'ZodNull'].includes(\n def.innerType._def.typeName,\n ) &&\n (!def.innerType._def.checks || !def.innerType._def.checks.length)\n ) {\n return {\n type: [\n primitiveMappings[\n def.innerType._def.typeName as keyof typeof primitiveMappings\n ],\n 'null',\n ],\n };\n }\n\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'anyOf', '0'],\n });\n\n return base && { anyOf: [base, { type: 'null' }] };\n}\n","import { ZodNumberDef } from 'zod/v3';\n\nexport type JsonSchema7NumberType = {\n type: 'number' | 'integer';\n minimum?: number;\n exclusiveMinimum?: number;\n maximum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n};\n\nexport function parseNumberDef(def: ZodNumberDef): JsonSchema7NumberType {\n const res: JsonSchema7NumberType = {\n type: 'number',\n };\n\n if (!def.checks) return res;\n\n for (const check of def.checks) {\n switch (check.kind) {\n case 'int':\n res.type = 'integer';\n break;\n case 'min':\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case 'max':\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case 'multipleOf':\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n","import { ZodObjectDef, ZodTypeAny } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport type JsonSchema7ObjectType = {\n type: 'object';\n properties: Record<string, JsonSchema7Type>;\n additionalProperties?: boolean | JsonSchema7Type;\n required?: string[];\n};\n\nexport function parseObjectDef(def: ZodObjectDef, refs: Refs) {\n const result: JsonSchema7ObjectType = {\n type: 'object',\n properties: {},\n };\n\n const required: string[] = [];\n\n const shape = def.shape();\n\n for (const propName in shape) {\n let propDef = shape[propName];\n\n if (propDef === undefined || propDef._def === undefined) {\n continue;\n }\n\n const propOptional = safeIsOptional(propDef);\n\n const parsedDef = parseDef(propDef._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'properties', propName],\n propertyPath: [...refs.currentPath, 'properties', propName],\n });\n\n if (parsedDef === undefined) {\n continue;\n }\n\n result.properties[propName] = parsedDef;\n\n if (!propOptional) {\n required.push(propName);\n }\n }\n\n if (required.length) {\n result.required = required;\n }\n\n const additionalProperties = decideAdditionalProperties(def, refs);\n\n if (additionalProperties !== undefined) {\n result.additionalProperties = additionalProperties;\n }\n\n return result;\n}\n\nfunction decideAdditionalProperties(def: ZodObjectDef, refs: Refs) {\n if (def.catchall._def.typeName !== 'ZodNever') {\n return parseDef(def.catchall._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'additionalProperties'],\n });\n }\n\n switch (def.unknownKeys) {\n case 'passthrough':\n return refs.allowedAdditionalProperties;\n case 'strict':\n return refs.rejectedAdditionalProperties;\n case 'strip':\n return refs.removeAdditionalStrategy === 'strict'\n ? refs.allowedAdditionalProperties\n : refs.rejectedAdditionalProperties;\n }\n}\n\nfunction safeIsOptional(schema: ZodTypeAny): boolean {\n try {\n return schema.isOptional();\n } catch {\n return true;\n }\n}\n","import { ZodPromiseDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport function parsePromiseDef(\n def: ZodPromiseDef,\n refs: Refs,\n): JsonSchema7Type | undefined {\n return parseDef(def.type._def, refs);\n}\n","import { ZodSetDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport type JsonSchema7SetType = {\n type: 'array';\n uniqueItems: true;\n items?: JsonSchema7Type;\n minItems?: number;\n maxItems?: number;\n};\n\nexport function parseSetDef(def: ZodSetDef, refs: Refs): JsonSchema7SetType {\n const items = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items'],\n });\n\n const schema: JsonSchema7SetType = {\n type: 'array',\n uniqueItems: true,\n items,\n };\n\n if (def.minSize) {\n schema.minItems = def.minSize.value;\n }\n\n if (def.maxSize) {\n schema.maxItems = def.maxSize.value;\n }\n\n return schema;\n}\n","import { ZodTupleDef, ZodTupleItems, ZodTypeAny } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport type JsonSchema7TupleType = {\n type: 'array';\n minItems: number;\n items: JsonSchema7Type[];\n} & (\n | {\n maxItems: number;\n }\n | {\n additionalItems?: JsonSchema7Type;\n }\n);\n\nexport function parseTupleDef(\n def: ZodTupleDef<ZodTupleItems | [], ZodTypeAny | null>,\n refs: Refs,\n): JsonSchema7TupleType {\n if (def.rest) {\n return {\n type: 'array',\n minItems: def.items.length,\n items: def.items\n .map((x, i) =>\n parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items', `${i}`],\n }),\n )\n .reduce(\n (acc: JsonSchema7Type[], x) => (x === undefined ? acc : [...acc, x]),\n [],\n ),\n additionalItems: parseDef(def.rest._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'additionalItems'],\n }),\n };\n } else {\n return {\n type: 'array',\n minItems: def.items.length,\n maxItems: def.items.length,\n items: def.items\n .map((x, i) =>\n parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items', `${i}`],\n }),\n )\n .reduce(\n (acc: JsonSchema7Type[], x) => (x === undefined ? acc : [...acc, x]),\n [],\n ),\n };\n }\n}\n","import { JsonSchema7AnyType, parseAnyDef } from './any';\n\nexport type JsonSchema7UndefinedType = {\n not: JsonSchema7AnyType;\n};\n\nexport function parseUndefinedDef(): JsonSchema7UndefinedType {\n return {\n not: parseAnyDef(),\n };\n}\n","import { JsonSchema7AnyType, parseAnyDef } from './any';\n\nexport type JsonSchema7UnknownType = JsonSchema7AnyType;\n\nexport function parseUnknownDef(): JsonSchema7UnknownType {\n return parseAnyDef();\n}\n","import { ZodTypeDef } from 'zod/v3';\nimport { Refs, Seen } from './refs';\nimport { ignoreOverride } from './options';\nimport { JsonSchema7Type } from './parse-types';\nimport { selectParser } from './select-parser';\nimport { getRelativePath } from './get-relative-path';\nimport { parseAnyDef } from './parsers/any';\n\nexport function parseDef(\n def: ZodTypeDef,\n refs: Refs,\n forceResolution = false, // Forces a new schema to be instantiated even though its def has been seen. Used for improving refs in definitions. See https://github.com/StefanTerdell/zod-to-json-schema/pull/61.\n): JsonSchema7Type | undefined {\n const seenItem = refs.seen.get(def);\n\n if (refs.override) {\n const overrideResult = refs.override?.(\n def,\n refs,\n seenItem,\n forceResolution,\n );\n\n if (overrideResult !== ignoreOverride) {\n return overrideResult;\n }\n }\n\n if (seenItem && !forceResolution) {\n const seenSchema = get$ref(seenItem, refs);\n\n if (seenSchema !== undefined) {\n return seenSchema;\n }\n }\n\n const newItem: Seen = { def, path: refs.currentPath, jsonSchema: undefined };\n\n refs.seen.set(def, newItem);\n\n const jsonSchemaOrGetter = selectParser(def, (def as any).typeName, refs);\n\n // If the return was a function, then the inner definition needs to be extracted before a call to parseDef (recursive)\n const jsonSchema =\n typeof jsonSchemaOrGetter === 'function'\n ? parseDef(jsonSchemaOrGetter(), refs)\n : jsonSchemaOrGetter;\n\n if (jsonSchema) {\n addMeta(def, refs, jsonSchema);\n }\n\n if (refs.postProcess) {\n const postProcessResult = refs.postProcess(jsonSchema, def, refs);\n\n newItem.jsonSchema = jsonSchema;\n\n return postProcessResult;\n }\n\n newItem.jsonSchema = jsonSchema;\n\n return jsonSchema;\n}\n\nconst get$ref = (\n item: Seen,\n refs: Refs,\n):\n | {\n $ref: string;\n }\n | {}\n | undefined => {\n switch (refs.$refStrategy) {\n case 'root':\n return { $ref: item.path.join('/') };\n case 'relative':\n return { $ref: getRelativePath(refs.currentPath, item.path) };\n case 'none':\n case 'seen': {\n if (\n item.path.length < refs.currentPath.length &&\n item.path.every((value, index) => refs.currentPath[index] === value)\n ) {\n console.warn(\n `Recursive reference detected at ${refs.currentPath.join(\n '/',\n )}! Defaulting to any`,\n );\n\n return parseAnyDef();\n }\n\n return refs.$refStrategy === 'seen' ? parseAnyDef() : undefined;\n }\n }\n};\n\nconst addMeta = (\n def: ZodTypeDef,\n refs: Refs,\n jsonSchema: JsonSchema7Type,\n): JsonSchema7Type => {\n if (def.description) {\n jsonSchema.description = def.description;\n }\n return jsonSchema;\n};\n","import { JSONSchema7, TypeValidationError } from '@ai-sdk/provider';\nimport { StandardSchemaV1, StandardJSONSchemaV1 } from '@standard-schema/spec';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { addAdditionalPropertiesToJsonSchema } from './add-additional-properties-to-json-schema';\nimport { zod3ToJsonSchema } from './to-json-schema/zod3-to-json-schema';\n\n/**\n * Used to mark schemas so we can support both Zod and custom schemas.\n */\nconst schemaSymbol = Symbol.for('vercel.ai.schema');\n\nexport type ValidationResult<OBJECT> =\n | { success: true; value: OBJECT }\n | { success: false; error: Error };\n\nexport type Schema<OBJECT = unknown> = {\n /**\n * Used to mark schemas so we can support both Zod and custom schemas.\n */\n [schemaSymbol]: true;\n\n /**\n * Schema type for inference.\n */\n _type: OBJECT;\n\n /**\n * Optional. Validates that the structure of a value matches this schema,\n * and returns a typed version of the value if it does.\n */\n readonly validate?: (\n value: unknown,\n ) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>;\n\n /**\n * The JSON Schema for the schema. It is passed to the providers.\n */\n readonly jsonSchema: JSONSchema7 | PromiseLike<JSONSchema7>;\n};\n\n/**\n * Creates a schema with deferred creation.\n * This is important to reduce the startup time of the library\n * and to avoid initializing unused validators.\n *\n * @param createValidator A function that creates a schema.\n * @returns A function that returns a schema.\n */\nexport function lazySchema<SCHEMA>(\n createSchema: () => Schema<SCHEMA>,\n): LazySchema<SCHEMA> {\n // cache the validator to avoid initializing it multiple times\n let schema: Schema<SCHEMA> | undefined;\n return () => {\n if (schema == null) {\n schema = createSchema();\n }\n return schema;\n };\n}\n\nexport type LazySchema<SCHEMA> = () => Schema<SCHEMA>;\n\nexport type ZodSchema<SCHEMA = any> =\n | z3.Schema<SCHEMA, z3.ZodTypeDef, any>\n | z4.core.$ZodType<SCHEMA, any>;\n\nexport type StandardSchema<SCHEMA = any> = StandardSchemaV1<unknown, SCHEMA> &\n StandardJSONSchemaV1<unknown, SCHEMA>;\n\nexport type FlexibleSchema<SCHEMA = any> =\n | Schema<SCHEMA>\n | LazySchema<SCHEMA>\n | ZodSchema<SCHEMA>\n | StandardSchema<SCHEMA>;\n\nexport type InferSchema<SCHEMA> =\n SCHEMA extends ZodSchema<infer T>\n ? T\n : SCHEMA extends StandardSchema<infer T>\n ? T\n : SCHEMA extends LazySchema<infer T>\n ? T\n : SCHEMA extends Schema<infer T>\n ? T\n : never;\n\n/**\n * Create a schema using a JSON Schema.\n *\n * @param jsonSchema The JSON Schema for the schema.\n * @param options.validate Optional. A validation function for the schema.\n */\nexport function jsonSchema<OBJECT = unknown>(\n jsonSchema:\n | JSONSchema7\n | PromiseLike<JSONSchema7>\n | (() => JSONSchema7 | PromiseLike<JSONSchema7>),\n {\n validate,\n }: {\n validate?: (\n value: unknown,\n ) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>;\n } = {},\n): Schema<OBJECT> {\n return {\n [schemaSymbol]: true,\n _type: undefined as OBJECT, // should never be used directly\n get jsonSchema() {\n if (typeof jsonSchema === 'function') {\n jsonSchema = jsonSchema(); // cache the function results\n }\n return jsonSchema;\n },\n validate,\n };\n}\n\nfunction isSchema(value: unknown): value is Schema {\n return (\n typeof value === 'object' &&\n value !== null &&\n schemaSymbol in value &&\n value[schemaSymbol] === true &&\n 'jsonSchema' in value &&\n 'validate' in value\n );\n}\n\nexport function asSchema<OBJECT>(\n schema: FlexibleSchema<OBJECT> | undefined,\n): Schema<OBJECT> {\n return schema == null\n ? jsonSchema({ properties: {}, additionalProperties: false })\n : isSchema(schema)\n ? schema\n : '~standard' in schema\n ? schema['~standard'].vendor === 'zod'\n ? zodSchema(schema as ZodSchema<OBJECT>)\n : standardSchema(schema as StandardSchema<OBJECT>)\n : schema();\n}\n\nfunction standardSchema<OBJECT>(\n standardSchema: StandardSchema<OBJECT>,\n): Schema<OBJECT> {\n return jsonSchema(\n () =>\n addAdditionalPropertiesToJsonSchema(\n standardSchema['~standard'].jsonSchema.input({\n target: 'draft-07',\n }) as JSONSchema7,\n ),\n {\n validate: async value => {\n const result = await standardSchema['~standard'].validate(value);\n return 'value' in result\n ? { success: true, value: result.value }\n : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: result.issues,\n }),\n };\n },\n },\n );\n}\n\nexport function zod3Schema<OBJECT>(\n zodSchema: z3.Schema<OBJECT, z3.ZodTypeDef, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n // default to no references (to support openapi conversion for google)\n const useReferences = options?.useReferences ?? false;\n\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () =>\n zod3ToJsonSchema(zodSchema, {\n $refStrategy: useReferences ? 'root' : 'none',\n }) as JSONSchema7,\n {\n validate: async value => {\n const result = await zodSchema.safeParseAsync(value);\n return result.success\n ? { success: true, value: result.data }\n : { success: false, error: result.error };\n },\n },\n );\n}\n\nexport function zod4Schema<OBJECT>(\n zodSchema: z4.core.$ZodType<OBJECT, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n // default to no references (to support openapi conversion for google)\n const useReferences = options?.useReferences ?? false;\n\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () =>\n addAdditionalPropertiesToJsonSchema(\n z4.toJSONSchema(zodSchema, {\n target: 'draft-7',\n io: 'input',\n reused: useReferences ? 'ref' : 'inline',\n }) as JSONSchema7,\n ),\n {\n validate: async value => {\n const result = await z4.safeParseAsync(zodSchema, value);\n return result.success\n ? { success: true, value: result.data }\n : { success: false, error: result.error };\n },\n },\n );\n}\n\nexport function isZod4Schema(\n zodSchema: z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>,\n): zodSchema is z4.core.$ZodType<any, any> {\n // https://zod.dev/library-authors?id=how-to-support-zod-3-and-zod-4-simultaneously\n return '_zod' in zodSchema;\n}\n\nexport function zodSchema<OBJECT>(\n zodSchema:\n | z4.core.$ZodType<OBJECT, any>\n | z3.Schema<OBJECT, z3.ZodTypeDef, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n if (isZod4Schema(zodSchema)) {\n return zod4Schema(zodSchema, options);\n } else {\n return zod3Schema(zodSchema, options);\n }\n}\n","import { TypeValidationContext, TypeValidationError } from '@ai-sdk/provider';\nimport { FlexibleSchema, asSchema } from './schema';\n\n/**\n * Validates the types of an unknown object using a schema and\n * return a strongly-typed object.\n *\n * @template T - The type of the object to validate.\n * @param {string} options.value - The object to validate.\n * @param {Validator<T>} options.schema - The schema to use for validating the JSON.\n * @param {TypeValidationContext} options.context - Optional context about what is being validated.\n * @returns {Promise<T>} - The typed object.\n */\nexport async function validateTypes<OBJECT>({\n value,\n schema,\n context,\n}: {\n value: unknown;\n schema: FlexibleSchema<OBJECT>;\n context?: TypeValidationContext;\n}): Promise<OBJECT> {\n const result = await safeValidateTypes({ value, schema, context });\n\n if (!result.success) {\n throw TypeValidationError.wrap({ value, cause: result.error, context });\n }\n\n return result.value;\n}\n\n/**\n * Safely validates the types of an unknown object using a schema and\n * return a strongly-typed object.\n *\n * @template T - The type of the object to validate.\n * @param {string} options.value - The JSON object to validate.\n * @param {Validator<T>} options.schema - The schema to use for validating the JSON.\n * @param {TypeValidationContext} options.context - Optional context about what is being validated.\n * @returns An object with either a `success` flag and the parsed and typed data, or a `success` flag and an error object.\n */\nexport async function safeValidateTypes<OBJECT>({\n value,\n schema,\n context,\n}: {\n value: unknown;\n schema: FlexibleSchema<OBJECT>;\n context?: TypeValidationContext;\n}): Promise<\n | {\n success: true;\n value: OBJECT;\n rawValue: unknown;\n }\n | {\n success: false;\n error: TypeValidationError;\n rawValue: unknown;\n }\n> {\n const actualSchema = asSchema(schema);\n\n try {\n if (actualSchema.validate == null) {\n return { success: true, value: value as OBJECT, rawValue: value };\n }\n\n const result = await actualSchema.validate(value);\n\n if (result.success) {\n return { success: true, value: result.value, rawValue: value };\n }\n\n return {\n success: false,\n error: TypeValidationError.wrap({ value, cause: result.error, context }),\n rawValue: value,\n };\n } catch (error) {\n return {\n success: false,\n error: TypeValidationError.wrap({ value, cause: error, context }),\n rawValue: value,\n };\n }\n}\n","import {\n JSONParseError,\n JSONValue,\n TypeValidationError,\n} from '@ai-sdk/provider';\nimport { secureJsonParse } from './secure-json-parse';\nimport { safeValidateTypes, validateTypes } from './validate-types';\nimport { FlexibleSchema } from './schema';\n\n/**\n * Parses a JSON string into an unknown object.\n *\n * @param text - The JSON string to parse.\n * @returns {JSONValue} - The parsed JSON object.\n */\nexport async function parseJSON(options: {\n text: string;\n schema?: undefined;\n}): Promise<JSONValue>;\n/**\n * Parses a JSON string into a strongly-typed object using the provided schema.\n *\n * @template T - The type of the object to parse the JSON into.\n * @param {string} text - The JSON string to parse.\n * @param {Validator<T>} schema - The schema to use for parsing the JSON.\n * @returns {Promise<T>} - The parsed object.\n */\nexport async function parseJSON<T>(options: {\n text: string;\n schema: FlexibleSchema<T>;\n}): Promise<T>;\nexport async function parseJSON<T>({\n text,\n schema,\n}: {\n text: string;\n schema?: FlexibleSchema<T>;\n}): Promise<T> {\n try {\n const value = secureJsonParse(text);\n\n if (schema == null) {\n return value;\n }\n\n return validateTypes<T>({ value, schema });\n } catch (error) {\n if (\n JSONParseError.isInstance(error) ||\n TypeValidationError.isInstance(error)\n ) {\n throw error;\n }\n\n throw new JSONParseError({ text, cause: error });\n }\n}\n\nexport type ParseResult<T> =\n | { success: true; value: T; rawValue: unknown }\n | {\n success: false;\n error: JSONParseError | TypeValidationError;\n rawValue: unknown;\n };\n\n/**\n * Safely parses a JSON string and returns the result as an object of type `unknown`.\n *\n * @param text - The JSON string to parse.\n * @returns {Promise<object>} Either an object with `success: true` and the parsed data, or an object with `success: false` and the error that occurred.\n */\nexport async function safeParseJSON(options: {\n text: string;\n schema?: undefined;\n}): Promise<ParseResult<JSONValue>>;\n/**\n * Safely parses a JSON string into a strongly-typed object, using a provided schema to validate the object.\n *\n * @template T - The type of the object to parse the JSON into.\n * @param {string} text - The JSON string to parse.\n * @param {Validator<T>} schema - The schema to use for parsing the JSON.\n * @returns An object with either a `success` flag and the parsed and typed data, or a `success` flag and an error object.\n */\nexport async function safeParseJSON<T>(options: {\n text: string;\n schema: FlexibleSchema<T>;\n}): Promise<ParseResult<T>>;\nexport async function safeParseJSON<T>({\n text,\n schema,\n}: {\n text: string;\n schema?: FlexibleSchema<T>;\n}): Promise<ParseResult<T>> {\n try {\n const value = secureJsonParse(text);\n\n if (schema == null) {\n return { success: true, value: value as T, rawValue: value };\n }\n\n return await safeValidateTypes<T>({ value, schema });\n } catch (error) {\n return {\n success: false,\n error: JSONParseError.isInstance(error)\n ? error\n : new JSONParseError({ text, cause: error }),\n rawValue: undefined,\n };\n }\n}\n\nexport function isParsableJson(input: string): boolean {\n try {\n secureJsonParse(input);\n return true;\n } catch {\n return false;\n }\n}\n","import {\n EventSourceMessage,\n EventSourceParserStream,\n} from 'eventsource-parser/stream';\nimport { ParseResult, safeParseJSON } from './parse-json';\nimport { FlexibleSchema } from './schema';\n\n/**\n * Parses a JSON event stream into a stream of parsed JSON objects.\n */\nexport function parseJsonEventStream<T>({\n stream,\n schema,\n}: {\n stream: ReadableStream<Uint8Array>;\n schema: FlexibleSchema<T>;\n}): ReadableStream<ParseResult<T>> {\n return stream\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new TransformStream<EventSourceMessage, ParseResult<T>>({\n async transform({ data }, controller) {\n // ignore the 'DONE' event that e.g. OpenAI sends:\n if (data === '[DONE]') {\n return;\n }\n\n controller.enqueue(await safeParseJSON({ text: data, schema }));\n },\n }),\n );\n}\n","import { InvalidArgumentError } from '@ai-sdk/provider';\nimport { safeValidateTypes } from './validate-types';\nimport { FlexibleSchema } from './schema';\n\nexport async function parseProviderOptions<OPTIONS>({\n provider,\n providerOptions,\n schema,\n}: {\n provider: string;\n providerOptions: Record<string, unknown> | undefined;\n schema: FlexibleSchema<OPTIONS>;\n}): Promise<OPTIONS | undefined> {\n if (providerOptions?.[provider] == null) {\n return undefined;\n }\n\n const parsedProviderOptions = await safeValidateTypes<OPTIONS | undefined>({\n value: providerOptions[provider],\n schema,\n });\n\n if (!parsedProviderOptions.success) {\n throw new InvalidArgumentError({\n argument: 'providerOptions',\n message: `invalid ${provider} provider options`,\n cause: parsedProviderOptions.error,\n });\n }\n\n return parsedProviderOptions.value;\n}\n","import { JSONValue } from '@ai-sdk/provider';\nimport { FlexibleSchema } from '../schema';\nimport { ToolResultOutput } from './content-part';\nimport { ModelMessage } from './model-message';\nimport { ProviderOptions } from './provider-options';\n\n/**\n * Additional options that are sent into each tool call.\n */\nexport interface ToolExecutionOptions {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * Messages that were sent to the language model to initiate the response that contained the tool call.\n * The messages **do not** include the system prompt nor the assistant response that contained the tool call.\n */\n messages: ModelMessage[];\n\n /**\n * An optional abort signal that indicates that the overall operation should be aborted.\n */\n abortSignal?: AbortSignal;\n\n /**\n * User-defined context.\n *\n * Treat the context object as immutable inside tools.\n * Mutating the context object can lead to race conditions and unexpected results\n * when tools are called in parallel.\n *\n * If you need to mutate the context, analyze the tool calls and results\n * in `prepareStep` and update it there.\n *\n * Experimental (can break in patch releases).\n */\n experimental_context?: unknown;\n}\n\n/**\n * Function that is called to determine if the tool needs approval before it can be executed.\n */\nexport type ToolNeedsApprovalFunction<INPUT> = (\n input: INPUT,\n options: {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * Messages that were sent to the language model to initiate the response that contained the tool call.\n * The messages **do not** include the system prompt nor the assistant response that contained the tool call.\n */\n messages: ModelMessage[];\n\n /**\n * Additional context.\n *\n * Experimental (can break in patch releases).\n */\n experimental_context?: unknown;\n },\n) => boolean | PromiseLike<boolean>;\n\nexport type ToolExecuteFunction<INPUT, OUTPUT> = (\n input: INPUT,\n options: ToolExecutionOptions,\n) => AsyncIterable<OUTPUT> | PromiseLike<OUTPUT> | OUTPUT;\n\n// 0 extends 1 & N checks for any\n// [N] extends [never] checks for never\ntype NeverOptional<N, T> = 0 extends 1 & N\n ? Partial<T>\n : [N] extends [never]\n ? Partial<Record<keyof T, undefined>>\n : T;\n\ntype ToolOutputProperties<INPUT, OUTPUT> = NeverOptional<\n OUTPUT,\n | {\n /**\n * An async function that is called with the arguments from the tool call and produces a result.\n * If not provided, the tool will not be executed automatically.\n *\n * @args is the input of the tool call.\n * @options.abortSignal is a signal that can be used to abort the tool call.\n */\n execute: ToolExecuteFunction<INPUT, OUTPUT>;\n\n outputSchema?: FlexibleSchema<OUTPUT>;\n }\n | {\n outputSchema: FlexibleSchema<OUTPUT>;\n\n execute?: never;\n }\n>;\n\n/**\n * A tool contains the description and the schema of the input that the tool expects.\n * This enables the language model to generate the input.\n *\n * The tool can also contain an optional execute function for the actual execution function of the tool.\n */\nexport type Tool<\n INPUT extends JSONValue | unknown | never = any,\n OUTPUT extends JSONValue | unknown | never = any,\n> = {\n /**\n * An optional description of what the tool does.\n * Will be used by the language model to decide whether to use the tool.\n * Not used for provider-defined tools.\n */\n description?: string;\n\n /**\n * An optional title of the tool.\n */\n title?: string;\n\n /**\n * Additional provider-specific metadata. They are passed through\n * to the provider from the AI SDK and enable provider-specific\n * functionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n\n /**\n * The schema of the input that the tool expects.\n * The language model will use this to generate the input.\n * It is also used to validate the output of the language model.\n *\n * You can use descriptions on the schema properties to make the input understandable for the language model.\n */\n inputSchema: FlexibleSchema<INPUT>;\n\n /**\n * An optional list of input examples that show the language\n * model what the input should look like.\n */\n inputExamples?: Array<{ input: NoInfer<INPUT> }>;\n\n /**\n * Whether the tool needs approval before it can be executed.\n */\n needsApproval?:\n | boolean\n | ToolNeedsApprovalFunction<[INPUT] extends [never] ? unknown : INPUT>;\n\n /**\n * Strict mode setting for the tool.\n *\n * Providers that support strict mode will use this setting to determine\n * how the input should be generated. Strict mode will always produce\n * valid inputs, but it might limit what input schemas are supported.\n */\n strict?: boolean;\n\n /**\n * Optional function that is called when the argument streaming starts.\n * Only called when the tool is used in a streaming context.\n */\n onInputStart?: (options: ToolExecutionOptions) => void | PromiseLike<void>;\n\n /**\n * Optional function that is called when an argument streaming delta is available.\n * Only called when the tool is used in a streaming context.\n */\n onInputDelta?: (\n options: { inputTextDelta: string } & ToolExecutionOptions,\n ) => void | PromiseLike<void>;\n\n /**\n * Optional function that is called when a tool call can be started,\n * even if the execute function is not provided.\n */\n onInputAvailable?: (\n options: {\n input: [INPUT] extends [never] ? unknown : INPUT;\n } & ToolExecutionOptions,\n ) => void | PromiseLike<void>;\n} & ToolOutputProperties<INPUT, OUTPUT> & {\n /**\n * Optional conversion function that maps the tool result to an output that can be used by the language model.\n *\n * If not provided, the tool result will be sent as a JSON object.\n */\n toModelOutput?: (options: {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * The input of the tool call.\n */\n input: [INPUT] extends [never] ? unknown : INPUT;\n\n /**\n * The output of the tool call.\n */\n output: 0 extends 1 & OUTPUT\n ? any\n : [OUTPUT] extends [never]\n ? any\n : NoInfer<OUTPUT>;\n }) => ToolResultOutput | PromiseLike<ToolResultOutput>;\n } & (\n | {\n /**\n * Tool with user-defined input and output schemas.\n */\n type?: undefined | 'function';\n }\n | {\n /**\n * Tool that is defined at runtime (e.g. an MCP tool).\n * The types of input and output are not known at development time.\n */\n type: 'dynamic';\n }\n | {\n /**\n * Tool with provider-defined input and output schemas.\n */\n type: 'provider';\n\n /**\n * The ID of the tool. Must follow the format `<provider-name>.<unique-tool-name>`.\n */\n id: `${string}.${string}`;\n\n /**\n * The arguments for configuring the tool. Must match the expected arguments defined by the provider for this tool.\n */\n args: Record<string, unknown>;\n\n /**\n * Whether this provider-executed tool supports deferred results.\n *\n * When true, the tool result may not be returned in the same turn as the\n * tool call (e.g., when using programmatic tool calling where a server tool\n * triggers a client-executed tool, and the server tool's result is deferred\n * until the client tool is resolved).\n *\n * This flag allows the AI SDK to handle tool results that arrive without\n * a matching tool call in the current response.\n *\n * @default false\n */\n supportsDeferredResults?: boolean;\n }\n );\n\n/**\n * Infer the input type of a tool.\n */\nexport type InferToolInput<TOOL extends Tool> =\n TOOL extends Tool<infer INPUT, any> ? INPUT : never;\n\n/**\n * Infer the output type of a tool.\n */\nexport type InferToolOutput<TOOL extends Tool> =\n TOOL extends Tool<any, infer OUTPUT> ? OUTPUT : never;\n\n/**\n * Helper function for inferring the execute args of a tool.\n */\n// Note: overload order is important for auto-completion\nexport function tool<INPUT, OUTPUT>(\n tool: Tool<INPUT, OUTPUT>,\n): Tool<INPUT, OUTPUT>;\nexport function tool<INPUT>(tool: Tool<INPUT, never>): Tool<INPUT, never>;\nexport function tool<OUTPUT>(tool: Tool<never, OUTPUT>): Tool<never, OUTPUT>;\nexport function tool(tool: Tool<never, never>): Tool<never, never>;\nexport function tool(tool: any): any {\n return tool;\n}\n\n/**\n * Defines a dynamic tool.\n */\nexport function dynamicTool(tool: {\n description?: string;\n title?: string;\n providerOptions?: ProviderOptions;\n inputSchema: FlexibleSchema<unknown>;\n execute: ToolExecuteFunction<unknown, unknown>;\n\n /**\n * Optional conversion function that maps the tool result to an output that can be used by the language model.\n *\n * If not provided, the tool result will be sent as a JSON object.\n */\n toModelOutput?: (options: {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * The input of the tool call.\n */\n input: unknown;\n\n /**\n * The output of the tool call.\n */\n output: unknown;\n }) => ToolResultOutput | PromiseLike<ToolResultOutput>;\n\n /**\n * Whether the tool needs approval before it can be executed.\n */\n needsApproval?: boolean | ToolNeedsApprovalFunction<unknown>;\n}): Tool<unknown, unknown> & {\n type: 'dynamic';\n} {\n return { ...tool, type: 'dynamic' };\n}\n","import { tool, Tool, ToolExecuteFunction } from './types/tool';\nimport { FlexibleSchema } from './schema';\n\nexport type ProviderToolFactory<INPUT, ARGS extends object> = <OUTPUT>(\n options: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n },\n) => Tool<INPUT, OUTPUT>;\n\nexport function createProviderToolFactory<INPUT, ARGS extends object>({\n id,\n inputSchema,\n}: {\n id: `${string}.${string}`;\n inputSchema: FlexibleSchema<INPUT>;\n}): ProviderToolFactory<INPUT, ARGS> {\n return <OUTPUT>({\n execute,\n outputSchema,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n outputSchema?: FlexibleSchema<OUTPUT>;\n needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n }): Tool<INPUT, OUTPUT> =>\n tool({\n type: 'provider',\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n });\n}\n\nexport type ProviderToolFactoryWithOutputSchema<\n INPUT,\n OUTPUT,\n ARGS extends object,\n> = (\n options: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n },\n) => Tool<INPUT, OUTPUT>;\n\nexport function createProviderToolFactoryWithOutputSchema<\n INPUT,\n OUTPUT,\n ARGS extends object,\n>({\n id,\n inputSchema,\n outputSchema,\n supportsDeferredResults,\n}: {\n id: `${string}.${string}`;\n inputSchema: FlexibleSchema<INPUT>;\n outputSchema: FlexibleSchema<OUTPUT>;\n /**\n * Whether this provider-executed tool supports deferred results.\n *\n * When true, the tool result may not be returned in the same turn as the\n * tool call (e.g., when using programmatic tool calling where a server tool\n * triggers a client-executed tool, and the server tool's result is deferred\n * until the client tool is resolved).\n *\n * @default false\n */\n supportsDeferredResults?: boolean;\n}): ProviderToolFactoryWithOutputSchema<INPUT, OUTPUT, ARGS> {\n return ({\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n }): Tool<INPUT, OUTPUT> =>\n tool({\n type: 'provider',\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n supportsDeferredResults,\n });\n}\n","/**\n * Removes entries from a record where the value is null or undefined.\n * @param record - The input object whose entries may be null or undefined.\n * @returns A new object containing only entries with non-null and non-undefined values.\n */\nexport function removeUndefinedEntries<T>(\n record: Record<string, T | undefined>,\n): Record<string, T> {\n return Object.fromEntries(\n Object.entries(record).filter(([_key, value]) => value != null),\n ) as Record<string, T>;\n}\n","import { MaybePromiseLike } from './maybe-promise-like';\n\nexport type Resolvable<T> = MaybePromiseLike<T> | (() => MaybePromiseLike<T>);\n\n/**\n * Resolves a value that could be a raw value, a Promise, a function returning a value,\n * or a function returning a Promise.\n */\nexport async function resolve<T>(value: Resolvable<T>): Promise<T> {\n // If it's a function, call it to get the value/promise\n if (typeof value === 'function') {\n value = (value as Function)();\n }\n\n // Otherwise just resolve whatever we got (value or promise)\n return Promise.resolve(value as T);\n}\n","export function withoutTrailingSlash(url: string | undefined) {\n return url?.replace(/\\/$/, '');\n}\n","export function isAsyncIterable<T = any>(obj: any): obj is AsyncIterable<T> {\n return obj != null && typeof obj[Symbol.asyncIterator] === 'function';\n}\n","import { isAsyncIterable } from '../is-async-iterable';\nimport { ToolExecutionOptions, ToolExecuteFunction } from './tool';\n\nexport async function* executeTool<INPUT, OUTPUT>({\n execute,\n input,\n options,\n}: {\n execute: ToolExecuteFunction<INPUT, OUTPUT>;\n input: INPUT;\n options: ToolExecutionOptions;\n}): AsyncGenerator<\n { type: 'preliminary'; output: OUTPUT } | { type: 'final'; output: OUTPUT }\n> {\n const result = execute(input, options);\n\n if (isAsyncIterable(result)) {\n let lastOutput: OUTPUT | undefined;\n for await (const output of result) {\n lastOutput = output;\n yield { type: 'preliminary', output };\n }\n yield { type: 'final', output: lastOutput! };\n } else {\n yield { type: 'final', output: await result };\n }\n}\n","/**\n * Delayed promise. It is only constructed once the value is accessed.\n * This is useful to avoid unhandled promise rejections when the promise is created\n * but not accessed.\n */\nexport class DelayedPromise<T> {\n private status:\n | { type: 'pending' }\n | { type: 'resolved'; value: T }\n | { type: 'rejected'; error: unknown } = { type: 'pending' };\n private _promise: Promise<T> | undefined;\n private _resolve: undefined | ((value: T) => void) = undefined;\n private _reject: undefined | ((error: unknown) => void) = undefined;\n\n get promise(): Promise<T> {\n if (this._promise) {\n return this._promise;\n }\n\n this._promise = new Promise<T>((resolve, reject) => {\n if (this.status.type === 'resolved') {\n resolve(this.status.value);\n } else if (this.status.type === 'rejected') {\n reject(this.status.error);\n }\n\n this._resolve = resolve;\n this._reject = reject;\n });\n\n return this._promise;\n }\n\n resolve(value: T): void {\n this.status = { type: 'resolved', value };\n\n if (this._promise) {\n this._resolve?.(value);\n }\n }\n\n reject(error: unknown): void {\n this.status = { type: 'rejected', error };\n\n if (this._promise) {\n this._reject?.(error);\n }\n }\n\n isResolved(): boolean {\n return this.status.type === 'resolved';\n }\n\n isRejected(): boolean {\n return this.status.type === 'rejected';\n }\n\n isPending(): boolean {\n return this.status.type === 'pending';\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_DownloadError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class DownloadError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly statusCode?: number;\n readonly statusText?: string;\n\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null\n ? `Failed to download ${url}: ${statusCode} ${statusText}`\n : `Failed to download ${url}: ${cause}`,\n }: {\n url: string;\n statusCode?: number;\n statusText?: string;\n message?: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n\n static isInstance(error: unknown): error is DownloadError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { InvalidArgumentError } from '@ai-sdk/provider';\n\n/**\n * Creates an ID generator.\n * The total length of the ID is the sum of the prefix, separator, and random part length.\n * Not cryptographically secure.\n *\n * @param alphabet - The alphabet to use for the ID. Default: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.\n * @param prefix - The prefix of the ID to generate. Optional.\n * @param separator - The separator between the prefix and the random part of the ID. Default: '-'.\n * @param size - The size of the random part of the ID to generate. Default: 16.\n */\nexport const createIdGenerator = ({\n prefix,\n size = 16,\n alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n separator = '-',\n}: {\n prefix?: string;\n separator?: string;\n size?: number;\n alphabet?: string;\n} = {}): IdGenerator => {\n const generator = () => {\n const alphabetLength = alphabet.length;\n const chars = new Array(size);\n for (let i = 0; i < size; i++) {\n chars[i] = alphabet[(Math.random() * alphabetLength) | 0];\n }\n return chars.join('');\n };\n\n if (prefix == null) {\n return generator;\n }\n\n // check that the prefix is not part of the alphabet (otherwise prefix checking can fail randomly)\n if (alphabet.includes(separator)) {\n throw new InvalidArgumentError({\n argument: 'separator',\n message: `The separator \"${separator}\" must not be part of the alphabet \"${alphabet}\".`,\n });\n }\n\n return () => `${prefix}${separator}${generator()}`;\n};\n\n/**\n * A function that generates an ID.\n */\nexport type IdGenerator = () => string;\n\n/**\n * Generates a 16-character random string to use for IDs.\n * Not cryptographically secure.\n */\nexport const generateId = createIdGenerator();\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { APICallError } from '@ai-sdk/provider';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { FetchFunction } from './fetch-function';\nimport { handleFetchError } from './handle-fetch-error';\nimport { isAbortError } from './is-abort-error';\nimport { ResponseHandler } from './response-handler';\nimport { getRuntimeEnvironmentUserAgent } from './get-runtime-environment-user-agent';\nimport { withUserAgentSuffix } from './with-user-agent-suffix';\nimport { VERSION } from './version';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => globalThis.fetch;\n\nexport const getFromApi = async <T>({\n url,\n headers = {},\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch = getOriginalFetch(),\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n failedResponseHandler: ResponseHandler<Error>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) => {\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n ),\n signal: abortSignal,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.ok) {\n let errorInformation: {\n value: Error;\n responseHeaders?: Record<string, string> | undefined;\n };\n\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: {},\n });\n } catch (error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n\n throw new APICallError({\n message: 'Failed to process error response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {},\n });\n }\n\n throw errorInformation.value;\n }\n\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: {},\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n }\n\n throw new APICallError({\n message: 'Failed to process successful response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {},\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: {} });\n }\n};\n","import { ZodSchema, ZodTypeDef } from 'zod/v3';\nimport { Refs, Seen } from './refs';\nimport { JsonSchema7Type } from './parse-types';\n\nexport type DateStrategy =\n | 'format:date-time'\n | 'format:date'\n | 'string'\n | 'integer';\n\nexport const ignoreOverride = Symbol(\n 'Let zodToJsonSchema decide on which parser to use',\n);\n\nexport type OverrideCallback = (\n def: ZodTypeDef,\n refs: Refs,\n seen: Seen | undefined,\n forceResolution?: boolean,\n) => JsonSchema7Type | undefined | typeof ignoreOverride;\n\nexport type PostProcessCallback = (\n jsonSchema: JsonSchema7Type | undefined,\n def: ZodTypeDef,\n refs: Refs,\n) => JsonSchema7Type | undefined;\n\nexport const jsonDescription: PostProcessCallback = (jsonSchema, def) => {\n if (def.description) {\n try {\n return {\n ...jsonSchema,\n ...JSON.parse(def.description),\n };\n } catch {}\n }\n\n return jsonSchema;\n};\n\nexport type Options = {\n name: string | undefined;\n $refStrategy: 'root' | 'relative' | 'none' | 'seen';\n basePath: string[];\n effectStrategy: 'input' | 'any';\n pipeStrategy: 'input' | 'output' | 'all';\n dateStrategy: DateStrategy | DateStrategy[];\n mapStrategy: 'entries' | 'record';\n removeAdditionalStrategy: 'passthrough' | 'strict';\n allowedAdditionalProperties: true | undefined;\n rejectedAdditionalProperties: false | undefined;\n strictUnions: boolean;\n definitionPath: string;\n definitions: Record<string, ZodSchema>;\n errorMessages: boolean;\n patternStrategy: 'escape' | 'preserve';\n applyRegexFlags: boolean;\n emailStrategy: 'format:email' | 'format:idn-email' | 'pattern:zod';\n base64Strategy: 'format:binary' | 'contentEncoding:base64' | 'pattern:zod';\n nameStrategy: 'ref' | 'title';\n override?: OverrideCallback;\n postProcess?: PostProcessCallback;\n};\n\nexport const defaultOptions: Options = {\n name: undefined,\n $refStrategy: 'root',\n basePath: ['#'],\n effectStrategy: 'input',\n pipeStrategy: 'all',\n dateStrategy: 'format:date-time',\n mapStrategy: 'entries',\n removeAdditionalStrategy: 'passthrough',\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: 'definitions',\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n patternStrategy: 'escape',\n applyRegexFlags: false,\n emailStrategy: 'format:email',\n base64Strategy: 'contentEncoding:base64',\n nameStrategy: 'ref',\n};\n\nexport const getDefaultOptions = (\n options: Partial<Options> | string | undefined,\n) =>\n (typeof options === 'string'\n ? {\n ...defaultOptions,\n name: options,\n }\n : {\n ...defaultOptions,\n ...options,\n }) as Options;\n","import { ZodCatchDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { Refs } from '../refs';\n\nexport const parseCatchDef = (def: ZodCatchDef<any>, refs: Refs) => {\n return parseDef(def.innerType._def, refs);\n};\n","import { ZodOptionalDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { parseAnyDef } from './any';\n\nexport const parseOptionalDef = (\n def: ZodOptionalDef,\n refs: Refs,\n): JsonSchema7Type | undefined => {\n if (refs.currentPath.toString() === refs.propertyPath?.toString()) {\n return parseDef(def.innerType._def, refs);\n }\n\n const innerSchema = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'anyOf', '1'],\n });\n\n return innerSchema\n ? { anyOf: [{ not: parseAnyDef() }, innerSchema] }\n : parseAnyDef();\n};\n","import { ZodPipelineDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { JsonSchema7AllOfType } from './intersection';\n\nexport const parsePipelineDef = (\n def: ZodPipelineDef<any, any>,\n refs: Refs,\n): JsonSchema7AllOfType | JsonSchema7Type | undefined => {\n if (refs.pipeStrategy === 'input') {\n return parseDef(def.in._def, refs);\n } else if (refs.pipeStrategy === 'output') {\n return parseDef(def.out._def, refs);\n }\n\n const a = parseDef(def.in._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'allOf', '0'],\n });\n const b = parseDef(def.out._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'allOf', a ? '1' : '0'],\n });\n\n return {\n allOf: [a, b].filter((x): x is JsonSchema7Type => x !== undefined),\n };\n};\n","import { ZodReadonlyDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { Refs } from '../refs';\n\nexport const parseReadonlyDef = (def: ZodReadonlyDef<any>, refs: Refs) => {\n return parseDef(def.innerType._def, refs);\n};\n","import { ZodFirstPartyTypeKind } from 'zod/v3';\nimport { parseAnyDef } from './parsers/any';\nimport { parseArrayDef } from './parsers/array';\nimport { parseBigintDef } from './parsers/bigint';\nimport { parseBooleanDef } from './parsers/boolean';\nimport { parseBrandedDef } from './parsers/branded';\nimport { parseCatchDef } from './parsers/catch';\nimport { parseDateDef } from './parsers/date';\nimport { parseDefaultDef } from './parsers/default';\nimport { parseEffectsDef } from './parsers/effects';\nimport { parseEnumDef } from './parsers/enum';\nimport { parseIntersectionDef } from './parsers/intersection';\nimport { parseLiteralDef } from './parsers/literal';\nimport { parseMapDef } from './parsers/map';\nimport { parseNativeEnumDef } from './parsers/native-enum';\nimport { parseNeverDef } from './parsers/never';\nimport { parseNullDef } from './parsers/null';\nimport { parseNullableDef } from './parsers/nullable';\nimport { parseNumberDef } from './parsers/number';\nimport { parseObjectDef } from './parsers/object';\nimport { parseOptionalDef } from './parsers/optional';\nimport { parsePipelineDef } from './parsers/pipeline';\nimport { parsePromiseDef } from './parsers/promise';\nimport { parseRecordDef } from './parsers/record';\nimport { parseSetDef } from './parsers/set';\nimport { parseStringDef } from './parsers/string';\nimport { parseTupleDef } from './parsers/tuple';\nimport { parseUndefinedDef } from './parsers/undefined';\nimport { parseUnionDef } from './parsers/union';\nimport { parseUnknownDef } from './parsers/unknown';\nimport { Refs } from './refs';\nimport { parseReadonlyDef } from './parsers/readonly';\nimport { JsonSchema7Type } from './parse-types';\n\nexport type InnerDefGetter = () => any;\n\nexport const selectParser = (\n def: any,\n typeName: ZodFirstPartyTypeKind,\n refs: Refs,\n): JsonSchema7Type | undefined | InnerDefGetter => {\n switch (typeName) {\n case ZodFirstPartyTypeKind.ZodString:\n return parseStringDef(def, refs);\n case ZodFirstPartyTypeKind.ZodNumber:\n return parseNumberDef(def);\n case ZodFirstPartyTypeKind.ZodObject:\n return parseObjectDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBigInt:\n return parseBigintDef(def);\n case ZodFirstPartyTypeKind.ZodBoolean:\n return parseBooleanDef();\n case ZodFirstPartyTypeKind.ZodDate:\n return parseDateDef(def, refs);\n case ZodFirstPartyTypeKind.ZodUndefined:\n return parseUndefinedDef();\n case ZodFirstPartyTypeKind.ZodNull:\n return parseNullDef();\n case ZodFirstPartyTypeKind.ZodArray:\n return parseArrayDef(def, refs);\n case ZodFirstPartyTypeKind.ZodUnion:\n case ZodFirstPartyTypeKind.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case ZodFirstPartyTypeKind.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case ZodFirstPartyTypeKind.ZodTuple:\n return parseTupleDef(def, refs);\n case ZodFirstPartyTypeKind.ZodRecord:\n return parseRecordDef(def, refs);\n case ZodFirstPartyTypeKind.ZodLiteral:\n return parseLiteralDef(def);\n case ZodFirstPartyTypeKind.ZodEnum:\n return parseEnumDef(def);\n case ZodFirstPartyTypeKind.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case ZodFirstPartyTypeKind.ZodNullable:\n return parseNullableDef(def, refs);\n case ZodFirstPartyTypeKind.ZodOptional:\n return parseOptionalDef(def, refs);\n case ZodFirstPartyTypeKind.ZodMap:\n return parseMapDef(def, refs);\n case ZodFirstPartyTypeKind.ZodSet:\n return parseSetDef(def, refs);\n case ZodFirstPartyTypeKind.ZodLazy:\n return () => (def as any).getter()._def;\n case ZodFirstPartyTypeKind.ZodPromise:\n return parsePromiseDef(def, refs);\n case ZodFirstPartyTypeKind.ZodNaN:\n case ZodFirstPartyTypeKind.ZodNever:\n return parseNeverDef();\n case ZodFirstPartyTypeKind.ZodEffects:\n return parseEffectsDef(def, refs);\n case ZodFirstPartyTypeKind.ZodAny:\n return parseAnyDef();\n case ZodFirstPartyTypeKind.ZodUnknown:\n return parseUnknownDef();\n case ZodFirstPartyTypeKind.ZodDefault:\n return parseDefaultDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBranded:\n return parseBrandedDef(def, refs);\n case ZodFirstPartyTypeKind.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case ZodFirstPartyTypeKind.ZodCatch:\n return parseCatchDef(def, refs);\n case ZodFirstPartyTypeKind.ZodPipeline:\n return parsePipelineDef(def, refs);\n case ZodFirstPartyTypeKind.ZodFunction:\n case ZodFirstPartyTypeKind.ZodVoid:\n case ZodFirstPartyTypeKind.ZodSymbol:\n return undefined;\n default:\n /* c8 ignore next */\n return ((_: never) => undefined)(typeName);\n }\n};\n","export const getRelativePath = (pathA: string[], pathB: string[]) => {\n let i = 0;\n for (; i < pathA.length && i < pathB.length; i++) {\n if (pathA[i] !== pathB[i]) break;\n }\n return [(pathA.length - i).toString(), ...pathB.slice(i)].join('/');\n};\n","import { ZodTypeDef } from 'zod/v3';\nimport { getDefaultOptions, Options } from './options';\nimport { JsonSchema7Type } from './parse-types';\n\nexport type Refs = {\n seen: Map<ZodTypeDef, Seen>;\n currentPath: string[];\n propertyPath: string[] | undefined;\n} & Options;\n\nexport type Seen = {\n def: ZodTypeDef;\n path: string[];\n jsonSchema: JsonSchema7Type | undefined;\n};\n\nexport const getRefs = (options?: string | Partial<Options>): Refs => {\n const _options = getDefaultOptions(options);\n const currentPath =\n _options.name !== undefined\n ? [..._options.basePath, _options.definitionPath, _options.name]\n : _options.basePath;\n return {\n ..._options,\n currentPath: currentPath,\n propertyPath: undefined,\n seen: new Map(\n Object.entries(_options.definitions).map(([name, def]) => [\n def._def,\n {\n def: def._def,\n path: [..._options.basePath, _options.definitionPath, name],\n // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.\n jsonSchema: undefined,\n },\n ]),\n ),\n };\n};\n","import { ZodSchema } from 'zod/v3';\nimport { Options } from './options';\nimport { parseDef } from './parse-def';\nimport { JsonSchema7Type } from './parse-types';\nimport { getRefs } from './refs';\nimport { parseAnyDef } from './parsers/any';\n\nconst zod3ToJsonSchema = (\n schema: ZodSchema<any>,\n options?: Partial<Options> | string,\n): JsonSchema7Type & {\n $schema?: string;\n definitions?: {\n [key: string]: JsonSchema7Type;\n };\n} => {\n const refs = getRefs(options);\n\n let definitions =\n typeof options === 'object' && options.definitions\n ? Object.entries(options.definitions).reduce(\n (acc: { [key: string]: JsonSchema7Type }, [name, schema]) => ({\n ...acc,\n [name]:\n parseDef(\n schema._def,\n {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name],\n },\n true,\n ) ?? parseAnyDef(),\n }),\n {},\n )\n : undefined;\n\n const name =\n typeof options === 'string'\n ? options\n : options?.nameStrategy === 'title'\n ? undefined\n : options?.name;\n\n const main =\n parseDef(\n schema._def,\n name === undefined\n ? refs\n : {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name],\n },\n false,\n ) ?? (parseAnyDef() as JsonSchema7Type);\n\n const title =\n typeof options === 'object' &&\n options.name !== undefined &&\n options.nameStrategy === 'title'\n ? options.name\n : undefined;\n\n if (title !== undefined) {\n main.title = title;\n }\n\n const combined: ReturnType<typeof zod3ToJsonSchema> =\n name === undefined\n ? definitions\n ? {\n ...main,\n [refs.definitionPath]: definitions,\n }\n : main\n : {\n $ref: [\n ...(refs.$refStrategy === 'relative' ? [] : refs.basePath),\n refs.definitionPath,\n name,\n ].join('/'),\n [refs.definitionPath]: {\n ...definitions,\n [name]: main,\n },\n };\n\n combined.$schema = 'http://json-schema.org/draft-07/schema#';\n\n return combined;\n};\n\nexport { zod3ToJsonSchema };\n","import { APICallError } from '@ai-sdk/provider';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { FetchFunction } from './fetch-function';\nimport { handleFetchError } from './handle-fetch-error';\nimport { isAbortError } from './is-abort-error';\nimport { ResponseHandler } from './response-handler';\nimport { getRuntimeEnvironmentUserAgent } from './get-runtime-environment-user-agent';\nimport { withUserAgentSuffix } from './with-user-agent-suffix';\nimport { VERSION } from './version';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => globalThis.fetch;\n\nexport const postJsonToApi = async <T>({\n url,\n headers,\n body,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n body: unknown;\n failedResponseHandler: ResponseHandler<APICallError>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) =>\n postToApi({\n url,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: {\n content: JSON.stringify(body),\n values: body,\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n });\n\nexport const postFormDataToApi = async <T>({\n url,\n headers,\n formData,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n formData: FormData;\n failedResponseHandler: ResponseHandler<APICallError>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) =>\n postToApi({\n url,\n headers,\n body: {\n content: formData,\n values: Object.fromEntries((formData as any).entries()),\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n });\n\nexport const postToApi = async <T>({\n url,\n headers = {},\n body,\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch = getOriginalFetch(),\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n body: {\n content: string | FormData | Uint8Array;\n values: unknown;\n };\n failedResponseHandler: ResponseHandler<Error>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) => {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n ),\n body: body.content,\n signal: abortSignal,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.ok) {\n let errorInformation: {\n value: Error;\n responseHeaders?: Record<string, string> | undefined;\n };\n\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: body.values,\n });\n } catch (error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n\n throw new APICallError({\n message: 'Failed to process error response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values,\n });\n }\n\n throw errorInformation.value;\n }\n\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: body.values,\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n }\n\n throw new APICallError({\n message: 'Failed to process successful response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values,\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: body.values });\n }\n};\n","import { APICallError, EmptyResponseBodyError } from '@ai-sdk/provider';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { parseJSON, ParseResult, safeParseJSON } from './parse-json';\nimport { parseJsonEventStream } from './parse-json-event-stream';\nimport { FlexibleSchema } from './schema';\n\nexport type ResponseHandler<RETURN_TYPE> = (options: {\n url: string;\n requestBodyValues: unknown;\n response: Response;\n}) => PromiseLike<{\n value: RETURN_TYPE;\n rawValue?: unknown;\n responseHeaders?: Record<string, string>;\n}>;\n\nexport const createJsonErrorResponseHandler =\n <T>({\n errorSchema,\n errorToMessage,\n isRetryable,\n }: {\n errorSchema: FlexibleSchema<T>;\n errorToMessage: (error: T) => string;\n isRetryable?: (response: Response, error?: T) => boolean;\n }): ResponseHandler<APICallError> =>\n async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n\n // Some providers return an empty response body for some errors:\n if (responseBody.trim() === '') {\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable?.(response),\n }),\n };\n }\n\n // resilient parsing in case the response is not JSON or does not match the schema:\n try {\n const parsedError = await parseJSON({\n text: responseBody,\n schema: errorSchema,\n });\n\n return {\n responseHeaders,\n value: new APICallError({\n message: errorToMessage(parsedError),\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n data: parsedError,\n isRetryable: isRetryable?.(response, parsedError),\n }),\n };\n } catch (parseError) {\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable?.(response),\n }),\n };\n }\n };\n\nexport const createEventSourceResponseHandler =\n <T>(\n chunkSchema: FlexibleSchema<T>,\n ): ResponseHandler<ReadableStream<ParseResult<T>>> =>\n async ({ response }: { response: Response }) => {\n const responseHeaders = extractResponseHeaders(response);\n\n if (response.body == null) {\n throw new EmptyResponseBodyError({});\n }\n\n return {\n responseHeaders,\n value: parseJsonEventStream({\n stream: response.body,\n schema: chunkSchema,\n }),\n };\n };\n\nexport const createJsonResponseHandler =\n <T>(responseSchema: FlexibleSchema<T>): ResponseHandler<T> =>\n async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n\n const parsedResult = await safeParseJSON({\n text: responseBody,\n schema: responseSchema,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!parsedResult.success) {\n throw new APICallError({\n message: 'Invalid JSON response',\n cause: parsedResult.error,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n url,\n requestBodyValues,\n });\n }\n\n return {\n responseHeaders,\n value: parsedResult.value,\n rawValue: parsedResult.rawValue,\n };\n };\n\nexport const createBinaryResponseHandler =\n (): ResponseHandler<Uint8Array> =>\n async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.body) {\n throw new APICallError({\n message: 'Response body is empty',\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: undefined,\n });\n }\n\n try {\n const buffer = await response.arrayBuffer();\n return {\n responseHeaders,\n value: new Uint8Array(buffer),\n };\n } catch (error) {\n throw new APICallError({\n message: 'Failed to read response as array buffer',\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: undefined,\n cause: error,\n });\n }\n };\n\nexport const createStatusCodeErrorResponseHandler =\n (): ResponseHandler<APICallError> =>\n async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await response.text();\n\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues: requestBodyValues as Record<string, unknown>,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n }),\n };\n };\n","export * from './combine-headers';\nexport { convertAsyncIteratorToReadableStream } from './convert-async-iterator-to-readable-stream';\nexport {\n createToolNameMapping,\n type ToolNameMapping,\n} from './create-tool-name-mapping';\nexport * from './delay';\nexport { DelayedPromise } from './delayed-promise';\nexport * from './extract-response-headers';\nexport { convertImageModelFileToDataUri } from './convert-image-model-file-to-data-uri';\nexport { convertToFormData } from './convert-to-form-data';\nexport { downloadBlob } from './download-blob';\nexport { DownloadError } from './download-error';\nexport {\n readResponseWithSizeLimit,\n DEFAULT_MAX_DOWNLOAD_SIZE,\n} from './read-response-with-size-limit';\nexport * from './fetch-function';\nexport { createIdGenerator, generateId, type IdGenerator } from './generate-id';\nexport * from './get-error-message';\nexport * from './get-from-api';\nexport { getRuntimeEnvironmentUserAgent } from './get-runtime-environment-user-agent';\nexport { injectJsonInstructionIntoMessages } from './inject-json-instruction';\nexport * from './is-abort-error';\nexport { isNonNullable } from './is-non-nullable';\nexport { isUrlSupported } from './is-url-supported';\nexport * from './load-api-key';\nexport { loadOptionalSetting } from './load-optional-setting';\nexport { loadSetting } from './load-setting';\nexport { type MaybePromiseLike } from './maybe-promise-like';\nexport { mediaTypeToExtension } from './media-type-to-extension';\nexport { normalizeHeaders } from './normalize-headers';\nexport * from './parse-json';\nexport { parseJsonEventStream } from './parse-json-event-stream';\nexport { parseProviderOptions } from './parse-provider-options';\nexport * from './post-to-api';\nexport {\n createProviderToolFactory,\n createProviderToolFactoryWithOutputSchema,\n type ProviderToolFactory,\n type ProviderToolFactoryWithOutputSchema,\n} from './provider-tool-factory';\nexport * from './remove-undefined-entries';\nexport * from './resolve';\nexport * from './response-handler';\nexport {\n asSchema,\n jsonSchema,\n lazySchema,\n zodSchema,\n type FlexibleSchema,\n type InferSchema,\n type LazySchema,\n type Schema,\n type ValidationResult,\n} from './schema';\nexport * from './uint8-utils';\nexport * from './validate-types';\nexport { VERSION } from './version';\nexport { withUserAgentSuffix } from './with-user-agent-suffix';\nexport * from './without-trailing-slash';\n\n// folder re-exports\nexport * from './types';\n\n// external re-exports\nexport type * from '@standard-schema/spec';\nexport {\n EventSourceParserStream,\n type EventSourceMessage,\n} from 'eventsource-parser/stream';\n","import { z } from 'zod';\n\n/**\n * OAuth configuration for MCP authentication\n */\nexport interface MCPOAuthConfig {\n /**\n * OAuth authorization server metadata URL\n * (e.g., https://auth.example.com/.well-known/oauth-authorization-server)\n */\n serverUrl: string;\n\n /**\n * Scopes to request during authorization\n */\n scopes?: Array<string>;\n\n /**\n * Resource indicator (RFC 8707, required by MCP 2025-06-18 spec)\n */\n resource?: string;\n\n /**\n * Path to Playwright auth state file\n * (e.g., playwright/.auth/oauth-state.json)\n */\n authStatePath?: string;\n\n /**\n * Client ID (if pre-registered; otherwise uses Dynamic Client Registration)\n */\n clientId?: string;\n\n /**\n * Client secret (for confidential clients)\n */\n clientSecret?: string;\n\n /**\n * Redirect URI for OAuth callback\n */\n redirectUri?: string;\n}\n\n/**\n * OAuth 2.1 client credentials configuration for machine-to-machine (CI/CD) authentication.\n * Credentials can be provided here or via MCP_CLIENT_ID/MCP_CLIENT_SECRET environment variables.\n */\nexport interface MCPClientCredentialsConfig {\n /**\n * OAuth client ID (falls back to MCP_CLIENT_ID env var)\n */\n clientId?: string;\n\n /**\n * OAuth client secret (falls back to MCP_CLIENT_SECRET env var)\n */\n clientSecret?: string;\n\n /**\n * Token endpoint URL (required)\n */\n tokenEndpoint?: string;\n\n /**\n * Scopes to request\n */\n scopes?: string[];\n}\n\n/**\n * Authentication configuration for MCP connections\n */\nexport interface MCPAuthConfig {\n /**\n * Pre-acquired access token (simplest authentication mode)\n */\n accessToken?: string;\n\n /**\n * Full OAuth configuration for browser-based authentication\n */\n oauth?: MCPOAuthConfig;\n\n /**\n * OAuth 2.1 client credentials grant for machine-to-machine authentication\n */\n clientCredentials?: MCPClientCredentialsConfig;\n}\n\n/**\n * MCP host capabilities that can be registered with the server\n */\nexport interface MCPHostCapabilities {\n /**\n * Sampling capabilities (for LLM sampling)\n */\n sampling?: Record<string, unknown>;\n\n /**\n * Roots capabilities (for file system roots)\n */\n roots?: {\n /**\n * Whether the client can notify the server when roots change\n */\n listChanged: boolean;\n };\n}\n\n/**\n * Configuration for MCP client connection via stdio transport (local process)\n */\nexport interface StdioMCPConfig {\n /**\n * Transport type discriminant\n */\n transport: 'stdio';\n\n /**\n * Command to execute (required for stdio transport)\n */\n command: string;\n\n /**\n * Command arguments\n */\n args?: Array<string>;\n\n /**\n * Working directory for the command\n */\n cwd?: string;\n\n /**\n * Environment variables to pass to the subprocess.\n * Merged with the current process environment.\n */\n env?: Record<string, string>;\n\n /**\n * Suppress stderr output from the server process.\n * When true, server stderr is ignored instead of inherited.\n */\n quiet?: boolean;\n\n /**\n * Host capabilities to register with the server\n */\n capabilities?: MCPHostCapabilities;\n\n /**\n * Connection timeout in milliseconds\n */\n connectTimeoutMs?: number;\n\n /**\n * Request timeout in milliseconds\n */\n requestTimeoutMs?: number;\n\n /**\n * Timeout in milliseconds for MCP tool/list operations. Default: 30000\n */\n callTimeoutMs?: number;\n}\n\n/**\n * Configuration for MCP client connection via HTTP transport (remote server)\n */\nexport interface HttpMCPConfig {\n /**\n * Transport type discriminant\n */\n transport: 'http';\n\n /**\n * Server URL (required for http transport)\n */\n serverUrl: string;\n\n /**\n * HTTP headers (e.g., Authorization)\n */\n headers?: Record<string, string>;\n\n /**\n * Authentication configuration\n */\n auth?: MCPAuthConfig;\n\n /**\n * Host capabilities to register with the server\n */\n capabilities?: MCPHostCapabilities;\n\n /**\n * Connection timeout in milliseconds\n */\n connectTimeoutMs?: number;\n\n /**\n * Request timeout in milliseconds\n */\n requestTimeoutMs?: number;\n\n /**\n * Timeout in milliseconds for MCP tool/list operations. Default: 30000\n */\n callTimeoutMs?: number;\n\n /**\n * HTTP proxy configuration. Falls back to HTTPS_PROXY/HTTP_PROXY environment variables.\n */\n proxy?: {\n /**\n * Proxy URL. Credentials can be embedded directly if required:\n * `http://user:pass@proxy.example.com:8080`\n */\n url: string;\n };\n\n /**\n * Number of retry attempts for transient connection failures and 429 rate limit responses.\n * Uses exponential backoff with Retry-After header awareness. Defaults to 0 (no retries).\n */\n retryAttempts?: number;\n\n /**\n * TLS/mTLS configuration for custom certificates or disabling cert validation.\n * File paths should point to PEM-encoded certificate files.\n */\n tls?: {\n /**\n * Path to CA certificate PEM file (for custom/self-signed CAs)\n */\n ca?: string;\n\n /**\n * Path to client certificate PEM file (for mutual TLS)\n */\n cert?: string;\n\n /**\n * Path to client private key PEM file (for mutual TLS)\n */\n key?: string;\n\n /**\n * Whether to reject unauthorized certificates. Defaults to true.\n * Set to false to disable certificate validation (not recommended for production).\n */\n rejectUnauthorized?: boolean;\n };\n}\n\n/**\n * Configuration for MCP client connection.\n *\n * This is a discriminated union — narrow with `isStdioConfig()` or `isHttpConfig()`\n * before accessing transport-specific fields.\n *\n * Supports both stdio (local) and HTTP (remote) transports.\n */\nexport type MCPConfig = StdioMCPConfig | HttpMCPConfig;\n\n/**\n * Zod schema for MCPHostCapabilities\n */\nconst MCPHostCapabilitiesSchema = z.object({\n sampling: z.record(z.string(), z.unknown()).optional(),\n roots: z\n .object({\n listChanged: z.boolean(),\n })\n .optional(),\n});\n\n/**\n * Zod schema for MCPOAuthConfig\n */\nconst MCPOAuthConfigSchema = z.object({\n serverUrl: z.string().url('serverUrl must be a valid URL'),\n scopes: z.array(z.string()).optional(),\n resource: z.string().url().optional(),\n authStatePath: z.string().optional(),\n clientId: z.string().optional(),\n clientSecret: z.string().optional(),\n redirectUri: z.string().url().optional(),\n});\n\n/**\n * Zod schema for MCPClientCredentialsConfig\n */\nconst MCPClientCredentialsConfigSchema = z.object({\n clientId: z.string().optional(),\n clientSecret: z.string().optional(),\n tokenEndpoint: z.string().url('tokenEndpoint must be a valid URL').optional(),\n scopes: z.array(z.string()).optional(),\n});\n\n/**\n * Zod schema for MCPAuthConfig\n */\nconst MCPAuthConfigSchema = z\n .object({\n accessToken: z.string().optional(),\n oauth: MCPOAuthConfigSchema.optional(),\n clientCredentials: MCPClientCredentialsConfigSchema.optional(),\n })\n .refine(\n (data) => !(data.accessToken && data.oauth),\n 'Cannot specify both accessToken and oauth configuration'\n );\n\n/**\n * Zod schema for stdio transport config\n */\nconst StdioConfigSchema = z.object({\n transport: z.literal('stdio'),\n command: z.string().min(1, 'command is required for stdio transport'),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n capabilities: MCPHostCapabilitiesSchema.optional(),\n connectTimeoutMs: z.number().positive().optional(),\n requestTimeoutMs: z.number().positive().optional(),\n callTimeoutMs: z.number().positive().optional(),\n quiet: z.boolean().optional(),\n});\n\n/**\n * Returns true if the hostname refers to the loopback interface\n */\nfunction isLocalhost(hostname: string): boolean {\n return (\n hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1'\n );\n}\n\n/**\n * Zod schema for HTTP transport config\n */\nconst HttpConfigSchema = z.object({\n transport: z.literal('http'),\n serverUrl: z\n .string()\n .url('serverUrl must be a valid URL')\n .refine((url) => {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return true;\n }\n if (parsed.protocol === 'http:' && !isLocalhost(parsed.hostname)) {\n console.warn(\n `[mcp-server-tester] serverUrl uses http:// for non-localhost address \"${parsed.hostname}\". ` +\n `This transmits tokens unencrypted. Use https:// for remote servers.`\n );\n }\n return true;\n }),\n headers: z.record(z.string(), z.string()).optional(),\n capabilities: MCPHostCapabilitiesSchema.optional(),\n connectTimeoutMs: z.number().positive().optional(),\n requestTimeoutMs: z.number().positive().optional(),\n callTimeoutMs: z.number().positive().optional(),\n auth: MCPAuthConfigSchema.optional(),\n proxy: z\n .object({\n url: z.string().url('proxy.url must be a valid URL'),\n })\n .optional(),\n retryAttempts: z.number().int().min(0).optional(),\n tls: z\n .object({\n ca: z.string().optional(),\n cert: z.string().optional(),\n key: z.string().optional(),\n rejectUnauthorized: z.boolean().optional(),\n })\n .optional(),\n});\n\n/**\n * Union schema for MCPConfig (validates based on transport type)\n */\nexport const MCPConfigSchema = z.discriminatedUnion('transport', [\n StdioConfigSchema,\n HttpConfigSchema,\n]);\n\n/**\n * Validates an MCPConfig object\n *\n * @param config - The config to validate\n * @returns The validated config\n * @throws {z.ZodError} If validation fails\n */\nexport function validateMCPConfig(config: unknown): MCPConfig {\n return MCPConfigSchema.parse(config);\n}\n\n/**\n * Type guard to check if a config is for stdio transport\n */\nexport function isStdioConfig(config: MCPConfig): config is StdioMCPConfig {\n return config.transport === 'stdio';\n}\n\n/**\n * Type guard to check if a config is for HTTP transport\n */\nexport function isHttpConfig(config: MCPConfig): config is HttpMCPConfig {\n return config.transport === 'http';\n}\n","/**\n * @gleanwork/mcp-server-tester\n *\n * Playwright-based testing framework for MCP servers\n *\n * @packageDocumentation\n */\n\n// Config\nexport type {\n MCPConfig,\n StdioMCPConfig,\n HttpMCPConfig,\n MCPHostCapabilities,\n MCPAuthConfig,\n MCPOAuthConfig,\n MCPClientCredentialsConfig,\n} from './config/mcpConfig.js';\nexport {\n MCPConfigSchema,\n validateMCPConfig,\n isStdioConfig,\n isHttpConfig,\n} from './config/mcpConfig.js';\n\n// Auth\nexport type {\n StoredTokens,\n StoredClientInfo,\n StoredOAuthState,\n OAuthSetupConfig,\n TokenResult,\n} from './auth/types.js';\nexport {\n PlaywrightOAuthClientProvider,\n type PlaywrightOAuthClientProviderConfig,\n} from './auth/oauthClientProvider.js';\nexport {\n createTokenAuthHeaders,\n validateAccessToken,\n isTokenExpired,\n isTokenExpiringSoon,\n} from './auth/tokenAuth.js';\nexport {\n performOAuthSetup,\n performOAuthSetupIfNeeded,\n} from './auth/setupOAuth.js';\nexport {\n performClientCredentialsFlow,\n type ClientCredentialsConfig,\n} from './auth/oauthFlow.js';\n\n// Discovery (RFC 9728)\nexport {\n discoverProtectedResource,\n discoverAuthorizationServer,\n DiscoveryError,\n MCP_PROTOCOL_VERSION,\n type ProtectedResourceMetadata,\n type ProtectedResourceDiscoveryResult,\n} from './auth/discovery.js';\n\n// Token Storage\nexport {\n loadTokens,\n hasValidTokens,\n injectTokens,\n loadTokensFromEnv,\n ENV_VAR_NAMES,\n type StoredServerMetadata,\n} from './auth/storage.js';\n\n// CLI OAuth\nexport {\n CLIOAuthClient,\n type CLIOAuthClientConfig,\n type CLIOAuthResult,\n} from './auth/cli.js';\n\n// MCP Client\nexport {\n createMCPClientForConfig,\n closeMCPClient,\n type CreateMCPClientOptions,\n} from './mcp/clientFactory.js';\n\n// Response Normalization\nexport type { ContentBlock, NormalizedToolResponse } from './mcp/response.js';\nexport { normalizeToolResponse, extractText } from './mcp/response.js';\n\n// Assertions - Matchers (primary API)\n// The extended expect with MCP tool matchers is exported via fixtures\n// Use: import { expect } from '@gleanwork/mcp-server-tester'\n\n// Assertions - Validators (for programmatic use)\nexport {\n validateResponse,\n validateSchema,\n validateText,\n validatePattern,\n validateError,\n validateSize,\n validateToolCalls,\n validateToolCallCount,\n validateJudge,\n getResponseSizeBytes,\n normalizeWhitespace,\n} from './assertions/validators/index.js';\n\nexport { SnapshotSanitizers } from './assertions/validators/types.js';\nexport type {\n ValidationResult,\n TextValidatorOptions,\n SizeValidatorOptions,\n SchemaValidatorOptions,\n PatternValidatorOptions,\n SnapshotSanitizer,\n BuiltInSanitizer,\n RegexSanitizer,\n FieldRemovalSanitizer,\n SchemaRegistry,\n} from './assertions/validators/types.js';\n\nexport type {\n ToolCallExpectation,\n ToolCallCountOptions,\n} from './assertions/validators/toolCalls.js';\n\nexport type { JudgeValidatorConfig } from './assertions/validators/judge.js';\n\nexport type {\n JudgeMatcherOptions,\n ToolPredicate,\n PredicateResult,\n} from './assertions/matchers/types.js';\n\n// Fixtures\nexport type {\n MCPFixtureApi,\n MCPFixtureOptions,\n AuthType,\n} from './mcp/fixtures/mcpFixture.js';\nexport { createMCPFixture } from './mcp/fixtures/mcpFixture.js';\nexport { test, expect } from './fixtures/mcp.js';\n\n// Auth fixtures — re-exported from main path for convenience.\n// The auth `test` is aliased to avoid a name collision with the MCP `test` above.\n// Use `mcpAuthTest` when you need to extend auth fixtures (e.g., base.extend<MCPAuthFixtures>).\nexport type { MCPAuthFixtures } from './fixtures/mcpAuth.js';\nexport { test as mcpAuthTest } from './fixtures/mcpAuth.js';\n\n// Canonical Types (single source of truth)\nexport type {\n ResultSource,\n ExpectationType,\n ExpectationBreakdown,\n ExpectationResultMap,\n} from './types/index.js';\n\n// Eval Dataset\nexport type {\n EvalCase,\n EvalDataset,\n EvalExpectBlock,\n JudgeExpectConfig,\n SerializedEvalDataset,\n EvalMode,\n} from './evals/datasetTypes.js';\nexport {\n EvalCaseSchema,\n EvalDatasetSchema,\n validateEvalCase,\n validateEvalDataset,\n} from './evals/datasetTypes.js';\n\n// Eval Loader\nexport type { LoadDatasetOptions } from './evals/datasetLoader.js';\nexport {\n loadEvalDataset,\n loadEvalDatasetFromObject,\n} from './evals/datasetLoader.js';\n\n// Eval Runner\nexport type {\n EvalContext,\n EvalExpectationResult,\n EvalCaseResult,\n IterationResult,\n EvalRunnerResult,\n EvalRunnerOptions,\n} from './evals/evalRunner.js';\nexport { runEvalDataset, runEvalCase } from './evals/evalRunner.js';\n\n// Baseline eval comparison\nexport {\n saveBaseline,\n loadBaseline,\n type SaveBaselineOptions,\n} from './evals/baseline.js';\n\n// Multi-server A/B comparison\nexport type {\n ComparisonOutcome,\n CaseComparisonResult,\n ServerComparisonResult,\n ServerComparisonOptions,\n} from './evals/serverComparison.js';\nexport { runServerComparison } from './evals/serverComparison.js';\n\n// MCP Host Simulation\nexport type {\n HostType,\n CLIOutputFormat,\n CLIConfig,\n LLMProvider,\n MCPHostConfig,\n LLMToolCall,\n MCPHostSimulationResult,\n MCPHostSimulator,\n} from './evals/mcpHost/index.js';\nexport {\n simulateMCPHost,\n isProviderAvailable,\n getMissingDependencyMessage,\n} from './evals/mcpHost/index.js';\n\n// Judge\nexport type {\n JudgeConfig,\n Judge,\n JudgeResult,\n UsageMetrics,\n ProviderKind,\n BuiltInRubric,\n RubricSpec,\n} from './judge/judgeTypes.js';\nexport { createJudge } from './judge/judgeClient.js';\nexport {\n BUILT_IN_RUBRICS,\n resolveRubric,\n isBuiltInRubric,\n} from './judge/judgeTypes.js';\n\n// Custom Judge Registry\nexport type {\n CustomJudgeExecutor,\n CustomJudgeResult,\n} from './judge/judgeRegistry.js';\nexport {\n registerJudge,\n getRegisteredJudge,\n clearJudgeRegistry,\n} from './judge/judgeRegistry.js';\n\n// Conformance\nexport type {\n MCPConformanceOptions,\n MCPConformanceResult,\n MCPConformanceCheck,\n MCPConformanceRaw,\n} from './spec/conformanceChecks.js';\nexport { runConformanceChecks } from './spec/conformanceChecks.js';\n\n// Reporter types — primarily used by the mcpReporter plugin.\n// These types are available for custom reporter implementations or\n// when consuming reporter output programmatically.\n// Import the reporter itself from '@gleanwork/mcp-server-tester/reporters/mcpReporter'\nexport type {\n MCPEvalReporterConfig,\n MCPEvalRunData,\n MCPEvalHistoricalSummary,\n MCPConformanceResultData,\n MCPServerCapabilitiesData,\n MCPEvalData,\n} from './reporters/types.js';\n","/**\n * Static token authentication utilities\n *\n * Simple utilities for pre-acquired token authentication\n */\n\n/**\n * Creates HTTP headers for static token authentication\n *\n * @param accessToken - The pre-acquired access token\n * @param tokenType - The token type (default: \"Bearer\")\n * @returns HTTP headers with Authorization header\n *\n * @example\n * ```typescript\n * const headers = createTokenAuthHeaders(process.env.MCP_ACCESS_TOKEN);\n * // { Authorization: 'Bearer eyJ...' }\n * ```\n */\nexport function createTokenAuthHeaders(\n accessToken: string,\n tokenType: string = 'Bearer'\n): Record<string, string> {\n return {\n Authorization: `${tokenType} ${accessToken}`,\n };\n}\n\n/**\n * Validates that an access token is present and non-empty\n *\n * @param accessToken - The access token to validate\n * @throws Error if token is missing or empty\n */\nexport function validateAccessToken(accessToken: string | undefined): void {\n if (!accessToken) {\n throw new Error('Access token is required but was not provided');\n }\n\n if (accessToken.trim().length === 0) {\n throw new Error('Access token cannot be empty');\n }\n}\n\n/**\n * Checks if a token appears to be expired based on common JWT structure\n *\n * Note: This is a best-effort check and may not work for all token formats.\n * For reliable expiration checking, use the token's associated expiration time.\n *\n * @param accessToken - The access token to check\n * @returns true if the token appears to be expired, false otherwise\n */\nexport function isTokenExpired(accessToken: string): boolean {\n try {\n // Try to decode as JWT\n const parts = accessToken.split('.');\n if (parts.length !== 3) {\n // Not a JWT, can't determine expiration\n return false;\n }\n\n const payloadPart = parts[1];\n if (!payloadPart) {\n return false;\n }\n\n const payload = JSON.parse(\n Buffer.from(payloadPart, 'base64url').toString('utf-8')\n ) as Record<string, unknown>;\n\n if (typeof payload.exp === 'number') {\n // exp is in seconds, Date.now() is in milliseconds\n return payload.exp * 1000 < Date.now();\n }\n\n return false;\n } catch {\n // If we can't parse the token, assume it's not expired\n return false;\n }\n}\n\n/**\n * Checks if a token will expire within the specified buffer time\n *\n * @param expiresAt - Token expiration timestamp in milliseconds\n * @param bufferMs - Buffer time in milliseconds (default: 60000 = 1 minute)\n * @returns true if the token will expire within the buffer time\n */\nexport function isTokenExpiringSoon(\n expiresAt: number | undefined,\n bufferMs: number = 60000\n): boolean {\n if (expiresAt === undefined) {\n return false;\n }\n\n return expiresAt - bufferMs < Date.now();\n}\n","/**\n * OAuth setup utility for Playwright globalSetup\n *\n * Performs the browser-based OAuth flow and saves the auth state\n * for reuse across tests following Playwright's auth state pattern.\n */\n\nimport { chromium, type Page } from '@playwright/test';\nimport {\n discoverAuthorizationServerMetadata,\n startAuthorization,\n exchangeAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport type {\n OAuthSetupConfig,\n OAuthLoginSelectors,\n StoredOAuthState,\n} from './types.js';\nimport { saveOAuthState } from './oauthClientProvider.js';\nimport { debugOAuth } from '../debug.js';\n\n/**\n * Default timeout for OAuth login flow (30 seconds)\n */\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n/**\n * Default redirect URI for OAuth callback\n */\nconst DEFAULT_REDIRECT_URI = 'http://localhost:3000/oauth/callback';\n\n/**\n * Performs the OAuth authorization flow using Playwright browser automation\n *\n * This function is designed to be used in Playwright's globalSetup to\n * authenticate once before running tests. The resulting auth state is\n * saved to disk and reused across tests.\n *\n * @param config - OAuth setup configuration\n *\n * @example\n * ```typescript\n * // global-setup.ts\n * import { performOAuthSetup } from '@gleanwork/mcp-server-tester';\n *\n * export default async function globalSetup() {\n * await performOAuthSetup({\n * authServerUrl: 'https://auth.example.com',\n * scopes: ['mcp:read', 'mcp:write'],\n * loginSelectors: {\n * usernameInput: '#username',\n * passwordInput: '#password',\n * submitButton: 'button[type=\"submit\"]',\n * },\n * credentials: {\n * username: process.env.TEST_USER!,\n * password: process.env.TEST_PASSWORD!,\n * },\n * outputPath: 'playwright/.auth/oauth-state.json',\n * });\n * }\n * ```\n */\nexport async function performOAuthSetup(\n config: OAuthSetupConfig\n): Promise<void> {\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const redirectUri = config.redirectUri ?? DEFAULT_REDIRECT_URI;\n\n // 1. Discover OAuth authorization server metadata\n const metadata = await discoverAuthorizationServerMetadata(\n config.authServerUrl\n );\n\n if (!metadata) {\n throw new Error(\n `Could not discover OAuth metadata at ${config.authServerUrl}`\n );\n }\n\n // 2. Build client information\n const clientInformation = {\n client_id: config.clientId ?? 'mcp-server-tester-client',\n client_secret: config.clientSecret,\n };\n\n // 3. Start authorization flow (generates PKCE, builds auth URL)\n const { authorizationUrl, codeVerifier } = await startAuthorization(\n config.authServerUrl,\n {\n metadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope: config.scopes.join(' '),\n resource: config.resource ? new URL(config.resource) : undefined,\n }\n );\n\n // 4. Launch browser and complete login flow\n const browser = await chromium.launch({\n headless: process.env.OAUTH_DEBUG !== 'true',\n });\n\n try {\n const context = await browser.newContext();\n const page = await context.newPage();\n\n // Set timeout for the entire flow\n page.setDefaultTimeout(timeoutMs);\n\n // Navigate to authorization URL\n await page.goto(authorizationUrl.toString());\n\n // Complete login — custom flow or standard form\n if ('customLoginFlow' in config && config.customLoginFlow) {\n await config.customLoginFlow(page);\n } else {\n await completeLoginForm(page, config);\n }\n\n // Wait for redirect with authorization code\n await page.waitForURL(\n (url) => url.href.startsWith(redirectUri) && url.searchParams.has('code'),\n { timeout: timeoutMs }\n );\n\n // Extract authorization code from callback URL\n const callbackUrl = new URL(page.url());\n const code = callbackUrl.searchParams.get('code');\n const error = callbackUrl.searchParams.get('error');\n\n if (error) {\n const errorDescription =\n callbackUrl.searchParams.get('error_description');\n throw new Error(\n `OAuth authorization failed: ${error}${errorDescription ? ` - ${errorDescription}` : ''}`\n );\n }\n\n if (!code) {\n throw new Error('No authorization code in callback URL');\n }\n\n // 5. Exchange authorization code for tokens\n const tokens = await exchangeAuthorization(config.authServerUrl, {\n metadata,\n clientInformation,\n authorizationCode: code,\n codeVerifier,\n redirectUri,\n resource: config.resource ? new URL(config.resource) : undefined,\n });\n\n // 6. Save auth state to disk\n // codeVerifier is intentionally excluded: it is single-use per PKCE spec\n // and must not be persisted after a successful token exchange.\n const state: StoredOAuthState = {\n tokens: {\n accessToken: tokens.access_token,\n tokenType: tokens.token_type,\n refreshToken: tokens.refresh_token,\n expiresAt: tokens.expires_in\n ? Date.now() + tokens.expires_in * 1000\n : undefined,\n },\n clientInfo: config.clientId\n ? {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n }\n : undefined,\n savedAt: Date.now(),\n };\n\n await saveOAuthState(config.outputPath, state);\n\n debugOAuth('Auth state saved to %s', config.outputPath);\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Completes the login form using the provided selectors\n */\nasync function completeLoginForm(\n page: Page,\n config: {\n loginSelectors: OAuthLoginSelectors;\n credentials: { username: string; password: string };\n }\n): Promise<void> {\n const { loginSelectors, credentials } = config;\n\n // Wait for and fill username\n await page.waitForSelector(loginSelectors.usernameInput, {\n state: 'visible',\n });\n await page.fill(loginSelectors.usernameInput, credentials.username);\n\n // Wait for and fill password\n await page.waitForSelector(loginSelectors.passwordInput, {\n state: 'visible',\n });\n await page.fill(loginSelectors.passwordInput, credentials.password);\n\n // Click submit button\n await page.waitForSelector(loginSelectors.submitButton, {\n state: 'visible',\n });\n await page.click(loginSelectors.submitButton);\n\n // Handle consent button if present\n if (loginSelectors.consentButton) {\n try {\n await page.waitForSelector(loginSelectors.consentButton, {\n state: 'visible',\n timeout: 5000,\n });\n await page.click(loginSelectors.consentButton);\n } catch {\n // Consent button may not appear if already consented\n }\n }\n}\n\n/**\n * Checks if OAuth state exists and contains valid tokens (Playwright auth pattern)\n *\n * This function checks Playwright's single-file auth state format,\n * typically created by `performOAuthSetup` in globalSetup.\n *\n * **Note:** This does NOT work with tokens stored by the CLI (`mcp-server-tester login`).\n * For CLI-stored tokens, use `hasValidTokens(serverUrl)` instead.\n *\n * @param storagePath - Path to the auth state file (e.g., 'playwright/.auth/oauth-state.json')\n * @returns true if valid auth state exists\n *\n * @example\n * ```typescript\n * // Check Playwright auth state\n * if (await hasValidOAuthState('playwright/.auth/oauth-state.json')) {\n * console.log('Auth state is valid, skipping OAuth setup');\n * }\n * ```\n */\nexport async function hasValidOAuthState(\n storagePath: string\n): Promise<boolean> {\n try {\n const { loadOAuthState } = await import('./oauthClientProvider.js');\n const state = await loadOAuthState(storagePath);\n\n if (!state?.tokens?.accessToken) {\n return false;\n }\n\n // Check if token is expired (with 1 minute buffer)\n if (state.tokens.expiresAt) {\n const bufferMs = 60000;\n if (state.tokens.expiresAt - bufferMs < Date.now()) {\n return false;\n }\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Performs OAuth setup only if valid state doesn't already exist\n *\n * Use this in globalSetup to avoid re-authenticating on every test run.\n *\n * @param config - OAuth setup configuration\n *\n * @example\n * ```typescript\n * // global-setup.ts\n * export default async function globalSetup() {\n * await performOAuthSetupIfNeeded({\n * authServerUrl: 'https://auth.example.com',\n * scopes: ['mcp:read'],\n * loginSelectors: { ... },\n * credentials: { ... },\n * outputPath: 'playwright/.auth/oauth-state.json',\n * });\n * }\n * ```\n */\nexport async function performOAuthSetupIfNeeded(\n config: OAuthSetupConfig\n): Promise<void> {\n const hasValid = await hasValidOAuthState(config.outputPath);\n\n if (hasValid) {\n debugOAuth('Using existing auth state from %s', config.outputPath);\n return;\n }\n\n debugOAuth('No valid auth state found, performing OAuth flow...');\n await performOAuthSetup(config);\n}\n","/**\n * Debug logging utilities\n *\n * Uses the `debug` package for conditional logging.\n * Enable via DEBUG environment variable:\n *\n * @example\n * ```bash\n * # Enable all mcp-server-tester logs\n * DEBUG=mcp-server-tester:* npm test\n *\n * # Enable only client logs\n * DEBUG=mcp-server-tester:client npm test\n *\n * # Enable only OAuth logs\n * DEBUG=mcp-server-tester:oauth npm test\n *\n * # Enable HTTP-level trace logging (URL, headers, transport selection)\n * DEBUG=mcp-server-tester:http npx playwright test\n * ```\n */\n\nimport createDebug from 'debug';\n\nconst NAMESPACE = 'mcp-server-tester';\n\n/**\n * Debug logger for MCP client operations\n */\nexport const debugClient = createDebug(`${NAMESPACE}:client`);\n\n/**\n * Debug logger for OAuth operations\n */\nexport const debugOAuth = createDebug(`${NAMESPACE}:oauth`);\n\n/**\n * Debug logger for eval operations\n */\nexport const debugEval = createDebug(`${NAMESPACE}:eval`);\n\n/**\n * Debug logger for HTTP-level trace logging.\n *\n * Enable with:\n * ```bash\n * DEBUG=mcp-server-tester:http npx playwright test\n * ```\n *\n * Logs: server URL, transport type selected (Streamable HTTP vs SSE),\n * outgoing request header names, and connection outcomes.\n */\nexport const debugHttp = createDebug(`${NAMESPACE}:http`);\n","/**\n * OAuth flow utilities using oauth4webapi\n *\n * Implements OAuth 2.1 with PKCE as required by MCP specification\n */\n\nimport * as oauth from 'oauth4webapi';\nimport createDebug from 'debug';\nimport type { TokenResult } from './types.js';\n\nconst debug = createDebug('mcp-server-tester:oauth-flow');\n\n/**\n * Discovered OAuth authorization server metadata\n */\nexport interface AuthServerMetadata {\n /**\n * The oauth4webapi AuthorizationServer object\n */\n server: oauth.AuthorizationServer;\n\n /**\n * Issuer URL\n */\n issuer: string;\n}\n\n/**\n * PKCE code verifier and challenge pair\n */\nexport interface PKCEPair {\n /**\n * Random code verifier string\n */\n codeVerifier: string;\n\n /**\n * S256 hashed code challenge\n */\n codeChallenge: string;\n}\n\n/**\n * Configuration for building authorization URL\n */\nexport interface AuthorizationUrlConfig {\n /**\n * Authorization server metadata\n */\n authServer: AuthServerMetadata;\n\n /**\n * Client ID\n */\n clientId: string;\n\n /**\n * Redirect URI for callback\n */\n redirectUri: string;\n\n /**\n * Requested scopes\n */\n scopes: Array<string>;\n\n /**\n * PKCE code challenge\n */\n codeChallenge: string;\n\n /**\n * OAuth state parameter for CSRF protection\n */\n state: string;\n\n /**\n * Resource indicator (RFC 8707)\n */\n resource?: string;\n}\n\n/**\n * Configuration for token exchange\n */\nexport interface TokenExchangeConfig {\n /**\n * Authorization server metadata\n */\n authServer: AuthServerMetadata;\n\n /**\n * Client ID\n */\n clientId: string;\n\n /**\n * Client secret (for confidential clients)\n */\n clientSecret?: string;\n\n /**\n * Authorization code from callback\n */\n code: string;\n\n /**\n * OAuth state parameter for CSRF validation\n */\n state: string;\n\n /**\n * PKCE code verifier\n */\n codeVerifier: string;\n\n /**\n * Redirect URI used in authorization request\n */\n redirectUri: string;\n}\n\n/**\n * Configuration for token refresh\n */\nexport interface TokenRefreshConfig {\n /**\n * Authorization server metadata\n */\n authServer: AuthServerMetadata;\n\n /**\n * Client ID\n */\n clientId: string;\n\n /**\n * Client secret (for confidential clients)\n */\n clientSecret?: string;\n\n /**\n * Refresh token\n */\n refreshToken: string;\n}\n\n/**\n * Discovers OAuth authorization server metadata from a well-known URL\n *\n * @param issuerUrl - The authorization server URL (will append /.well-known/oauth-authorization-server)\n * @returns Authorization server metadata\n */\nexport async function discoverAuthServer(\n issuerUrl: string\n): Promise<AuthServerMetadata> {\n const issuer = new URL(issuerUrl);\n const response = await oauth.discoveryRequest(issuer, {\n algorithm: 'oauth2',\n });\n\n const metadata = await oauth.processDiscoveryResponse(issuer, response);\n\n return {\n server: metadata,\n issuer: issuerUrl,\n };\n}\n\n/**\n * Generates a PKCE code verifier and challenge pair\n *\n * Uses S256 challenge method as required by OAuth 2.1 and MCP specification\n *\n * @returns PKCE code verifier and challenge\n */\nexport async function generatePKCE(): Promise<PKCEPair> {\n const codeVerifier = oauth.generateRandomCodeVerifier();\n const codeChallenge = await oauth.calculatePKCECodeChallenge(codeVerifier);\n\n return {\n codeVerifier,\n codeChallenge,\n };\n}\n\n/**\n * Generates a random state parameter for CSRF protection\n *\n * @returns Random state string\n */\nexport function generateState(): string {\n return oauth.generateRandomState();\n}\n\n/**\n * Builds the OAuth authorization URL for browser redirect\n *\n * @param config - Authorization URL configuration\n * @returns Authorization URL to redirect the user to\n */\nexport function buildAuthorizationUrl(config: AuthorizationUrlConfig): URL {\n const authorizationEndpoint = config.authServer.server.authorization_endpoint;\n if (!authorizationEndpoint) {\n throw new Error(\n 'Authorization server does not have an authorization_endpoint'\n );\n }\n\n const authorizationUrl = new URL(authorizationEndpoint);\n\n authorizationUrl.searchParams.set('client_id', config.clientId);\n authorizationUrl.searchParams.set('redirect_uri', config.redirectUri);\n authorizationUrl.searchParams.set('response_type', 'code');\n authorizationUrl.searchParams.set('scope', config.scopes.join(' '));\n authorizationUrl.searchParams.set('code_challenge', config.codeChallenge);\n authorizationUrl.searchParams.set('code_challenge_method', 'S256');\n authorizationUrl.searchParams.set('state', config.state);\n\n if (config.resource) {\n authorizationUrl.searchParams.set('resource', config.resource);\n }\n\n return authorizationUrl;\n}\n\n/**\n * Exchanges an authorization code for tokens\n *\n * @param config - Token exchange configuration\n * @returns Token result\n */\nexport async function exchangeCodeForTokens(\n config: TokenExchangeConfig\n): Promise<TokenResult> {\n const client: oauth.Client = {\n client_id: config.clientId,\n token_endpoint_auth_method: config.clientSecret\n ? 'client_secret_basic'\n : 'none',\n };\n\n const clientAuth = config.clientSecret\n ? oauth.ClientSecretBasic(config.clientSecret)\n : oauth.None();\n\n // Build callback URL with code and state for validation\n const callbackUrl = new URL(config.redirectUri);\n callbackUrl.searchParams.set('code', config.code);\n callbackUrl.searchParams.set('state', config.state);\n\n // Validate the auth response - oauth4webapi requires this before token exchange\n // This throws on error, returns URLSearchParams on success\n const validatedParams = oauth.validateAuthResponse(\n config.authServer.server,\n client,\n callbackUrl,\n config.state\n );\n\n const response = await oauth.authorizationCodeGrantRequest(\n config.authServer.server,\n client,\n clientAuth,\n validatedParams,\n config.redirectUri,\n config.codeVerifier\n );\n\n const result = await oauth.processAuthorizationCodeResponse(\n config.authServer.server,\n client,\n response\n );\n\n return {\n accessToken: result.access_token,\n tokenType: result.token_type,\n expiresIn: result.expires_in,\n refreshToken: result.refresh_token,\n scope: result.scope,\n };\n}\n\n/**\n * Refreshes an access token using a refresh token\n *\n * @param config - Token refresh configuration\n * @returns New token result\n */\nexport async function refreshAccessToken(\n config: TokenRefreshConfig\n): Promise<TokenResult> {\n const client: oauth.Client = {\n client_id: config.clientId,\n token_endpoint_auth_method: config.clientSecret\n ? 'client_secret_basic'\n : 'none',\n };\n\n const clientAuth = config.clientSecret\n ? oauth.ClientSecretBasic(config.clientSecret)\n : oauth.None();\n\n const response = await oauth.refreshTokenGrantRequest(\n config.authServer.server,\n client,\n clientAuth,\n config.refreshToken\n );\n\n // Handle non-OK responses that may not be JSON (oauth4webapi requires application/json)\n if (!response.ok) {\n const contentType = response.headers.get('content-type') ?? '';\n let errorMessage = `Token refresh failed: ${response.status} ${response.statusText}`;\n\n try {\n if (contentType.includes('application/json')) {\n // Try to extract OAuth error from JSON response\n const errorBody = (await response.clone().json()) as {\n error?: string;\n error_description?: string;\n };\n if (errorBody.error) {\n errorMessage = `Token refresh failed: ${errorBody.error}`;\n if (errorBody.error_description) {\n errorMessage += ` - ${errorBody.error_description}`;\n }\n }\n } else {\n // Non-JSON response (e.g., text/plain) - read the body as text\n const textBody = await response.clone().text();\n if (textBody) {\n errorMessage = `Token refresh failed: ${response.status} - ${textBody}`;\n }\n }\n } catch {\n // If we can't parse the error body, use the status message\n }\n\n throw new Error(errorMessage);\n }\n\n const result = await oauth.processRefreshTokenResponse(\n config.authServer.server,\n client,\n response\n );\n\n return {\n accessToken: result.access_token,\n tokenType: result.token_type,\n expiresIn: result.expires_in,\n refreshToken: result.refresh_token,\n scope: result.scope,\n };\n}\n\n/**\n * Configuration for client credentials grant\n */\nexport interface ClientCredentialsConfig {\n /**\n * Token endpoint URL\n */\n tokenEndpoint: string;\n\n /**\n * OAuth client ID\n */\n clientId: string;\n\n /**\n * OAuth client secret\n */\n clientSecret: string;\n\n /**\n * Scopes to request (optional)\n */\n scopes?: string[];\n}\n\n/**\n * Performs the OAuth 2.1 client credentials grant to obtain an access token.\n * Suitable for CI/CD machine-to-machine authentication.\n *\n * Uses oauth4webapi for spec-compliant request construction and response validation,\n * consistent with how the rest of this module handles OAuth flows.\n *\n * @param config - Client credentials configuration\n * @returns Token result\n */\nexport async function performClientCredentialsFlow(\n config: ClientCredentialsConfig\n): Promise<TokenResult> {\n // Construct minimal AuthorizationServer from the token endpoint URL.\n // oauth4webapi requires an issuer; we use the origin of the token endpoint.\n const tokenEndpointUrl = new URL(config.tokenEndpoint);\n const authServer: oauth.AuthorizationServer = {\n issuer: tokenEndpointUrl.origin,\n token_endpoint: config.tokenEndpoint,\n };\n\n const client: oauth.Client = {\n client_id: config.clientId,\n };\n\n // ClientSecretBasic transmits credentials via Authorization: Basic header (RFC 6749 §2.3.1).\n // This is the recommended method — avoids placing secrets in the request body.\n const clientAuth = oauth.ClientSecretBasic(config.clientSecret);\n\n const parameters: Record<string, string> = {};\n if (config.scopes && config.scopes.length > 0) {\n parameters['scope'] = config.scopes.join(' ');\n }\n\n const response = await oauth.clientCredentialsGrantRequest(\n authServer,\n client,\n clientAuth,\n parameters\n );\n\n const result = await oauth.processClientCredentialsResponse(\n authServer,\n client,\n response\n );\n\n const requestedScopes = new Set(\n config.scopes && config.scopes.length > 0 ? config.scopes : []\n );\n const grantedScopes = new Set(\n (result.scope ?? '').split(' ').filter(Boolean)\n );\n const missingScopes = [...requestedScopes].filter(\n (s) => !grantedScopes.has(s)\n );\n if (\n missingScopes.length > 0 &&\n requestedScopes.size > 0 &&\n grantedScopes.size > 0\n ) {\n debug(\n '[oauth] Warning: Token server granted fewer scopes than requested. Missing: %s',\n missingScopes.join(', ')\n );\n }\n\n return {\n accessToken: result.access_token,\n tokenType: result.token_type,\n expiresIn: result.expires_in,\n scope: result.scope,\n };\n}\n\n/**\n * Validates the callback URL from OAuth redirect\n *\n * @param callbackUrl - The full callback URL with query parameters\n * @param expectedState - The state parameter sent in the authorization request\n * @returns The authorization code\n * @throws Error if validation fails\n */\nexport function validateCallback(\n callbackUrl: URL,\n expectedState: string\n): string {\n const error = callbackUrl.searchParams.get('error');\n if (error) {\n const errorDescription = callbackUrl.searchParams.get('error_description');\n throw new Error(\n `OAuth error: ${error}${errorDescription ? ` - ${errorDescription}` : ''}`\n );\n }\n\n const state = callbackUrl.searchParams.get('state');\n if (state !== expectedState) {\n throw new Error('OAuth state mismatch - possible CSRF attack');\n }\n\n const code = callbackUrl.searchParams.get('code');\n if (!code) {\n throw new Error('No authorization code in callback URL');\n }\n\n return code;\n}\n","/**\n * OAuth Protected Resource and Authorization Server discovery\n *\n * Implements RFC 9728 (OAuth Protected Resource Metadata) and\n * RFC 8414 (Authorization Server Metadata) for MCP servers.\n */\n\nimport * as oauth from 'oauth4webapi';\nimport type { AuthServerMetadata } from './oauthFlow.js';\n\n/**\n * Returns true if the hostname refers to the loopback interface\n */\nfunction isLocalhostUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n const h = parsed.hostname;\n return h === 'localhost' || h === '127.0.0.1' || h === '::1';\n } catch {\n return false;\n }\n}\n\n/**\n * Validates that critical OAuth endpoints returned by discovery use HTTPS.\n * Localhost URLs are exempt to support local development and testing.\n *\n * @throws Error if any endpoint uses a non-HTTPS, non-localhost scheme\n */\nfunction validateAuthServerEndpoints(authServer: {\n authorization_endpoint?: string;\n token_endpoint?: string;\n issuer?: string;\n}): void {\n const endpoints = [\n { name: 'authorization_endpoint', url: authServer.authorization_endpoint },\n { name: 'token_endpoint', url: authServer.token_endpoint },\n ];\n\n for (const { name, url } of endpoints) {\n if (url && !url.startsWith('https://') && !isLocalhostUrl(url)) {\n throw new Error(\n `OAuth discovery returned an insecure ${name}: \"${url}\". ` +\n `Only HTTPS endpoints are permitted for OAuth flows to prevent token interception.`\n );\n }\n }\n}\n\n/**\n * MCP Protocol version header value\n */\nexport const MCP_PROTOCOL_VERSION = '2025-06-18';\n\n/**\n * Protected Resource Metadata (RFC 9728)\n */\nexport interface ProtectedResourceMetadata {\n /**\n * The protected resource URL\n */\n resource: string;\n\n /**\n * Array of authorization server URLs\n */\n authorization_servers?: Array<string>;\n\n /**\n * Scopes supported by the protected resource\n */\n scopes_supported?: Array<string>;\n\n /**\n * Bearer token formats supported\n */\n bearer_methods_supported?: Array<string>;\n\n /**\n * Resource documentation URL\n */\n resource_documentation?: string;\n\n /**\n * Resource signing algorithms\n */\n resource_signing_alg_values_supported?: Array<string>;\n}\n\n/**\n * Result of protected resource discovery\n */\nexport interface ProtectedResourceDiscoveryResult {\n /**\n * The discovered metadata\n */\n metadata: ProtectedResourceMetadata;\n\n /**\n * The URL where metadata was found\n */\n discoveryUrl: string;\n\n /**\n * Whether path-aware discovery was used (vs base discovery)\n */\n usedPathAwareDiscovery: boolean;\n}\n\n/**\n * Discovers protected resource metadata per RFC 9728\n *\n * Follows RFC 9728 Section 4.1 for path-aware discovery:\n * 1. First tries: {origin}/.well-known/oauth-protected-resource{pathname}\n * 2. Falls back to: {origin}/.well-known/oauth-protected-resource\n *\n * @param mcpServerUrl - The MCP server URL\n * @returns Protected resource discovery result\n * @throws Error if discovery fails completely\n *\n * @example\n * const result = await discoverProtectedResource('https://api.example.com/mcp/default');\n * console.log(result.metadata.authorization_servers);\n */\nexport async function discoverProtectedResource(\n mcpServerUrl: string\n): Promise<ProtectedResourceDiscoveryResult> {\n const url = new URL(mcpServerUrl);\n const origin = url.origin;\n const pathname = url.pathname;\n\n // Try path-aware discovery first (RFC 9728 Section 4.1)\n const pathAwareUrl = `${origin}/.well-known/oauth-protected-resource${pathname}`;\n\n try {\n const metadata = await fetchProtectedResourceMetadata(pathAwareUrl);\n return {\n metadata,\n discoveryUrl: pathAwareUrl,\n usedPathAwareDiscovery: true,\n };\n } catch (error) {\n // If path-aware fails with 404, try base discovery\n if (error instanceof DiscoveryError && error.status === 404) {\n const baseUrl = `${origin}/.well-known/oauth-protected-resource`;\n\n // This will throw if base discovery also fails\n const metadata = await fetchProtectedResourceMetadata(baseUrl);\n return {\n metadata,\n discoveryUrl: baseUrl,\n usedPathAwareDiscovery: false,\n };\n }\n\n // Non-404 error from path-aware discovery\n throw error;\n }\n}\n\n/**\n * Error thrown when discovery fails\n */\nexport class DiscoveryError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly url?: string\n ) {\n super(message);\n this.name = 'DiscoveryError';\n }\n}\n\n/**\n * Fetches protected resource metadata from a discovery URL\n */\nasync function fetchProtectedResourceMetadata(\n discoveryUrl: string\n): Promise<ProtectedResourceMetadata> {\n const response = await fetch(discoveryUrl, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n 'MCP-Protocol-Version': MCP_PROTOCOL_VERSION,\n },\n });\n\n if (!response.ok) {\n throw new DiscoveryError(\n `Protected resource discovery failed: ${response.status} ${response.statusText}`,\n response.status,\n discoveryUrl\n );\n }\n\n const metadata = (await response.json()) as ProtectedResourceMetadata;\n\n // Validate required field\n if (!metadata.resource) {\n throw new DiscoveryError(\n 'Invalid protected resource metadata: missing required \"resource\" field',\n undefined,\n discoveryUrl\n );\n }\n\n return metadata;\n}\n\n/**\n * Discovers OAuth Authorization Server metadata per RFC 8414\n *\n * Wraps oauth4webapi's discovery with MCP-specific headers.\n *\n * @param authServerUrl - The authorization server URL\n * @returns Authorization server metadata\n * @throws Error if discovery fails\n *\n * @example\n * const authServer = await discoverAuthorizationServer('https://auth.example.com');\n * console.log(authServer.server.token_endpoint);\n */\nexport async function discoverAuthorizationServer(\n authServerUrl: string\n): Promise<AuthServerMetadata> {\n const issuer = new URL(authServerUrl);\n\n // Use oauth4webapi for discovery with custom headers\n const response = await oauth.discoveryRequest(issuer, {\n algorithm: 'oauth2',\n headers: new Headers({\n 'MCP-Protocol-Version': MCP_PROTOCOL_VERSION,\n }),\n });\n\n const metadata = await oauth.processDiscoveryResponse(issuer, response);\n\n validateAuthServerEndpoints(metadata);\n\n return {\n server: metadata,\n issuer: authServerUrl,\n };\n}\n","/**\n * OAuth token storage with environment variable support for CI/CD\n *\n * Provides file-based storage for OAuth state per MCP server, with support\n * for token injection via environment variables for automated testing.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { homedir } from 'node:os';\nimport type { StoredTokens, StoredClientInfo } from './types.js';\nimport type { AuthServerMetadata } from './oauthFlow.js';\nimport type { ProtectedResourceMetadata } from './discovery.js';\n\n/**\n * Combined server metadata (auth server + protected resource)\n */\nexport interface StoredServerMetadata {\n /**\n * Authorization server metadata\n */\n authServer: AuthServerMetadata;\n\n /**\n * Protected resource metadata\n */\n protectedResource: ProtectedResourceMetadata;\n\n /**\n * Timestamp when metadata was discovered\n */\n discoveredAt: number;\n}\n\n/**\n * Interface for OAuth storage operations\n */\nexport interface OAuthStorage {\n /**\n * Load combined server metadata\n */\n loadServerMetadata(): Promise<StoredServerMetadata | null>;\n\n /**\n * Save combined server metadata\n */\n saveServerMetadata(metadata: StoredServerMetadata): Promise<void>;\n\n /**\n * Load registered client information\n */\n loadClient(): Promise<StoredClientInfo | null>;\n\n /**\n * Save registered client information\n */\n saveClient(client: StoredClientInfo): Promise<void>;\n\n /**\n * Load stored tokens\n */\n loadTokens(): Promise<StoredTokens | null>;\n\n /**\n * Save tokens\n */\n saveTokens(tokens: StoredTokens): Promise<void>;\n\n /**\n * Delete stored tokens\n */\n deleteTokens(): Promise<void>;\n\n /**\n * Check if valid (non-expired) token exists\n * @param bufferMs - Buffer time in milliseconds before expiration (default: 60000)\n */\n hasValidToken(bufferMs?: number): Promise<boolean>;\n}\n\n/**\n * Configuration for file-based OAuth storage\n */\nexport interface FileOAuthStorageConfig {\n /**\n * MCP server URL (used to generate storage key)\n */\n serverUrl: string;\n\n /**\n * Custom state directory (overrides default)\n */\n stateDir?: string;\n}\n\n/**\n * Environment variable names for CI/CD token injection\n */\nexport const ENV_VAR_NAMES = {\n accessToken: 'MCP_ACCESS_TOKEN',\n refreshToken: 'MCP_REFRESH_TOKEN',\n tokenType: 'MCP_TOKEN_TYPE',\n expiresAt: 'MCP_TOKEN_EXPIRES_AT',\n} as const;\n\n/**\n * Default buffer time before token expiration (60 seconds)\n */\nconst DEFAULT_EXPIRY_BUFFER_MS = 60_000;\n\n/**\n * Generates a filesystem-safe key from a server URL\n *\n * @param serverUrl - The MCP server URL\n * @returns A filesystem-safe key string\n *\n * @example\n * generateServerKey('https://api.example.com:8080/mcp')\n * // Returns: 'api.example.com_8080_mcp'\n */\nexport function generateServerKey(serverUrl: string): string {\n const url = new URL(serverUrl);\n\n // Start with hostname\n let key = url.hostname;\n\n // Add port if non-standard\n if (url.port) {\n key += `_${url.port}`;\n }\n\n // Add path, replacing slashes with underscores\n if (url.pathname && url.pathname !== '/') {\n const cleanPath = url.pathname\n .replace(/^\\/+|\\/+$/g, '') // Remove leading/trailing slashes\n .replace(/\\//g, '_'); // Replace remaining slashes with underscores\n if (cleanPath) {\n key += `_${cleanPath}`;\n }\n }\n\n // Make filesystem-safe: replace any remaining problematic characters\n return key.replace(/[^a-zA-Z0-9_.-]/g, '_');\n}\n\n/**\n * Gets the state directory for a server\n *\n * Default locations:\n * - Linux: $XDG_STATE_HOME/mcp-tests/{serverKey}/ or ~/.local/state/mcp-tests/{serverKey}/\n * - macOS: ~/.local/state/mcp-tests/{serverKey}/\n * - Windows: %LOCALAPPDATA%\\mcp-tests\\{serverKey}\\\n *\n * @param serverUrl - The MCP server URL\n * @param customDir - Optional custom base directory\n * @returns The state directory path\n */\nexport function getStateDir(serverUrl: string, customDir?: string): string {\n const serverKey = generateServerKey(serverUrl);\n\n if (customDir) {\n return path.join(customDir, serverKey);\n }\n\n // Platform-specific defaults\n if (process.platform === 'win32') {\n const localAppData = process.env.LOCALAPPDATA;\n if (localAppData) {\n return path.join(localAppData, 'mcp-tests', serverKey);\n }\n // Fallback for Windows\n return path.join(homedir(), 'AppData', 'Local', 'mcp-tests', serverKey);\n }\n\n // Linux: Honor XDG_STATE_HOME\n if (process.platform === 'linux' && process.env.XDG_STATE_HOME) {\n return path.join(process.env.XDG_STATE_HOME, 'mcp-tests', serverKey);\n }\n\n // Default for macOS and Linux\n return path.join(homedir(), '.local', 'state', 'mcp-tests', serverKey);\n}\n\n/**\n * Get the base directory for all MCP token storage\n */\nexport function getBaseStateDir(): string {\n if (process.platform === 'win32') {\n const localAppData = process.env.LOCALAPPDATA;\n if (localAppData) {\n return path.join(localAppData, 'mcp-tests');\n }\n return path.join(homedir(), 'AppData', 'Local', 'mcp-tests');\n }\n\n if (process.platform === 'linux' && process.env.XDG_STATE_HOME) {\n return path.join(process.env.XDG_STATE_HOME, 'mcp-tests');\n }\n\n return path.join(homedir(), '.local', 'state', 'mcp-tests');\n}\n\n/**\n * Known server info\n */\nexport interface KnownServer {\n /** The server key (directory name) */\n key: string;\n /** Reconstructed URL (best effort) */\n url: string;\n /** Whether valid tokens exist */\n hasTokens: boolean;\n}\n\n/**\n * List all known authenticated servers from the token storage directory\n *\n * @returns Array of known servers with their URLs and token status\n */\nexport async function listKnownServers(): Promise<KnownServer[]> {\n const baseDir = getBaseStateDir();\n const servers: KnownServer[] = [];\n\n try {\n const entries = await fs.readdir(baseDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const serverKey = entry.name;\n const tokensPath = path.join(baseDir, serverKey, 'tokens.json');\n\n let hasTokens = false;\n try {\n await fs.access(tokensPath);\n hasTokens = true;\n } catch {\n // No tokens file\n }\n\n // Reconstruct URL from server key (best effort)\n // Format: hostname_port_path or hostname_path\n const parts = serverKey.split('_');\n const hostname = parts[0];\n const rest = parts.slice(1).join('/');\n const url = `https://${hostname}/${rest}`;\n\n servers.push({ key: serverKey, url, hasTokens });\n }\n } catch {\n // Directory doesn't exist or not readable\n }\n\n return servers;\n}\n\n/**\n * Reads tokens from environment variables (for CI/CD)\n *\n * @returns StoredTokens if MCP_ACCESS_TOKEN is set, null otherwise\n */\nexport function loadTokensFromEnv(): StoredTokens | null {\n const accessToken = process.env[ENV_VAR_NAMES.accessToken];\n\n if (!accessToken) {\n return null;\n }\n\n const expiresAtStr = process.env[ENV_VAR_NAMES.expiresAt];\n const expiresAt = expiresAtStr ? parseInt(expiresAtStr, 10) : undefined;\n\n return {\n accessToken,\n refreshToken: process.env[ENV_VAR_NAMES.refreshToken],\n tokenType: process.env[ENV_VAR_NAMES.tokenType] ?? 'Bearer',\n expiresAt: expiresAt && !isNaN(expiresAt) ? expiresAt : undefined,\n };\n}\n\n/**\n * Programmatically inject tokens into storage (for CI/CD setup)\n *\n * @param serverUrl - The MCP server URL\n * @param tokens - The tokens to inject\n * @param stateDir - Optional custom state directory\n */\nexport async function injectTokens(\n serverUrl: string,\n tokens: StoredTokens,\n stateDir?: string\n): Promise<void> {\n const storage = createFileOAuthStorage({ serverUrl, stateDir });\n await storage.saveTokens(tokens);\n}\n\n/**\n * Load stored OAuth tokens for an MCP server\n *\n * Reads tokens from the standard storage location for the given server URL.\n * Tokens are stored by `mcp-server-tester login` or `injectTokens()`.\n *\n * @param serverUrl - The MCP server URL\n * @param stateDir - Optional custom state directory\n * @returns StoredTokens if found, null otherwise\n *\n * @example\n * ```typescript\n * // After running: npx mcp-server-tester login https://api.example.com/mcp\n * const tokens = await loadTokens('https://api.example.com/mcp');\n * if (tokens?.accessToken) {\n * // Use the token — never log raw token values\n * headers.Authorization = `Bearer ${tokens.accessToken}`;\n * }\n * ```\n */\nexport async function loadTokens(\n serverUrl: string,\n stateDir?: string\n): Promise<StoredTokens | null> {\n const storage = createFileOAuthStorage({ serverUrl, stateDir });\n return storage.loadTokens();\n}\n\n/**\n * Check if valid OAuth tokens exist for an MCP server\n *\n * Returns true if tokens exist and are not expired (with buffer).\n * Use this to check if authentication is needed before making requests.\n *\n * @param serverUrl - The MCP server URL\n * @param options - Optional configuration\n * @param options.stateDir - Custom state directory\n * @param options.bufferMs - Buffer time before expiration (default: 60000ms)\n * @returns true if valid (non-expired) tokens exist\n *\n * @example\n * ```typescript\n * if (await hasValidTokens('https://api.example.com/mcp')) {\n * // Use stored tokens\n * const tokens = await loadTokens('https://api.example.com/mcp');\n * } else {\n * console.log('Run: npx mcp-server-tester login https://api.example.com/mcp');\n * }\n * ```\n */\nexport async function hasValidTokens(\n serverUrl: string,\n options?: { stateDir?: string; bufferMs?: number }\n): Promise<boolean> {\n const storage = createFileOAuthStorage({\n serverUrl,\n stateDir: options?.stateDir,\n });\n return storage.hasValidToken(options?.bufferMs);\n}\n\n/**\n * Creates a file-based OAuth storage instance\n *\n * @param config - Storage configuration\n * @returns OAuthStorage instance\n */\nexport function createFileOAuthStorage(\n config: FileOAuthStorageConfig\n): OAuthStorage {\n return new FileOAuthStorage(config);\n}\n\n/**\n * File-based OAuth storage implementation\n */\nclass FileOAuthStorage implements OAuthStorage {\n private readonly stateDir: string;\n\n constructor(config: FileOAuthStorageConfig) {\n this.stateDir = getStateDir(config.serverUrl, config.stateDir);\n }\n\n private get serverMetadataPath(): string {\n return path.join(this.stateDir, 'server.json');\n }\n\n private get clientPath(): string {\n return path.join(this.stateDir, 'client.json');\n }\n\n private get tokensPath(): string {\n return path.join(this.stateDir, 'tokens.json');\n }\n\n async loadServerMetadata(): Promise<StoredServerMetadata | null> {\n return this.loadFile<StoredServerMetadata>(this.serverMetadataPath);\n }\n\n async saveServerMetadata(metadata: StoredServerMetadata): Promise<void> {\n await this.atomicWrite(this.serverMetadataPath, metadata);\n }\n\n async loadClient(): Promise<StoredClientInfo | null> {\n return this.loadFile<StoredClientInfo>(this.clientPath);\n }\n\n async saveClient(client: StoredClientInfo): Promise<void> {\n await this.atomicWrite(this.clientPath, client);\n }\n\n async loadTokens(): Promise<StoredTokens | null> {\n return this.loadFile<StoredTokens>(this.tokensPath);\n }\n\n async saveTokens(tokens: StoredTokens): Promise<void> {\n await this.atomicWrite(this.tokensPath, tokens);\n }\n\n async deleteTokens(): Promise<void> {\n await this.deleteFile(this.tokensPath);\n }\n\n async hasValidToken(\n bufferMs: number = DEFAULT_EXPIRY_BUFFER_MS\n ): Promise<boolean> {\n const tokens = await this.loadTokens();\n\n if (!tokens?.accessToken) {\n return false;\n }\n\n // If no expiration, assume valid\n if (!tokens.expiresAt) {\n return true;\n }\n\n // Check if token is expired (with buffer)\n return tokens.expiresAt > Date.now() + bufferMs;\n }\n\n /**\n * Load a JSON file, returning null if not found\n */\n private async loadFile<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Write data atomically: write to .tmp file, then rename\n * Files are created with 0o600 permissions (user read/write only)\n */\n private async atomicWrite(filePath: string, data: unknown): Promise<void> {\n // Note: The `mode` parameter is ignored on Windows (Win32) where file\n // permissions are controlled by NTFS ACLs, not Unix permission bits.\n // On Windows, token files may be readable by other users on the system\n // depending on the directory's inherited ACL. This is a Node.js fs\n // limitation. Windows users should verify %LOCALAPPDATA% permissions manually.\n await fs.mkdir(this.stateDir, { recursive: true, mode: 0o700 });\n\n const tmpPath = `${filePath}.tmp`;\n const content = JSON.stringify(data, null, 2);\n\n // Write to temp file with restrictive permissions (user read/write only)\n await fs.writeFile(tmpPath, content, { encoding: 'utf-8', mode: 0o600 });\n\n // Atomic rename\n await fs.rename(tmpPath, filePath);\n }\n\n /**\n * Delete a file, ignoring errors if the file doesn't exist\n */\n private async deleteFile(filePath: string): Promise<void> {\n try {\n await fs.unlink(filePath);\n } catch (error) {\n // Ignore ENOENT (file doesn't exist)\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n}\n","/**\n * CLI OAuth client for command-line authentication flows\n *\n * Provides browser-based OAuth authentication for CLI environments,\n * with support for environment variable token injection for CI/CD.\n */\n\nimport * as http from 'node:http';\nimport type { AddressInfo, Socket } from 'node:net';\nimport createDebug from 'debug';\nimport {\n generatePKCE,\n generateState,\n buildAuthorizationUrl,\n exchangeCodeForTokens,\n refreshAccessToken,\n type AuthServerMetadata,\n} from './oauthFlow.js';\nimport {\n discoverProtectedResource,\n discoverAuthorizationServer,\n MCP_PROTOCOL_VERSION,\n type ProtectedResourceMetadata,\n} from './discovery.js';\nimport {\n createFileOAuthStorage,\n loadTokensFromEnv,\n type OAuthStorage,\n type StoredServerMetadata,\n} from './storage.js';\nimport type { StoredTokens, StoredClientInfo, TokenResult } from './types.js';\n\nconst debug = createDebug('mcp-server-tester:cli-oauth');\n\n/**\n * Configuration for CLI OAuth client\n */\nexport interface CLIOAuthClientConfig {\n /**\n * MCP server URL (for protected resource discovery)\n */\n mcpServerUrl: string;\n\n /**\n * Scopes to request (optional, uses discovered scopes if not provided)\n */\n scopes?: Array<string>;\n\n /**\n * Custom storage directory\n */\n stateDir?: string;\n\n /**\n * Pre-registered client ID (skips DCR if provided)\n */\n clientId?: string;\n\n /**\n * Pre-registered client secret\n */\n clientSecret?: string;\n\n /**\n * Preferred callback port (default: random available port)\n */\n callbackPort?: number;\n\n /**\n * Timeout for OAuth flow in milliseconds (default: 300000 = 5 min)\n */\n timeoutMs?: number;\n\n /**\n * Client name for DCR registration\n */\n clientName?: string;\n}\n\n/**\n * Result of CLI OAuth authentication\n */\nexport interface CLIOAuthResult {\n /**\n * Access token\n */\n accessToken: string;\n\n /**\n * Token type (typically \"Bearer\")\n */\n tokenType: string;\n\n /**\n * Expiration timestamp (Unix ms)\n */\n expiresAt?: number;\n\n /**\n * Whether token was refreshed vs newly acquired\n */\n refreshed: boolean;\n\n /**\n * Scopes that were requested (only set for new authentications)\n */\n requestedScopes?: string[];\n\n /**\n * Whether token came from environment variables\n */\n fromEnv: boolean;\n}\n\n/**\n * Default timeout for OAuth flow (5 minutes)\n */\nconst DEFAULT_TIMEOUT_MS = 300_000;\n\n/**\n * Default client name for DCR\n */\nconst DEFAULT_CLIENT_NAME = '@gleanwork/mcp-server-tester';\n\n/**\n * Default TTL for cached server metadata (24 hours)\n * After this time, metadata will be re-discovered\n */\nconst DEFAULT_METADATA_TTL_MS = 24 * 60 * 60 * 1000;\n\n/**\n * CLI OAuth client for command-line authentication flows\n */\nexport class CLIOAuthClient {\n private readonly config: CLIOAuthClientConfig;\n private readonly storage: OAuthStorage;\n\n constructor(config: CLIOAuthClientConfig) {\n this.config = config;\n this.storage = createFileOAuthStorage({\n serverUrl: config.mcpServerUrl,\n stateDir: config.stateDir,\n });\n }\n\n /**\n * Get a valid access token, authenticating if necessary\n *\n * Token resolution priority:\n * 1. Check environment variables (for CI/CD)\n * 2. Check file storage for cached tokens\n * 3. Try to refresh if expired but refresh token exists\n * 4. Run full OAuth flow if needed\n */\n async getAccessToken(): Promise<CLIOAuthResult> {\n // 1. Check environment variables first (CI/CD support)\n const envTokens = loadTokensFromEnv();\n if (envTokens) {\n debug('Using tokens from environment variables');\n return {\n accessToken: envTokens.accessToken,\n tokenType: envTokens.tokenType,\n expiresAt: envTokens.expiresAt,\n refreshed: false,\n fromEnv: true,\n };\n }\n\n // 2. Check file storage for cached tokens\n const storedTokens = await this.storage.loadTokens();\n\n if (storedTokens?.accessToken) {\n // Check if token is still valid\n const isValid = await this.storage.hasValidToken();\n\n if (isValid) {\n debug('Using cached tokens from storage');\n return {\n accessToken: storedTokens.accessToken,\n tokenType: storedTokens.tokenType,\n expiresAt: storedTokens.expiresAt,\n refreshed: false,\n fromEnv: false,\n };\n }\n\n // 3. Try to refresh if we have a refresh token\n if (storedTokens.refreshToken) {\n debug('Token expired, attempting refresh');\n try {\n const refreshedTokens = await this.refreshStoredToken(storedTokens);\n return {\n accessToken: refreshedTokens.accessToken,\n tokenType: refreshedTokens.tokenType,\n expiresAt: refreshedTokens.expiresAt,\n refreshed: true,\n fromEnv: false,\n };\n } catch (error) {\n debug('Token refresh failed, will re-authenticate:', error);\n // Fall through to full authentication\n }\n }\n }\n\n // 4. Run full OAuth flow\n debug('Performing full OAuth authentication');\n return this.authenticate();\n }\n\n /**\n * Try to get a valid access token without triggering browser auth\n *\n * Returns null if no valid token is available (no stored tokens,\n * expired without refresh token, or refresh failed). Unlike getAccessToken(),\n * this will NOT open a browser for authentication.\n *\n * Use this for CLI commands that should prompt the user to run `login`\n * instead of automatically starting the OAuth flow.\n */\n async tryGetAccessToken(): Promise<CLIOAuthResult | null> {\n // 1. Check environment variables first (CI/CD support)\n const envTokens = loadTokensFromEnv();\n if (envTokens) {\n debug('Using tokens from environment variables');\n return {\n accessToken: envTokens.accessToken,\n tokenType: envTokens.tokenType,\n expiresAt: envTokens.expiresAt,\n refreshed: false,\n fromEnv: true,\n };\n }\n\n // 2. Check file storage for cached tokens\n const storedTokens = await this.storage.loadTokens();\n\n if (storedTokens?.accessToken) {\n // Check if token is still valid\n const isValid = await this.storage.hasValidToken();\n\n if (isValid) {\n debug('Using cached tokens from storage');\n return {\n accessToken: storedTokens.accessToken,\n tokenType: storedTokens.tokenType,\n expiresAt: storedTokens.expiresAt,\n refreshed: false,\n fromEnv: false,\n };\n }\n\n // 3. Try to refresh if we have a refresh token\n if (storedTokens.refreshToken) {\n debug('Token expired, attempting refresh');\n try {\n const refreshedTokens = await this.refreshStoredToken(storedTokens);\n return {\n accessToken: refreshedTokens.accessToken,\n tokenType: refreshedTokens.tokenType,\n expiresAt: refreshedTokens.expiresAt,\n refreshed: true,\n fromEnv: false,\n };\n } catch (error) {\n debug('Token refresh failed:', error);\n // Return null - don't fall through to browser auth\n return null;\n }\n }\n }\n\n // No valid token available - return null instead of opening browser\n debug('No valid token available');\n return null;\n }\n\n /**\n * Force a new authentication flow\n */\n async authenticate(): Promise<CLIOAuthResult> {\n // Discover servers\n const { protectedResource, authServer } = await this.discoverServers();\n\n // Get or register client\n const client = await this.getOrRegisterClient(authServer);\n\n // Perform OAuth flow\n const { tokens, requestedScopes } = await this.performOAuthFlow(\n authServer,\n client,\n protectedResource\n );\n\n return {\n accessToken: tokens.accessToken,\n tokenType: tokens.tokenType,\n expiresAt: tokens.expiresAt,\n refreshed: false,\n fromEnv: false,\n requestedScopes,\n };\n }\n\n /**\n * Check if stored credentials exist (may be expired)\n */\n async hasStoredCredentials(): Promise<boolean> {\n const tokens = await this.storage.loadTokens();\n return tokens?.accessToken !== undefined;\n }\n\n /**\n * Clear stored credentials\n */\n async clearCredentials(): Promise<void> {\n await this.storage.deleteTokens();\n debug('Cleared stored credentials');\n }\n\n /**\n * Discover protected resource and authorization server\n */\n private async discoverServers(): Promise<{\n protectedResource: ProtectedResourceMetadata;\n authServer: AuthServerMetadata;\n }> {\n // Check cached server metadata\n const cachedMetadata = await this.storage.loadServerMetadata();\n if (cachedMetadata) {\n // Check if metadata is stale (older than TTL)\n const age = Date.now() - cachedMetadata.discoveredAt;\n if (age < DEFAULT_METADATA_TTL_MS) {\n debug('Using cached server metadata (age: %dms)', age);\n debug(\n 'Cached protected resource scopes: %O',\n cachedMetadata.protectedResource.scopes_supported\n );\n debug(\n 'Cached auth server scopes: %O',\n cachedMetadata.authServer.server.scopes_supported\n );\n return {\n protectedResource: cachedMetadata.protectedResource,\n authServer: cachedMetadata.authServer,\n };\n }\n debug('Cached server metadata is stale (age: %dms), re-discovering', age);\n }\n\n // Discover protected resource\n debug('Discovering protected resource:', this.config.mcpServerUrl);\n const prResult = await discoverProtectedResource(this.config.mcpServerUrl);\n debug('Found protected resource:', prResult.metadata.resource);\n debug(\n 'Protected resource scopes_supported: %O',\n prResult.metadata.scopes_supported\n );\n\n // Get authorization server URL\n const authServerUrl = prResult.metadata.authorization_servers?.[0];\n if (!authServerUrl) {\n throw new Error(\n 'No authorization servers found in protected resource metadata'\n );\n }\n\n // Discover authorization server\n debug('Discovering authorization server:', authServerUrl);\n const authServer = await discoverAuthorizationServer(authServerUrl);\n debug('Found authorization server:', authServer.issuer);\n debug(\n 'Auth server scopes_supported: %O',\n authServer.server.scopes_supported\n );\n\n // Cache metadata\n const metadata: StoredServerMetadata = {\n authServer,\n protectedResource: prResult.metadata,\n discoveredAt: Date.now(),\n };\n await this.storage.saveServerMetadata(metadata);\n\n return {\n protectedResource: prResult.metadata,\n authServer,\n };\n }\n\n /**\n * Get existing client or register new one via DCR\n */\n private async getOrRegisterClient(\n authServer: AuthServerMetadata\n ): Promise<StoredClientInfo> {\n // Use pre-configured client if provided\n if (this.config.clientId) {\n debug('Using pre-configured client ID');\n return {\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n };\n }\n\n // Check cached client\n const cachedClient = await this.storage.loadClient();\n if (cachedClient?.clientId) {\n debug('Using cached client registration');\n return cachedClient;\n }\n\n // Register new client via DCR\n debug('Registering new client via DCR');\n const client = await this.registerClient(authServer);\n await this.storage.saveClient(client);\n\n return client;\n }\n\n /**\n * Register a new client via Dynamic Client Registration\n */\n private async registerClient(\n authServer: AuthServerMetadata\n ): Promise<StoredClientInfo> {\n const registrationEndpoint = authServer.server.registration_endpoint;\n if (!registrationEndpoint) {\n throw new Error(\n 'Authorization server does not support Dynamic Client Registration. ' +\n 'Please provide a clientId in the configuration.'\n );\n }\n\n // We'll use a placeholder redirect URI for now\n // The actual port will be determined when we start the callback server\n const redirectUri = 'http://127.0.0.1:0/callback';\n\n const response = await fetch(registrationEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'MCP-Protocol-Version': MCP_PROTOCOL_VERSION,\n },\n body: JSON.stringify({\n redirect_uris: [redirectUri],\n token_endpoint_auth_method: 'none',\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n client_name: this.config.clientName ?? DEFAULT_CLIENT_NAME,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Dynamic Client Registration failed: ${response.status} ${response.statusText}\\n${errorText}`\n );\n }\n\n const data = (await response.json()) as {\n client_id: string;\n client_secret?: string;\n client_id_issued_at?: number;\n client_secret_expires_at?: number;\n };\n\n debug('Client registered:', data.client_id);\n\n return {\n clientId: data.client_id,\n clientSecret: data.client_secret,\n clientIdIssuedAt: data.client_id_issued_at,\n clientSecretExpiresAt: data.client_secret_expires_at,\n };\n }\n\n /**\n * Perform the full OAuth authorization flow\n */\n private async performOAuthFlow(\n authServer: AuthServerMetadata,\n client: StoredClientInfo,\n protectedResource: ProtectedResourceMetadata\n ): Promise<{ tokens: StoredTokens; requestedScopes: string[] }> {\n // Generate PKCE and state\n const pkce = await generatePKCE();\n const state = generateState();\n\n // Start callback server\n const { port, codePromise, close } = await this.startCallbackServer(state);\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n try {\n // Determine scopes: user-provided > protected resource > auth server > fallback\n // Try multiple sources since not all servers advertise scopes in the same place\n const requestedScopes = this.config.scopes ??\n protectedResource.scopes_supported ??\n authServer.server.scopes_supported ?? ['openid'];\n\n debug('Scope resolution:');\n debug(' - User config scopes: %O', this.config.scopes);\n debug(\n ' - Protected resource scopes_supported: %O',\n protectedResource.scopes_supported\n );\n debug(\n ' - Auth server scopes_supported: %O',\n authServer.server.scopes_supported\n );\n debug(' - Final requested scopes: %O', requestedScopes);\n\n const authUrl = buildAuthorizationUrl({\n authServer,\n clientId: client.clientId,\n redirectUri,\n scopes: requestedScopes,\n codeChallenge: pkce.codeChallenge,\n state,\n resource: protectedResource.resource,\n });\n\n // Log only non-sensitive parts of the authorization URL.\n // Do NOT log: state, code_challenge, code_challenge_method (security-sensitive).\n debug(\n 'Authorization URL (base): %s',\n `${authUrl.origin}${authUrl.pathname}`\n );\n debug('Authorization URL params:');\n debug(' - client_id: %s', authUrl.searchParams.get('client_id'));\n debug(' - redirect_uri: %s', authUrl.searchParams.get('redirect_uri'));\n debug(' - scope: %s', authUrl.searchParams.get('scope'));\n debug(' - resource: %s', authUrl.searchParams.get('resource'));\n\n // Open browser or print URL\n await this.openBrowserOrPrintUrl(authUrl);\n\n // Wait for callback\n debug('Waiting for OAuth callback...');\n const code = await codePromise;\n debug('Received authorization code');\n\n // Exchange code for tokens\n const tokenResult = await exchangeCodeForTokens({\n authServer,\n clientId: client.clientId,\n clientSecret: client.clientSecret,\n code,\n state,\n codeVerifier: pkce.codeVerifier,\n redirectUri,\n });\n\n // Store tokens with the client ID used to obtain them\n const tokens = this.tokenResultToStoredTokens(\n tokenResult,\n client.clientId\n );\n await this.storage.saveTokens(tokens);\n\n return { tokens, requestedScopes };\n } finally {\n // Clean up callback server and all connections\n close();\n }\n }\n\n /**\n * Refresh an expired token\n *\n * Uses the clientId stored with the tokens (if available) to ensure\n * the refresh request uses the same client that obtained the original tokens.\n * This is important because refresh tokens are bound to the client_id.\n */\n private async refreshStoredToken(\n storedTokens: StoredTokens\n ): Promise<StoredTokens> {\n if (!storedTokens.refreshToken) {\n throw new Error('No refresh token available');\n }\n\n // Get cached server metadata\n const metadata = await this.storage.loadServerMetadata();\n if (!metadata) {\n throw new Error('No cached server metadata for refresh');\n }\n\n // Determine which client credentials to use for refresh.\n // Priority: tokens.clientId > stored client.json > error\n let clientId: string;\n let clientSecret: string | undefined;\n\n if (storedTokens.clientId) {\n // Use the client ID that was used to obtain these tokens\n debug('Using clientId from stored tokens for refresh');\n clientId = storedTokens.clientId;\n\n // Try to get the client secret from stored client info if it matches\n const storedClient = await this.storage.loadClient();\n if (storedClient?.clientId === clientId) {\n clientSecret = storedClient.clientSecret;\n }\n } else {\n // Legacy tokens without clientId - fall back to stored client\n debug(\n 'No clientId in stored tokens, falling back to stored client (legacy behavior)'\n );\n const client = await this.getOrRegisterClient(metadata.authServer);\n clientId = client.clientId;\n clientSecret = client.clientSecret;\n }\n\n // Refresh token\n const tokenResult = await refreshAccessToken({\n authServer: metadata.authServer,\n clientId,\n clientSecret,\n refreshToken: storedTokens.refreshToken,\n });\n\n // Store new tokens with the clientId that was used\n const tokens = this.tokenResultToStoredTokens(tokenResult, clientId);\n await this.storage.saveTokens(tokens);\n\n return tokens;\n }\n\n /**\n * Start local callback server\n */\n private async startCallbackServer(expectedState: string): Promise<{\n port: number;\n codePromise: Promise<string>;\n close: () => void;\n }> {\n const timeoutMs = this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n const server = http.createServer();\n\n // Track active connections so we can force-close them\n const connections = new Set<Socket>();\n server.on('connection', (socket) => {\n connections.add(socket);\n socket.on('close', () => connections.delete(socket));\n });\n\n // Helper to force-close the server\n const forceClose = () => {\n for (const socket of connections) {\n socket.destroy();\n }\n server.close();\n };\n\n let codeResolve: (code: string) => void;\n let codeReject: (error: Error) => void;\n\n const codePromise = new Promise<string>((res, rej) => {\n codeResolve = res;\n codeReject = rej;\n });\n\n // Set up timeout\n const timeout = setTimeout(() => {\n forceClose();\n codeReject(new Error(`OAuth flow timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n // Handle incoming requests\n server.on('request', (req, res) => {\n const url = new URL(\n req.url ?? '/',\n `http://127.0.0.1:${(server.address() as AddressInfo).port}`\n );\n\n if (url.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not Found');\n return;\n }\n\n // Check for errors\n const error = url.searchParams.get('error');\n if (error) {\n const errorDescription = url.searchParams.get('error_description');\n clearTimeout(timeout);\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(this.errorHtml(error, errorDescription ?? undefined));\n codeReject(\n new Error(\n `OAuth error: ${error}${errorDescription ? ` - ${errorDescription}` : ''}`\n )\n );\n return;\n }\n\n // Validate state\n const state = url.searchParams.get('state');\n if (state !== expectedState) {\n clearTimeout(timeout);\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(this.errorHtml('invalid_state', 'State parameter mismatch'));\n codeReject(new Error('OAuth state mismatch - possible CSRF attack'));\n return;\n }\n\n // Get authorization code\n const code = url.searchParams.get('code');\n if (!code) {\n clearTimeout(timeout);\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(\n this.errorHtml('missing_code', 'No authorization code received')\n );\n codeReject(new Error('No authorization code in callback'));\n return;\n }\n\n // Success!\n clearTimeout(timeout);\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(this.successHtml());\n codeResolve(code);\n });\n\n // Listen on preferred port or random port\n const preferredPort = this.config.callbackPort ?? 0;\n\n server.listen(preferredPort, '127.0.0.1', () => {\n const address = server.address() as AddressInfo;\n debug('Callback server listening on port', address.port);\n resolve({ port: address.port, codePromise, close: forceClose });\n });\n\n server.on('error', (err) => {\n reject(err);\n });\n });\n }\n\n /**\n * Open browser or print URL for headless environments\n */\n private async openBrowserOrPrintUrl(url: URL): Promise<void> {\n if (isHeadless()) {\n console.log('\\n' + '='.repeat(60));\n console.log(\n 'Please open the following URL in your browser to authenticate:'\n );\n console.log('\\n' + url.toString() + '\\n');\n console.log('='.repeat(60) + '\\n');\n return;\n }\n\n try {\n // Dynamic import of 'open' package\n const open = await import('open');\n await open.default(url.toString());\n debug('Opened browser for authentication');\n } catch (error) {\n // If browser opening fails, fall back to printing URL\n debug('Failed to open browser:', error);\n console.log('\\nFailed to open browser automatically.');\n console.log('Please open the following URL manually:\\n');\n console.log(url.toString() + '\\n');\n }\n }\n\n /**\n * Convert TokenResult to StoredTokens\n *\n * @param result - Token result from exchange or refresh\n * @param clientId - Client ID that was used to obtain these tokens\n */\n private tokenResultToStoredTokens(\n result: TokenResult,\n clientId: string\n ): StoredTokens {\n return {\n accessToken: result.accessToken,\n tokenType: result.tokenType,\n refreshToken: result.refreshToken,\n expiresAt: result.expiresIn\n ? Date.now() + result.expiresIn * 1000\n : undefined,\n clientId,\n };\n }\n\n /**\n * HTML page for successful authentication\n */\n private successHtml(): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <title>Authentication Successful</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\n background: #f8fafc; }\n .container { text-align: center; background: white; padding: 48px 64px; border-radius: 8px;\n border: 1px solid #e2e8f0; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n .icon { width: 48px; height: 48px; margin: 0 auto 24px; background: #dcfce7; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; }\n .icon svg { width: 24px; height: 24px; color: #16a34a; }\n h1 { color: #0f172a; margin: 0 0 8px 0; font-size: 20px; font-weight: 600; }\n p { color: #64748b; margin: 0; font-size: 14px; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"/>\n </svg>\n </div>\n <h1>Authentication Successful</h1>\n <p>You can close this window and return to the terminal.</p>\n </div>\n</body>\n</html>`;\n }\n\n /**\n * HTML page for authentication error\n */\n private errorHtml(error: string, description?: string): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <title>Authentication Failed</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\n background: #f8fafc; }\n .container { text-align: center; background: white; padding: 48px 64px; border-radius: 8px;\n border: 1px solid #e2e8f0; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n .icon { width: 48px; height: 48px; margin: 0 auto 24px; background: #fee2e2; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; }\n .icon svg { width: 24px; height: 24px; color: #dc2626; }\n h1 { color: #0f172a; margin: 0 0 8px 0; font-size: 20px; font-weight: 600; }\n p { color: #64748b; margin: 0 0 8px 0; font-size: 14px; }\n code { background: #f1f5f9; padding: 2px 8px; border-radius: 4px; color: #dc2626; font-size: 13px; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </div>\n <h1>Authentication Failed</h1>\n <p>Error: <code>${escapeHtml(error)}</code></p>\n ${description ? `<p>${escapeHtml(description)}</p>` : ''}\n </div>\n</body>\n</html>`;\n }\n}\n\n/**\n * Detect if running in a headless environment\n */\nfunction isHeadless(): boolean {\n // CI environment\n if (process.env.CI) {\n return true;\n }\n\n // No TTY (piped input)\n if (!process.stdin.isTTY) {\n return true;\n }\n\n // Linux without DISPLAY (no X server)\n if (\n process.platform === 'linux' &&\n !process.env.DISPLAY &&\n !process.env.WAYLAND_DISPLAY\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n","{\n \"name\": \"@gleanwork/mcp-server-tester\",\n \"version\": \"1.0.0-beta.8\",\n \"description\": \"Playwright-based testing and evaluation framework for MCP servers\",\n \"keywords\": [\n \"playwright\",\n \"mcp\",\n \"model-context-protocol\",\n \"evals\",\n \"testing\",\n \"llm\",\n \"server-testing\"\n ],\n \"homepage\": \"https://github.com/gleanwork/mcp-server-tester#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/gleanwork/mcp-server-tester/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/gleanwork/mcp-server-tester.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Glean Contributors\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./fixtures/mcp\": {\n \"types\": \"./dist/fixtures/mcp.d.ts\",\n \"import\": \"./dist/fixtures/mcp.js\"\n },\n \"./fixtures/mcpAuth\": {\n \"types\": \"./dist/fixtures/mcpAuth.d.ts\",\n \"import\": \"./dist/fixtures/mcpAuth.js\"\n },\n \"./reporters/mcpReporter\": {\n \"types\": \"./dist/reporters/mcpReporter.d.ts\",\n \"import\": \"./dist/reporters/mcpReporter.js\",\n \"require\": \"./dist/reporters/mcpReporter.cjs\"\n }\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"mcp-server-tester\": \"./dist/cli/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"npm run build:ui && tsup && npm run build:copy-ui\",\n \"build:copy-ui\": \"cp -r src/reporters/ui-dist dist/reporters/\",\n \"build:ui\": \"tsx src/reporters/build-ui.ts\",\n \"dev\": \"tsup --watch\",\n \"dev:ui\": \"tsx src/reporters/build-ui.ts --watch\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"format:check\": \"prettier --check \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"lint\": \"eslint . --ext .ts,.tsx\",\n \"lint:fix\": \"eslint . --ext .ts,.tsx --fix\",\n \"prepublishOnly\": \"npm run test:all\",\n \"docs:check\": \"markdown-code check\",\n \"docs:sync\": \"markdown-code sync\",\n \"preview-reporter\": \"tsx scripts/preview-reporter.ts\",\n \"test\": \"vitest run\",\n \"test:all\": \"npm run build && npm run format:check && npm run lint && npm run typecheck && npm test\",\n \"test:playwright\": \"playwright test\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"^0.2.71\",\n \"@inkjs/ui\": \"^2.0.0\",\n \"@modelcontextprotocol/sdk\": \"^1.27.1\",\n \"commander\": \"^14.0.2\",\n \"debug\": \"^4.4.3\",\n \"ink\": \"^5.2.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"oauth4webapi\": \"^3.0.0\",\n \"open\": \"^10.1.0\",\n \"react\": \"^18.3.1\",\n \"undici\": \"^7.24.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@ai-sdk/provider-utils\": \"^4.0.15\",\n \"@playwright/test\": \"^1.49.0\",\n \"@release-it-plugins/lerna-changelog\": \"^8.0.1\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/node\": \"^22.10.2\",\n \"@types/react\": \"^18.3.12\",\n \"@types/react-dom\": \"^18.3.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.18.2\",\n \"@typescript-eslint/parser\": \"^8.18.2\",\n \"@vitest/ui\": \"^4.1.2\",\n \"autoprefixer\": \"^10.4.20\",\n \"bintastic\": \"^4.0.1\",\n \"esbuild\": \"^0.28.0\",\n \"eslint\": \"^8.57.1\",\n \"ink-testing-library\": \"^4.0.0\",\n \"lucide-react\": \"^0.460.0\",\n \"markdown-code\": \"^0.6.1\",\n \"memfs\": \"^4.51.1\",\n \"postcss\": \"^8.4.49\",\n \"prettier\": \"^3.4.2\",\n \"react-dom\": \"^18.3.1\",\n \"recharts\": \"^3.7.0\",\n \"release-it\": \"^19.2.4\",\n \"tailwindcss\": \"^3.4.15\",\n \"tsup\": \"^8.3.5\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.7.2\",\n \"vitest\": \"^4.1.2\"\n },\n \"peerDependencies\": {\n \"@ai-sdk/anthropic\": \"^3.0.46\",\n \"@ai-sdk/azure\": \"^3.0.0\",\n \"@ai-sdk/deepseek\": \"^2.0.0\",\n \"@ai-sdk/google\": \"^3.0.0\",\n \"@ai-sdk/google-vertex\": \"^4.0.0\",\n \"@ai-sdk/mistral\": \"^3.0.0\",\n \"@ai-sdk/openai\": \"^3.0.31\",\n \"@ai-sdk/xai\": \"^3.0.0\",\n \"@openrouter/ai-sdk-provider\": \"^2.0.0\",\n \"@playwright/test\": \"^1.40.0\",\n \"ai\": \"^6.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"ai\": {\n \"optional\": true\n },\n \"@ai-sdk/anthropic\": {\n \"optional\": true\n },\n \"@ai-sdk/azure\": {\n \"optional\": true\n },\n \"@ai-sdk/deepseek\": {\n \"optional\": true\n },\n \"@ai-sdk/google\": {\n \"optional\": true\n },\n \"@ai-sdk/google-vertex\": {\n \"optional\": true\n },\n \"@ai-sdk/mistral\": {\n \"optional\": true\n },\n \"@ai-sdk/openai\": {\n \"optional\": true\n },\n \"@ai-sdk/xai\": {\n \"optional\": true\n },\n \"@openrouter/ai-sdk-provider\": {\n \"optional\": true\n }\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org\"\n },\n \"release-it\": {\n \"plugins\": {\n \"@release-it-plugins/lerna-changelog\": {\n \"infile\": \"CHANGELOG.md\",\n \"launchEditor\": true\n }\n },\n \"git\": {\n \"tagName\": \"v${version}\"\n },\n \"github\": {\n \"release\": true,\n \"tokenRef\": \"GITHUB_AUTH\"\n }\n },\n \"optionalDependencies\": {\n \"@ai-sdk/anthropic\": \"^3.0.46\",\n \"@ai-sdk/azure\": \"^3.0.0\",\n \"@ai-sdk/deepseek\": \"^2.0.0\",\n \"@ai-sdk/google\": \"^3.0.0\",\n \"@ai-sdk/google-vertex\": \"^4.0.68\",\n \"@ai-sdk/mistral\": \"^3.0.0\",\n \"@ai-sdk/openai\": \"^3.0.31\",\n \"@ai-sdk/xai\": \"^3.0.0\",\n \"@openrouter/ai-sdk-provider\": \"^2.0.0\",\n \"ai\": \"^6.0.97\"\n },\n \"overrides\": {\n \"release-it\": {\n \"undici\": \"6.24.1\"\n }\n }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport type { MCPConfig } from '../config/mcpConfig.js';\nimport {\n validateMCPConfig,\n isStdioConfig,\n isHttpConfig,\n} from '../config/mcpConfig.js';\nimport { debugClient, debugHttp } from '../debug.js';\nimport { ProxyAgent, Agent as UndiciAgent } from 'undici';\nimport { readFileSync } from 'node:fs';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { performClientCredentialsFlow } from '../auth/oauthFlow.js';\n\n/**\n * Extracts the Retry-After delay in milliseconds from an error response, if present.\n * Returns null if no Retry-After header is found or parseable.\n */\nfunction getRetryAfterDelayMs(err: unknown): number | null {\n const response = (err as Record<string, unknown>)?.response as\n | Response\n | undefined;\n const retryAfter = response?.headers?.get?.('Retry-After');\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) return seconds * 1000;\n }\n return null;\n}\n\n/**\n * Returns true if the error is a 429 rate limit response\n */\nfunction isRateLimitError(err: unknown): boolean {\n const response = (err as Record<string, unknown>)?.response as\n | Response\n | undefined;\n return response?.status === 429;\n}\n\n/**\n * Returns true if the error is a transient network error that may succeed on retry\n */\nfunction isTransientNetworkError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes('econnreset') ||\n msg.includes('econnrefused') ||\n msg.includes('etimedout') ||\n msg.includes('enotfound') ||\n msg.includes('network') ||\n msg.includes('socket hang up') ||\n msg.includes('fetch failed')\n );\n}\n\n/**\n * Returns true if the error should be retried\n */\nfunction isRetryableError(err: unknown): boolean {\n return isTransientNetworkError(err) || isRateLimitError(err);\n}\n\n/**\n * Retries an async operation with exponential backoff.\n * Respects Retry-After headers for 429 rate limit responses.\n */\nasync function retryWithBackoff<T>(\n fn: () => Promise<T>,\n maxAttempts: number\n): Promise<T> {\n let lastErr: unknown;\n for (let attempt = 0; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (attempt < maxAttempts && isRetryableError(err)) {\n const retryAfterMs = getRetryAfterDelayMs(err);\n const delayMs =\n retryAfterMs !== null\n ? retryAfterMs\n : Math.min(1000 * 2 ** attempt, 30000);\n debugClient(\n 'Retryable error on attempt %d/%d, retrying in %dms: %s',\n attempt + 1,\n maxAttempts + 1,\n delayMs,\n (err as Error).message\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n } else {\n throw err;\n }\n }\n }\n throw lastErr;\n}\n\n/**\n * Tracks undici agents that need to be closed when their associated client is closed.\n * Keyed by Client instance identity.\n */\nconst agentRegistry = new WeakMap<object, UndiciAgent | ProxyAgent>();\n\n/**\n * Options for creating an MCP client\n */\nexport interface CreateMCPClientOptions {\n /**\n * Client information (name and version)\n */\n clientInfo?: {\n name?: string;\n version?: string;\n };\n\n /**\n * OAuth client provider for authentication\n *\n * When provided, the MCP SDK handles OAuth flow automatically.\n * This takes precedence over static token auth in config.auth.accessToken.\n */\n authProvider?: OAuthClientProvider;\n\n /**\n * Sampling handler callback for LLM sampling requests from the server.\n *\n * When provided, the client will advertise sampling capability to the server.\n * When absent, sampling is removed from declared capabilities so the client\n * does not falsely advertise support it cannot fulfill.\n */\n samplingHandler?: (...args: unknown[]) => unknown;\n}\n\n/**\n * Creates and connects an MCP client based on the provided configuration\n *\n * @param config - MCP configuration (will be validated)\n * @param options - Optional client options including auth provider\n * @returns Connected MCP Client instance\n * @throws {Error} If config is invalid or connection fails\n *\n * @example\n * // Stdio transport\n * const client = await createMCPClientForConfig({\n * transport: 'stdio',\n * command: 'node',\n * args: ['server.js']\n * });\n *\n * @example\n * // HTTP transport with static token auth\n * const client = await createMCPClientForConfig({\n * transport: 'http',\n * serverUrl: 'http://localhost:3000/mcp',\n * auth: { accessToken: 'your-token' }\n * });\n *\n * @example\n * // HTTP transport with OAuth provider\n * const client = await createMCPClientForConfig(\n * { transport: 'http', serverUrl: 'http://localhost:3000/mcp' },\n * { authProvider: myOAuthProvider }\n * );\n */\nexport async function createMCPClientForConfig(\n config: MCPConfig,\n options?: CreateMCPClientOptions\n): Promise<Client> {\n // Validate config\n const validatedConfig = validateMCPConfig(config);\n\n // Create client with info\n const client = new Client(\n {\n name: options?.clientInfo?.name ?? '@gleanwork/mcp-server-tester',\n version: options?.clientInfo?.version ?? packageJson.version,\n },\n {\n capabilities: {\n ...(validatedConfig.capabilities ?? {}),\n // Only advertise sampling if a handler has been registered;\n // declaring sampling capability without a handler violates the MCP spec\n sampling: options?.samplingHandler\n ? (validatedConfig.capabilities?.sampling ?? {})\n : undefined,\n },\n }\n );\n\n // Create appropriate transport and connect\n if (isStdioConfig(validatedConfig)) {\n const transport = new StdioClientTransport({\n command: validatedConfig.command,\n args: validatedConfig.args ?? [],\n ...(validatedConfig.cwd && { cwd: validatedConfig.cwd }),\n // Suppress server stderr when quiet mode is enabled\n ...(validatedConfig.quiet && { stderr: 'ignore' as const }),\n ...(validatedConfig.env && {\n env: Object.fromEntries(\n Object.entries({ ...process.env, ...validatedConfig.env }).filter(\n (entry): entry is [string, string] => entry[1] !== undefined\n )\n ),\n }),\n });\n\n debugClient('Connecting via stdio: %O', {\n command: validatedConfig.command,\n args: validatedConfig.args,\n cwd: validatedConfig.cwd,\n });\n\n await client.connect(\n transport,\n validatedConfig.connectTimeoutMs !== undefined\n ? { timeout: validatedConfig.connectTimeoutMs }\n : undefined\n );\n } else if (isHttpConfig(validatedConfig)) {\n // Build headers, including static token auth if configured and no authProvider.\n // User-provided headers take precedence over defaults (spread order).\n const headers: Record<string, string> = {\n 'User-Agent': `@gleanwork/mcp-server-tester/${packageJson.version}`,\n ...validatedConfig.headers,\n };\n\n // If using client credentials grant, fetch a token first\n if (validatedConfig.auth?.clientCredentials && !options?.authProvider) {\n const ccConfig = validatedConfig.auth.clientCredentials;\n const clientId = ccConfig.clientId ?? process.env['MCP_CLIENT_ID'];\n const clientSecret =\n ccConfig.clientSecret ?? process.env['MCP_CLIENT_SECRET'];\n\n if (!clientId || !clientSecret) {\n throw new Error(\n 'Client credentials require clientId/clientSecret in config or MCP_CLIENT_ID/MCP_CLIENT_SECRET env vars'\n );\n }\n\n if (!ccConfig.tokenEndpoint) {\n throw new Error(\n 'Client credentials require tokenEndpoint in auth.clientCredentials config'\n );\n }\n\n debugClient('Fetching token via client credentials grant');\n const tokenResult = await performClientCredentialsFlow({\n tokenEndpoint: ccConfig.tokenEndpoint,\n clientId,\n clientSecret,\n scopes: ccConfig.scopes,\n });\n headers.Authorization = `Bearer ${tokenResult.accessToken}`;\n }\n\n // If using static token auth (no authProvider), add Authorization header\n if (validatedConfig.auth?.accessToken && !options?.authProvider) {\n headers.Authorization = `Bearer ${validatedConfig.auth.accessToken}`;\n }\n\n const url = new URL(validatedConfig.serverUrl);\n let requestInit: RequestInit | undefined =\n Object.keys(headers).length > 0 ? { headers } : undefined;\n\n // Apply proxy if configured or available from environment\n const proxyUrl =\n validatedConfig.proxy?.url ??\n process.env['HTTPS_PROXY'] ??\n process.env['HTTP_PROXY'];\n\n if (proxyUrl) {\n const proxyAgent = new ProxyAgent(proxyUrl);\n try {\n const sanitized = new URL(proxyUrl);\n debugClient(\n 'Using proxy: %s://%s:%s',\n sanitized.protocol.slice(0, -1),\n sanitized.hostname,\n sanitized.port\n );\n } catch {\n debugClient('Using proxy (unparseable URL)');\n }\n requestInit = {\n ...requestInit,\n dispatcher: proxyAgent,\n } as unknown as RequestInit;\n }\n\n // Apply TLS configuration if present\n if (validatedConfig.tls) {\n const tlsCfg = validatedConfig.tls;\n try {\n const dispatcher = new UndiciAgent({\n connect: {\n ...(tlsCfg.ca && { ca: readFileSync(tlsCfg.ca) }),\n ...(tlsCfg.cert && { cert: readFileSync(tlsCfg.cert) }),\n ...(tlsCfg.key && { key: readFileSync(tlsCfg.key) }),\n rejectUnauthorized: tlsCfg.rejectUnauthorized ?? true,\n },\n });\n agentRegistry.set(client, dispatcher);\n requestInit = {\n ...requestInit,\n dispatcher,\n } as unknown as RequestInit;\n debugClient('TLS configuration applied');\n } catch (error) {\n const filePath = tlsCfg.ca ?? tlsCfg.cert ?? tlsCfg.key;\n const fileType = tlsCfg.ca\n ? 'CA certificate'\n : tlsCfg.cert\n ? 'client certificate'\n : 'client key';\n throw new Error(\n `Failed to load TLS ${fileType} from ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (proxyUrl) {\n // Track ProxyAgent for cleanup (already created above in the proxy branch)\n // Re-extract if already set via requestInit\n const existingDispatcher = (\n requestInit as unknown as { dispatcher?: ProxyAgent }\n )?.dispatcher;\n if (existingDispatcher) {\n agentRegistry.set(client, existingDispatcher);\n }\n }\n\n debugClient('Connecting via HTTP: %O', {\n serverUrl: validatedConfig.serverUrl,\n headers:\n Object.keys(headers).length > 0 ? Object.keys(headers) : undefined,\n hasAuthProvider: !!options?.authProvider,\n });\n\n debugHttp('Connecting to %s', validatedConfig.serverUrl);\n if (Object.keys(headers).length > 0) {\n debugHttp('Request header names: %O', Object.keys(headers));\n }\n\n const retryAttempts = validatedConfig.retryAttempts ?? 0;\n const connectOptions =\n validatedConfig.connectTimeoutMs !== undefined\n ? { timeout: validatedConfig.connectTimeoutMs }\n : undefined;\n\n // Try Streamable HTTP first (MCP spec 2025-03-26), fall back to SSE (2024-11-05)\n await retryWithBackoff(async () => {\n try {\n debugHttp('Attempting transport: streamableHttp');\n const streamableTransport = new StreamableHTTPClientTransport(url, {\n requestInit,\n authProvider: options?.authProvider,\n });\n await client.connect(streamableTransport, connectOptions);\n debugClient('Connected via Streamable HTTP');\n debugHttp('Connection established via streamableHttp');\n } catch (err) {\n debugHttp(\n 'streamableHttp failed (%s), falling back to SSE',\n (err as Error).message\n );\n debugClient('Streamable HTTP failed, falling back to SSE transport');\n debugHttp('Attempting transport: sse');\n const sseTransport = new SSEClientTransport(url, {\n requestInit,\n authProvider: options?.authProvider,\n });\n await client.connect(sseTransport, connectOptions);\n debugClient('Connected via SSE');\n debugHttp('Connection established via sse');\n }\n }, retryAttempts);\n }\n\n debugClient('Connected successfully');\n const serverInfo = client.getServerVersion();\n if (serverInfo) {\n debugClient('Server info: %O', serverInfo);\n }\n\n return client;\n}\n\n/**\n * Safely closes an MCP client connection\n *\n * @param client - The client to close\n */\nexport async function closeMCPClient(client: Client): Promise<void> {\n // notifications/cancelled requires a specific requestId to be useful — without one\n // the server cannot identify which request to abort. The MCP SDK does not expose\n // outstanding request IDs as a public API, so we close directly and let the\n // transport teardown signal disconnection to the server.\n try {\n await client.close();\n } catch (error) {\n debugClient(\n 'Error closing client: %s',\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n } finally {\n // Close any pooled undici agent associated with this client\n const agent = agentRegistry.get(client);\n if (agent) {\n agentRegistry.delete(client);\n try {\n await agent.close();\n } catch (agentError) {\n debugClient(\n 'Error closing undici agent: %s',\n (agentError as Error).message\n );\n }\n }\n }\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * A single content block from an MCP response\n */\nexport interface ContentBlock {\n type: string;\n text?: string;\n data?: unknown;\n mimeType?: string;\n}\n\n/**\n * Normalized representation of an MCP tool response\n *\n * This provides a consistent interface regardless of the response format\n * returned by the MCP server.\n */\nexport interface NormalizedToolResponse {\n /**\n * Extracted text content (concatenated from all text blocks)\n */\n text: string;\n\n /**\n * Original raw response from the MCP SDK\n */\n raw: CallToolResult;\n\n /**\n * Whether the tool call resulted in an error\n */\n isError: boolean;\n\n /**\n * Parsed content blocks from the response\n */\n contentBlocks: ContentBlock[];\n\n /**\n * Structured content if present (parsed JSON or raw data)\n */\n structuredContent: unknown;\n}\n\n/**\n * Normalizes an MCP CallToolResult into a consistent format\n *\n * @param result - Raw CallToolResult from the MCP SDK\n * @returns Normalized response with extracted text, content blocks, etc.\n *\n * @example\n * ```typescript\n * const result = await client.callTool({ name: 'read_file', arguments: { path: 'readme.txt' } });\n * const normalized = normalizeToolResponse(result);\n *\n * console.log(normalized.text); // \"Hello World\"\n * console.log(normalized.isError); // false\n * console.log(normalized.contentBlocks); // [{ type: 'text', text: 'Hello World' }]\n * ```\n */\nexport function normalizeToolResponse(\n result: CallToolResult\n): NormalizedToolResponse {\n const isError = result.isError ?? false;\n const contentBlocks: ContentBlock[] = [];\n const textParts: string[] = [];\n\n // Parse content array if present\n if (Array.isArray(result.content)) {\n for (const block of result.content) {\n if (block == null || typeof block !== 'object') {\n continue;\n }\n\n const b = block as Record<string, unknown>;\n const contentBlock: ContentBlock = {\n type: typeof b.type === 'string' ? b.type : 'unknown',\n };\n\n // Extract text if present\n if (typeof b.text === 'string') {\n contentBlock.text = b.text;\n textParts.push(b.text);\n }\n\n // Extract data/blob if present\n if (b.data !== undefined) {\n contentBlock.data = b.data;\n }\n\n // Extract mimeType if present\n if (typeof b.mimeType === 'string') {\n contentBlock.mimeType = b.mimeType;\n }\n\n contentBlocks.push(contentBlock);\n }\n }\n\n // Handle structuredContent\n let structuredContent: unknown = null;\n if (result.structuredContent !== undefined) {\n structuredContent = result.structuredContent;\n\n // If no text was extracted from content blocks, try to get text from structuredContent\n if (textParts.length === 0) {\n if (typeof result.structuredContent === 'string') {\n textParts.push(result.structuredContent);\n } else if (result.structuredContent != null) {\n // For objects/arrays, stringify for text representation\n textParts.push(JSON.stringify(result.structuredContent));\n }\n }\n }\n\n // Build final text by joining all parts\n const text = textParts.join('\\n');\n\n return {\n text,\n raw: result,\n isError,\n contentBlocks,\n structuredContent,\n };\n}\n\n/**\n * Extracts just the text content from a normalized or raw response\n *\n * This is a convenience function that works with both:\n * - Raw CallToolResult from the MCP SDK\n * - NormalizedToolResponse from normalizeToolResponse()\n * - Plain strings or other legacy formats\n *\n * @param response - Response in any supported format\n * @returns Extracted text content\n */\nexport function extractText(response: unknown): string {\n // Handle null/undefined\n if (response == null) {\n return '';\n }\n\n // Plain string\n if (typeof response === 'string') {\n return response;\n }\n\n // Already normalized response\n if (isNormalizedResponse(response)) {\n return response.text;\n }\n\n // Raw CallToolResult - normalize it first\n if (isCallToolResult(response)) {\n return normalizeToolResponse(response).text;\n }\n\n // Array of content blocks (direct content)\n if (Array.isArray(response)) {\n return extractTextFromContentArray(response);\n }\n\n // Generic object - try common patterns\n if (typeof response === 'object') {\n const r = response as Record<string, unknown>;\n\n // Check for content array\n if (Array.isArray(r.content)) {\n return extractTextFromContentArray(r.content);\n }\n\n // Check for content as a direct string (single content block format)\n if (typeof r.content === 'string') {\n return r.content;\n }\n\n // Check for structuredContent\n if (r.structuredContent !== undefined) {\n if (typeof r.structuredContent === 'string') {\n return r.structuredContent;\n }\n return JSON.stringify(r.structuredContent);\n }\n\n // Check for direct text field\n if (typeof r.text === 'string') {\n return r.text;\n }\n\n // Fallback to JSON\n return JSON.stringify(r);\n }\n\n // Primitives (number, boolean, bigint, symbol)\n if (\n typeof response === 'number' ||\n typeof response === 'boolean' ||\n typeof response === 'bigint'\n ) {\n return String(response);\n }\n\n // Symbol or other edge cases\n return '';\n}\n\n/**\n * Type guard for NormalizedToolResponse\n */\nfunction isNormalizedResponse(value: unknown): value is NormalizedToolResponse {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const v = value as Record<string, unknown>;\n return (\n typeof v.text === 'string' &&\n typeof v.isError === 'boolean' &&\n Array.isArray(v.contentBlocks) &&\n v.raw !== undefined\n );\n}\n\n/**\n * Type guard for CallToolResult\n */\nfunction isCallToolResult(value: unknown): value is CallToolResult {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const v = value as Record<string, unknown>;\n // Per MCP spec, content is required in CallToolResult — isError alone is insufficient\n return Array.isArray(v.content);\n}\n\n/**\n * Extracts text from a content block array\n */\nfunction extractTextFromContentArray(content: unknown[]): string {\n const textParts: string[] = [];\n\n for (const block of content) {\n if (block == null || typeof block !== 'object') {\n continue;\n }\n const b = block as Record<string, unknown>;\n if (b.type === 'text' && typeof b.text === 'string') {\n textParts.push(b.text);\n }\n }\n\n if (textParts.length > 0) {\n return textParts.join('\\n');\n }\n\n // No text blocks found, stringify the whole array\n return JSON.stringify(content);\n}\n","/**\n * Validator Utilities\n *\n * Shared utility functions for validation operations.\n * Re-exports core utilities from mcp/response.ts and adds validation-specific helpers.\n */\n\nimport { extractText as extractTextFromResponse } from '../../mcp/response.js';\n\n/**\n * Re-export extractText from mcp/response.ts\n * This extracts text content from any response format.\n */\nexport const extractText = extractTextFromResponse;\n\n/**\n * Gets the size of a response in bytes\n *\n * Serializes the response to JSON (with pretty printing for consistency)\n * and returns the byte length using UTF-8 encoding.\n *\n * @param response - Response in any format\n * @returns Size in bytes\n */\nexport function getResponseSizeBytes(response: unknown): number {\n if (response === null || response === undefined) {\n return 0;\n }\n\n // For strings, get direct byte length\n if (typeof response === 'string') {\n return Buffer.byteLength(response, 'utf8');\n }\n\n // For objects/arrays, serialize with formatting\n const serialized = JSON.stringify(response, null, 2);\n return Buffer.byteLength(serialized, 'utf8');\n}\n\n/**\n * Converts a response to a string for comparison\n *\n * @param response - Response in any format\n * @returns String representation\n */\nexport function stringifyResponse(response: unknown): string {\n if (response === null || response === undefined) {\n return '';\n }\n\n if (typeof response === 'string') {\n return response;\n }\n\n return JSON.stringify(response, null, 2);\n}\n\n/**\n * Checks if a response represents an error\n *\n * @param response - Response to check\n * @returns true if the response is an error\n */\nexport function isErrorResponse(response: unknown): boolean {\n if (response === null || response === undefined) {\n return false;\n }\n\n if (typeof response !== 'object') {\n return false;\n }\n\n const r = response as Record<string, unknown>;\n\n // Check isError flag directly\n if (r.isError === true) {\n return true;\n }\n\n // Check for normalized response with isError\n if ('raw' in r && typeof r.raw === 'object' && r.raw !== null) {\n const raw = r.raw as Record<string, unknown>;\n return raw.isError === true;\n }\n\n return false;\n}\n\n/**\n * Extracts error message from an error response\n *\n * @param response - Error response\n * @returns Error message or empty string if not an error\n */\nexport function extractErrorMessage(response: unknown): string {\n if (!isErrorResponse(response)) {\n return '';\n }\n\n // Extract text content which typically contains the error message\n return extractText(response);\n}\n\n/**\n * Normalizes whitespace in text for consistent comparison\n *\n * Collapses multiple whitespace characters (spaces, tabs, newlines) into single spaces\n * and trims leading/trailing whitespace.\n *\n * @param text - Text to normalize\n * @returns Normalized text with collapsed whitespace\n *\n * @example\n * ```typescript\n * normalizeWhitespace(' hello\\n\\n world ');\n * // Returns: \"hello world\"\n * ```\n */\nexport function normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n","/**\n * Response Validator\n *\n * Validates that a response exactly matches an expected value.\n */\n\nimport type { ValidationResult } from './types.js';\nimport { stringifyResponse } from './utils.js';\n\n/**\n * Validates that a response exactly matches the expected value\n *\n * Performs deep equality comparison using JSON serialization.\n *\n * @param actual - The actual response\n * @param expected - The expected response\n * @returns Validation result\n *\n * @example\n * ```typescript\n * const result = validateResponse(response, { status: 'ok', count: 42 });\n * if (!result.pass) {\n * console.log(result.message);\n * }\n * ```\n */\nexport function validateResponse(\n actual: unknown,\n expected: unknown\n): ValidationResult {\n const actualStr = stringifyResponse(actual);\n const expectedStr = stringifyResponse(expected);\n\n if (actualStr === expectedStr) {\n return {\n pass: true,\n message: 'Response matches expected value',\n };\n }\n\n return {\n pass: false,\n message: `Response does not match expected value`,\n details: {\n actual: truncateForDisplay(actualStr),\n expected: truncateForDisplay(expectedStr),\n },\n };\n}\n\n/**\n * Truncates a string for display in error messages\n */\nfunction truncateForDisplay(str: string, maxLength = 500): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Schema Validator\n *\n * Validates that a response matches a Zod schema.\n */\n\nimport type { ZodType, ZodError } from 'zod';\nimport type { ValidationResult, SchemaValidatorOptions } from './types.js';\nimport { extractText } from './utils.js';\n\n/**\n * Validates that a response matches a Zod schema\n *\n * Attempts to parse the response with the provided Zod schema.\n * If the response is a text representation of JSON, it will be parsed first.\n *\n * @param response - The response to validate\n * @param schema - The Zod schema to validate against\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n *\n * const WeatherSchema = z.object({\n * temperature: z.number(),\n * conditions: z.string(),\n * });\n *\n * const result = validateSchema(response, WeatherSchema);\n * if (!result.pass) {\n * console.log(result.message);\n * }\n * ```\n */\nexport function validateSchema(\n response: unknown,\n schema: ZodType,\n options: SchemaValidatorOptions = {}\n): ValidationResult {\n // Get the value to validate\n const valueToValidate = getValidatableValue(response);\n\n // If strict mode is enabled and we have an object schema with .strict(),\n // the schema itself should handle this - the option is for documentation\n if (options.strict && valueToValidate !== null) {\n // Strict mode is handled by the schema itself (using z.object().strict())\n // This option documents the intent but the actual strictness comes from the schema\n }\n\n try {\n // Attempt to parse with the schema\n schema.parse(valueToValidate);\n\n return {\n pass: true,\n message: 'Response matches schema',\n };\n } catch (error) {\n const zodError = error as ZodError;\n const issues = formatZodIssues(zodError);\n\n return {\n pass: false,\n message: `Response does not match schema: ${issues}`,\n details: {\n issues: zodError.issues,\n },\n };\n }\n}\n\n/**\n * Extracts a validatable value from a response\n *\n * Handles various response formats:\n * - NormalizedToolResponse: extracts structuredContent or parses text\n * - CallToolResult: extracts structuredContent or parses content\n * - Plain objects: used directly\n * - Strings: parsed as JSON\n */\nfunction getValidatableValue(response: unknown): unknown {\n if (response === null || response === undefined) {\n return null;\n }\n\n // Plain object - use directly (might be a schema-ready value)\n if (typeof response === 'object' && !Array.isArray(response)) {\n const r = response as Record<string, unknown>;\n\n // Check for structuredContent (MCP response with structured data)\n if ('structuredContent' in r && r.structuredContent !== undefined) {\n return r.structuredContent;\n }\n\n // Check for normalized response format\n if ('raw' in r && 'text' in r && 'isError' in r && 'contentBlocks' in r) {\n // It's a NormalizedToolResponse\n if (r.structuredContent !== undefined) {\n return r.structuredContent;\n }\n // Try to parse text as JSON\n const text = r.text as string;\n return tryParseJson(text) ?? response;\n }\n\n // Check for raw CallToolResult format\n if ('content' in r && Array.isArray(r.content)) {\n // Try to extract and parse text content\n const text = extractText(response);\n return tryParseJson(text) ?? response;\n }\n\n // Regular object - use as-is\n return response;\n }\n\n // String - try to parse as JSON\n if (typeof response === 'string') {\n return tryParseJson(response) ?? response;\n }\n\n // Array or primitive - use directly\n return response;\n}\n\n/**\n * Attempts to parse a string as JSON\n */\nfunction tryParseJson(text: string): unknown {\n if (!text || typeof text !== 'string') {\n return null;\n }\n\n const trimmed = text.trim();\n // Quick check for JSON-like strings\n if (\n !(trimmed.startsWith('{') || trimmed.startsWith('[')) ||\n !(trimmed.endsWith('}') || trimmed.endsWith(']'))\n ) {\n return null;\n }\n\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\n/**\n * Formats Zod issues into a human-readable string\n */\nfunction formatZodIssues(error: ZodError): string {\n const issues = error.issues.map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\n return `${path}: ${issue.message}`;\n });\n\n return issues.join('; ');\n}\n","/**\n * Text Validator\n *\n * Validates that a response contains expected text substrings.\n */\n\nimport type { ValidationResult, TextValidatorOptions } from './types.js';\nimport { extractText } from './utils.js';\n\n/**\n * Validates that a response contains all expected text substrings\n *\n * Extracts text from the response and checks that each expected substring\n * is present. By default, matching is case-sensitive.\n *\n * @param response - The response to validate\n * @param expected - Expected substring(s) to find\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * const result = validateText(response, ['temperature', 'conditions']);\n * if (!result.pass) {\n * console.log(result.message);\n * }\n *\n * // Case-insensitive matching\n * const result2 = validateText(response, 'HELLO', { caseSensitive: false });\n * ```\n */\nexport function validateText(\n response: unknown,\n expected: string | string[],\n options: TextValidatorOptions = {}\n): ValidationResult {\n const { caseSensitive = true } = options;\n\n // Normalize expected to array\n const expectedStrings = Array.isArray(expected) ? expected : [expected];\n\n // Extract text from response\n const text = extractText(response);\n\n // Apply case sensitivity\n const compareText = caseSensitive ? text : text.toLowerCase();\n\n // Check each expected substring\n const missing: string[] = [];\n for (const substring of expectedStrings) {\n const compareSubstring = caseSensitive\n ? substring\n : substring.toLowerCase();\n\n if (!compareText.includes(compareSubstring)) {\n missing.push(substring);\n }\n }\n\n if (missing.length === 0) {\n return {\n pass: true,\n message:\n expectedStrings.length === 1\n ? `Response contains expected text`\n : `Response contains all ${expectedStrings.length} expected substrings`,\n };\n }\n\n return {\n pass: false,\n message:\n missing.length === 1\n ? `Response does not contain expected text: \"${missing[0]}\"`\n : `Response is missing ${missing.length} expected substrings: ${missing.map((s) => `\"${s}\"`).join(', ')}`,\n details: {\n missing,\n textLength: text.length,\n textPreview: truncateForDisplay(text),\n },\n };\n}\n\n/**\n * Truncates a string for display in error messages\n */\nfunction truncateForDisplay(str: string, maxLength = 200): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Pattern Validator\n *\n * Validates that a response matches regex patterns.\n */\n\nimport type { ValidationResult, PatternValidatorOptions } from './types.js';\nimport { extractText } from './utils.js';\n\n/**\n * Validates that a response matches all expected regex patterns\n *\n * Extracts text from the response and checks that each pattern matches.\n * Patterns can be strings (which are compiled to RegExp) or RegExp objects.\n *\n * @param response - The response to validate\n * @param patterns - Expected pattern(s) to match\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * // String pattern\n * const result = validatePattern(response, 'temperature: \\\\d+');\n *\n * // RegExp pattern\n * const result2 = validatePattern(response, /temperature: \\d+/);\n *\n * // Multiple patterns\n * const result3 = validatePattern(response, [\n * /temperature: \\d+/,\n * /humidity: \\d+%/,\n * ]);\n *\n * // Case-insensitive matching\n * const result4 = validatePattern(response, 'HELLO', { caseSensitive: false });\n * ```\n */\nexport function validatePattern(\n response: unknown,\n patterns: string | RegExp | (string | RegExp)[],\n options: PatternValidatorOptions = {}\n): ValidationResult {\n const { caseSensitive = true } = options;\n const caseInsensitive = !caseSensitive;\n\n // Normalize patterns to array\n const patternList = Array.isArray(patterns) ? patterns : [patterns];\n\n // Extract text from response\n const text = extractText(response);\n\n // Check each pattern\n const unmatched: string[] = [];\n for (const pattern of patternList) {\n const regex = toRegExp(pattern, caseInsensitive);\n if (!regex.test(text)) {\n unmatched.push(patternToString(pattern));\n }\n }\n\n if (unmatched.length === 0) {\n return {\n pass: true,\n message:\n patternList.length === 1\n ? `Response matches pattern`\n : `Response matches all ${patternList.length} patterns`,\n };\n }\n\n return {\n pass: false,\n message:\n unmatched.length === 1\n ? `Response does not match pattern: ${unmatched[0]}`\n : `Response does not match ${unmatched.length} patterns: ${unmatched.join(', ')}`,\n details: {\n unmatched,\n textLength: text.length,\n textPreview: truncateForDisplay(text),\n },\n };\n}\n\n/**\n * Converts a pattern to a RegExp\n */\nfunction toRegExp(pattern: string | RegExp, caseInsensitive: boolean): RegExp {\n if (pattern instanceof RegExp) {\n // If caseInsensitive option is set but regex doesn't have it, add it\n if (caseInsensitive && !pattern.flags.includes('i')) {\n return new RegExp(pattern.source, pattern.flags + 'i');\n }\n return pattern;\n }\n\n // Compile string to RegExp\n const flags = caseInsensitive ? 'i' : '';\n return new RegExp(pattern, flags);\n}\n\n/**\n * Converts a pattern to a display string\n */\nfunction patternToString(pattern: string | RegExp): string {\n if (pattern instanceof RegExp) {\n return pattern.toString();\n }\n return `/${pattern}/`;\n}\n\n/**\n * Truncates a string for display in error messages\n */\nfunction truncateForDisplay(str: string, maxLength = 200): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Error Validator\n *\n * Validates error response behavior.\n */\n\nimport type { ValidationResult } from './types.js';\nimport { isErrorResponse, extractErrorMessage, extractText } from './utils.js';\n\n/**\n * Validates that a response is (or is not) an error\n *\n * Can check for:\n * - Any error (expected = true)\n * - No error (expected = false)\n * - Error with specific message(s) (expected = string or string[])\n *\n * @param response - The response to validate\n * @param expected - What to expect (true for any error, false for no error, string for specific message)\n * @returns Validation result\n *\n * @example\n * ```typescript\n * // Expect any error\n * const result = validateError(response, true);\n *\n * // Expect no error\n * const result2 = validateError(response, false);\n *\n * // Expect error with specific message\n * const result3 = validateError(response, 'File not found');\n *\n * // Expect error containing one of several messages\n * const result4 = validateError(response, ['not found', 'does not exist']);\n * ```\n */\nexport function validateError(\n response: unknown,\n expected: boolean | string | string[] = true\n): ValidationResult {\n const actualIsError = isErrorResponse(response);\n const errorMessage = actualIsError ? extractErrorMessage(response) : '';\n\n // Handle boolean expectation\n if (typeof expected === 'boolean') {\n if (expected) {\n // Expect an error\n if (actualIsError) {\n return {\n pass: true,\n message: 'Response is an error as expected',\n };\n }\n return {\n pass: false,\n message: 'Expected an error response but got success',\n details: {\n textPreview: truncateForDisplay(extractText(response)),\n },\n };\n } else {\n // Expect no error\n if (!actualIsError) {\n return {\n pass: true,\n message: 'Response is not an error as expected',\n };\n }\n return {\n pass: false,\n message: `Expected a success response but got error: \"${truncateForDisplay(errorMessage)}\"`,\n details: {\n errorMessage,\n },\n };\n }\n }\n\n // Handle string or string[] expectation\n const expectedMessages = Array.isArray(expected) ? expected : [expected];\n\n // Must be an error first\n if (!actualIsError) {\n return {\n pass: false,\n message: `Expected an error containing \"${expectedMessages[0]}\" but got success`,\n details: {\n textPreview: truncateForDisplay(extractText(response)),\n },\n };\n }\n\n // Check if error message contains any of the expected strings\n const matched = expectedMessages.some((msg) =>\n errorMessage.toLowerCase().includes(msg.toLowerCase())\n );\n\n if (matched) {\n return {\n pass: true,\n message: 'Error message contains expected text',\n };\n }\n\n return {\n pass: false,\n message:\n expectedMessages.length === 1\n ? `Error message does not contain \"${expectedMessages[0]}\"`\n : `Error message does not contain any of: ${expectedMessages.map((m) => `\"${m}\"`).join(', ')}`,\n details: {\n actualErrorMessage: errorMessage,\n expectedToContain: expectedMessages,\n },\n };\n}\n\n/**\n * Truncates a string for display in error messages\n */\nfunction truncateForDisplay(str: string, maxLength = 200): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Size Validator\n *\n * Validates that a response meets size constraints.\n */\n\nimport type { ValidationResult, SizeValidatorOptions } from './types.js';\nimport { getResponseSizeBytes } from './utils.js';\n\n/**\n * Validates that a response meets size constraints\n *\n * Checks that the response size in bytes is within the specified bounds.\n * At least one of minBytes or maxBytes must be provided.\n *\n * @param response - The response to validate\n * @param options - Size constraints\n * @returns Validation result\n *\n * @example\n * ```typescript\n * // Maximum size check\n * const result = validateSize(response, { maxBytes: 10000 });\n *\n * // Minimum size check\n * const result2 = validateSize(response, { minBytes: 100 });\n *\n * // Both bounds\n * const result3 = validateSize(response, { minBytes: 100, maxBytes: 10000 });\n * ```\n */\nexport function validateSize(\n response: unknown,\n options: SizeValidatorOptions\n): ValidationResult {\n const { maxBytes, minBytes } = options;\n\n // Require at least one bound\n if (maxBytes === undefined && minBytes === undefined) {\n return {\n pass: false,\n message: 'Size validation requires at least one of maxBytes or minBytes',\n };\n }\n\n const actualSize = getResponseSizeBytes(response);\n const issues: string[] = [];\n\n // Check minimum\n if (minBytes !== undefined && actualSize < minBytes) {\n issues.push(\n `Response size (${formatBytes(actualSize)}) is below minimum (${formatBytes(minBytes)})`\n );\n }\n\n // Check maximum\n if (maxBytes !== undefined && actualSize > maxBytes) {\n issues.push(\n `Response size (${formatBytes(actualSize)}) exceeds maximum (${formatBytes(maxBytes)})`\n );\n }\n\n if (issues.length === 0) {\n return {\n pass: true,\n message: `Response size (${formatBytes(actualSize)}) is within bounds`,\n details: {\n actualBytes: actualSize,\n },\n };\n }\n\n return {\n pass: false,\n message: issues.join('; '),\n details: {\n actualBytes: actualSize,\n minBytes,\n maxBytes,\n },\n };\n}\n\n/**\n * Formats bytes as a human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} bytes`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/**\n * Tool call validators for mcp_host simulation results.\n *\n * These validators extract the tool call trace from an MCPHostSimulationResult\n * and apply assertions against expected call lists and counts.\n */\nimport type { ValidationResult } from './types.js';\nimport type {\n MCPHostSimulationResult,\n LLMToolCall,\n} from '../../evals/mcpHost/mcpHostTypes.js';\n\nexport interface ToolCallExpectation {\n calls: Array<{\n name: string;\n arguments?: Record<string, unknown>;\n required?: boolean;\n }>;\n order?: 'strict' | 'any';\n exclusive?: boolean;\n}\n\nexport interface ToolCallCountOptions {\n min?: number;\n max?: number;\n exact?: number;\n}\n\nfunction isSimulationResult(value: unknown): value is MCPHostSimulationResult {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'success' in value &&\n 'toolCalls' in value &&\n Array.isArray((value as MCPHostSimulationResult).toolCalls)\n );\n}\n\n/**\n * Checks whether a value is a `{ $pattern: \"regex\" }` matcher object.\n */\nfunction isPatternMatcher(\n v: unknown\n): v is { $pattern: string; $flags?: string } {\n return (\n typeof v === 'object' &&\n v !== null &&\n '$pattern' in v &&\n typeof (v as Record<string, unknown>)['$pattern'] === 'string'\n );\n}\n\nfunction partialMatch(\n actual: Record<string, unknown>,\n expected: Record<string, unknown>\n): boolean {\n return Object.entries(expected).every(([k, v]) => {\n const actualVal = actual[k];\n\n // { $pattern: \"regex\", $flags?: \"i\" } — match actual string against regex\n if (isPatternMatcher(v)) {\n if (typeof actualVal !== 'string') return false;\n const re = new RegExp(v.$pattern, v.$flags);\n return re.test(actualVal);\n }\n\n if (\n typeof v === 'object' &&\n v !== null &&\n typeof actualVal === 'object' &&\n actualVal !== null\n ) {\n return partialMatch(\n actualVal as Record<string, unknown>,\n v as Record<string, unknown>\n );\n }\n // Key order in nested objects is handled by recursion — this branch only\n // reaches leaf primitives (strings, numbers, booleans, null) and arrays,\n // where JSON.stringify comparison is correct.\n return JSON.stringify(actualVal) === JSON.stringify(v);\n });\n}\n\nfunction findMatchingCall(\n actual: LLMToolCall[],\n expected: ToolCallExpectation['calls'][number],\n startIndex = 0\n): number {\n for (let i = startIndex; i < actual.length; i++) {\n const call = actual[i]!;\n if (call.name !== expected.name) continue;\n if (\n expected.arguments !== undefined &&\n !partialMatch(call.arguments ?? {}, expected.arguments)\n ) {\n continue;\n }\n return i;\n }\n return -1;\n}\n\n/**\n * Validates tool calls made during an MCP host simulation.\n *\n * @param response - Must be an MCPHostSimulationResult (from mcp_host mode)\n * @param expectation - Expected tool call specification\n */\nexport function validateToolCalls(\n response: unknown,\n expectation: ToolCallExpectation\n): ValidationResult {\n if (!isSimulationResult(response)) {\n return {\n pass: false,\n message:\n 'toolsTriggered expectation requires mcp_host mode — response must be an MCPHostSimulationResult',\n };\n }\n\n const actual = response.toolCalls;\n\n // Compute recall: fraction of required calls that were made\n const requiredCalls = expectation.calls.filter((c) => c.required !== false);\n const calledRequiredCount = requiredCalls.filter(\n (expected) => findMatchingCall(actual, expected) !== -1\n ).length;\n const recall =\n requiredCalls.length > 0 ? calledRequiredCount / requiredCalls.length : 1.0;\n\n // Compute precision: fraction of actual calls that were expected.\n // Always computed so the metric reflects actual tool call efficiency.\n // Whether unexpected calls cause a FAILURE is controlled separately by exclusive=true (lines below).\n const allowedNames = new Set(expectation.calls.map((c) => c.name));\n const precision =\n actual.length > 0\n ? actual.filter((c) => allowedNames.has(c.name)).length / actual.length\n : 1.0;\n\n const metrics = { precision, recall };\n\n const order = expectation.order ?? 'any';\n\n if (order === 'strict') {\n // All calls must appear in the specified sequence\n let searchFrom = 0;\n for (const expected of expectation.calls) {\n const idx = findMatchingCall(actual, expected, searchFrom);\n if (idx === -1) {\n if (expected.required !== false) {\n return {\n pass: false,\n message: `Expected tool '${expected.name}' to be called in sequence (starting from position ${searchFrom}), but it was not found`,\n metrics,\n };\n }\n } else {\n searchFrom = idx + 1;\n }\n }\n } else {\n // Any order: each required call must appear somewhere\n const required = expectation.calls.filter((c) => c.required !== false);\n for (const expected of required) {\n const idx = findMatchingCall(actual, expected);\n if (idx === -1) {\n const argsNote =\n expected.arguments !== undefined\n ? ` with args ${JSON.stringify(expected.arguments)}`\n : '';\n return {\n pass: false,\n message: `Expected tool '${expected.name}'${argsNote} to be called, but it was not`,\n metrics,\n };\n }\n }\n }\n\n if (expectation.exclusive === true) {\n const unexpected = actual.filter((c) => !allowedNames.has(c.name));\n if (unexpected.length > 0) {\n const names = unexpected.map((c) => `'${c.name}'`).join(', ');\n return {\n pass: false,\n message: `Unexpected tool calls: ${names}. Only ${[...allowedNames].map((n) => `'${n}'`).join(', ')} are allowed`,\n metrics,\n };\n }\n }\n\n return { pass: true, message: 'All tool call expectations met', metrics };\n}\n\n/**\n * Validates the number of tool calls made during an MCP host simulation.\n *\n * @param response - Must be an MCPHostSimulationResult (from mcp_host mode)\n * @param options - Count constraints (min, max, exact)\n */\nexport function validateToolCallCount(\n response: unknown,\n options: ToolCallCountOptions\n): ValidationResult {\n if (!isSimulationResult(response)) {\n return {\n pass: false,\n message:\n 'toolCallCount expectation requires mcp_host mode — response must be an MCPHostSimulationResult',\n };\n }\n\n const count = response.toolCalls.length;\n const { min, max, exact } = options;\n\n if (exact !== undefined && count !== exact) {\n return {\n pass: false,\n message: `Expected exactly ${exact} tool call(s), but got ${count}`,\n };\n }\n\n if (min !== undefined && count < min) {\n return {\n pass: false,\n message: `Expected at least ${min} tool call(s), but got ${count}`,\n };\n }\n\n if (max !== undefined && count > max) {\n return {\n pass: false,\n message: `Expected at most ${max} tool call(s), but got ${count}`,\n };\n }\n\n return {\n pass: true,\n message: `Tool call count (${count}) is within expected range`,\n };\n}\n","/**\n * Built-in judge rubrics matching Glean EvalV2's named judge types.\n * Use these for consistent, standardized evaluations across teams.\n *\n * All built-in rubrics use a 5-point scale: 0.0 / 0.25 / 0.5 / 0.75 / 1.0\n */\nexport type BuiltInRubric =\n | 'correctness'\n | 'completeness'\n | 'groundedness'\n | 'instruction-following'\n | 'conciseness';\n\nexport const BUILT_IN_RUBRICS: Record<BuiltInRubric, string> = {\n correctness:\n 'Evaluate whether the response is factually correct and accurately answers the question. ' +\n 'Compare against the reference answer if provided. ' +\n 'Score 1.0 for fully correct with no errors; ' +\n 'Score 0.75 for mostly correct with one minor inaccuracy or omission; ' +\n 'Score 0.5 for partially correct — answers part of the question but misses key elements; ' +\n 'Score 0.25 for minimally relevant but substantially incorrect or missing most key details; ' +\n 'Score 0.0 for incorrect, irrelevant, or directly contradicting the reference.',\n\n completeness:\n 'Evaluate whether the response fully addresses all aspects of the question. ' +\n 'Score 1.0 if the response covers all key points comprehensively; ' +\n 'Score 0.75 if the response covers most key points with one minor gap; ' +\n 'Score 0.5 if the response partially answers — covers some aspects but misses others; ' +\n 'Score 0.25 if the response touches on the topic but misses most key aspects; ' +\n 'Score 0.0 if major aspects of the question are entirely missing or the response is off-topic.',\n\n groundedness:\n 'Evaluate whether all claims in the response are supported by the retrieved context or reference. ' +\n 'Penalize unsupported assertions or hallucinated facts. ' +\n 'Score 1.0 for fully grounded — every claim is traceable to the provided context; ' +\n 'Score 0.75 for mostly grounded with one minor unsupported detail; ' +\n 'Score 0.5 for partially grounded — some claims are supported but notable hallucinations are present; ' +\n 'Score 0.25 for minimally grounded — most claims are unsupported or invented; ' +\n 'Score 0.0 for completely hallucinated or contradicting the provided context.',\n\n 'instruction-following':\n 'Evaluate whether the response follows the instructions given in the question. ' +\n 'Check format, tone, constraints, and task completion. ' +\n 'Score 1.0 for full compliance — all instructions are followed precisely; ' +\n 'Score 0.75 for mostly compliant with one minor deviation from the instructions; ' +\n 'Score 0.5 for partial compliance — some instructions followed but key constraints violated; ' +\n 'Score 0.25 for minimal compliance — the response loosely addresses the task but ignores most instructions; ' +\n 'Score 0.0 for non-compliance — the response disregards the instructions entirely.',\n\n conciseness:\n 'Evaluate whether the response is appropriately concise without losing important information. ' +\n 'Penalize unnecessary verbosity, padding, or repetition. ' +\n 'Score 1.0 for well-sized — concise and complete with no unnecessary content; ' +\n 'Score 0.75 for slightly verbose but no information is lost or repeated; ' +\n 'Score 0.5 for moderately verbose — some padding or repetition that reduces clarity; ' +\n 'Score 0.25 for excessively verbose — significantly overlong with substantial filler or repetition; ' +\n 'Score 0.0 for extremely verbose — so padded or repetitive that the core answer is obscured.',\n};\n\n/** A rubric specification: either a built-in named rubric or custom text. */\nexport type RubricSpec = BuiltInRubric | { text: string };\n\n/**\n * Returns true if `s` is a built-in rubric name.\n */\nexport function isBuiltInRubric(s: unknown): s is BuiltInRubric {\n return typeof s === 'string' && s in BUILT_IN_RUBRICS;\n}\n\n/**\n * Resolves a RubricSpec to its full rubric text.\n * - Built-in name → returns the expanded rubric text from BUILT_IN_RUBRICS\n * - Custom object → returns rubric.text as-is\n */\nexport function resolveRubric(rubric: RubricSpec): string {\n if (typeof rubric === 'string') {\n return BUILT_IN_RUBRICS[rubric];\n }\n return rubric.text;\n}\n","import { z } from 'zod';\n\n/**\n * Zod schema for validating judge LLM responses.\n * Ensures the response has the required structure before it is used.\n */\nexport const JudgeResponseSchema = z.object({\n pass: z.boolean(),\n score: z.number().min(0).max(1),\n reasoning: z.string(),\n});\n\n/**\n * The validated shape returned by a judge LLM.\n */\nexport type JudgeResponse = z.infer<typeof JudgeResponseSchema>;\n\n/**\n * Usage metrics from Claude Agent SDK response\n */\nexport interface UsageMetrics {\n /**\n * Number of input tokens consumed\n */\n inputTokens: number;\n\n /**\n * Number of output tokens generated\n */\n outputTokens: number;\n\n /**\n * Total cost in USD\n */\n totalCostUsd: number;\n\n /**\n * Execution duration in milliseconds\n */\n durationMs: number;\n\n /**\n * API call duration in milliseconds (excluding network overhead)\n */\n durationApiMs?: number;\n\n /**\n * Number of tokens read from cache\n */\n cacheReadInputTokens?: number;\n\n /**\n * Number of tokens written to cache\n */\n cacheCreationInputTokens?: number;\n}\n\n/** Valid LLM judge provider kinds. */\nexport type ProviderKind =\n | 'anthropic'\n | 'vertex-anthropic'\n | 'anthropic-agent-sdk'\n | 'openai'\n | 'google';\n\n/**\n * Configuration for an LLM judge\n */\nexport interface JudgeConfig {\n /**\n * LLM provider to use\n * @default 'anthropic'\n */\n provider?: ProviderKind;\n\n /**\n * Environment variable name containing the API key\n * @default 'ANTHROPIC_API_KEY'\n */\n apiKeyEnvVar?: string;\n\n /**\n * Model to use for judging\n * @default 'claude-sonnet-4-20250514'\n */\n model?: string;\n\n /**\n * Maximum tokens for response\n * @default 1000\n */\n maxTokens?: number;\n\n /**\n * Temperature (0-1, lower is more deterministic)\n * @default 0.0\n */\n temperature?: number;\n\n /**\n * Maximum budget in USD for the judge evaluation\n * @default 0.10\n */\n maxBudgetUsd?: number;\n\n /**\n * Maximum size (in bytes) for tool output before failing the test\n * When set, the judge will fail if the candidate response exceeds this size\n */\n maxToolOutputSize?: number;\n}\n\n/**\n * Result from LLM judge evaluation\n */\nexport interface JudgeResult {\n /**\n * Whether the evaluation passed\n */\n pass: boolean;\n\n /**\n * Numeric score (0-1, where 1 is best)\n */\n score?: number;\n\n /**\n * Reasoning/explanation from the judge\n */\n reasoning?: string;\n\n /**\n * Usage metrics from the Claude Agent SDK\n */\n usage?: UsageMetrics;\n\n /**\n * Size of the candidate response in bytes (for maxToolOutputSize tracking)\n */\n candidateSizeBytes?: number;\n\n /**\n * Whether the candidate exceeded maxToolOutputSize\n */\n exceedsMaxToolOutputSize?: boolean;\n\n /**\n * Standard deviation of individual rep scores.\n * Only populated when the judge was run with reps > 1.\n */\n scoreStdDev?: number;\n\n /**\n * True when the standard deviation across reps exceeds 0.2, indicating\n * that the rubric may be ambiguous or the judge is non-deterministic.\n * Only populated when the judge was run with reps > 1.\n */\n highVariance?: boolean;\n\n /**\n * Individual scores from each judge rep.\n * Only populated when the judge was run with reps > 1.\n */\n scores?: number[];\n}\n\nexport type { BuiltInRubric, RubricSpec } from './rubrics.js';\nexport { BUILT_IN_RUBRICS, resolveRubric, isBuiltInRubric } from './rubrics.js';\n\n/**\n * LLM judge client interface\n */\nexport interface Judge {\n /**\n * Evaluates a candidate response against a reference\n *\n * @param candidate - The actual response to evaluate\n * @param reference - The expected/reference response (or null if not applicable)\n * @param rubric - The evaluation rubric/criteria\n * @returns Evaluation result with usage metrics\n */\n evaluate(\n candidate: unknown,\n reference: unknown,\n rubric: string\n ): Promise<JudgeResult>;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\nimport type { Judge, JudgeConfig, JudgeResult } from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates an Anthropic-backed LLM judge using the Anthropic SDK directly.\n * Requires the `@anthropic-ai/sdk` package and an Anthropic API key.\n */\nexport function createAnthropicJudge(config: JudgeConfig = {}): Judge {\n const apiKeyEnvVar = config.apiKeyEnvVar ?? 'ANTHROPIC_API_KEY';\n const apiKey = process.env[apiKeyEnvVar];\n if (!apiKey) {\n throw new Error(\n `Anthropic judge requires an API key. Set the ${apiKeyEnvVar} environment variable.`\n );\n }\n\n const model = config.model ?? 'claude-sonnet-4-20250514';\n const maxTokens = config.maxTokens ?? 1000;\n const temperature = config.temperature ?? 0.0;\n\n return {\n async evaluate(candidate, reference, rubric): Promise<JudgeResult> {\n let anthropicModule: any;\n try {\n // @ts-expect-error - optional: npm install @anthropic-ai/sdk\n anthropicModule = await import('@anthropic-ai/sdk');\n } catch (err) {\n throw new Error(\n 'Anthropic judge requires the `@anthropic-ai/sdk` package. ' +\n 'Install it with: npm install @anthropic-ai/sdk\\n' +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const client = new anthropicModule.default({ apiKey });\n const prompt = buildJudgePrompt(candidate, reference, rubric);\n\n const startTime = Date.now();\n const response = await client.messages.create({\n model,\n max_tokens: maxTokens,\n temperature,\n system:\n 'You are an expert evaluator. Respond with valid JSON only: {\"pass\": true|false, \"score\": 0.0-1.0, \"reasoning\": \"explanation\"}',\n messages: [{ role: 'user', content: prompt }],\n });\n const durationMs = Date.now() - startTime;\n\n const textBlock = (response.content as any[]).find(\n (b: any) => b.type === 'text'\n );\n const text = (textBlock?.text as string) ?? '';\n const parsed = parseJudgeResponse(text);\n\n return {\n pass: parsed.pass,\n score: parsed.score,\n reasoning: parsed.reasoning,\n usage: {\n inputTokens: (response.usage?.input_tokens as number) ?? 0,\n outputTokens: (response.usage?.output_tokens as number) ?? 0,\n totalCostUsd: 0,\n durationMs,\n },\n };\n },\n };\n}\n\nfunction buildJudgePrompt(\n candidate: unknown,\n reference: unknown,\n rubric: string\n): string {\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n return (\n `Rubric:\\n${rubric}\\n\\n` +\n `<candidate_response>\\n${candidateStr}\\n</candidate_response>\\n\\n` +\n `<reference_answer>\\n${referenceStr ?? 'No reference provided.'}\\n</reference_answer>\\n\\n` +\n `Evaluate and return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}`\n );\n}\n\nfunction parseJudgeResponse(text: string): {\n pass: boolean;\n score: number;\n reasoning: string;\n} {\n const cleaned = text\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n\n const result = JudgeResponseSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${cleaned.slice(0, 500)}\\nValidation errors: ${JSON.stringify(result.error.issues)}`\n );\n }\n return result.data;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\nimport type { Judge, JudgeConfig, JudgeResult } from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates an Anthropic-backed LLM judge that routes through Google Vertex AI.\n * Requires the `@anthropic-ai/vertex-sdk` package and Application Default Credentials.\n * Set GOOGLE_VERTEX_PROJECT and GOOGLE_VERTEX_LOCATION env vars.\n */\nexport function createVertexAnthropicJudge(config: JudgeConfig = {}): Judge {\n const model = config.model ?? 'claude-sonnet-4-20250514';\n const maxTokens = config.maxTokens ?? 1000;\n const temperature = config.temperature ?? 0.0;\n\n return {\n async evaluate(candidate, reference, rubric): Promise<JudgeResult> {\n let vertexModule: any;\n try {\n // @ts-expect-error - optional: npm install @anthropic-ai/vertex-sdk\n vertexModule = await import('@anthropic-ai/vertex-sdk');\n } catch (err) {\n throw new Error(\n 'Vertex Anthropic judge requires the `@anthropic-ai/vertex-sdk` package. ' +\n 'Install it with: npm install @anthropic-ai/vertex-sdk\\n' +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const client = new vertexModule.AnthropicVertex({\n projectId:\n process.env.GOOGLE_VERTEX_PROJECT ?? process.env.CLOUD_ML_PROJECT_ID,\n region: process.env.GOOGLE_VERTEX_LOCATION ?? 'us-east5',\n });\n\n const prompt = buildJudgePrompt(candidate, reference, rubric);\n\n const startTime = Date.now();\n const response = await client.messages.create({\n model,\n max_tokens: maxTokens,\n temperature,\n system:\n 'You are an expert evaluator. Respond with valid JSON only: {\"pass\": true|false, \"score\": 0.0-1.0, \"reasoning\": \"explanation\"}',\n messages: [{ role: 'user', content: prompt }],\n });\n const durationMs = Date.now() - startTime;\n\n const textBlock = (response.content as any[]).find(\n (b: any) => b.type === 'text'\n );\n const text = (textBlock?.text as string) ?? '';\n const parsed = parseJudgeResponse(text);\n\n return {\n pass: parsed.pass,\n score: parsed.score,\n reasoning: parsed.reasoning,\n usage: {\n inputTokens: (response.usage?.input_tokens as number) ?? 0,\n outputTokens: (response.usage?.output_tokens as number) ?? 0,\n totalCostUsd: 0,\n durationMs,\n },\n };\n },\n };\n}\n\nfunction buildJudgePrompt(\n candidate: unknown,\n reference: unknown,\n rubric: string\n): string {\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n return (\n `Rubric:\\n${rubric}\\n\\n` +\n `<candidate_response>\\n${candidateStr}\\n</candidate_response>\\n\\n` +\n `<reference_answer>\\n${referenceStr ?? 'No reference provided.'}\\n</reference_answer>\\n\\n` +\n `Evaluate and return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}`\n );\n}\n\nfunction parseJudgeResponse(text: string): {\n pass: boolean;\n score: number;\n reasoning: string;\n} {\n const cleaned = text\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n\n const result = JudgeResponseSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${cleaned.slice(0, 500)}\\nValidation errors: ${JSON.stringify(result.error.issues)}`\n );\n }\n return result.data;\n}\n","import { query } from '@anthropic-ai/claude-agent-sdk';\nimport type {\n JudgeConfig,\n Judge,\n JudgeResult,\n UsageMetrics,\n} from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates a Claude Agent SDK-based LLM judge client\n *\n * Uses the Claude Agent SDK query() function for evaluation.\n * This is a response-only judge that does not use any tools.\n *\n * @param config - Judge configuration\n * @returns Claude agent judge client\n */\nexport function createClaudeAgentJudge(config: JudgeConfig): Judge {\n const model = config.model ?? 'claude-sonnet-4-20250514';\n const maxBudgetUsd = config.maxBudgetUsd ?? 0.1;\n const maxToolOutputSize = config.maxToolOutputSize;\n\n return {\n async evaluate(\n candidate: unknown,\n reference: unknown,\n rubric: string\n ): Promise<JudgeResult> {\n // Calculate candidate size for threshold check\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n const candidateSizeBytes = Buffer.byteLength(candidateStr, 'utf8');\n\n // Check maxToolOutputSize threshold before calling API (fail fast, save money)\n if (\n maxToolOutputSize !== undefined &&\n candidateSizeBytes > maxToolOutputSize\n ) {\n return {\n pass: false,\n score: 0,\n reasoning: `Tool output size (${candidateSizeBytes} bytes) exceeds maximum allowed size (${maxToolOutputSize} bytes)`,\n candidateSizeBytes,\n exceedsMaxToolOutputSize: true,\n };\n }\n\n // Build evaluation prompt\n const prompt = buildJudgePrompt(candidate, reference, rubric);\n\n try {\n // Use query() with no tools for response-only mode\n // Iterate through the generator to get the final result message\n let resultMessage:\n | {\n type: 'result';\n result?: string;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n total_cost_usd?: number;\n duration_ms?: number;\n duration_api_ms?: number;\n subtype?: string;\n errors?: string[];\n }\n | undefined;\n\n for await (const message of query({\n prompt,\n options: {\n model,\n maxBudgetUsd,\n // Use empty tools array for response-only mode\n tools: [],\n // Bypass permissions since we're not using any tools\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n // Use a custom system prompt for JSON output\n systemPrompt: buildSystemPrompt(),\n // Limit to 1 turn since this is a simple evaluation\n maxTurns: 1,\n },\n })) {\n // The final message will be the SDKResultMessage\n if (message.type === 'result') {\n resultMessage = message as unknown as typeof resultMessage;\n }\n }\n\n if (!resultMessage) {\n throw new Error('No result message received from Claude Agent SDK');\n }\n\n // Check for errors\n if (\n resultMessage.subtype !== 'success' &&\n resultMessage.errors?.length\n ) {\n throw new Error(\n `Claude Agent SDK error: ${resultMessage.errors.join(', ')}`\n );\n }\n\n // Extract text response from the result\n const responseText = resultMessage.result ?? '';\n\n // Parse the JSON response\n const parsed = parseJudgeResponse(responseText);\n\n // Build usage metrics from SDK response\n const usage: UsageMetrics = {\n inputTokens: resultMessage.usage?.input_tokens ?? 0,\n outputTokens: resultMessage.usage?.output_tokens ?? 0,\n totalCostUsd: resultMessage.total_cost_usd ?? 0,\n durationMs: resultMessage.duration_ms ?? 0,\n durationApiMs: resultMessage.duration_api_ms,\n cacheReadInputTokens: resultMessage.usage?.cache_read_input_tokens,\n cacheCreationInputTokens:\n resultMessage.usage?.cache_creation_input_tokens,\n };\n\n return {\n pass: parsed.pass,\n score: parsed.score,\n reasoning: parsed.reasoning,\n usage,\n candidateSizeBytes,\n exceedsMaxToolOutputSize: false,\n };\n } catch (error) {\n throw new Error(\n `Claude Agent judge evaluation failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n };\n}\n\n/**\n * Builds the system prompt for the judge\n */\nfunction buildSystemPrompt(): string {\n return (\n 'You are an expert evaluator. Evaluate the candidate response based on the rubric provided. ' +\n 'Respond ONLY with valid JSON in this exact format: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}. ' +\n 'Do not include any other text, markdown formatting, or code blocks.'\n );\n}\n\n/**\n * Builds the user prompt for evaluation\n */\nfunction buildJudgePrompt(\n candidate: unknown,\n reference: unknown,\n rubric: string\n): string {\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n const parts: Array<string> = [];\n\n parts.push('Rubric:\\n');\n parts.push(rubric);\n parts.push('\\n\\n<candidate_response>\\n');\n parts.push(candidateStr);\n parts.push('\\n</candidate_response>\\n\\n');\n\n parts.push('<reference_answer>\\n');\n parts.push(referenceStr ?? 'No reference provided.');\n parts.push('\\n</reference_answer>\\n\\n');\n\n parts.push(\n 'Evaluate the candidate response against the rubric' +\n (referenceStr !== null\n ? ', comparing it with the reference answer if helpful'\n : '') +\n '. Return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}'\n );\n\n return parts.join('');\n}\n\n/**\n * Parses and validates the JSON response from the judge, handling markdown code blocks.\n * Throws a descriptive error if the response cannot be parsed or fails schema validation.\n */\nfunction parseJudgeResponse(text: string): {\n pass: boolean;\n score: number;\n reasoning: string;\n} {\n let jsonText = text.trim();\n\n // Strip markdown code blocks if present\n if (jsonText.startsWith('```json')) {\n jsonText = jsonText.slice(7);\n }\n if (jsonText.startsWith('```')) {\n jsonText = jsonText.slice(3);\n }\n if (jsonText.endsWith('```')) {\n jsonText = jsonText.slice(0, -3);\n }\n jsonText = jsonText.trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonText);\n } catch {\n // If JSON parsing fails, try to extract from the text\n // Sometimes the model adds extra text before/after JSON\n const jsonMatch = jsonText.match(/\\{[\\s\\S]*\"pass\"[\\s\\S]*\\}/);\n if (jsonMatch) {\n parsed = JSON.parse(jsonMatch[0]);\n } else {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n }\n\n const result = JudgeResponseSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${jsonText.slice(0, 500)}\\nValidation errors: ${JSON.stringify(result.error.issues)}`\n );\n }\n return result.data;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\nimport type { Judge, JudgeConfig, JudgeResult } from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates an OpenAI-backed LLM judge.\n * Requires the `openai` package and an OpenAI API key.\n */\nexport function createOpenAIJudge(config: JudgeConfig = {}): Judge {\n const apiKeyEnvVar = config.apiKeyEnvVar ?? 'OPENAI_API_KEY';\n const apiKey = process.env[apiKeyEnvVar];\n if (!apiKey) {\n throw new Error(\n `OpenAI judge requires an API key. Set the ${apiKeyEnvVar} environment variable.`\n );\n }\n\n const model = config.model ?? 'gpt-4o';\n const maxTokens = config.maxTokens ?? 1000;\n const temperature = config.temperature ?? 0.0;\n\n return {\n async evaluate(candidate, reference, rubric): Promise<JudgeResult> {\n // Dynamic import keeps `openai` an optional runtime dep.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let openaiModule: any;\n try {\n // @ts-expect-error - optional: npm install openai\n openaiModule = await import('openai');\n } catch (err) {\n throw new Error(\n 'OpenAI judge requires the `openai` package. Install it with: npm install openai\\n' +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const client = new openaiModule.default({ apiKey });\n const prompt = buildJudgePrompt(candidate, reference, rubric);\n\n const startTime = Date.now();\n const completion = await client.chat.completions.create({\n model,\n max_tokens: maxTokens,\n temperature,\n messages: [\n {\n role: 'system',\n content:\n 'You are an expert evaluator. Respond with valid JSON only: {\"pass\": true|false, \"score\": 0.0-1.0, \"reasoning\": \"explanation\"}',\n },\n { role: 'user', content: prompt },\n ],\n });\n const durationMs = Date.now() - startTime;\n\n const text =\n (completion.choices[0]?.message.content as string | null | undefined) ??\n '';\n const parsed = parseJudgeResponse(text);\n\n return {\n pass: parsed.pass,\n score: parsed.score,\n reasoning: parsed.reasoning,\n usage: {\n inputTokens:\n (completion.usage?.prompt_tokens as number | undefined) ?? 0,\n outputTokens:\n (completion.usage?.completion_tokens as number | undefined) ?? 0,\n totalCostUsd: 0,\n durationMs,\n },\n };\n },\n };\n}\n\nfunction buildJudgePrompt(\n candidate: unknown,\n reference: unknown,\n rubric: string\n): string {\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n return (\n `Rubric:\\n${rubric}\\n\\n` +\n `<candidate_response>\\n${candidateStr}\\n</candidate_response>\\n\\n` +\n `<reference_answer>\\n${referenceStr ?? 'No reference provided.'}\\n</reference_answer>\\n\\n` +\n `Evaluate and return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}`\n );\n}\n\nfunction parseJudgeResponse(text: string): {\n pass: boolean;\n score: number;\n reasoning: string;\n} {\n const cleaned = text\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n\n const result = JudgeResponseSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${cleaned.slice(0, 500)}\\nValidation errors: ${JSON.stringify(result.error.issues)}`\n );\n }\n return result.data;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\nimport type { Judge, JudgeConfig, JudgeResult } from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates a Google Gemini-backed LLM judge.\n * Requires the `@google/generative-ai` package and a Google API key.\n */\nexport function createGoogleJudge(config: JudgeConfig = {}): Judge {\n const apiKeyEnvVar = config.apiKeyEnvVar ?? 'GOOGLE_API_KEY';\n const apiKey = process.env[apiKeyEnvVar];\n if (!apiKey) {\n throw new Error(\n `Google judge requires an API key. Set the ${apiKeyEnvVar} environment variable.`\n );\n }\n\n const model = config.model ?? 'gemini-2.0-flash';\n const maxTokens = config.maxTokens ?? 1000;\n\n return {\n async evaluate(candidate, reference, rubric): Promise<JudgeResult> {\n // Dynamic import keeps `@google/generative-ai` an optional runtime dep.\n let googleModule: any;\n try {\n // @ts-expect-error - optional: npm install @google/generative-ai\n googleModule = await import('@google/generative-ai');\n } catch (err) {\n throw new Error(\n 'Google judge requires the `@google/generative-ai` package. Install it with: npm install @google/generative-ai\\n' +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const genAI = new googleModule.GoogleGenerativeAI(apiKey);\n const gemini = genAI.getGenerativeModel({\n model,\n generationConfig: {\n maxOutputTokens: maxTokens,\n temperature: 0.0,\n },\n systemInstruction:\n 'You are an expert evaluator. Respond with valid JSON only: {\"pass\": true|false, \"score\": 0.0-1.0, \"reasoning\": \"explanation\"}',\n });\n\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n const prompt =\n `Rubric:\\n${rubric}\\n\\n` +\n `<candidate_response>\\n${candidateStr}\\n</candidate_response>\\n\\n` +\n `<reference_answer>\\n${referenceStr ?? 'No reference provided.'}\\n</reference_answer>\\n\\n` +\n `Evaluate and return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}`;\n\n const startTime = Date.now();\n const result = await gemini.generateContent(prompt);\n const durationMs = Date.now() - startTime;\n\n const text = result.response.text() as string;\n const cleaned = text\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n let parsedRaw: unknown;\n try {\n parsedRaw = JSON.parse(cleaned);\n } catch {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n\n const validation = JudgeResponseSchema.safeParse(parsedRaw);\n if (!validation.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${cleaned.slice(0, 500)}\\nValidation errors: ${JSON.stringify(validation.error.issues)}`\n );\n }\n const { pass, score, reasoning } = validation.data;\n\n return {\n pass,\n score,\n reasoning,\n usage: {\n inputTokens:\n (result.response.usageMetadata?.promptTokenCount as\n | number\n | undefined) ?? 0,\n outputTokens:\n (result.response.usageMetadata?.candidatesTokenCount as\n | number\n | undefined) ?? 0,\n totalCostUsd: 0,\n durationMs,\n },\n };\n },\n };\n}\n","import type { Judge, JudgeConfig, ProviderKind } from './judgeTypes.js';\nimport { createAnthropicJudge } from './anthropicJudge.js';\nimport { createVertexAnthropicJudge } from './vertexAnthropicJudge.js';\nimport { createClaudeAgentJudge } from './claudeAgentJudge.js';\nimport { createOpenAIJudge } from './openaiJudge.js';\nimport { createGoogleJudge } from './googleJudge.js';\n\n/**\n * Creates an LLM judge for evaluating tool responses\n *\n * Uses Claude Agent SDK for evaluation with usage metrics tracking.\n *\n * @param config - Judge configuration\n * @returns Judge instance\n * @throws {Error} If provider is unsupported or configuration is invalid\n *\n * @example\n * // Default Claude judge\n * const judge = createJudge();\n *\n * @example\n * // With configuration\n * const judge = createJudge({\n * model: 'claude-sonnet-4-20250514',\n * maxToolOutputSize: 50000, // Fail if response > 50KB\n * maxBudgetUsd: 0.05,\n * });\n *\n * // Evaluate a response\n * const result = await judge.evaluate(\n * candidateResponse,\n * referenceResponse,\n * 'Evaluate for accuracy and completeness'\n * );\n *\n * // Access usage metrics\n * console.log('Cost:', result.usage?.totalCostUsd);\n * console.log('Tokens:', result.usage?.inputTokens, result.usage?.outputTokens);\n */\nexport function createJudge(config: JudgeConfig = {}): Judge {\n const provider: ProviderKind = config.provider ?? 'anthropic';\n\n switch (provider) {\n case 'anthropic':\n return createAnthropicJudge(config);\n\n case 'vertex-anthropic':\n return createVertexAnthropicJudge(config);\n\n case 'anthropic-agent-sdk':\n return createClaudeAgentJudge(config);\n\n case 'openai':\n return createOpenAIJudge(config);\n\n case 'google':\n return createGoogleJudge(config);\n\n default:\n throw new Error(`Unsupported LLM provider: ${String(provider)}`);\n }\n}\n","/**\n * Custom Judge Registry\n *\n * Allows consumers to register named judge executors that can be referenced\n * by string ID in eval fixtures and programmatic tests. This enables\n * multi-step judge pipelines (LLM call + post-processing), custom scoring\n * logic, and reusable judge configurations without duplicating rubrics.\n */\n\n/**\n * Result returned by a custom judge executor.\n *\n * Custom judges must return a normalized score (0–1). The framework applies\n * the caller's `threshold` (default 0.7) to determine pass/fail. This keeps\n * judges reusable — the same judge can be used with different thresholds in\n * different tests.\n */\nexport interface CustomJudgeResult {\n /** Normalized score (0–1, where 1 is best) */\n score: number;\n /** Optional reasoning/explanation */\n reasoning?: string;\n}\n\n/**\n * A user-defined judge executor function.\n *\n * Custom executors own their entire evaluation pipeline — prompt construction,\n * LLM calls, and post-processing — but return a normalized score. The framework\n * determines pass/fail by comparing the score against the caller's threshold.\n *\n * @param candidate - The actual response to evaluate\n * @param reference - Optional reference/expected response\n * @returns Evaluation result with a normalized score and optional reasoning\n *\n * @example\n * ```typescript\n * const completenessJudge: CustomJudgeExecutor = async (candidate, reference) => {\n * // Step 1: LLM call with your own prompt and schema\n * const llmResult = await callLLM(COMPLETENESS_PROMPT, candidate);\n * const { verdict, reasoning } = JSON.parse(llmResult);\n *\n * // Step 2: Deterministic post-processing into a normalized score\n * const score = { Complete: 1.0, Incomplete: 0.5 }[verdict] ?? 0.0;\n *\n * return { score, reasoning };\n * };\n * ```\n */\nexport type CustomJudgeExecutor = (\n candidate: unknown,\n reference?: unknown\n) => Promise<CustomJudgeResult>;\n\nconst registry = new Map<string, CustomJudgeExecutor>();\n\n/**\n * Registers a named custom judge executor.\n *\n * Call this in your test setup (e.g., `playwright.config.ts` or a global setup file)\n * before tests run. The name can then be referenced in JSON eval fixtures via the\n * `judge` field on `passesJudge`.\n *\n * @param name - Unique identifier for the judge\n * @param executor - The judge executor function\n * @throws {Error} If a judge with the same name is already registered\n *\n * @example\n * ```typescript\n * import { registerJudge } from '@gleanwork/mcp-server-tester';\n *\n * registerJudge('glean-completeness', async (candidate, reference) => {\n * // Step 1: LLM call with your own prompt and schema\n * const llmResult = await callLLM(COMPLETENESS_PROMPT, candidate);\n * const { verdict, reasoning } = JSON.parse(llmResult);\n *\n * // Step 2: Deterministic post-processing into a normalized score\n * const score = { Complete: 1.0, Incomplete: 0.5 }[verdict] ?? 0.0;\n *\n * return { score, reasoning };\n * });\n *\n * // Then in tests — same judge, different thresholds:\n * // expect(result).toPassToolJudge({ judge: 'glean-completeness', passingThreshold: 0.8 });\n * // expect(result).toPassToolJudge({ judge: 'glean-completeness', passingThreshold: 0.5 });\n * ```\n */\nexport function registerJudge(\n name: string,\n executor: CustomJudgeExecutor\n): void {\n const existing = registry.get(name);\n if (existing !== undefined) {\n if (existing === executor) {\n return; // same function re-registered (e.g., shared setup imported by multiple files)\n }\n throw new Error(\n `Judge \"${name}\" is already registered with a different executor. ` +\n `Use clearJudgeRegistry() first if you need to replace it.`\n );\n }\n registry.set(name, executor);\n}\n\n/**\n * Retrieves a registered custom judge executor by name.\n *\n * @param name - The judge name to look up\n * @returns The registered executor\n * @throws {Error} If no judge with the given name is registered\n */\nexport function getRegisteredJudge(name: string): CustomJudgeExecutor {\n const executor = registry.get(name);\n if (!executor) {\n const available =\n registry.size > 0\n ? ` Available judges: ${[...registry.keys()].join(', ')}`\n : ' No judges are registered.';\n throw new Error(\n `Judge \"${name}\" is not registered.${available} ` +\n `Register it with registerJudge() before tests run.`\n );\n }\n return executor;\n}\n\n/**\n * Clears all registered judges. Intended for test teardown.\n */\nexport function clearJudgeRegistry(): void {\n registry.clear();\n}\n","/**\n * Judge Validator\n *\n * Validates a response using an LLM-as-a-judge evaluation.\n */\n\nimport type { ValidationResult } from './types.js';\nimport type { ProviderKind } from '../../judge/judgeTypes.js';\nimport type { RubricSpec } from '../../judge/rubrics.js';\nimport { createJudge } from '../../judge/judgeClient.js';\nimport { resolveRubric } from '../../judge/rubrics.js';\nimport { getRegisteredJudge } from '../../judge/judgeRegistry.js';\n\n/**\n * Configuration for the judge validator\n */\nexport interface JudgeValidatorConfig {\n /**\n * The evaluation rubric: a built-in name or custom { text: string }.\n * Required when no named `judge` is specified.\n */\n rubric?: RubricSpec;\n /** Optional reference response to compare against */\n reference?: unknown;\n /** Minimum score required to pass (0-1, default: 0.7) */\n threshold?: number;\n /** Number of judge evaluations to run. Scores averaged. @default 1 */\n reps?: number;\n /** Judge provider. @default 'claude' */\n provider?: ProviderKind;\n /** Model override (e.g., 'claude-opus-4-20250514') */\n model?: string;\n /** Environment variable name for API key */\n apiKeyEnvVar?: string;\n /** Max tokens for judge response */\n maxTokens?: number;\n /** Temperature for judge LLM (0–1) */\n temperature?: number;\n /** Max budget in USD per evaluation */\n maxBudgetUsd?: number;\n /** Fail if response exceeds this size in bytes before judging */\n maxToolOutputSize?: number;\n /**\n * Name of a registered custom judge executor.\n * When set, the named judge handles the entire evaluation pipeline\n * and returns a normalized score. The `threshold` determines pass/fail.\n * Register judges with `registerJudge()` before tests run.\n */\n judge?: string;\n}\n\n/**\n * Validates a response using an LLM-as-a-judge evaluation\n *\n * Calls the configured judge with the response and rubric, then checks whether\n * the resulting score meets the threshold. Returns a ValidationResult compatible\n * with the unified assertion architecture.\n *\n * @param response - The response to evaluate\n * @param config - Judge evaluation configuration (rubric, reference, threshold, provider, model, etc.)\n * @returns Validation result indicating pass/fail with judge reasoning\n *\n * @example\n * ```typescript\n * const result = await validateJudge(\n * response,\n * { rubric: 'Does the response accurately describe the weather?' }\n * );\n * if (!result.pass) {\n * console.log(result.message);\n * }\n *\n * // With inline judge config and threshold\n * const result2 = await validateJudge(\n * response,\n * { rubric: 'Is this helpful?', threshold: 0.9, model: 'claude-opus-4-20250514', temperature: 0 }\n * );\n * ```\n */\n/**\n * Computes population standard deviation of an array of scores.\n * Returns 0 when there are fewer than 2 values.\n */\nfunction computeStdDev(scores: number[], mean: number): number {\n if (scores.length <= 1) return 0;\n const variance =\n scores.reduce((sum, s) => sum + (s - mean) ** 2, 0) / scores.length;\n return Math.sqrt(variance);\n}\n\nexport async function validateJudge(\n response: unknown,\n config: JudgeValidatorConfig\n): Promise<ValidationResult> {\n const {\n judge: judgeName,\n rubric,\n reference,\n threshold = 0.7,\n reps = 1,\n provider,\n model,\n apiKeyEnvVar,\n maxTokens,\n temperature,\n maxBudgetUsd,\n maxToolOutputSize,\n } = config;\n\n // Named custom judge — executor returns a score, threshold determines pass/fail\n if (judgeName !== undefined) {\n try {\n const executor = getRegisteredJudge(judgeName);\n const judgeResult = await executor(response, reference ?? undefined);\n\n const score = judgeResult.score;\n const passed = score >= threshold;\n\n return {\n pass: passed,\n message: passed\n ? `Custom judge \"${judgeName}\" passed with score ${score.toFixed(2)}`\n : `Custom judge \"${judgeName}\" failed with score ${score.toFixed(2)} (threshold: ${threshold}). ${judgeResult.reasoning ?? ''}`,\n };\n } catch (err) {\n return {\n pass: false,\n message: `Custom judge \"${judgeName}\" error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n // Built-in LLM judge — requires rubric\n if (rubric === undefined) {\n return {\n pass: false,\n message:\n 'Judge evaluation failed: either \"judge\" or \"rubric\" must be provided',\n };\n }\n\n const resolvedRubric = resolveRubric(rubric);\n\n const judgeConfig = {\n ...(provider !== undefined && { provider }),\n ...(model !== undefined && { model }),\n ...(apiKeyEnvVar !== undefined && { apiKeyEnvVar }),\n ...(maxTokens !== undefined && { maxTokens }),\n ...(temperature !== undefined && { temperature }),\n ...(maxBudgetUsd !== undefined && { maxBudgetUsd }),\n ...(maxToolOutputSize !== undefined && { maxToolOutputSize }),\n };\n\n try {\n const judge = createJudge(judgeConfig);\n\n const scores: number[] = [];\n let lastReasoning: string | undefined;\n\n for (let i = 0; i < reps; i++) {\n const judgeResult = await judge.evaluate(\n response,\n reference ?? null,\n resolvedRubric\n );\n scores.push(judgeResult.score ?? (judgeResult.pass ? 1.0 : 0.0));\n lastReasoning = judgeResult.reasoning;\n }\n\n if (scores.length === 0) {\n return {\n pass: false,\n message: 'Judge evaluation failed: no scores collected',\n };\n }\n\n const meanScore = scores.reduce((a, b) => a + b, 0) / scores.length;\n const passed = meanScore >= threshold;\n const repNote =\n reps > 1\n ? ` (mean of ${reps} reps: [${scores.map((s) => s.toFixed(2)).join(', ')}])`\n : '';\n\n let stdDev: number | undefined;\n let highVariance: boolean | undefined;\n\n if (reps > 1) {\n stdDev = computeStdDev(scores, meanScore);\n highVariance = stdDev > 0.2;\n\n if (highVariance) {\n console.warn(\n `[mcp-server-tester] Judge scores have high variance ` +\n `(stdDev=${stdDev.toFixed(2)}, scores=[${scores.map((s) => s.toFixed(2)).join(', ')}]). ` +\n `The rubric may be ambiguous.`\n );\n }\n }\n\n return {\n pass: passed,\n message: passed\n ? `Judge passed with score ${meanScore.toFixed(2)}${repNote}`\n : `Judge failed with score ${meanScore.toFixed(2)} (threshold: ${threshold})${repNote}. ${lastReasoning ?? ''}`,\n details: {\n score: meanScore,\n reasoning: lastReasoning,\n judgeProvider: provider ?? 'anthropic',\n judgeModel: model,\n ...(reps > 1 && {\n scores,\n scoreStdDev: stdDev,\n highVariance,\n }),\n },\n };\n } catch (err) {\n return {\n pass: false,\n message: `Judge evaluation error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n","/**\n * Validator Types\n *\n * Core types for the unified assertion architecture.\n * These types are used by both Playwright matchers and the eval runner.\n */\n\nimport type { ZodType } from 'zod';\n\n/**\n * Result of a validation operation\n */\nexport interface ValidationResult {\n /** Whether the validation passed */\n pass: boolean;\n /** Human-readable message explaining the result */\n message: string;\n /** Additional structured details about the validation */\n details?: Record<string, unknown>;\n /**\n * Optional quantitative metrics from the validation.\n * Populated by validateToolCalls for precision/recall.\n */\n metrics?: {\n precision?: number;\n recall?: number;\n };\n}\n\n/**\n * Options for text validation\n */\nexport interface TextValidatorOptions {\n /** Whether to perform case-sensitive matching (default: true) */\n caseSensitive?: boolean;\n}\n\n/**\n * Options for response size validation\n */\nexport interface SizeValidatorOptions {\n /** Maximum allowed size in bytes */\n maxBytes?: number;\n /** Minimum required size in bytes */\n minBytes?: number;\n}\n\n/**\n * Options for schema validation\n */\nexport interface SchemaValidatorOptions {\n /** Whether to use strict mode (fail on extra properties) */\n strict?: boolean;\n}\n\n/**\n * Options for pattern validation\n */\nexport interface PatternValidatorOptions {\n /** Whether to perform case-sensitive matching (default: true) */\n caseSensitive?: boolean;\n}\n\n/**\n * Built-in snapshot sanitizer names for use with toMatchToolSnapshot.\n * Pass these values in the sanitizers array to replace non-deterministic\n * values with stable placeholders before snapshot comparison.\n *\n * @example\n * expect(result).toMatchToolSnapshot('my-snapshot', [\n * SnapshotSanitizers.UUID,\n * SnapshotSanitizers.ISO_DATE,\n * ]);\n */\nexport const SnapshotSanitizers = {\n /** Replaces Unix timestamps (seconds and milliseconds) with a stable placeholder */\n TIMESTAMP: 'timestamp' as const,\n /** Replaces UUID v1-v5 strings with a stable placeholder */\n UUID: 'uuid' as const,\n /** Replaces ISO 8601 date/datetime strings with a stable placeholder */\n ISO_DATE: 'iso-date' as const,\n /** Replaces MongoDB ObjectId strings with a stable placeholder */\n OBJECT_ID: 'objectId' as const,\n /** Replaces JWT tokens with a stable placeholder */\n JWT: 'jwt' as const,\n} as const;\n\n/**\n * Built-in sanitizer names for common variable patterns\n */\nexport type BuiltInSanitizer =\n (typeof SnapshotSanitizers)[keyof typeof SnapshotSanitizers];\n\n/**\n * Custom regex-based sanitizer\n */\nexport interface RegexSanitizer {\n /** Regex pattern to match */\n pattern: string | RegExp;\n /** Replacement string (default: \"[SANITIZED]\") */\n replacement?: string;\n}\n\n/**\n * Field removal sanitizer - removes specified fields from objects\n */\nexport interface FieldRemovalSanitizer {\n /** Field paths to remove (supports dot notation for nested fields) */\n remove: string[];\n}\n\n/**\n * Snapshot sanitizer configuration\n *\n * Sanitizers transform response data before snapshot comparison,\n * allowing variable content (timestamps, IDs, etc.) to be normalized.\n *\n * Can be:\n * - A built-in sanitizer name: 'timestamp', 'uuid', 'iso-date', 'objectId', 'jwt'\n * - A regex sanitizer: { pattern: /regex/, replacement: '[REPLACED]' }\n * - A field removal sanitizer: { remove: ['field1', 'nested.field'] }\n */\nexport type SnapshotSanitizer =\n | BuiltInSanitizer\n | RegexSanitizer\n | FieldRemovalSanitizer;\n\n/**\n * Schema registry for named schemas in datasets\n */\nexport type SchemaRegistry = Record<string, ZodType>;\n","import type { TestInfo } from '@playwright/test';\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport type {\n Tool,\n CallToolResult,\n ListToolsResult,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { AuthType } from '../../types/index.js';\n\n// Re-export AuthType for backwards compatibility\nexport type { AuthType } from '../../types/index.js';\n\nconst DEFAULT_CALL_TIMEOUT_MS = 30_000;\n\nfunction withCallTimeout<T>(\n promise: Promise<T>,\n ms: number,\n opName: string\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () =>\n reject(\n new Error(`MCP operation \"${opName}\" timed out after ${ms}ms`)\n ),\n ms\n );\n }),\n ]).finally(() => clearTimeout(timer));\n}\n\n// Dynamic import of test for conditional step tracking\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet testStep:\n | ((name: string, fn: () => Promise<unknown>) => Promise<unknown>)\n | null = null;\n\n// Try to load test.step() dynamically\ntry {\n /* eslint-disable @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n const playwright = require('@playwright/test');\n if (playwright && playwright.test && playwright.test.step) {\n testStep = playwright.test.step.bind(playwright.test) as typeof testStep;\n }\n /* eslint-enable @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n} catch {\n // Not in a test context, that's fine\n}\n\n/**\n * Options for creating an MCP fixture\n */\nexport interface MCPFixtureOptions {\n /**\n * Authentication type used for this test\n * - 'oauth': Interactive OAuth 2.1 with PKCE (browser-based authentication)\n * - 'api-token': Static API token (e.g., from a dashboard or environment variable)\n * - 'none': No authentication\n */\n authType?: AuthType;\n\n /**\n * Playwright project name for this test\n * Used for filtering and grouping in the reporter\n */\n project?: string;\n\n /**\n * Timeout in milliseconds for MCP tool/list operations. Default: 30000\n */\n callTimeoutMs?: number;\n}\n\n/**\n * High-level API for interacting with MCP servers in tests\n *\n * This interface wraps the raw MCP Client with test-friendly methods\n */\nexport interface MCPFixtureApi {\n /**\n * The underlying MCP client (for advanced usage)\n */\n client: Client;\n\n /**\n * Authentication type used for this test session\n */\n authType: AuthType;\n\n /**\n * Playwright project name for this test session\n */\n project?: string;\n\n /**\n * Lists all available tools from the MCP server\n *\n * @returns Array of tool definitions\n */\n listTools(): Promise<Array<Tool>>;\n\n /**\n * Calls a tool on the MCP server\n *\n * @param name - Tool name\n * @param args - Tool arguments\n * @returns Tool call result\n */\n callTool<TArgs extends Record<string, unknown> = Record<string, unknown>>(\n name: string,\n args: TArgs\n ): Promise<CallToolResult>;\n\n /**\n * Gets information about the connected server\n */\n getServerInfo(): {\n name?: string;\n version?: string;\n } | null;\n}\n\n/**\n * Creates an MCP fixture wrapper around a Client, providing a high-level\n * {@link MCPFixtureApi} without requiring Playwright's `test.extend` pattern.\n *\n * Use this when you need to set up an MCP fixture manually — for example in\n * custom fixture hierarchies, non-Playwright test runners (e.g. Vitest,\n * Jest), or when you want to compose the fixture with other lifecycle\n * management logic that doesn't fit the standard `test.extend` model.\n *\n * For the typical Playwright use case, prefer importing `test` and `mcp`\n * directly from `@gleanwork/mcp-server-tester/fixtures/mcp`, which wires\n * this function up automatically.\n *\n * When `testInfo` is provided, all MCP operations are automatically wrapped\n * in `test.step()` calls and attachments are created for the MCP Test\n * Reporter. Omit `testInfo` for lightweight usage outside Playwright.\n *\n * @param client - The MCP client to wrap (created via `createMCPClientForConfig`)\n * @param testInfo - Optional Playwright TestInfo for auto-tracking and reporter attachments\n * @param options - Optional fixture options (authType, project)\n * @returns MCPFixtureApi instance\n *\n * @example\n * ```typescript\n * // Advanced: custom fixture setup inside test.extend\n * const test = base.extend<{ mcp: MCPFixtureApi }>({\n * mcp: async ({}, use, testInfo) => {\n * const client = await createMCPClientForConfig(config);\n * const api = createMCPFixture(client, testInfo, { authType: 'api-token' });\n * await use(api);\n * await closeMCPClient(client);\n * }\n * });\n *\n * // Non-Playwright usage (no reporter attachments)\n * const client = await createMCPClientForConfig(config);\n * const api = createMCPFixture(client);\n * const tools = await api.listTools();\n * ```\n */\nexport function createMCPFixture(\n client: Client,\n testInfo?: TestInfo,\n options?: MCPFixtureOptions\n): MCPFixtureApi {\n const authType = options?.authType ?? 'none';\n const project = options?.project;\n const callTimeout = options?.callTimeoutMs ?? DEFAULT_CALL_TIMEOUT_MS;\n // If no testInfo, return basic API without tracking\n if (!testInfo) {\n return {\n client,\n authType,\n project,\n\n async listTools(): Promise<Array<Tool>> {\n const result = await withCallTimeout(\n client.listTools() as Promise<ListToolsResult>,\n callTimeout,\n 'listTools'\n );\n return result.tools;\n },\n\n async callTool<TArgs extends Record<string, unknown>>(\n name: string,\n args: TArgs\n ): Promise<CallToolResult> {\n const result = await withCallTimeout(\n client.callTool({\n name,\n arguments: args,\n }) as Promise<CallToolResult>,\n callTimeout,\n `callTool(\"${name}\")`\n );\n return result;\n },\n\n getServerInfo() {\n const serverVersion = client.getServerVersion();\n if (!serverVersion) {\n return null;\n }\n return {\n name: serverVersion.name,\n version: serverVersion.version,\n };\n },\n };\n }\n\n // With testInfo, return tracked API\n return {\n client,\n authType,\n project,\n\n async listTools(): Promise<Array<Tool>> {\n const execute = async () => {\n const result = await withCallTimeout(\n client.listTools() as Promise<ListToolsResult>,\n callTimeout,\n 'listTools'\n );\n const tools = result.tools;\n\n // Auto-attach for reporter\n await testInfo.attach('mcp-list-tools', {\n contentType: 'application/json',\n body: JSON.stringify(\n {\n operation: 'listTools',\n toolCount: tools.length,\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n })),\n },\n null,\n 2\n ),\n });\n\n return tools;\n };\n\n // Wrap in test.step if available\n return (\n testStep ? testStep('MCP: listTools()', execute) : execute()\n ) as Promise<Array<Tool>>;\n },\n\n async callTool<TArgs extends Record<string, unknown>>(\n name: string,\n args: TArgs\n ): Promise<CallToolResult> {\n const execute = async () => {\n const startTime = Date.now();\n const result = await withCallTimeout(\n client.callTool({\n name,\n arguments: args,\n }) as Promise<CallToolResult>,\n callTimeout,\n `callTool(\"${name}\")`\n );\n const durationMs = Date.now() - startTime;\n\n // Auto-attach for reporter\n await testInfo.attach(`mcp-call-${name}`, {\n contentType: 'application/json',\n body: JSON.stringify(\n {\n operation: 'callTool',\n toolName: name,\n args,\n result,\n durationMs,\n isError: result.isError || false,\n authType,\n project,\n },\n null,\n 2\n ),\n });\n\n return result;\n };\n\n // Wrap in test.step if available\n return (\n testStep ? testStep(`MCP: callTool(\"${name}\")`, execute) : execute()\n ) as Promise<CallToolResult>;\n },\n\n getServerInfo() {\n const serverVersion = client.getServerVersion();\n const result = serverVersion\n ? {\n name: serverVersion.name,\n version: serverVersion.version,\n }\n : null;\n\n // Fire-and-forget attachment (don't block synchronous call)\n testInfo\n .attach('mcp-server-info', {\n contentType: 'application/json',\n body: JSON.stringify(\n {\n operation: 'getServerInfo',\n serverInfo: result,\n },\n null,\n 2\n ),\n })\n .catch((err) => {\n console.error('[MCPFixture] Failed to attach server info:', err);\n });\n\n return result;\n },\n };\n}\n","/**\n * toMatchToolResponse Matcher\n *\n * Validates that a response exactly matches an expected value.\n */\n\nimport { validateResponse } from '../validators/response.js';\n\n/**\n * Creates the toMatchToolResponse matcher function\n */\nexport function toMatchToolResponse(\n this: { isNot: boolean },\n received: unknown,\n expected: unknown\n) {\n const result = validateResponse(received, expected);\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n return result.pass\n ? 'Expected response NOT to match, but it did'\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toMatchToolSchema Matcher\n *\n * Validates that a response matches a Zod schema.\n */\n\nimport type { ZodType } from 'zod';\nimport { validateSchema } from '../validators/schema.js';\nimport type { SchemaValidatorOptions } from '../validators/types.js';\n\n/**\n * Creates the toMatchToolSchema matcher function\n */\nexport function toMatchToolSchema(\n this: { isNot: boolean },\n received: unknown,\n schema: ZodType,\n options: SchemaValidatorOptions = {}\n) {\n const result = validateSchema(received, schema, options);\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n return result.pass\n ? 'Expected response NOT to match schema, but it did'\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toContainToolText Matcher\n *\n * Validates that a response contains expected text substrings.\n */\n\nimport { validateText } from '../validators/text.js';\nimport type { TextValidatorOptions } from '../validators/types.js';\n\n/**\n * Creates the toContainToolText matcher function\n */\nexport function toContainToolText(\n this: { isNot: boolean },\n received: unknown,\n expected: string | string[],\n options: TextValidatorOptions = {}\n) {\n const result = validateText(received, expected, options);\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n const expectedStr = Array.isArray(expected)\n ? expected.map((s) => `\"${s}\"`).join(', ')\n : `\"${expected}\"`;\n return result.pass\n ? `Expected response NOT to contain ${expectedStr}, but it did`\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toMatchToolPattern Matcher\n *\n * Validates that a response matches regex patterns.\n */\n\nimport { validatePattern } from '../validators/pattern.js';\nimport type { PatternValidatorOptions } from '../validators/types.js';\n\n/**\n * Creates the toMatchToolPattern matcher function\n */\nexport function toMatchToolPattern(\n this: { isNot: boolean },\n received: unknown,\n patterns: string | RegExp | (string | RegExp)[],\n options: PatternValidatorOptions = {}\n) {\n const result = validatePattern(received, patterns, options);\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n return result.pass\n ? 'Expected response NOT to match pattern(s), but it did'\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toMatchToolSnapshot Matcher\n *\n * Validates that a response matches a saved snapshot.\n * Uses Playwright's native snapshot testing functionality.\n */\n\nimport { expect as baseExpect } from '@playwright/test';\nimport type { SnapshotSanitizer } from '../validators/types.js';\nimport { extractText } from '../validators/utils.js';\n\n/**\n * Built-in regex patterns for common variable data\n */\nconst BUILT_IN_PATTERNS: Record<\n string,\n { pattern: RegExp; replacement: string }\n> = {\n timestamp: {\n pattern: /\\b\\d{10,13}\\b/g,\n replacement: '[TIMESTAMP]',\n },\n uuid: {\n pattern:\n /\\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\b/gi,\n replacement: '[UUID]',\n },\n 'iso-date': {\n pattern:\n /\\b\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?(Z|[+-]\\d{2}:?\\d{2})?)?\\b/g,\n replacement: '[ISO_DATE]',\n },\n objectId: {\n pattern: /\\b[0-9a-f]{24}\\b/gi,\n replacement: '[OBJECT_ID]',\n },\n jwt: {\n pattern: /\\beyJ[A-Za-z0-9_-]*\\.eyJ[A-Za-z0-9_-]*\\.[A-Za-z0-9_-]+\\b/g,\n replacement: '[JWT]',\n },\n};\n\n/**\n * Type guard for regex sanitizer\n */\nfunction isRegexSanitizer(\n sanitizer: SnapshotSanitizer\n): sanitizer is { pattern: string | RegExp; replacement?: string } {\n return (\n typeof sanitizer === 'object' &&\n sanitizer !== null &&\n 'pattern' in sanitizer\n );\n}\n\n/**\n * Type guard for field removal sanitizer\n */\nfunction isFieldRemovalSanitizer(\n sanitizer: SnapshotSanitizer\n): sanitizer is { remove: string[] } {\n return (\n typeof sanitizer === 'object' && sanitizer !== null && 'remove' in sanitizer\n );\n}\n\n/**\n * Apply sanitizers to a string value\n *\n * Handles three types of sanitizers:\n * 1. Built-in names: 'timestamp', 'uuid', 'iso-date', 'objectId', 'jwt'\n * 2. Regex sanitizers: { pattern: string | RegExp, replacement?: string }\n * 3. Field removal sanitizers: { remove: string[] } - only works on JSON strings\n */\nfunction applySanitizers(\n value: string,\n sanitizers: SnapshotSanitizer[]\n): string {\n let result = value;\n\n for (const sanitizer of sanitizers) {\n // Handle built-in sanitizer names\n if (typeof sanitizer === 'string') {\n const builtIn = BUILT_IN_PATTERNS[sanitizer];\n if (builtIn) {\n result = result.replace(builtIn.pattern, builtIn.replacement);\n }\n continue;\n }\n\n // Handle regex sanitizers\n if (isRegexSanitizer(sanitizer)) {\n let pattern: RegExp;\n if (sanitizer.pattern instanceof RegExp) {\n pattern = sanitizer.pattern;\n } else {\n try {\n pattern = new RegExp(sanitizer.pattern, 'g');\n } catch {\n throw new Error(\n `toMatchToolSnapshot: invalid regex pattern \"${sanitizer.pattern}\" in sanitizer`\n );\n }\n }\n const replacement = sanitizer.replacement ?? '[SANITIZED]';\n result = result.replace(pattern, replacement);\n continue;\n }\n\n // Handle field removal sanitizers\n if (isFieldRemovalSanitizer(sanitizer)) {\n try {\n const parsed: unknown = JSON.parse(result);\n removeFields(parsed, sanitizer.remove);\n result = JSON.stringify(parsed, null, 2);\n } catch {\n // Not valid JSON, skip field removal\n }\n }\n }\n\n return result;\n}\n\n/**\n * Remove fields from an object by dot-notation paths\n */\nfunction removeFields(obj: unknown, paths: string[]): void {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n\n for (const path of paths) {\n const parts = path.split('.');\n if (parts.length === 0) {\n continue;\n }\n\n let current: unknown = obj;\n\n // Navigate to parent of target field\n for (let i = 0; i < parts.length - 1; i++) {\n if (typeof current !== 'object' || current === null) {\n break;\n }\n const key = parts[i];\n if (key !== undefined) {\n current = (current as Record<string, unknown>)[key];\n }\n }\n\n // Delete the target field\n if (typeof current === 'object' && current !== null) {\n const lastKey = parts[parts.length - 1];\n if (lastKey !== undefined) {\n delete (current as Record<string, unknown>)[lastKey];\n }\n }\n }\n}\n\n/**\n * Creates the toMatchToolSnapshot matcher function\n *\n * @remarks\n * **Requires Playwright test context.** This matcher calls `expect(content).toMatchSnapshot()`\n * internally, which only works inside a Playwright test (i.e., when `testInfo` is available).\n * Calling it outside a Playwright test will throw a cryptic context error.\n *\n * To test sanitizer logic without a Playwright context, use the exported `applySanitizers`\n * function directly.\n *\n * Note: This is an async matcher that uses Playwright's snapshot testing.\n */\nexport async function toMatchToolSnapshot(\n this: { isNot: boolean },\n received: unknown,\n name: string,\n sanitizers: SnapshotSanitizer[] = []\n): Promise<{ pass: boolean; message: () => string }> {\n // Extract text content from response\n let content = extractText(received);\n\n // Apply sanitizers\n if (sanitizers.length > 0) {\n content = applySanitizers(content, sanitizers);\n }\n\n // .not is not really meaningful for snapshots, but handle it gracefully\n if (this.isNot) {\n // For .not, we want to verify it does NOT match - this is unusual for snapshots\n // but we can try and check if it throws\n try {\n // eslint-disable-next-line @typescript-eslint/await-thenable\n await baseExpect(content).toMatchSnapshot(name);\n // If it didn't throw, the snapshot matched - so .not fails\n return {\n pass: false,\n message: () =>\n `Expected response NOT to match snapshot \"${name}\", but it did`,\n };\n } catch {\n // Snapshot didn't match - .not passes\n return {\n pass: true,\n message: () => `Response does not match snapshot \"${name}\" as expected`,\n };\n }\n }\n\n try {\n // Use Playwright's native snapshot testing\n // eslint-disable-next-line @typescript-eslint/await-thenable\n await baseExpect(content).toMatchSnapshot(name);\n return {\n pass: true,\n message: () => `Response matches snapshot \"${name}\"`,\n };\n } catch (error) {\n return {\n pass: false,\n message: () =>\n error instanceof Error\n ? error.message\n : `Response does not match snapshot \"${name}\"`,\n };\n }\n}\n\nexport { BUILT_IN_PATTERNS, applySanitizers };\n","/**\n * toBeToolError Matcher\n *\n * Validates that a response is (or is not) an error.\n */\n\nimport { validateError } from '../validators/error.js';\n\n/**\n * Creates the toBeToolError matcher function\n */\nexport function toBeToolError(\n this: { isNot: boolean },\n received: unknown,\n expected: boolean | string | string[] = true\n) {\n // Handle .not case specially\n const effectiveExpected = this.isNot\n ? typeof expected === 'boolean'\n ? !expected\n : false // .not with string message means \"should not be error\"\n : expected;\n\n const result = validateError(received, effectiveExpected);\n\n return {\n pass: this.isNot ? !result.pass : result.pass,\n message: () => {\n if (this.isNot) {\n // When using .not, we want the opposite behavior\n if (typeof expected === 'boolean') {\n return result.pass\n ? 'Expected response NOT to be an error, but it was'\n : 'Response is not an error as expected';\n }\n const expectedStr = Array.isArray(expected)\n ? expected.join(', ')\n : expected;\n return result.pass\n ? `Expected response NOT to be an error with \"${expectedStr}\", but it was`\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toPassToolJudge Matcher\n *\n * Validates that a response passes LLM-as-judge evaluation.\n * Delegates evaluation logic to validateJudge() for consistency\n * with the validator/matcher duality pattern.\n *\n * Supports three call signatures:\n * - toPassToolJudge(rubric, options?) — built-in LLM judge with rubric\n * - toPassToolJudge({ judge: 'name', ... }) — named custom judge\n * - toPassToolJudge([...judges]) — multi-judge (all must pass)\n */\n\nimport { validateJudge } from '../validators/judge.js';\nimport type { RubricSpec } from '../../judge/rubrics.js';\nimport type { JudgeMatcherOptions } from './types.js';\n\n// Default passing threshold\nconst DEFAULT_PASSING_THRESHOLD = 0.7;\n\n/**\n * Runs a single judge evaluation and returns the result.\n */\nasync function runSingleJudge(\n received: unknown,\n rubric: RubricSpec | undefined,\n options: JudgeMatcherOptions\n): Promise<{ pass: boolean; message: string }> {\n const {\n reference = null,\n passingThreshold = DEFAULT_PASSING_THRESHOLD,\n reps,\n provider,\n model,\n judge,\n } = options;\n\n const validation = await validateJudge(received, {\n ...(rubric !== undefined && { rubric }),\n reference: reference ?? undefined,\n threshold: passingThreshold,\n ...(reps !== undefined && { reps }),\n ...(provider !== undefined && { provider }),\n ...(model !== undefined && { model }),\n ...(judge !== undefined && { judge }),\n });\n\n return { pass: validation.pass, message: validation.message };\n}\n\n/**\n * The toPassToolJudge matcher function.\n *\n * Accepts either:\n * (received, rubric, options?) — rubric-based LLM judge\n * (received, options) — named custom judge (options.judge required)\n * (received, judges[]) — multi-judge (all must pass)\n */\nexport async function toPassToolJudge(\n this: { isNot: boolean },\n received: unknown,\n rubricOrOptions:\n | RubricSpec\n | JudgeMatcherOptions\n | Array<JudgeMatcherOptions & { rubric?: RubricSpec }>,\n maybeOptions?: JudgeMatcherOptions\n): Promise<{ pass: boolean; message: () => string }> {\n // Multi-judge: array of judge configs\n if (Array.isArray(rubricOrOptions)) {\n const results = await Promise.all(\n rubricOrOptions.map(async (judgeConfig) => {\n const { rubric: r, ...opts } = judgeConfig;\n return runSingleJudge(received, r, opts);\n })\n );\n\n const allPassed = results.every((r) => r.pass);\n const passCount = results.filter((r) => r.pass).length;\n const summary = `${passCount}/${results.length} judges passed`;\n const details = results.map((r) => r.message).join('\\n');\n\n if (this.isNot) {\n return {\n pass: !allPassed,\n message: () =>\n allPassed\n ? `Expected all judges to fail, but ${summary}`\n : `Judges failed as expected: ${summary}`,\n };\n }\n\n return {\n pass: allPassed,\n message: () => `${summary}\\n${details}`,\n };\n }\n\n // Single judge\n let rubric: RubricSpec | undefined;\n let options: JudgeMatcherOptions;\n\n if (\n typeof rubricOrOptions === 'string' ||\n (typeof rubricOrOptions === 'object' &&\n rubricOrOptions !== null &&\n 'text' in rubricOrOptions)\n ) {\n rubric = rubricOrOptions as RubricSpec;\n options = maybeOptions ?? {};\n } else {\n options = rubricOrOptions;\n }\n\n const result = await runSingleJudge(received, rubric, options);\n\n if (this.isNot) {\n return {\n pass: !result.pass,\n message: () =>\n result.pass\n ? `Expected judge evaluation to fail, but it passed`\n : `Judge evaluation failed as expected`,\n };\n }\n\n return {\n pass: result.pass,\n message: () => result.message,\n };\n}\n","/**\n * toHaveToolResponseSize Matcher\n *\n * Validates that a response meets size constraints.\n */\n\nimport { validateSize } from '../validators/size.js';\nimport type { SizeValidatorOptions } from '../validators/types.js';\n\n/**\n * Creates the toHaveToolResponseSize matcher function\n */\nexport function toHaveToolResponseSize(\n this: { isNot: boolean },\n received: unknown,\n options: SizeValidatorOptions\n) {\n const result = validateSize(received, options);\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n return result.pass\n ? 'Expected response size NOT to be within bounds, but it was'\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toSatisfyToolPredicate Matcher\n *\n * Validates that a response satisfies a custom predicate function.\n * This is an escape hatch for custom validation logic when built-in\n * matchers don't cover the use case.\n */\n\nimport { extractText } from '../validators/utils.js';\nimport type { PredicateResult, ToolPredicate } from './types.js';\n\n/**\n * Normalizes predicate result to PredicateResult object\n */\nfunction normalizeResult(result: boolean | PredicateResult): PredicateResult {\n if (typeof result === 'boolean') {\n return {\n pass: result,\n message: result ? 'Predicate passed' : 'Predicate returned false',\n };\n }\n return result;\n}\n\n/**\n * Creates the toSatisfyToolPredicate matcher function\n *\n * This matcher allows custom validation logic via a predicate function.\n * The predicate receives both the raw response and extracted text.\n *\n * @example\n * ```typescript\n * // Simple boolean predicate\n * expect(result).toSatisfyToolPredicate((response) => {\n * return response.data?.length > 0;\n * });\n *\n * // Predicate with custom message\n * expect(result).toSatisfyToolPredicate((response, text) => {\n * const hasTemperature = text.includes('temperature');\n * return {\n * pass: hasTemperature,\n * message: hasTemperature\n * ? 'Found temperature in response'\n * : 'Expected response to contain temperature',\n * };\n * });\n *\n * // Async predicate\n * expect(result).toSatisfyToolPredicate(async (response) => {\n * const isValid = await validateWithExternalService(response);\n * return isValid;\n * });\n * ```\n */\nexport async function toSatisfyToolPredicate(\n this: { isNot: boolean },\n received: unknown,\n predicate: ToolPredicate,\n description?: string\n): Promise<{ pass: boolean; message: () => string }> {\n const predicateDescription = description ?? 'custom predicate';\n\n try {\n // Extract text for convenience\n const text = extractText(received);\n\n // Run the predicate\n const rawResult = await predicate(received, text);\n const result = normalizeResult(rawResult);\n\n // Handle .not\n if (this.isNot) {\n return {\n pass: !result.pass,\n message: () =>\n result.pass\n ? `Expected response NOT to satisfy ${predicateDescription}`\n : `Response does not satisfy ${predicateDescription} as expected`,\n };\n }\n\n return {\n pass: result.pass,\n message: () =>\n result.pass\n ? (result.message ?? `Response satisfies ${predicateDescription}`)\n : (result.message ??\n `Expected response to satisfy ${predicateDescription}`),\n };\n } catch (error) {\n // Predicate threw an error\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n return {\n pass: this.isNot, // If using .not, an error means the predicate didn't pass\n message: () => `Predicate threw error: ${errorMessage}`,\n };\n }\n}\n","/**\n * toHaveToolCalls Matcher\n *\n * Validates which tools the LLM called during a mcp_host simulation.\n */\n\nimport { validateToolCalls } from '../validators/toolCalls.js';\nimport type { ToolCallExpectation } from '../validators/toolCalls.js';\n\n/**\n * Creates the toHaveToolCalls matcher function\n */\nexport function toHaveToolCalls(\n this: { isNot: boolean },\n received: unknown,\n expectation: ToolCallExpectation\n) {\n const result = validateToolCalls(received, expectation);\n\n return {\n pass: result.pass,\n message: () => result.message,\n };\n}\n","/**\n * toHaveToolCallCount Matcher\n *\n * Validates the number of tool calls made during a mcp_host simulation.\n */\n\nimport { validateToolCallCount } from '../validators/toolCalls.js';\nimport type { ToolCallCountOptions } from '../validators/toolCalls.js';\n\n/**\n * Creates the toHaveToolCallCount matcher function\n */\nexport function toHaveToolCallCount(\n this: { isNot: boolean },\n received: unknown,\n options: ToolCallCountOptions\n) {\n const result = validateToolCallCount(received, options);\n\n return {\n pass: result.pass,\n message: () => result.message,\n };\n}\n","/**\n * Matchers Module\n *\n * Custom Playwright matchers for MCP tool response validation.\n * These matchers use the validators internally and provide a clean\n * assertion API for Playwright tests.\n */\n\nimport { expect as baseExpect } from '@playwright/test';\n\n// Import matcher functions\nimport { toMatchToolResponse } from './toMatchToolResponse.js';\nimport { toMatchToolSchema } from './toMatchToolSchema.js';\nimport { toContainToolText } from './toContainToolText.js';\nimport { toMatchToolPattern } from './toMatchToolPattern.js';\nimport { toMatchToolSnapshot } from './toMatchToolSnapshot.js';\nimport { toBeToolError } from './toBeToolError.js';\nimport { toPassToolJudge } from './toPassToolJudge.js';\nimport { toHaveToolResponseSize } from './toHaveToolResponseSize.js';\nimport { toSatisfyToolPredicate } from './toSatisfyToolPredicate.js';\nimport { toHaveToolCalls } from './toHaveToolCalls.js';\nimport { toHaveToolCallCount } from './toHaveToolCallCount.js';\n\n// Import types for global declaration\nimport './types.js';\n\n/**\n * Extended Playwright expect with MCP tool matchers\n *\n * @example\n * ```typescript\n * import { expect } from '@gleanwork/mcp-server-tester';\n *\n * test('weather tool', async ({ mcp }) => {\n * const result = await mcp.callTool('get_weather', { city: 'London' });\n *\n * expect(result).toContainToolText('temperature');\n * expect(result).toMatchToolSchema(WeatherSchema);\n * expect(result).not.toBeToolError();\n * });\n * ```\n */\nexport const expect = baseExpect.extend({\n toMatchToolResponse,\n toMatchToolSchema,\n toContainToolText,\n toMatchToolPattern,\n toMatchToolSnapshot,\n toBeToolError,\n toPassToolJudge,\n toHaveToolResponseSize,\n toSatisfyToolPredicate,\n toHaveToolCalls,\n toHaveToolCallCount,\n});\n\n// Re-export types\nexport type {\n JudgeMatcherOptions,\n ToolPredicate,\n PredicateResult,\n} from './types.js';\n","import { test as base } from '@playwright/test';\nimport { expect } from '../assertions/matchers/index.js';\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport {\n createMCPClientForConfig,\n closeMCPClient,\n} from '../mcp/clientFactory.js';\nimport {\n createMCPFixture,\n type MCPFixtureApi,\n type AuthType,\n} from '../mcp/fixtures/mcpFixture.js';\nimport { PlaywrightOAuthClientProvider } from '../auth/oauthClientProvider.js';\nimport { CLIOAuthClient } from '../auth/cli.js';\nimport { isHttpConfig, type MCPConfig } from '../config/mcpConfig.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Internal fixture state for passing auth type between fixtures\n */\ninterface MCPFixtureState {\n /**\n * The resolved authentication type (may differ from config if CLI tokens are used)\n */\n resolvedAuthType: AuthType;\n}\n\n/**\n * Extended test fixtures for MCP testing\n */\ntype MCPFixtures = {\n /**\n * Raw MCP client instance (automatically connected and cleaned up)\n */\n mcpClient: Client;\n\n /**\n * High-level MCP API for tests\n */\n mcp: MCPFixtureApi;\n\n /**\n * Internal fixture state (not for external use)\n */\n _mcpFixtureState: MCPFixtureState;\n};\n\n/**\n * Extended Playwright test with MCP fixtures\n *\n * @example\n * import { test, expect } from '@gleanwork/mcp-server-tester';\n *\n * test('lists tools from MCP server', async ({ mcp }) => {\n * const tools = await mcp.listTools();\n * expect(tools.length).toBeGreaterThan(0);\n * });\n */\nexport const test = base.extend<MCPFixtures>({\n /**\n * Internal fixture state - tracks resolved auth type between fixtures\n */\n _mcpFixtureState: [\n // eslint-disable-next-line no-empty-pattern\n async ({}, use) => {\n // Initialize with 'none', will be updated by mcpClient fixture\n const state: MCPFixtureState = { resolvedAuthType: 'none' };\n await use(state);\n },\n { scope: 'test' },\n ],\n\n /**\n * mcpClient fixture: Creates and connects an MCP client\n *\n * The client configuration is read from the project's `use.mcpConfig`\n * setting in playwright.config.ts\n *\n * Authentication resolution order:\n * 1. Explicit authStatePath → uses PlaywrightOAuthClientProvider\n * 2. Explicit accessToken → uses static Bearer token\n * 3. HTTP transport with no auth → tries CLI-stored tokens (from `mcp-server-tester login`)\n * with automatic token refresh\n */\n mcpClient: async ({ _mcpFixtureState }, use, testInfo) => {\n // Extract mcpConfig from project use settings\n const useConfig = testInfo.project.use as { mcpConfig?: MCPConfig };\n const mcpConfig = useConfig.mcpConfig;\n\n if (!mcpConfig) {\n throw new Error(\n `Missing mcpConfig in project.use for project \"${testInfo.project.name}\". ` +\n `Please add mcpConfig to your project configuration in playwright.config.ts`\n );\n }\n\n // Track resolved auth type\n let resolvedAuthType: AuthType = 'none';\n\n // Narrow to HTTP config once for all auth-related logic (auth is HTTP-only)\n const httpConfig = isHttpConfig(mcpConfig) ? mcpConfig : null;\n\n // Create auth provider if OAuth authStatePath is configured\n let authProvider: OAuthClientProvider | undefined;\n if (httpConfig?.auth?.oauth?.authStatePath) {\n authProvider = new PlaywrightOAuthClientProvider({\n storagePath: httpConfig.auth.oauth.authStatePath,\n redirectUri:\n httpConfig.auth.oauth.redirectUri ??\n 'http://localhost:3000/oauth/callback',\n clientId: httpConfig.auth.oauth.clientId,\n clientSecret: httpConfig.auth.oauth.clientSecret,\n });\n resolvedAuthType = 'oauth';\n }\n\n // Build effective config - may add CLI tokens if no auth is configured\n let effectiveConfig = mcpConfig;\n\n // Check for explicit static API token\n if (httpConfig?.auth?.accessToken) {\n resolvedAuthType = 'api-token';\n }\n\n // If HTTP transport with no explicit auth, try to use CLI-stored tokens\n // This enables the simple flow: `mcp-server-tester login <url>` then run tests\n if (\n httpConfig &&\n !httpConfig.auth?.accessToken &&\n !httpConfig.auth?.oauth?.authStatePath\n ) {\n const cliClient = new CLIOAuthClient({\n mcpServerUrl: httpConfig.serverUrl,\n });\n\n // Try to get a valid token (will refresh if expired)\n const tokenResult = await cliClient.tryGetAccessToken();\n\n if (tokenResult) {\n // Use the CLI token as static auth\n effectiveConfig = {\n ...httpConfig,\n auth: {\n ...httpConfig.auth,\n accessToken: tokenResult.accessToken,\n },\n };\n // CLI tokens come from OAuth flow\n resolvedAuthType = 'oauth';\n }\n }\n\n // Store resolved auth type for mcp fixture\n _mcpFixtureState.resolvedAuthType = resolvedAuthType;\n\n // Create and connect client\n const client = await createMCPClientForConfig(effectiveConfig, {\n clientInfo: {\n name: '@gleanwork/mcp-server-tester',\n version: packageJson.version,\n },\n authProvider,\n });\n\n try {\n // Provide client to test\n await use(client);\n } finally {\n // Cleanup: close the client\n await closeMCPClient(client);\n }\n },\n\n /**\n * mcp fixture: High-level test API built on mcpClient\n *\n * Depends on mcpClient fixture\n * Automatically tracks all MCP operations for the reporter\n */\n mcp: async ({ mcpClient, _mcpFixtureState }, use, testInfo) => {\n const useConfig = testInfo.project.use as { mcpConfig?: MCPConfig };\n const api = createMCPFixture(mcpClient, testInfo, {\n authType: _mcpFixtureState.resolvedAuthType,\n project: testInfo.project.name,\n callTimeoutMs: useConfig.mcpConfig?.callTimeoutMs,\n });\n await use(api);\n },\n});\n\n/**\n * Re-export extended expect with MCP tool matchers\n *\n * @example\n * ```typescript\n * expect(result).toContainToolText('temperature');\n * expect(result).toMatchToolSchema(WeatherSchema);\n * expect(result).not.toBeToolError();\n * ```\n */\nexport { expect };\n","/**\n * Playwright fixtures for MCP OAuth authentication\n *\n * Provides worker-scoped OAuth authentication following Playwright's\n * recommended auth state pattern.\n */\n\nimport { test as base } from '@playwright/test';\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport type { MCPAuthConfig, MCPOAuthConfig } from '../config/mcpConfig.js';\nimport {\n PlaywrightOAuthClientProvider,\n type PlaywrightOAuthClientProviderConfig,\n} from '../auth/oauthClientProvider.js';\n\n/**\n * Static token auth provider that wraps a pre-acquired token\n *\n * This is a minimal implementation that provides tokens directly\n * without OAuth flow support.\n */\nclass StaticTokenAuthProvider implements OAuthClientProvider {\n private readonly accessToken: string;\n\n constructor(accessToken: string) {\n this.accessToken = accessToken;\n }\n\n get redirectUrl(): string {\n throw new Error('StaticTokenAuthProvider does not support OAuth redirects');\n }\n\n get clientMetadata() {\n return {\n redirect_uris: [],\n token_endpoint_auth_method: 'none' as const,\n grant_types: [],\n response_types: [],\n client_name: '@gleanwork/mcp-server-tester',\n };\n }\n\n async clientInformation() {\n return undefined;\n }\n\n async tokens() {\n return {\n access_token: this.accessToken,\n token_type: 'Bearer',\n };\n }\n\n async saveTokens(): Promise<void> {\n // Static tokens don't need to be saved\n }\n\n async redirectToAuthorization(): Promise<void> {\n throw new Error('StaticTokenAuthProvider does not support OAuth redirects');\n }\n\n async saveCodeVerifier(): Promise<void> {\n throw new Error('StaticTokenAuthProvider does not support PKCE');\n }\n\n async codeVerifier(): Promise<string> {\n throw new Error('StaticTokenAuthProvider does not support PKCE');\n }\n}\n\n/**\n * Test-scoped auth fixtures interface\n */\nexport interface MCPAuthFixtures {\n /**\n * OAuth client provider for MCP authentication\n */\n mcpAuthProvider: OAuthClientProvider | undefined;\n}\n\n/**\n * Extended Playwright test with MCP auth fixtures\n *\n * Use this when you need OAuth authentication for MCP server testing.\n *\n * @example\n * ```typescript\n * // test.ts\n * import { test } from '@gleanwork/mcp-server-tester/fixtures/mcpAuth';\n *\n * test('authenticated MCP call', async ({ mcpAuthProvider }) => {\n * // mcpAuthProvider can be passed to createMCPClientForConfig\n * });\n * ```\n */\nexport const test = base.extend<MCPAuthFixtures>({\n /**\n * Create auth provider based on environment configuration\n */\n // eslint-disable-next-line no-empty-pattern\n mcpAuthProvider: async ({}, use) => {\n const authConfig = getAuthConfigFromEnv();\n\n if (!authConfig) {\n await use(undefined);\n return;\n }\n\n // Static token mode\n if (authConfig.accessToken) {\n const provider = new StaticTokenAuthProvider(authConfig.accessToken);\n await use(provider);\n return;\n }\n\n // OAuth mode\n if (authConfig.oauth) {\n const provider = createOAuthProvider(authConfig.oauth);\n await use(provider);\n return;\n }\n\n await use(undefined);\n },\n});\n\n/**\n * Creates an OAuth provider from configuration\n */\nfunction createOAuthProvider(\n oauthConfig: MCPOAuthConfig\n): PlaywrightOAuthClientProvider {\n if (!oauthConfig.authStatePath) {\n throw new Error(\n 'OAuth configuration requires authStatePath. ' +\n 'Use performOAuthSetup() in globalSetup to create auth state first.'\n );\n }\n\n const providerConfig: PlaywrightOAuthClientProviderConfig = {\n storagePath: oauthConfig.authStatePath,\n redirectUri:\n oauthConfig.redirectUri ?? 'http://localhost:3000/oauth/callback',\n clientId: oauthConfig.clientId,\n clientSecret: oauthConfig.clientSecret,\n };\n\n return new PlaywrightOAuthClientProvider(providerConfig);\n}\n\n/**\n * Gets auth config from environment variables\n *\n * This is a fallback for fixtures that can't access testInfo.project directly.\n */\nfunction getAuthConfigFromEnv(): MCPAuthConfig | undefined {\n // Check for static token\n const accessToken = process.env.MCP_ACCESS_TOKEN;\n if (accessToken) {\n return { accessToken };\n }\n\n // Check for OAuth config\n const oauthServerUrl = process.env.MCP_OAUTH_SERVER_URL;\n const authStatePath = process.env.MCP_AUTH_STATE_PATH;\n\n if (oauthServerUrl || authStatePath) {\n return {\n oauth: {\n serverUrl: oauthServerUrl ?? '',\n authStatePath: authStatePath,\n clientId: process.env.MCP_OAUTH_CLIENT_ID,\n clientSecret: process.env.MCP_OAUTH_CLIENT_SECRET,\n scopes: process.env.MCP_OAUTH_SCOPES?.split(','),\n resource: process.env.MCP_OAUTH_RESOURCE,\n },\n };\n }\n\n return undefined;\n}\n\n/**\n * Re-export expect for convenience\n */\nexport { expect } from '@playwright/test';\n","import { z } from 'zod';\nimport type { MCPHostConfig } from './mcpHost/mcpHostTypes.js';\nimport type { SnapshotSanitizer } from '../assertions/validators/types.js';\nimport type { BuiltInRubric } from '../judge/judgeTypes.js';\n\n// Re-export sanitizer types from canonical source (validators/types.ts)\n// Note: For JSON datasets, the Zod schema below validates that patterns are strings.\n// The TypeScript types allow RegExp for runtime usage with Playwright matchers.\nexport type {\n BuiltInSanitizer,\n SnapshotSanitizer,\n RegexSanitizer,\n FieldRemovalSanitizer,\n} from '../assertions/validators/types.js';\n\n/**\n * Evaluation mode\n */\nexport type EvalMode = 'direct' | 'mcp_host';\n\n/**\n * A single eval test case\n *\n * For 'direct' mode: toolName and args are required\n * For 'mcp_host' mode: scenario and mcpHostConfig are required\n */\nexport interface EvalCase {\n /**\n * Unique identifier for this test case\n */\n id: string;\n\n /**\n * Human-readable description of what this test case validates\n */\n description?: string;\n\n /**\n * Evaluation mode\n * - 'direct': Direct API calls to MCP tools (default)\n * - 'mcp_host': LLM-driven tool selection via natural language\n *\n * @default 'direct'\n */\n mode?: EvalMode;\n\n /**\n * Name of the MCP tool to call (required for 'direct' mode, optional for 'mcp_host' mode)\n */\n toolName?: string;\n\n /**\n * Arguments to pass to the tool (required for 'direct' mode, optional for 'mcp_host' mode)\n */\n args?: Record<string, unknown>;\n\n /**\n * Natural language scenario for LLM to execute (optional, required for 'mcp_host' mode)\n *\n * @example \"Get the weather for London and tell me if I need an umbrella\"\n */\n scenario?: string;\n\n /**\n * MCP host configuration (optional for 'mcp_host' mode)\n *\n * If not specified, uses default configuration from test environment\n */\n mcpHostConfig?: MCPHostConfig;\n\n /**\n * Additional metadata for this test case\n *\n * For 'mcp_host' mode, can include 'expectedToolCalls' for validation\n */\n metadata?: Record<string, unknown>;\n\n /**\n * Number of times to run this case and compute an assertion pass rate.\n * When > 1, `EvalCaseResult.assertionPassRate` is populated and `pass` is determined\n * by `accuracyThreshold` rather than a single run.\n * @default 1\n */\n iterations?: number;\n\n /**\n * Minimum accuracy (0–1) required to pass when `iterations > 1`.\n * @default 1.0 (all iterations must pass)\n */\n accuracyThreshold?: number;\n\n /**\n * Number of times to invoke the LLM judge per `passesJudge` assertion.\n * Scores are averaged; the mean must meet the threshold to pass.\n * Reduces judge variance caused by non-determinism.\n * Per-assertion `passesJudge.reps` overrides this value.\n * @default 1\n */\n judgeReps?: number;\n\n /**\n * Golden/expected answer for this case.\n * When set, automatically passed as `reference` to the LLM judge\n * (unless passesJudge.reference is explicitly provided).\n * Mirrors EvalV2's `canonical_answer` field.\n */\n canonicalAnswer?: string;\n\n /**\n * Arbitrary string labels for this case.\n * Use for filtering eval runs with `EvalRunnerOptions.filterTags`\n * and for slicing results by category.\n *\n * @example ['tool-finding', 'multi-hop', 'search']\n */\n tags?: string[];\n\n /**\n * Expectations to validate against the tool response\n *\n * Multiple expectations can be combined and will all be validated.\n *\n * @example\n * ```json\n * {\n * \"id\": \"weather-london\",\n * \"toolName\": \"get_weather\",\n * \"args\": { \"city\": \"London\" },\n * \"expect\": {\n * \"containsText\": [\"temperature\", \"conditions\"],\n * \"schema\": \"WeatherResponse\",\n * \"responseSize\": { \"maxBytes\": 10000 },\n * \"isError\": false\n * }\n * }\n * ```\n */\n expect?: EvalExpectBlock;\n}\n\n/**\n * Configuration for a single LLM-as-judge evaluation\n */\nexport interface JudgeExpectConfig {\n /**\n * Name of a registered custom judge executor.\n * When set, the named judge handles evaluation and returns a normalized score.\n * The `threshold` determines pass/fail. `reps` and LLM config fields\n * (provider, model, etc.) are ignored.\n */\n judge?: string;\n /** Built-in rubric name or custom rubric object. Required when no `judge` is specified. */\n rubric?: BuiltInRubric | { text: string };\n /** Reference response to compare against */\n reference?: unknown;\n /** Score threshold for passing (0-1, default: 0.7) */\n threshold?: number;\n /** Number of judge evaluations for this assertion. Overrides EvalCase.judgeReps. */\n reps?: number;\n /** Judge provider. @default 'anthropic' */\n provider?:\n | 'anthropic'\n | 'vertex-anthropic'\n | 'anthropic-agent-sdk'\n | 'openai'\n | 'google';\n /** Model override (e.g., 'claude-opus-4-20250514') */\n model?: string;\n /** Environment variable name for API key */\n apiKeyEnvVar?: string;\n /** Max tokens for judge response */\n maxTokens?: number;\n /** Temperature for judge LLM (0–1) */\n temperature?: number;\n /** Max budget in USD per evaluation */\n maxBudgetUsd?: number;\n /** Fail if response exceeds this size in bytes before judging */\n maxToolOutputSize?: number;\n}\n\n/**\n * Unified expectation block for eval cases\n *\n * Mirrors the Playwright matcher API for consistency.\n */\nexport interface EvalExpectBlock {\n /**\n * Exact response match (toMatchToolResponse)\n */\n response?: unknown;\n\n /**\n * Name of schema to validate against (toMatchToolSchema)\n */\n schema?: string;\n\n /**\n * Text substring(s) that must be present (toContainToolText)\n */\n containsText?: string | string[];\n\n /**\n * Regex pattern(s) that must match (toMatchToolPattern)\n */\n matchesPattern?: string | string[];\n\n /**\n * Snapshot name for comparison (toMatchToolSnapshot)\n */\n snapshot?: string;\n\n /**\n * Snapshot sanitizers to apply\n */\n snapshotSanitizers?: SnapshotSanitizer[];\n\n /**\n * Error expectation (toBeToolError)\n * - true: expects any error\n * - false: expects no error\n * - string: expects error containing this message\n */\n isError?: boolean | string | string[];\n\n /**\n * LLM-as-judge evaluation (toPassToolJudge)\n *\n * Accepts a single judge config or an array for multi-judge evaluation.\n * When an array is provided, all judges must pass (AND semantics).\n */\n passesJudge?: JudgeExpectConfig | JudgeExpectConfig[];\n\n /**\n * Response size validation (toHaveToolResponseSize)\n */\n responseSize?: {\n /** Maximum allowed size in bytes */\n maxBytes?: number;\n /** Minimum required size in bytes */\n minBytes?: number;\n };\n\n /**\n * Asserts which tools the LLM called during a mcp_host simulation.\n * Only meaningful for mcp_host mode — direct mode has no tool call trace.\n */\n toolsTriggered?: {\n /** Expected tool calls */\n calls: Array<{\n /** Tool name */\n name: string;\n /** Expected arguments (partial match — extra keys are allowed) */\n arguments?: Record<string, unknown>;\n /** Whether this call MUST have been made (default: true) */\n required?: boolean;\n }>;\n /**\n * 'strict': calls must appear in the exact order listed\n * 'any': calls can appear in any order (default)\n */\n order?: 'strict' | 'any';\n /** If true, no tool calls outside the `calls` list are allowed */\n exclusive?: boolean;\n };\n\n /**\n * Asserts the number of tool calls made during a mcp_host simulation.\n */\n toolCallCount?: {\n /** Minimum number of tool calls */\n min?: number;\n /** Maximum number of tool calls */\n max?: number;\n /** Exact number of tool calls */\n exact?: number;\n };\n}\n\n/**\n * A complete eval dataset containing multiple test cases\n */\nexport interface EvalDataset {\n /**\n * Dataset name\n */\n name: string;\n\n /**\n * Dataset description\n */\n description?: string;\n\n /**\n * Test cases in this dataset\n */\n cases: Array<EvalCase>;\n\n /**\n * Optional schema definitions referenced by test cases\n */\n schemas?: Record<string, z.ZodSchema>;\n\n /**\n * Additional dataset metadata\n */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Zod schema for MCPHostConfig (simplified for serialization)\n */\nconst MCPHostConfigSchema = z.object({\n hostType: z.enum(['sdk', 'cli', 'browser', 'desktop']).optional(),\n provider: z\n .enum([\n 'openai',\n 'anthropic',\n 'azure',\n 'google',\n 'mistral',\n 'deepseek',\n 'openrouter',\n 'xai',\n 'vertex-anthropic',\n ])\n .optional(),\n apiKeyEnvVar: z.string().optional(),\n model: z.string().optional(),\n maxTokens: z.number().optional(),\n temperature: z.number().optional(),\n maxToolCalls: z.number().optional(),\n cli: z\n .object({\n command: z.string(),\n args: z.array(z.string()),\n outputFormat: z.enum(['stream-json', 'json']).optional(),\n timeout: z.number().optional(),\n })\n .optional(),\n});\n\n/**\n * Zod schema for SnapshotSanitizer\n */\nconst SnapshotSanitizerSchema = z.union([\n // Built-in sanitizers\n z.enum(['timestamp', 'uuid', 'iso-date', 'objectId', 'jwt']),\n // Custom regex sanitizer\n z.object({\n pattern: z.string(),\n replacement: z.string().optional(),\n }),\n // Field removal sanitizer\n z.object({\n remove: z.array(z.string()),\n }),\n]);\n\n/**\n * Zod schema for a single judge configuration\n */\nconst JudgeExpectConfigSchema = z\n .object({\n judge: z.string().min(1).optional(),\n rubric: z\n .union([\n z.enum([\n 'correctness',\n 'completeness',\n 'groundedness',\n 'instruction-following',\n 'conciseness',\n ]),\n z.object({ text: z.string().min(1) }),\n ])\n .optional(),\n reference: z.unknown().optional(),\n threshold: z.number().min(0).max(1).optional(),\n reps: z.number().int().min(1).optional(),\n provider: z\n .enum([\n 'anthropic',\n 'vertex-anthropic',\n 'anthropic-agent-sdk',\n 'openai',\n 'google',\n ])\n .optional(),\n model: z.string().optional(),\n apiKeyEnvVar: z.string().optional(),\n maxTokens: z.number().int().positive().optional(),\n temperature: z.number().min(0).max(1).optional(),\n maxBudgetUsd: z.number().positive().optional(),\n maxToolOutputSize: z.number().int().positive().optional(),\n })\n .refine((data) => data.judge !== undefined || data.rubric !== undefined, {\n message: 'Either \"judge\" or \"rubric\" must be provided in passesJudge',\n });\n\n/**\n * Zod schema for EvalExpectBlock\n */\nconst EvalExpectBlockSchema = z.object({\n response: z.unknown().optional(),\n schema: z.string().optional(),\n containsText: z.union([z.string(), z.array(z.string())]).optional(),\n matchesPattern: z.union([z.string(), z.array(z.string())]).optional(),\n snapshot: z.string().optional(),\n snapshotSanitizers: z.array(SnapshotSanitizerSchema).optional(),\n isError: z.union([z.boolean(), z.string(), z.array(z.string())]).optional(),\n passesJudge: z\n .union([JudgeExpectConfigSchema, z.array(JudgeExpectConfigSchema).min(1)])\n .optional(),\n responseSize: z\n .object({\n maxBytes: z.number().optional(),\n minBytes: z.number().optional(),\n })\n .optional(),\n toolsTriggered: z\n .object({\n calls: z.array(\n z.object({\n name: z.string(),\n arguments: z.record(z.string(), z.unknown()).optional(),\n required: z.boolean().optional(),\n })\n ),\n order: z.enum(['strict', 'any']).optional(),\n exclusive: z.boolean().optional(),\n })\n .optional(),\n toolCallCount: z\n .object({\n min: z.number().int().min(0).optional(),\n max: z.number().int().min(0).optional(),\n exact: z.number().int().min(0).optional(),\n })\n .optional(),\n});\n\n/**\n * Zod schema for EvalCase\n *\n * toolName and args are optional for mcp_host mode (which uses scenario instead)\n */\nexport const EvalCaseSchema = z.object({\n id: z.string().min(1, 'id must not be empty'),\n description: z.string().optional(),\n mode: z.enum(['direct', 'mcp_host']).optional(),\n toolName: z.string().min(1, 'toolName must not be empty').optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n scenario: z.string().optional(),\n mcpHostConfig: MCPHostConfigSchema.optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n iterations: z.number().int().min(1).optional(),\n accuracyThreshold: z.number().min(0).max(1).optional(),\n judgeReps: z.number().int().min(1).optional(),\n canonicalAnswer: z.string().optional(),\n tags: z.array(z.string()).optional(),\n expect: EvalExpectBlockSchema.optional(),\n});\n\n/**\n * Zod schema for EvalDataset (without schemas field, as schemas aren't serializable)\n */\nexport const EvalDatasetSchema = z.object({\n name: z.string().min(1, 'name must not be empty'),\n description: z.string().optional(),\n cases: z.array(EvalCaseSchema).min(1, 'dataset must have at least one case'),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Type for serialized eval dataset (without Zod schemas)\n */\nexport type SerializedEvalDataset = z.infer<typeof EvalDatasetSchema>;\n\n/**\n * Validates an eval case\n *\n * @param evalCase - The eval case to validate\n * @returns The validated eval case\n * @throws {z.ZodError} If validation fails\n */\nexport function validateEvalCase(evalCase: unknown): EvalCase {\n return EvalCaseSchema.parse(evalCase);\n}\n\n/**\n * Validates a serialized eval dataset\n *\n * @param dataset - The dataset to validate\n * @returns The validated dataset\n * @throws {z.ZodError} If validation fails\n */\nexport function validateEvalDataset(dataset: unknown): SerializedEvalDataset {\n return EvalDatasetSchema.parse(dataset);\n}\n","import { readFile } from 'fs/promises';\nimport { type z } from 'zod';\nimport {\n type EvalDataset,\n type SerializedEvalDataset,\n validateEvalDataset,\n} from './datasetTypes.js';\n\n/**\n * Options for loading an eval dataset\n */\nexport interface LoadDatasetOptions {\n /**\n * Optional schema definitions to attach to the dataset\n *\n * Keys should match the expectedSchemaName in eval cases\n */\n schemas?: Record<string, z.ZodSchema>;\n\n /**\n * Whether to validate the loaded dataset\n * @default true\n */\n validate?: boolean;\n}\n\n/**\n * Loads an eval dataset from a JSON file\n *\n * @param filePath - Absolute path to the JSON file\n * @param options - Load options\n * @returns The loaded and validated dataset\n * @throws {Error} If file cannot be read or JSON is invalid\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * const dataset = await loadEvalDataset('./data/my-evals.json', {\n * schemas: {\n * 'weather-response': WeatherResponseSchema,\n * },\n * });\n */\nexport async function loadEvalDataset(\n filePath: string,\n options: LoadDatasetOptions = {}\n): Promise<EvalDataset> {\n const { schemas, validate = true } = options;\n\n try {\n const fileContents = await readFile(filePath, 'utf-8');\n const rawData: unknown = JSON.parse(fileContents);\n\n // Validate if requested\n const serializedDataset: SerializedEvalDataset = validate\n ? validateEvalDataset(rawData)\n : (rawData as SerializedEvalDataset);\n\n // Create full dataset with schemas\n const dataset: EvalDataset = {\n ...serializedDataset,\n schemas: schemas ?? {},\n };\n\n return dataset;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(\n `Failed to parse JSON from ${filePath}: ${error.message}`\n );\n }\n throw error;\n }\n}\n\n/**\n * Loads an eval dataset from a plain object\n *\n * Useful for programmatically creating datasets in tests\n *\n * @param data - The dataset data\n * @param options - Load options\n * @returns The loaded and validated dataset\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * const dataset = loadEvalDatasetFromObject({\n * name: 'my-test-dataset',\n * cases: [\n * {\n * id: 'case-1',\n * toolName: 'get_weather',\n * args: { city: 'London' },\n * },\n * ],\n * });\n */\nexport function loadEvalDatasetFromObject(\n data: unknown,\n options: LoadDatasetOptions = {}\n): EvalDataset {\n const { schemas, validate = true } = options;\n\n // Validate if requested\n const serializedDataset: SerializedEvalDataset = validate\n ? validateEvalDataset(data)\n : (data as SerializedEvalDataset);\n\n // Create full dataset with schemas\n const dataset: EvalDataset = {\n ...serializedDataset,\n schemas: schemas ?? {},\n };\n\n return dataset;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unnecessary-type-assertion, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment */\n/**\n * Vercel AI SDK-based LLM host orchestrator.\n *\n * Replaces the custom agentic loop with generateText + stopWhen (ai v6),\n * giving access to 9 providers and built-in latency decomposition.\n *\n * Requires the `ai` package (v6+) as an optional peer dependency.\n * Additional providers require their respective @ai-sdk/* packages.\n */\nimport type {\n MCPHostConfig,\n MCPHostSimulationResult,\n MCPHostSimulator,\n LLMProvider,\n LLMToolCall,\n} from '../mcpHostTypes.js';\nimport type { MCPFixtureApi } from '../../../mcp/fixtures/mcpFixture.js';\nimport { extractText } from '../../../mcp/response.js';\n\n/**\n * Classifies a raw error from the Vercel AI SDK agentic loop and returns a\n * human-readable message with an actionable hint.\n *\n * The message is always prefixed with \"MCP host simulation failed: \" so that\n * callers see a consistent error surface regardless of which failure path was\n * hit.\n */\nfunction enrichErrorMessage(err: unknown, provider: string): string {\n const raw = err instanceof Error ? err.message : String(err);\n\n // Missing optional peer dependency\n if (\n raw.includes('Cannot find module') ||\n raw.includes('ERR_MODULE_NOT_FOUND')\n ) {\n return (\n `MCP host simulation failed: required package not installed.\\n` +\n `Hint: run \\`getMissingDependencyMessage('${provider}')\\` or check docs/mcp-host.md for install instructions.`\n );\n }\n\n // Authentication / API key problems\n if (\n raw.includes('401') ||\n raw.includes('Unauthorized') ||\n raw.includes('API key') ||\n raw.includes('api_key')\n ) {\n return (\n `MCP host simulation failed: authentication error.\\n` +\n `Hint: check your API key environment variable (e.g. ANTHROPIC_API_KEY, GOOGLE_APPLICATION_CREDENTIALS).`\n );\n }\n\n // Model not found (404 or explicit \"model … not found\" phrasing)\n if (\n raw.includes('404') ||\n raw.includes('Not Found') ||\n (raw.toLowerCase().includes('model') &&\n raw.toLowerCase().includes('not found'))\n ) {\n return (\n `MCP host simulation failed: model not found.\\n` +\n `Hint: check the model name format for your provider. For vertex-anthropic use 'claude-3-5-haiku@20241022' (with @).`\n );\n }\n\n // Network / DNS / connection errors\n if (\n raw.includes('ENOTFOUND') ||\n raw.includes('fetch failed') ||\n raw.includes('ECONNREFUSED')\n ) {\n return (\n `MCP host simulation failed: network error.\\n` +\n `Hint: check network connectivity and whether the provider's API endpoint is reachable from this machine.`\n );\n }\n\n // Rate limiting\n if (\n raw.includes('429') ||\n raw.toLowerCase().includes('rate limit') ||\n raw.includes('Too Many Requests')\n ) {\n return (\n `MCP host simulation failed: rate limited.\\n` +\n `Hint: reduce concurrency, add delays between iterations, or upgrade your API plan.`\n );\n }\n\n // Default: preserve original message with a consistent prefix\n return `MCP host simulation failed: ${raw}`;\n}\n\n// Dynamic import helper bypasses TypeScript module resolution for optional peer deps.\n// Each @ai-sdk/* package is optional — install only the providers you need.\nasync function loadModel(provider: LLMProvider, model: string): Promise<any> {\n switch (provider) {\n case 'openai': {\n const { openai } = await import('@ai-sdk/openai');\n return openai(model);\n }\n case 'anthropic': {\n const { anthropic } = await import('@ai-sdk/anthropic');\n return anthropic(model);\n }\n case 'vertex-anthropic': {\n // Anthropic via Google Vertex AI — uses Application Default Credentials.\n // Required env vars: GOOGLE_VERTEX_PROJECT, GOOGLE_VERTEX_LOCATION\n // Install: npm install @ai-sdk/google-vertex\n // Use this instead of 'anthropic' when api.anthropic.com is not reachable.\n const { createVertexAnthropic } =\n await import('@ai-sdk/google-vertex/anthropic');\n const vertexAnthropic = createVertexAnthropic({\n project: process.env.GOOGLE_VERTEX_PROJECT,\n location: process.env.GOOGLE_VERTEX_LOCATION ?? 'us-east5',\n });\n return (vertexAnthropic as unknown as (m: string) => unknown)(model);\n }\n case 'google': {\n // @ts-ignore - optional: npm install @ai-sdk/google\n const { google } = await import('@ai-sdk/google');\n return (google as any)(model);\n }\n case 'mistral': {\n // @ts-ignore - optional: npm install @ai-sdk/mistral\n const { mistral } = await import('@ai-sdk/mistral');\n return (mistral as any)(model);\n }\n case 'azure': {\n // @ts-ignore - optional: npm install @ai-sdk/azure\n const { azure } = await import('@ai-sdk/azure');\n return (azure as any)(model);\n }\n case 'deepseek': {\n // @ts-ignore - optional: npm install @ai-sdk/deepseek\n const { deepseek } = await import('@ai-sdk/deepseek');\n return (deepseek as any)(model);\n }\n case 'openrouter': {\n // @ts-ignore - optional: npm install @openrouter/ai-sdk-provider\n const { openrouter } = await import('@openrouter/ai-sdk-provider');\n return (openrouter as any)(model);\n }\n case 'xai': {\n // @ts-ignore - optional: npm install @ai-sdk/xai\n const { xai } = await import('@ai-sdk/xai');\n return (xai as any)(model);\n }\n default:\n throw new Error(\n `Unsupported Vercel AI SDK provider: ${String(provider)}`\n );\n }\n}\n\nfunction defaultModel(provider: LLMProvider): string {\n switch (provider) {\n case 'openai':\n return 'gpt-4o';\n case 'anthropic':\n return 'claude-3-5-sonnet-20241022';\n case 'google':\n return 'gemini-1.5-pro';\n case 'mistral':\n return 'mistral-large-latest';\n default:\n return 'default';\n }\n}\n\n/**\n * Creates a Vercel AI SDK-based MCP host simulator.\n *\n * Uses generateText with stopWhen (ai v6) to handle multi-turn tool calling.\n * Produces llmDurationMs and mcpDurationMs for latency decomposition.\n */\nexport function createVercelOrchestrator(): MCPHostSimulator {\n return {\n async simulate(\n mcp: MCPFixtureApi,\n scenario: string,\n config: MCPHostConfig\n ): Promise<MCPHostSimulationResult> {\n try {\n const { generateText, stepCountIs } = await import('ai');\n // jsonSchema from @ai-sdk/provider-utils creates a proper Schema object\n // (with .jsonSchema property) that ai's prepareToolsAndToolChoice can read.\n // Do NOT use jsonSchema from 'ai' — in v6 it produces the wrong shape.\n const { jsonSchema } = await import('@ai-sdk/provider-utils');\n\n if (!config.provider) {\n throw new Error('provider is required for SDK host type');\n }\n\n const modelId = config.model ?? defaultModel(config.provider);\n const model = await loadModel(config.provider, modelId);\n\n // Get available MCP tools and wrap them for Vercel AI SDK\n const mcpTools = await mcp.listTools();\n let mcpDurationMs = 0;\n const allToolCalls: LLMToolCall[] = [];\n\n // Build tool definitions in Vercel AI SDK format.\n // Uses any because the tool() generic requires inferred parameter types\n // which aren't available from MCP's JSON Schema at compile time.\n // Build tool definitions using explicit inputSchema (a Schema object with .jsonSchema).\n // We bypass the tool() helper because ai v6 tool() stores schema as .parameters\n // but prepareToolsAndToolChoice reads .inputSchema — they're inconsistent in v6.\n // Using jsonSchema() from @ai-sdk/provider-utils produces the correct Schema object.\n const tools: Record<string, any> = {};\n for (const mcpTool of mcpTools) {\n const toolName = mcpTool.name;\n // Ensure type:'object' is present — Anthropic requires it, some servers omit it.\n const rawSchema = {\n type: 'object',\n ...(mcpTool.inputSchema as Record<string, unknown>),\n };\n tools[toolName] = {\n description: mcpTool.description ?? '',\n inputSchema: jsonSchema(rawSchema),\n execute: async (args: Record<string, unknown>) => {\n const mcpStart = Date.now();\n const result = await mcp.callTool(toolName, args);\n mcpDurationMs += Date.now() - mcpStart;\n\n allToolCalls.push({ name: toolName, arguments: args });\n return extractText(result);\n },\n };\n }\n\n const maxSteps = config.maxToolCalls ?? 10;\n const llmStart = Date.now();\n\n const result = await (generateText as any)({\n model,\n prompt: scenario,\n tools,\n stopWhen: stepCountIs(maxSteps),\n temperature: config.temperature ?? 0,\n maxTokens: config.maxTokens,\n });\n\n const totalDurationMs = Date.now() - llmStart;\n const llmDurationMs = totalDurationMs - mcpDurationMs;\n\n const conversationHistory = (result.steps ?? []).map((step: any) => ({\n role: (step.toolCalls?.length > 0 ? 'tool' : 'assistant') as\n | 'tool'\n | 'assistant',\n content:\n step.toolCalls?.length > 0\n ? JSON.stringify(step.toolResults)\n : (step.text ?? ''),\n }));\n\n return {\n success: true,\n toolCalls: allToolCalls,\n response: result.text as string,\n scenario,\n llmDurationMs,\n mcpDurationMs,\n conversationHistory,\n };\n } catch (err) {\n return {\n success: false,\n toolCalls: [],\n error: enrichErrorMessage(err, config.provider ?? 'unknown'),\n };\n }\n },\n };\n}\n","import type {\n MCPHostSimulationResult,\n LLMToolCall,\n} from '../../mcpHostTypes.js';\n\n/** Parses NDJSON (stream-json) output from CLI hosts. */\nexport function parseStreamJson(stdout: string): MCPHostSimulationResult {\n const lines = stdout.split('\\n').filter((line) => line.trim().length > 0);\n const toolCalls: LLMToolCall[] = [];\n const textParts: string[] = [];\n const conversationHistory: Array<{\n role: 'user' | 'assistant' | 'tool';\n content: string;\n }> = [];\n\n for (const line of lines) {\n let event: StreamJsonEvent;\n try {\n event = JSON.parse(line) as StreamJsonEvent;\n } catch {\n // Skip non-JSON lines (e.g., debug output)\n continue;\n }\n\n if (event.type === 'assistant' && event.message?.content) {\n for (const block of event.message.content) {\n if (block.type === 'tool_use' && block.name) {\n const rawName = block.name;\n const mcpMatch = /^mcp__[^_]+__(.+)$/.exec(rawName);\n toolCalls.push({\n name: mcpMatch ? mcpMatch[1]! : rawName,\n arguments: block.input ?? {},\n id: block.id,\n });\n }\n\n if (block.type === 'text' && block.text) {\n textParts.push(block.text);\n }\n }\n }\n\n if (event.type === 'user' && event.message?.content) {\n for (const block of event.message.content) {\n if (block.type === 'tool_result') {\n const content =\n typeof block.content === 'string'\n ? block.content\n : JSON.stringify(block.content);\n conversationHistory.push({ role: 'tool', content });\n }\n }\n }\n\n if (event.type === 'result' && typeof event.result === 'string') {\n if (textParts.length === 0) {\n textParts.push(event.result);\n }\n }\n\n if (event.type === 'result' && event.is_error === true) {\n return {\n success: false,\n toolCalls,\n error:\n typeof event.result === 'string'\n ? event.result\n : 'CLI host reported an error',\n };\n }\n }\n\n const response = textParts.join('');\n\n if (response) {\n conversationHistory.push({ role: 'assistant', content: response });\n }\n\n return {\n success: true,\n toolCalls,\n response: response || undefined,\n conversationHistory:\n conversationHistory.length > 0 ? conversationHistory : undefined,\n };\n}\n\n/** Creates a parser for CLIs that output a single JSON object with configurable paths. */\nexport function createJsonParser(paths: {\n toolCalls: string;\n response: string;\n success?: string;\n}): (stdout: string) => MCPHostSimulationResult {\n return (stdout: string): MCPHostSimulationResult => {\n const data = JSON.parse(stdout) as Record<string, unknown>;\n\n const rawToolCalls = getNestedValue(data, paths.toolCalls);\n const toolCalls: LLMToolCall[] = Array.isArray(rawToolCalls)\n ? rawToolCalls.map((tc: Record<string, unknown>) => ({\n name: typeof tc.name === 'string' ? tc.name : '',\n arguments: (tc.arguments ?? tc.args ?? {}) as Record<string, unknown>,\n }))\n : [];\n\n const response = getNestedValue(data, paths.response);\n const success = paths.success\n ? Boolean(getNestedValue(data, paths.success))\n : true;\n\n return {\n success,\n toolCalls,\n response: typeof response === 'string' ? response : undefined,\n };\n };\n}\n\ninterface ContentBlock {\n type: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n text?: string;\n content?: unknown;\n tool_use_id?: string;\n}\n\ninterface StreamJsonEvent {\n type: string;\n message?: { role?: string; content?: ContentBlock[] };\n result?: string;\n is_error?: boolean;\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((current, key) => {\n if (current !== null && typeof current === 'object') {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n","import { spawn } from 'node:child_process';\nimport type {\n CLIConfig,\n LLMToolCall,\n MCPHostSimulationResult,\n} from '../../mcpHostTypes.js';\nimport { parseStreamJson, createJsonParser } from './parsers.js';\n\nconst DEFAULT_TIMEOUT = 120_000;\nconst MAX_BUFFER = 10 * 1024 * 1024; // 10MB\n\n/**\n * Returns a parser function for the given output format.\n */\nexport function getParser(\n format: CLIConfig['outputFormat']\n): (stdout: string) => MCPHostSimulationResult {\n switch (format ?? 'stream-json') {\n case 'stream-json':\n return parseStreamJson;\n case 'json':\n return createJsonParser({\n toolCalls: 'toolCalls',\n response: 'response',\n success: 'success',\n });\n }\n}\n\n/**\n * Interpolates `{{scenario}}` in each arg string.\n */\nexport function interpolateArgs(args: string[], scenario: string): string[] {\n return args.map((arg) => arg.replace(/\\{\\{scenario\\}\\}/g, scenario));\n}\n\n/**\n * Runs a CLI host: interpolates `{{scenario}}` in args, spawns the process\n * directly (no shell), and parses stdout according to `outputFormat`.\n *\n * Because the process is spawned without a shell, special characters in\n * the scenario (quotes, newlines, `$`, backticks, etc.) are passed through\n * safely as literal argument values.\n */\nexport async function runCLIHost(\n cliConfig: CLIConfig,\n scenario: string\n): Promise<MCPHostSimulationResult> {\n const timeout = cliConfig.timeout ?? DEFAULT_TIMEOUT;\n const args = interpolateArgs(cliConfig.args, scenario);\n\n const startTime = Date.now();\n\n let stdout: string;\n try {\n const result = await spawnProcess(cliConfig.command, args, { timeout });\n stdout = result.stdout;\n } catch (err) {\n const elapsed = Date.now() - startTime;\n const message = err instanceof Error ? err.message : String(err);\n\n if (message.includes('TIMEOUT') || message.includes('timed out')) {\n return {\n success: false,\n toolCalls: [],\n error:\n `CLI host timed out after ${elapsed}ms (limit: ${timeout}ms). ` +\n `Increase timeout via mcpHostConfig.cli.timeout.`,\n };\n }\n\n return {\n success: false,\n toolCalls: [],\n error: `CLI host process failed: ${message}`,\n };\n }\n\n const parse = getParser(cliConfig.outputFormat);\n\n let result: MCPHostSimulationResult;\n try {\n result = parse(stdout);\n } catch (err) {\n return {\n success: false,\n toolCalls: [],\n error:\n `Failed to parse CLI host output: ${err instanceof Error ? err.message : String(err)}` +\n `\\nstdout (first 500 chars): ${stdout.slice(0, 500)}`,\n };\n }\n\n const validationError = validateSimulationResult(result);\n if (validationError) {\n return {\n success: false,\n toolCalls: [],\n error: `CLI host returned invalid result: ${validationError}`,\n };\n }\n\n return result;\n}\n\nexport function validateSimulationResult(result: unknown): string | null {\n if (result === null || typeof result !== 'object') {\n return `Expected object, got ${typeof result}`;\n }\n\n const obj = result as Record<string, unknown>;\n\n if (typeof obj.success !== 'boolean') {\n return `\"success\" must be a boolean, got ${typeof obj.success}`;\n }\n\n if (!Array.isArray(obj.toolCalls)) {\n return `\"toolCalls\" must be an array, got ${typeof obj.toolCalls}`;\n }\n\n for (let i = 0; i < obj.toolCalls.length; i++) {\n const tc = obj.toolCalls[i] as LLMToolCall;\n if (typeof tc.name !== 'string') {\n return `toolCalls[${i}].name must be a string, got ${typeof tc.name}`;\n }\n if (typeof tc.arguments !== 'object' || tc.arguments === null) {\n return `toolCalls[${i}].arguments must be an object, got ${typeof tc.arguments}`;\n }\n }\n\n return null;\n}\n\n/**\n * Spawns a process directly (no shell) and closes stdin immediately.\n *\n * Using spawn without a shell means args are passed as-is to the process,\n * avoiding shell injection. Closing stdin prevents CLI hosts like Claude\n * Code from waiting for input.\n */\nfunction spawnProcess(\n command: string,\n args: string[],\n options: { timeout: number }\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Close stdin immediately so the CLI doesn't wait for input\n child.stdin.end();\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let totalBytes = 0;\n\n child.stdout.on('data', (chunk: Buffer) => {\n totalBytes += chunk.length;\n if (totalBytes <= MAX_BUFFER) {\n stdoutChunks.push(chunk);\n }\n });\n\n child.stderr.on('data', (chunk: Buffer) => {\n totalBytes += chunk.length;\n if (totalBytes <= MAX_BUFFER) {\n stderrChunks.push(chunk);\n }\n });\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n reject(new Error(`Process timed out after ${options.timeout}ms`));\n }, options.timeout);\n\n child.on('error', (err) => {\n clearTimeout(timer);\n reject(err);\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n const stdout = Buffer.concat(stdoutChunks).toString('utf-8');\n const stderr = Buffer.concat(stderrChunks).toString('utf-8');\n\n if (code !== 0) {\n reject(\n new Error(\n `Command failed with exit code ${code ?? 'null'}` +\n (stderr ? `\\nstderr: ${stderr}` : '')\n )\n );\n return;\n }\n\n resolve({ stdout, stderr });\n });\n });\n}\n","/**\n * MCP Host Simulation - Main entry point\n *\n * All providers (openai, anthropic, google, azure, mistral, deepseek,\n * openrouter, xai) run through the Vercel AI SDK orchestrator, which uses\n * generateText + stopWhen for a uniform multi-turn tool-calling loop with\n * built-in latency decomposition.\n *\n * Required packages per provider:\n * openai → npm install ai @ai-sdk/openai\n * anthropic → npm install ai @ai-sdk/anthropic\n * google → npm install ai @ai-sdk/google\n * azure → npm install ai @ai-sdk/azure\n * mistral → npm install ai @ai-sdk/mistral\n * deepseek → npm install ai @ai-sdk/deepseek\n * openrouter → npm install ai @openrouter/ai-sdk-provider\n * xai → npm install ai @ai-sdk/xai\n */\n\nimport type { MCPFixtureApi } from '../../mcp/fixtures/mcpFixture.js';\nimport type {\n MCPHostConfig,\n MCPHostSimulationResult,\n MCPHostSimulator,\n LLMProvider,\n} from './mcpHostTypes.js';\nimport { createVercelOrchestrator } from './adapters/vercel.js';\nimport { runCLIHost } from './adapters/cli/index.js';\n\n// Single orchestrator instance shared across all providers.\n// Each provider is dynamically imported inside the orchestrator on first use.\nconst vercelOrchestrator: MCPHostSimulator = createVercelOrchestrator();\n\nconst allProviders: LLMProvider[] = [\n 'openai',\n 'anthropic',\n 'azure',\n 'google',\n 'mistral',\n 'deepseek',\n 'openrouter',\n 'xai',\n 'vertex-anthropic',\n];\n\nconst simulatorRegistry = new Map<LLMProvider, MCPHostSimulator>(\n allProviders.map((p) => [p, vercelOrchestrator])\n);\n\n/**\n * Simulates an MCP host interacting with an MCP server.\n *\n * The LLM chooses which tools to call based solely on their descriptions and\n * schemas, testing discoverability and parameter clarity at the level a real\n * user (via Claude Desktop, ChatGPT, etc.) would experience.\n *\n * @param mcp - MCP fixture API (used by SDK hosts; ignored by CLI/browser hosts which establish their own connections)\n * @param scenario - Natural language prompt describing what the LLM should do\n * @param config - MCP host configuration (provider, model, temperature, etc.)\n * @returns Simulation result with tool calls, final response, and latency data\n *\n * @example\n * ```typescript\n * // SDK host (default) — uses the framework's existing MCP connection\n * const result = await simulateMCPHost(mcp,\n * \"Find recent documents about MCP testing frameworks\",\n * { provider: 'anthropic', model: 'claude-3-5-sonnet-20241022' }\n * );\n *\n * // CLI host — spawns a CLI process with its own MCP connection\n * const result = await simulateMCPHost(mcp,\n * \"Find recent documents about MCP testing frameworks\",\n * {\n * hostType: 'cli',\n * provider: 'anthropic',\n * cli: {\n * command: 'claude',\n * args: ['-p', '{{scenario}}', '--output-format', 'stream-json', '--verbose'],\n * },\n * }\n * );\n * ```\n */\nexport async function simulateMCPHost(\n mcp: MCPFixtureApi,\n scenario: string,\n config: MCPHostConfig\n): Promise<MCPHostSimulationResult> {\n const hostType = config.hostType ?? 'sdk';\n\n if (hostType === 'cli') {\n if (!config.cli) {\n throw new Error(\n `mcpHostConfig.cli is required when hostType is 'cli'. ` +\n `Provide { command } with a shell command containing {{scenario}}.`\n );\n }\n return runCLIHost(config.cli, scenario);\n }\n\n if (hostType === 'browser' || hostType === 'desktop') {\n throw new Error(\n `Host type '${hostType}' is not yet implemented. ` +\n `Supported host types: 'sdk', 'cli'.`\n );\n }\n\n // Default: SDK host via Vercel AI SDK\n if (!config.provider) {\n throw new Error(\n `mcpHostConfig.provider is required for 'sdk' host type. ` +\n `Supported: ${allProviders.join(', ')}`\n );\n }\n\n const simulator = simulatorRegistry.get(config.provider);\n if (!simulator) {\n throw new Error(\n `Unsupported provider: ${String(config.provider)}. ` +\n `Supported: ${allProviders.join(', ')}`\n );\n }\n return simulator.simulate(mcp, scenario, config);\n}\n\n/**\n * Returns true if the given provider is supported.\n *\n * Note: this does not check whether the required @ai-sdk/* package is\n * installed — that is validated at simulation time with a helpful error.\n */\nexport function isProviderAvailable(provider: LLMProvider): boolean {\n return simulatorRegistry.has(provider);\n}\n\n/**\n * Returns a human-readable installation message for a given provider.\n *\n * @remarks This is a diagnostic utility for checking whether optional\n * @ai-sdk/* packages are installed. Not part of the primary usage path.\n */\nexport function getMissingDependencyMessage(provider: LLMProvider): string {\n const packageMap: Partial<Record<LLMProvider, string>> = {\n openai: 'npm install ai @ai-sdk/openai',\n anthropic: 'npm install ai @ai-sdk/anthropic',\n google: 'npm install ai @ai-sdk/google',\n azure: 'npm install ai @ai-sdk/azure',\n mistral: 'npm install ai @ai-sdk/mistral',\n deepseek: 'npm install ai @ai-sdk/deepseek',\n openrouter: 'npm install ai @openrouter/ai-sdk-provider',\n xai: 'npm install ai @ai-sdk/xai',\n 'vertex-anthropic':\n 'npm install ai @ai-sdk/google-vertex (requires Application Default Credentials — see docs/mcp-host.md)',\n };\n\n const pkg = packageMap[provider];\n return pkg\n ? `${String(provider)} provider requires: ${pkg}`\n : `Unknown provider: ${String(provider)}`;\n}\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\nimport type { EvalRunnerResult } from './evalRunner.js';\n\n/**\n * Options for saveBaseline\n */\nexport interface SaveBaselineOptions {\n /**\n * When true (default), strips the `response` field from each case result\n * before saving. Keeps baseline files small and git-friendly — the baseline\n * is a pass/fail record and the full response is not needed for comparison.\n *\n * Set to false to preserve the complete response in the saved file.\n *\n * @default true\n */\n omitResponses?: boolean;\n}\n\n/**\n * Saves eval results to a JSON file for use as a baseline in future runs.\n *\n * @param result - The eval run result to save\n * @param filePath - Path to write the JSON file (parent dirs created automatically)\n * @param options - Save options\n */\nexport async function saveBaseline(\n result: EvalRunnerResult,\n filePath: string,\n options: SaveBaselineOptions = {}\n): Promise<void> {\n const { omitResponses = true } = options;\n\n const toSave = omitResponses\n ? {\n ...result,\n caseResults: result.caseResults.map(\n ({ response: _response, ...rest }) => rest\n ),\n }\n : result;\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(toSave, null, 2), 'utf8');\n}\n\n/**\n * Loads a previously saved baseline from a JSON file.\n *\n * @param filePath - Path to the JSON file written by saveBaseline\n * @returns The saved EvalRunnerResult\n * @throws If the file cannot be read or parsed\n */\nexport async function loadBaseline(\n filePath: string\n): Promise<EvalRunnerResult> {\n const raw = await readFile(filePath, 'utf8');\n return JSON.parse(raw) as EvalRunnerResult;\n}\n\n/**\n * Builds a map of case ID → pass status from a baseline result.\n * Used internally by runEvalDataset to tag current results with baseline status.\n */\nexport function buildBaselinePassMap(\n baseline: EvalRunnerResult\n): Map<string, boolean> {\n const map = new Map<string, boolean>();\n for (const result of baseline.caseResults) {\n map.set(result.id, result.pass);\n }\n return map;\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface ExecFileResult {\n status: 0 | 1;\n stdout: string;\n stderr: string;\n}\n\n/**\n * Runs execFile without throwing on non-zero exit codes.\n * Always returns a result object rather than throwing.\n */\nexport async function execFileNoThrow(\n file: string,\n args: string[]\n): Promise<ExecFileResult> {\n try {\n const result = await execFileAsync(file, args);\n return {\n status: 0,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n } catch (err: unknown) {\n const execErr = err as { stdout?: string; stderr?: string };\n return {\n status: 1,\n stdout: execErr.stdout ?? '',\n stderr: execErr.stderr ?? '',\n };\n }\n}\n","import type { MCPFixtureApi } from '../mcp/fixtures/mcpFixture.js';\nimport type { EvalDataset, EvalCase, EvalExpectBlock } from './datasetTypes.js';\nimport type { TestInfo, Expect } from '@playwright/test';\nimport type { ZodType } from 'zod';\nimport { simulateMCPHost } from './mcpHost/mcpHostSimulation.js';\nimport type { MCPHostSimulationResult } from './mcpHost/mcpHostTypes.js';\nimport type { EvalExpectationResult } from '../types/index.js';\nimport type {\n EvalCaseResult,\n EvalCaseRequest,\n IterationResult,\n EvalRunMetadata,\n} from '../types/reporter.js';\nimport {\n saveBaseline,\n loadBaseline,\n buildBaselinePassMap,\n} from './baseline.js';\nimport {\n validateResponse,\n validateSchema,\n validateText,\n validatePattern,\n validateError,\n validateSize,\n validateToolCalls,\n validateToolCallCount,\n validateJudge,\n} from '../assertions/validators/index.js';\nimport { execFileNoThrow } from '../utils/execFileNoThrow.js';\nimport { debugEval } from '../debug.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Context passed to the eval runner\n */\nexport interface EvalContext {\n /**\n * MCP fixture API for interacting with the server\n */\n mcp: MCPFixtureApi;\n\n /**\n * Optional Playwright TestInfo for reporter integration\n * When provided, eval results will be attached to the test for the MCP reporter\n */\n testInfo?: TestInfo;\n\n /**\n * Optional Playwright expect function for snapshot testing\n * Required for snapshot expectations to work properly\n */\n expect?: Expect;\n}\n\nexport type { EvalExpectationResult } from '../types/index.js';\n\nexport type {\n EvalCaseRequest,\n EvalCaseResult,\n IterationResult,\n EvalRunMetadata,\n} from '../types/reporter.js';\n\n/**\n * Overall result of running an eval dataset\n */\nexport interface EvalRunnerResult {\n /**\n * Total number of cases\n */\n total: number;\n\n /**\n * Number of passing cases\n */\n passed: number;\n\n /**\n * Number of failing cases\n */\n failed: number;\n\n /**\n * Individual case results\n */\n caseResults: Array<EvalCaseResult>;\n\n /**\n * Overall execution time in milliseconds\n */\n durationMs: number;\n\n /**\n * Difference between current pass rate and baseline pass rate.\n * Positive = improvement, negative = regression.\n * Only present when `baselineResultsFrom` was provided.\n */\n deltaPassRate?: number;\n\n /**\n * Number of cases that regressed: passed in baseline, failed now.\n * Only present when `baselineResultsFrom` was provided.\n */\n regressions?: number;\n\n /**\n * Number of cases that improved: failed in baseline, passed now.\n * Only present when `baselineResultsFrom` was provided.\n */\n improvements?: number;\n\n /**\n * Average tool precision across all mcp_host cases that have a\n * `toolsTriggered` expectation (precision = fraction of called tools\n * that were expected). Only present when at least one such case ran.\n */\n datasetToolPrecision?: number;\n\n /**\n * Average tool recall across all mcp_host cases that have a\n * `toolsTriggered` expectation (recall = fraction of required tools\n * that were actually called). Only present when at least one such case ran.\n */\n datasetToolRecall?: number;\n\n /**\n * Harmonic mean of `datasetToolPrecision` and `datasetToolRecall`.\n * Only present when at least one case contributes precision/recall data.\n */\n datasetToolF1?: number;\n\n /**\n * Experiment tracking metadata captured at run time.\n */\n metadata?: EvalRunMetadata;\n}\n\n/**\n * Options for running eval dataset\n */\nexport interface EvalRunnerOptions {\n /**\n * The dataset to run\n */\n dataset: EvalDataset;\n\n /**\n * Schema registry for schema validation by name\n *\n * Maps schema names to Zod schemas for use with expect.schema\n *\n * @example\n * ```typescript\n * {\n * schemas: {\n * WeatherResponse: z.object({ temperature: z.number() }),\n * ErrorResponse: z.object({ error: z.string() }),\n * }\n * }\n * ```\n */\n schemas?: Record<string, ZodType>;\n\n /**\n * Whether to stop on first failure\n * @default false\n */\n stopOnFailure?: boolean;\n\n /**\n * Optional callback called after each case\n */\n onCaseComplete?: (result: EvalCaseResult) => void | Promise<void>;\n\n /**\n * Maximum number of eval cases to run concurrently.\n * When > 1, cases run in parallel (ignores stopOnFailure ordering).\n * @default 1 (sequential)\n */\n concurrency?: number;\n\n /**\n * Default iteration count for `mcp_host` mode cases that do not specify\n * `iterations` explicitly. Has no effect on `direct` mode cases (which are\n * deterministic and always default to 1 iteration).\n *\n * Set to 10 for standard runs or 20 for release gates. Individual cases can\n * still override this with their own `iterations` field.\n *\n * @default 1 (preserves historical behaviour when not set)\n *\n * @example\n * ```typescript\n * // Run all mcp_host cases 10 times each by default\n * await runEvalDataset({ dataset, defaultLlmIterations: 10 }, { mcp });\n * ```\n */\n defaultLlmIterations?: number;\n\n /**\n * Default number of judge evaluations for cases that do not specify\n * `judgeReps` explicitly. Applies to any case with a `passesJudge`\n * expectation. Per-case `judgeReps` overrides this.\n *\n * @default 1 (single judge run)\n */\n defaultJudgeReps?: number;\n\n /**\n * When set, only eval cases whose `tags` array contains at least one of\n * the specified tags are run. Cases without a `tags` field are excluded.\n * When undefined or empty, all cases run (default behavior).\n */\n filterTags?: string[];\n\n /**\n * If set, saves the run results to this file path after completion.\n * Use with `baselineResultsFrom` on the next run for regression detection.\n *\n * @example '.mcp-test-results/baseline.json'\n */\n saveResultsTo?: string;\n\n /**\n * When true (default), strips the `response` field from each case result\n * before saving the baseline file. Keeps baseline files small and git-friendly —\n * the full tool response is not needed for pass/fail regression detection.\n *\n * Set to false to preserve complete responses in the saved file.\n *\n * @default true\n */\n omitResponsesFromBaseline?: boolean;\n\n /**\n * If set, loads this file as the baseline and computes delta metrics vs the current run.\n * Populates `EvalRunnerResult.deltaPassRate`, `.regressions`, `.improvements`,\n * and tags each `EvalCaseResult.baselinePass`.\n */\n baselineResultsFrom?: string;\n\n /**\n * MCP host model identifier to record in run metadata.\n * Use this to identify which model was used when running mcp_host cases.\n *\n * @example 'claude-opus-4-20250514'\n */\n mcpHostModel?: string;\n\n /**\n * Judge model identifier to record in run metadata.\n * Use this to identify which model was used for judge evaluations.\n *\n * @example 'claude-sonnet-4-20250514'\n */\n judgeModel?: string;\n}\n\n/**\n * Options for running a single eval case\n */\nexport interface EvalCaseOptions {\n /**\n * Dataset name for the result (defaults to 'single-case')\n */\n datasetName?: string;\n\n /**\n * Schema registry for schema validation by name\n */\n schemas?: Record<string, ZodType>;\n}\n\nasync function executeToolCall(\n evalCase: EvalCase,\n mcp: MCPFixtureApi\n): Promise<{ response: unknown; error?: string }> {\n const mode = evalCase.mode || 'direct';\n\n try {\n if (mode === 'mcp_host') {\n // MCP host simulation mode\n if (!evalCase.scenario) {\n throw new Error(\n `Eval case ${evalCase.id}: scenario is required for mcp_host mode`\n );\n }\n\n if (!evalCase.mcpHostConfig) {\n throw new Error(\n `Eval case ${evalCase.id}: mcpHostConfig is required for mcp_host mode`\n );\n }\n\n const simulationResult = await simulateMCPHost(\n mcp,\n evalCase.scenario,\n evalCase.mcpHostConfig\n );\n\n if (!simulationResult.success) {\n throw new Error(simulationResult.error || 'MCP host simulation failed');\n }\n\n return { response: simulationResult };\n } else {\n // Direct mode - call tool directly\n if (!evalCase.toolName) {\n throw new Error(\n `Eval case ${evalCase.id}: toolName is required for direct mode`\n );\n }\n if (!evalCase.args) {\n throw new Error(\n `Eval case ${evalCase.id}: args is required for direct mode`\n );\n }\n\n const result = await mcp.callTool(evalCase.toolName, evalCase.args);\n return { response: result };\n }\n } catch (err) {\n // Note: errors originating from mcp_host simulation are already enriched\n // with actionable context by enrichErrorMessage() in the vercel adapter.\n // Pass the message through unchanged so that hint text reaches the caller.\n return {\n response: undefined,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n/**\n * Determines if a case passed based on error and expectation results\n */\nfunction didCasePass(\n error: string | undefined,\n expectations: EvalCaseResult['expectations']\n): boolean {\n return (\n !error &&\n Object.values(expectations).every(\n (result) => result === undefined || result.pass\n )\n );\n}\n\n/**\n * Configuration for processing expect blocks\n */\ninterface ExpectBlockConfig {\n schemas?: Record<string, ZodType>;\n playwrightExpect?: Expect;\n judgeReps?: number;\n canonicalAnswer?: string;\n}\n\n/**\n * Return type for runExpectBlockValidations, including optional precision/recall metrics\n */\ninterface ExpectBlockResults {\n expectations: EvalCaseResult['expectations'];\n toolPrecision?: number;\n toolRecall?: number;\n}\n\n/**\n * Processes the new unified expect block using validators\n *\n * This function translates the expect block into validation results,\n * calling the appropriate validators for each field.\n */\nasync function runExpectBlockValidations(\n expectBlock: EvalExpectBlock,\n response: unknown,\n config: ExpectBlockConfig\n): Promise<ExpectBlockResults> {\n const results: EvalCaseResult['expectations'] = {};\n let toolPrecision: number | undefined;\n let toolRecall: number | undefined;\n\n // response (toMatchToolResponse)\n if (expectBlock.response !== undefined) {\n const validation = validateResponse(response, expectBlock.response);\n results.exact = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // schema (toMatchToolSchema)\n if (expectBlock.schema !== undefined) {\n const schema = config.schemas?.[expectBlock.schema];\n if (!schema) {\n results.schema = {\n pass: false,\n details: `Schema \"${expectBlock.schema}\" not found in schemas registry`,\n };\n } else {\n const validation = validateSchema(response, schema);\n results.schema = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n }\n\n // containsText (toContainToolText)\n if (expectBlock.containsText !== undefined) {\n const validation = validateText(response, expectBlock.containsText);\n results.textContains = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // matchesPattern (toMatchToolPattern)\n if (expectBlock.matchesPattern !== undefined) {\n const validation = validatePattern(response, expectBlock.matchesPattern);\n results.regex = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // isError (toBeToolError)\n if (expectBlock.isError !== undefined) {\n const validation = validateError(response, expectBlock.isError);\n results.error = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // responseSize (toHaveToolResponseSize)\n if (expectBlock.responseSize !== undefined) {\n const validation = validateSize(response, expectBlock.responseSize);\n results.size = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // toolsTriggered (toHaveToolCalls)\n if (expectBlock.toolsTriggered !== undefined) {\n const validation = validateToolCalls(response, expectBlock.toolsTriggered);\n results.toolsTriggered = {\n pass: validation.pass,\n details: validation.message,\n };\n toolPrecision = validation.metrics?.precision;\n toolRecall = validation.metrics?.recall;\n }\n\n // toolCallCount (toHaveToolCallCount)\n if (expectBlock.toolCallCount !== undefined) {\n const validation = validateToolCallCount(\n response,\n expectBlock.toolCallCount\n );\n results.toolCallCount = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // passesJudge (toPassToolJudge) — single or multi-judge\n if (expectBlock.passesJudge !== undefined) {\n const judgeConfigs = Array.isArray(expectBlock.passesJudge)\n ? expectBlock.passesJudge\n : [expectBlock.passesJudge];\n\n const judgeResultEntries = await Promise.all(\n judgeConfigs.map(async (judgeConfig) => {\n const effectiveReps = judgeConfig.reps ?? config.judgeReps ?? 1;\n const effectiveReference =\n judgeConfig.reference !== undefined\n ? judgeConfig.reference\n : config.canonicalAnswer;\n const validation = await validateJudge(response, {\n ...judgeConfig,\n reference: effectiveReference,\n reps: effectiveReps,\n });\n\n const judgeName =\n judgeConfig.judge ??\n (typeof judgeConfig.rubric === 'string'\n ? judgeConfig.rubric\n : undefined);\n\n return {\n pass: validation.pass,\n details: validation.message,\n score: validation.details?.score as number | undefined,\n reasoning: validation.details?.reasoning as string | undefined,\n judgeName,\n judgeProvider: validation.details?.judgeProvider as\n | string\n | undefined,\n judgeModel: validation.details?.judgeModel as string | undefined,\n } satisfies EvalExpectationResult;\n })\n );\n\n if (judgeResultEntries.length === 1) {\n // Single judge — flat result, same as before\n results.judge = judgeResultEntries[0]!;\n } else {\n // Multi-judge — aggregate with AND semantics\n const allPassed = judgeResultEntries.every((r) => r.pass);\n const passCount = judgeResultEntries.filter((r) => r.pass).length;\n\n results.judge = {\n pass: allPassed,\n details: `${passCount}/${judgeResultEntries.length} judges passed`,\n judgeResults: judgeResultEntries,\n };\n }\n }\n\n // snapshot (toMatchToolSnapshot) - requires Playwright expect with custom matcher\n if (expectBlock.snapshot !== undefined) {\n if (!config.playwrightExpect) {\n results.snapshot = {\n pass: false,\n details: 'Snapshot testing requires expect in context',\n };\n } else {\n try {\n // Use custom toMatchToolSnapshot matcher which:\n // 1. Extracts text from the response\n // 2. Applies sanitizers\n // 3. Uses Playwright's native snapshot testing\n const sanitizers = expectBlock.snapshotSanitizers ?? [];\n // eslint-disable-next-line @typescript-eslint/await-thenable, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n await (config.playwrightExpect(response) as any).toMatchToolSnapshot(\n expectBlock.snapshot,\n sanitizers\n );\n results.snapshot = {\n pass: true,\n details: `Matches snapshot \"${expectBlock.snapshot}\"`,\n };\n } catch (err) {\n results.snapshot = {\n pass: false,\n details: err instanceof Error ? err.message : String(err),\n };\n }\n }\n }\n\n return { expectations: results, toolPrecision, toolRecall };\n}\n\n/**\n * Builds the request metadata from an eval case for inclusion in results.\n */\nfunction buildRequest(evalCase: EvalCase): EvalCaseRequest {\n const request: EvalCaseRequest = {};\n if (evalCase.description) request.description = evalCase.description;\n\n if (evalCase.mode === 'mcp_host') {\n if (evalCase.scenario) request.scenario = evalCase.scenario;\n if (evalCase.mcpHostConfig) {\n request.mcpHostConfig = {\n provider: evalCase.mcpHostConfig.provider,\n ...(evalCase.mcpHostConfig.model !== undefined && {\n model: evalCase.mcpHostConfig.model,\n }),\n };\n }\n } else {\n if (evalCase.args) request.args = evalCase.args;\n }\n\n return request;\n}\n\nfunction isMCPHostSimulationResult(\n value: unknown\n): value is MCPHostSimulationResult {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'success' in value &&\n 'toolCalls' in value &&\n Array.isArray((value as MCPHostSimulationResult).toolCalls)\n );\n}\n\n/**\n * Runs a single iteration of an eval case (the atomic unit of work).\n * Extracted from runEvalCase to support multi-iteration accuracy loops.\n */\nasync function runSingleIteration(\n evalCase: EvalCase,\n context: EvalContext,\n options: EvalCaseOptions\n): Promise<EvalCaseResult> {\n const startTime = Date.now();\n\n // Execute tool call\n const { response, error } = await executeToolCall(evalCase, context.mcp);\n\n // Collect expectation results from expect block\n let expectationResults: EvalCaseResult['expectations'] = {};\n let toolPrecision: number | undefined;\n let toolRecall: number | undefined;\n\n let mcpHostTrace: EvalCaseResult['mcpHostTrace'];\n\n if (!error && evalCase.expect) {\n const {\n expectations,\n toolPrecision: tp,\n toolRecall: tr,\n } = await runExpectBlockValidations(evalCase.expect, response, {\n schemas: options.schemas,\n playwrightExpect: context.expect,\n judgeReps: evalCase.judgeReps,\n canonicalAnswer: evalCase.canonicalAnswer,\n });\n expectationResults = expectations;\n toolPrecision = tp;\n toolRecall = tr;\n\n // Build mcpHostTrace when toolsTriggered expectation is present\n if (\n evalCase.expect.toolsTriggered !== undefined &&\n isMCPHostSimulationResult(response)\n ) {\n const expectedNames = new Set(\n evalCase.expect.toolsTriggered.calls.map((c) => c.name)\n );\n const requiredNames = new Set(\n evalCase.expect.toolsTriggered.calls\n .filter((c) => c.required !== false)\n .map((c) => c.name)\n );\n const calledNames = new Set(response.toolCalls.map((c) => c.name));\n\n mcpHostTrace = {\n calls: response.toolCalls.map((call) => ({\n name: call.name,\n arguments: call.arguments,\n status: expectedNames.has(call.name) ? 'expected' : 'unexpected',\n })),\n missed: Array.from(requiredNames)\n .filter((name) => !calledNames.has(name))\n .map((name) => ({ name })),\n };\n }\n }\n\n // Build result - use test context for authType and project (Playwright is source of truth)\n return {\n id: evalCase.id,\n datasetName: options.datasetName ?? 'single-case',\n toolName:\n evalCase.scenario != null ? 'mcp_host' : (evalCase.toolName ?? 'unknown'),\n source: 'eval',\n pass: didCasePass(error, expectationResults),\n request: buildRequest(evalCase),\n response,\n error,\n expectations: expectationResults,\n authType: context.mcp.authType,\n project: context.mcp.project,\n durationMs: Date.now() - startTime,\n tags: evalCase.tags,\n toolPrecision,\n toolRecall,\n mcpHostTrace,\n };\n}\n\n/**\n * Returns true when the error message appears to be caused by network or\n * infrastructure issues (connection resets, timeouts, rate limits, etc.)\n * rather than an assertion or logic failure.\n *\n * Accepts either an Error object or a plain string error message so it can\n * classify both thrown errors and errors surfaced via result.error.\n */\nfunction isInfrastructureError(err: unknown): boolean {\n let name: string | undefined;\n let msg: string;\n let code: string = '';\n\n if (err instanceof Error) {\n name = err.name;\n msg = err.message.toLowerCase();\n code = ((err as NodeJS.ErrnoException).code ?? '').toLowerCase();\n } else if (typeof err === 'string') {\n msg = err.toLowerCase();\n } else {\n return false;\n }\n\n return (\n name === 'AbortError' ||\n msg.includes('econnreset') ||\n msg.includes('etimedout') ||\n msg.includes('econnrefused') ||\n msg.includes('rate limit') ||\n msg.includes('429') ||\n msg.includes('503') ||\n msg.includes('network') ||\n // Prompt/context overflow — LLM couldn't run, not a tool discoverability failure\n msg.includes('prompt is too long') ||\n msg.includes('context length exceeded') ||\n msg.includes('maximum context length') ||\n msg.includes('context_length_exceeded') ||\n msg.includes('tokens > ') ||\n code.includes('econnreset') ||\n code.includes('etimedout') ||\n code.includes('econnrefused')\n );\n}\n\n/**\n * Runs a single eval case and returns the result.\n * When `evalCase.iterations > 1`, runs the case N times and returns accuracy.\n *\n * @param evalCase - The eval case to run\n * @param context - Context containing mcp, testInfo, expect\n * @param options - Optional configuration (datasetName, schemas)\n * @returns The result of running the eval case\n *\n * @example\n * ```typescript\n * const result = await runEvalCase(\n * evalCase,\n * { mcp, testInfo, expect },\n * { schemas: { WeatherResponse: WeatherSchema } }\n * );\n *\n * expect(result.pass).toBe(true);\n * ```\n */\nexport async function runEvalCase(\n evalCase: EvalCase,\n context: EvalContext,\n options: EvalCaseOptions = {}\n): Promise<EvalCaseResult> {\n const iterations = evalCase.iterations ?? 1;\n\n if (iterations === 1) {\n return runSingleIteration(evalCase, context, options);\n }\n\n // Multi-iteration: run N times and compute accuracy\n const iterationResults: IterationResult[] = [];\n let lastResult: EvalCaseResult | null = null;\n\n for (let i = 0; i < iterations; i++) {\n try {\n const result = await runSingleIteration(evalCase, context, options);\n lastResult = result;\n // Check whether the tool call itself failed due to infrastructure (the\n // error is surfaced as result.error since executeToolCall swallows throws)\n const infraError =\n result.error != null && isInfrastructureError(result.error);\n iterationResults.push({\n pass: result.pass,\n durationMs: result.durationMs,\n error: result.error,\n isInfrastructureError: infraError,\n mcpHostTrace: result.mcpHostTrace,\n });\n } catch (err) {\n // runSingleIteration should not throw, but guard defensively\n const errorMessage = err instanceof Error ? err.message : String(err);\n iterationResults.push({\n pass: false,\n durationMs: 0,\n error: errorMessage,\n isInfrastructureError: isInfrastructureError(err),\n });\n }\n }\n\n const infraErrors = iterationResults.filter((r) => r.isInfrastructureError);\n const assertionResults = iterationResults.filter(\n (r) => !r.isInfrastructureError\n );\n const passCount = assertionResults.filter((r) => r.pass).length;\n const assertionPassRate =\n assertionResults.length > 0 ? passCount / assertionResults.length : 0;\n const infrastructureErrorRate = infraErrors.length / iterations;\n const threshold = evalCase.accuracyThreshold ?? 1.0;\n\n // Fall back to a synthetic result if all iterations threw infrastructure errors\n const baseResult: EvalCaseResult = lastResult ?? {\n id: evalCase.id,\n datasetName: options.datasetName ?? 'single-case',\n toolName:\n evalCase.scenario != null ? 'mcp_host' : (evalCase.toolName ?? 'unknown'),\n source: 'eval',\n pass: false,\n error: iterationResults[0]?.error,\n expectations: {},\n authType: context.mcp.authType,\n project: context.mcp.project,\n durationMs: 0,\n tags: evalCase.tags,\n };\n\n return {\n ...baseResult,\n pass: assertionPassRate >= threshold,\n assertionPassRate,\n assertionPassRateCI: wilsonCI(passCount, assertionResults.length),\n infrastructureErrorRate,\n iterationResults,\n infrastructureErrorCount: infraErrors.length,\n durationMs: iterationResults.reduce((sum, r) => sum + r.durationMs, 0),\n };\n}\n\n/**\n * Computes a 95% Wilson score confidence interval for a proportion.\n *\n * Preferred over naive ±√(p(1-p)/n) because it stays within [0,1] at\n * extreme pass rates and has better coverage at small sample sizes.\n *\n * Returns undefined when n < 2 (not enough data for a meaningful interval).\n */\nfunction wilsonCI(\n k: number,\n n: number\n): { lower: number; upper: number } | undefined {\n if (n < 2) return undefined;\n const z = 1.96; // 95% confidence\n const z2 = z * z;\n const ñ = n + z2;\n const p̃ = (k + z2 / 2) / ñ;\n const margin = z * Math.sqrt((p̃ * (1 - p̃)) / ñ);\n return {\n lower: Math.max(0, p̃ - margin),\n upper: Math.min(1, p̃ + margin),\n };\n}\n\n/**\n * Runs an array of async tasks with bounded concurrency.\n * Preserves result ordering.\n */\nasync function runWithConcurrency<T>(\n tasks: Array<() => Promise<T>>,\n limit: number\n): Promise<T[]> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const results: T[] = new Array(tasks.length);\n let index = 0;\n\n async function worker() {\n // `index++` is safe here: JavaScript's event loop is single-threaded, so the\n // read-modify-write of `index` completes atomically before any `await` yields\n // to another worker. Each worker captures a unique `i` before awaiting the task.\n while (index < tasks.length) {\n const i = index++;\n results[i] = await tasks[i]!();\n }\n }\n\n const workerCount = Math.min(limit, tasks.length);\n await Promise.all(Array.from({ length: workerCount }, worker));\n return results;\n}\n\n/**\n * Runs an eval dataset against an MCP server\n *\n * This function composes runEvalCase() for each case in the dataset,\n * adding dataset-level features like stopOnFailure and callbacks.\n *\n * @param options - Eval runner options (dataset, schemas)\n * @param context - Eval context (mcp fixture, optional testInfo, optional expect)\n * @returns Eval results\n *\n * @example\n * // Basic usage\n * const result = await runEvalDataset(\n * {\n * dataset,\n * schemas: { WeatherResponse: WeatherSchema },\n * },\n * { mcp }\n * );\n *\n * @example\n * // With MCP reporter integration\n * test('eval dataset', async ({ mcp }, testInfo) => {\n * const result = await runEvalDataset(\n * { dataset },\n * { mcp, testInfo } // testInfo enables MCP reporter\n * );\n * });\n */\n/**\n * Retrieves the current git commit hash using git rev-parse.\n * Returns undefined if git is unavailable or the directory is not a repo.\n */\nasync function getGitHash(): Promise<string | undefined> {\n const result = await execFileNoThrow('git', ['rev-parse', 'HEAD']);\n return result.status === 0 ? result.stdout.trim() : undefined;\n}\n\nexport async function runEvalDataset(\n options: EvalRunnerOptions,\n context: EvalContext\n): Promise<EvalRunnerResult> {\n const {\n dataset,\n schemas,\n stopOnFailure = false,\n concurrency = 1,\n defaultLlmIterations,\n defaultJudgeReps,\n onCaseComplete,\n filterTags,\n saveResultsTo,\n omitResponsesFromBaseline = true,\n baselineResultsFrom,\n mcpHostModel,\n judgeModel,\n } = options;\n\n const startTime = Date.now();\n\n // Merge schemas from dataset and options\n const allSchemas = {\n ...dataset.schemas,\n ...schemas,\n };\n\n // Filter cases by tag if filterTags is set (non-empty array)\n const casesToRun =\n filterTags && filterTags.length > 0\n ? dataset.cases.filter((c) => c.tags?.some((t) => filterTags.includes(t)))\n : dataset.cases;\n\n // Preflight cost warning: estimate the number of LLM judge API calls this run will make\n const estimatedJudgeCalls = casesToRun.reduce((sum, c) => {\n const effectiveIterations =\n c.mode === 'mcp_host'\n ? (c.iterations ?? defaultLlmIterations ?? 1)\n : (c.iterations ?? 1);\n if (c.expect?.passesJudge == null) return sum;\n const judges = Array.isArray(c.expect.passesJudge)\n ? c.expect.passesJudge\n : [c.expect.passesJudge];\n const totalReps = judges.reduce(\n (r, j) => r + (j.reps ?? c.judgeReps ?? defaultJudgeReps ?? 1),\n 0\n );\n return sum + effectiveIterations * totalReps;\n }, 0);\n\n if (estimatedJudgeCalls > 50) {\n debugEval(\n `Warning: This run will make approximately ${estimatedJudgeCalls} LLM judge API calls. This may incur significant costs.`\n );\n }\n\n // Build task factories for all cases\n const tasks = casesToRun.map((evalCase) => async () => {\n // Apply defaultLlmIterations to mcp_host cases that don't specify iterations.\n // Direct mode cases are deterministic — they always stay at 1 iteration.\n const withIterations =\n evalCase.mode === 'mcp_host' &&\n evalCase.iterations === undefined &&\n defaultLlmIterations !== undefined\n ? { ...evalCase, iterations: defaultLlmIterations }\n : evalCase;\n\n // Warn when a mcp_host case opts into multi-iteration accuracy measurement\n // but uses fewer iterations than the guide-recommended minimum.\n // Single-iteration mcp_host runs (the default) are a valid smoke-test pattern\n // and are not warned about — the warning is scoped to cases that have\n // explicitly chosen a multi-iteration count that is too small to be reliable.\n if (evalCase.mode === 'mcp_host') {\n const effectiveIterations = withIterations.iterations ?? 1;\n if (effectiveIterations > 1 && effectiveIterations < 10) {\n console.warn(\n `[mcp-server-tester] Eval case \"${evalCase.id}\": running ${effectiveIterations} iterations in mcp_host mode ` +\n `may not be statistically reliable. Consider using 10+ iterations for accuracy measurements you can trust.`\n );\n }\n }\n\n // Apply defaultJudgeReps to any case without explicit judgeReps\n const effectiveCase =\n withIterations.judgeReps === undefined && defaultJudgeReps !== undefined\n ? { ...withIterations, judgeReps: defaultJudgeReps }\n : withIterations;\n\n const result = await runEvalCase(effectiveCase, context, {\n datasetName: dataset.name,\n schemas: allSchemas,\n });\n\n if (onCaseComplete) {\n await onCaseComplete(result);\n }\n\n return result;\n });\n\n let caseResults: EvalCaseResult[];\n\n if (concurrency === 1 || stopOnFailure) {\n // Sequential path — required when stopOnFailure is set\n caseResults = [];\n for (const task of tasks) {\n const result = await task();\n caseResults.push(result);\n if (stopOnFailure && !result.pass) break;\n }\n } else {\n caseResults = await runWithConcurrency(tasks, concurrency);\n }\n\n const total = caseResults.length;\n const passed = caseResults.filter((r) => r.pass).length;\n\n const [gitHash] = await Promise.all([getGitHash()]);\n\n const metadata: EvalRunMetadata = {\n gitHash,\n timestamp: new Date().toISOString(),\n packageVersion: packageJson.version,\n ...(mcpHostModel !== undefined && { mcpHostModel }),\n ...(judgeModel !== undefined && { judgeModel }),\n };\n\n const result: EvalRunnerResult = {\n total,\n passed,\n failed: total - passed,\n caseResults,\n durationMs: Date.now() - startTime,\n metadata,\n };\n\n // Load baseline and compute delta if requested\n if (baselineResultsFrom) {\n try {\n const baseline = await loadBaseline(baselineResultsFrom);\n const baselinePassRate =\n baseline.total > 0 ? baseline.passed / baseline.total : 0;\n const baselineMap = buildBaselinePassMap(baseline);\n\n const currentCaseIds = result.caseResults.map((cr) => cr.id);\n const unmatchedCount = currentCaseIds.filter(\n (id) => !baselineMap.has(id)\n ).length;\n const unmatchedRatio =\n currentCaseIds.length > 0 ? unmatchedCount / currentCaseIds.length : 0;\n if (unmatchedRatio > 0.2) {\n console.warn(\n `[mcp-server-tester] Baseline comparison: ${unmatchedCount} of ${currentCaseIds.length} cases ` +\n `(${Math.round(unmatchedRatio * 100)}%) have no baseline entry. ` +\n `This may indicate the dataset structure has changed. Results for unmatched cases cannot be compared.`\n );\n }\n\n for (const cr of result.caseResults) {\n const baselinePass = baselineMap.get(cr.id);\n if (baselinePass !== undefined) {\n cr.baselinePass = baselinePass;\n }\n }\n\n result.regressions = result.caseResults.filter(\n (cr) => cr.baselinePass === true && !cr.pass\n ).length;\n result.improvements = result.caseResults.filter(\n (cr) => cr.baselinePass === false && cr.pass\n ).length;\n result.deltaPassRate =\n result.total > 0 ? result.passed / result.total - baselinePassRate : 0;\n } catch (err) {\n console.warn(\n `[mcp-server-tester] Could not load baseline from ${baselineResultsFrom}: ` +\n `${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n // Aggregate tool precision/recall/F1 across cases that have those metrics\n const mcpHostCases = caseResults.filter(\n (r) => r.toolPrecision !== undefined || r.toolRecall !== undefined\n );\n if (mcpHostCases.length > 0) {\n const avgPrec =\n mcpHostCases.reduce((s, r) => s + (r.toolPrecision ?? 0), 0) /\n mcpHostCases.length;\n const avgRecall =\n mcpHostCases.reduce((s, r) => s + (r.toolRecall ?? 0), 0) /\n mcpHostCases.length;\n result.datasetToolPrecision = avgPrec;\n result.datasetToolRecall = avgRecall;\n result.datasetToolF1 =\n avgPrec + avgRecall > 0\n ? (2 * avgPrec * avgRecall) / (avgPrec + avgRecall)\n : 0;\n }\n\n // Save results to file if requested\n if (saveResultsTo) {\n await saveBaseline(result, saveResultsTo, {\n omitResponses: omitResponsesFromBaseline,\n });\n }\n\n // Attach results for MCP reporter if testInfo is provided\n if (context.testInfo) {\n await context.testInfo.attach('mcp-test-results', {\n contentType: 'application/json',\n body: Buffer.from(JSON.stringify({ caseResults })),\n });\n } else if (caseResults.length > 0) {\n console.warn(\n '[mcp-server-tester] runEvalDataset: testInfo not provided — results will not appear in the MCP reporter.\\n' +\n 'To enable reporting, pass testInfo from the Playwright test function:\\n' +\n ' await runEvalDataset({ dataset }, { mcp, testInfo });'\n );\n }\n\n return result;\n}\n","import { runEvalDataset } from './evalRunner.js';\nimport type {\n EvalRunnerOptions,\n EvalContext,\n EvalRunnerResult,\n} from './evalRunner.js';\nimport type { EvalCaseResult } from '../types/reporter.js';\n\n/** Outcome of comparing two servers on a single eval case. */\nexport type ComparisonOutcome = 'A_WINS' | 'B_WINS' | 'TIE' | 'BOTH_FAIL';\n\n/** Result of comparing a single eval case across two servers. */\nexport interface CaseComparisonResult {\n /** Case ID */\n id: string;\n /** Comparison outcome */\n outcome: ComparisonOutcome;\n /** Result from server A */\n serverA: EvalCaseResult;\n /** Result from server B */\n serverB: EvalCaseResult;\n}\n\n/** Aggregated result of running a dataset against two servers. */\nexport interface ServerComparisonResult {\n /** Dataset name */\n dataset: string;\n /** Total cases compared (cases present in both runs) */\n total: number;\n /** Cases where server A passed and server B failed */\n aWins: number;\n /** Cases where server B passed and server A failed */\n bWins: number;\n /** Cases where both passed */\n ties: number;\n /** Cases where both failed */\n bothFail: number;\n /** Cases with a decisive outcome (aWins + bWins + ties, excludes BOTH_FAIL) */\n decidedCases: number;\n /** Fraction of total cases where both servers failed (bothFail / total) */\n failureAlignment: number;\n /** A win rate (aWins / decidedCases, excludes BOTH_FAIL) */\n aWinRate: number;\n /** B win rate (bWins / decidedCases, excludes BOTH_FAIL) */\n bWinRate: number;\n /** Tie rate (ties / decidedCases, excludes BOTH_FAIL) */\n tieRate: number;\n /** Per-case comparison results */\n cases: CaseComparisonResult[];\n /** Full result from server A */\n serverAResult: EvalRunnerResult;\n /** Full result from server B */\n serverBResult: EvalRunnerResult;\n /** Total duration in milliseconds */\n durationMs: number;\n}\n\n/**\n * Options for `runServerComparison`.\n * Same as `EvalRunnerOptions` without baseline-specific fields.\n */\nexport type ServerComparisonOptions = Omit<\n EvalRunnerOptions,\n 'saveResultsTo' | 'baselineResultsFrom'\n>;\n\n/**\n * Runs the same eval dataset against two MCP servers in parallel and\n * returns a detailed per-case comparison of results.\n *\n * Both servers receive identical cases and options. The comparison uses\n * simple pass/fail per case: A_WINS means A passed and B failed, etc.\n *\n * @param options - Eval dataset and runner options (shared between both servers)\n * @param contextA - MCP context for server A (e.g., Glean MCP)\n * @param contextB - MCP context for server B (e.g., native MCP)\n * @returns Comparison result with per-case outcomes and aggregate win rates\n *\n * @example\n * ```typescript\n * const comparison = await runServerComparison(\n * { dataset },\n * { mcp: gleanMcpFixture },\n * { mcp: nativeMcpFixture }\n * );\n * console.log(`Glean MCP wins: ${(comparison.aWinRate * 100).toFixed(1)}%`);\n * console.log(`Native MCP wins: ${(comparison.bWinRate * 100).toFixed(1)}%`);\n * ```\n */\nexport async function runServerComparison(\n options: ServerComparisonOptions,\n contextA: EvalContext,\n contextB: EvalContext\n): Promise<ServerComparisonResult> {\n const startTime = Date.now();\n\n // Run both servers concurrently\n const [resultA, resultB] = await Promise.all([\n runEvalDataset(options, contextA),\n runEvalDataset(options, contextB),\n ]);\n\n // Index results by case ID for O(1) lookup\n const mapA = new Map<string, EvalCaseResult>(\n resultA.caseResults.map((r) => [r.id, r])\n );\n const mapB = new Map<string, EvalCaseResult>(\n resultB.caseResults.map((r) => [r.id, r])\n );\n\n // Compare only cases present in both results\n const sharedIds = [...mapA.keys()].filter((id) => mapB.has(id));\n\n let aWins = 0;\n let bWins = 0;\n let ties = 0;\n let bothFail = 0;\n const cases: CaseComparisonResult[] = [];\n\n for (const id of sharedIds) {\n const a = mapA.get(id)!;\n const b = mapB.get(id)!;\n\n let outcome: ComparisonOutcome;\n if (a.pass && b.pass) {\n outcome = 'TIE';\n ties++;\n } else if (a.pass && !b.pass) {\n outcome = 'A_WINS';\n aWins++;\n } else if (!a.pass && b.pass) {\n outcome = 'B_WINS';\n bWins++;\n } else {\n outcome = 'BOTH_FAIL';\n bothFail++;\n }\n\n cases.push({ id, outcome, serverA: a, serverB: b });\n }\n\n const total = cases.length;\n const decidedCases = aWins + bWins + ties; // BOTH_FAIL excluded from win rate denominator\n\n return {\n dataset: options.dataset.name,\n total,\n aWins,\n bWins,\n ties,\n bothFail,\n decidedCases,\n failureAlignment: total > 0 ? bothFail / total : 0,\n aWinRate: decidedCases > 0 ? aWins / decidedCases : 0,\n bWinRate: decidedCases > 0 ? bWins / decidedCases : 0,\n tieRate: decidedCases > 0 ? ties / decidedCases : 0,\n cases,\n serverAResult: resultA,\n serverBResult: resultB,\n durationMs: Date.now() - startTime,\n };\n}\n","import type { MCPFixtureApi } from '../mcp/fixtures/mcpFixture.js';\nimport type { TestInfo } from '@playwright/test';\nimport type {\n Tool,\n Resource,\n Prompt,\n ServerCapabilities,\n Implementation,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { MCPConformanceCheck } from '../types/reporter.js';\n\nexport type { MCPConformanceCheck };\n\n/**\n * Options for conformance checks\n */\nexport interface MCPConformanceOptions {\n /**\n * List of tools that must be present\n */\n requiredTools?: Array<string>;\n\n /**\n * Whether to validate tool schemas\n * @default true\n */\n validateSchemas?: boolean;\n\n /**\n * Whether to check server info is present\n * @default true\n */\n checkServerInfo?: boolean;\n\n /**\n * Whether to check resources capability (if declared by server)\n * @default true\n */\n checkResources?: boolean;\n\n /**\n * Whether to check prompts capability (if declared by server)\n * @default true\n */\n checkPrompts?: boolean;\n}\n\n/**\n * Raw MCP responses for snapshotting\n */\nexport interface MCPConformanceRaw {\n /**\n * Server info (name, version)\n * null if not available\n */\n serverInfo: Implementation | null;\n\n /**\n * Server capabilities\n * null if not available\n */\n capabilities: ServerCapabilities | null;\n\n /**\n * List of tools from the server\n */\n tools: Tool[];\n\n /**\n * List of resources from the server\n * null if server doesn't declare resources capability\n */\n resources: Resource[] | null;\n\n /**\n * List of prompts from the server\n * null if server doesn't declare prompts capability\n */\n prompts: Prompt[] | null;\n}\n\n/**\n * Result of conformance checks\n */\nexport interface MCPConformanceResult {\n /**\n * Whether all checks passed\n */\n pass: boolean;\n\n /**\n * List of check results\n */\n checks: MCPConformanceCheck[];\n\n /**\n * Raw MCP responses for snapshotting\n *\n * @example\n * ```typescript\n * const result = await runConformanceChecks(mcp);\n * expect(result.raw.tools).toMatchSnapshot();\n * expect(result.raw.capabilities).toMatchSnapshot();\n * ```\n */\n raw: MCPConformanceRaw;\n}\n\n/**\n * Runs MCP protocol conformance checks\n *\n * Validates that the MCP server conforms to expected protocol behavior.\n * Returns both assertion results and raw MCP responses for snapshotting.\n *\n * When testInfo is provided, results are automatically attached for the MCP reporter.\n *\n * @param mcp - MCP fixture API\n * @param options - Conformance check options\n * @param testInfo - Optional Playwright TestInfo for reporter integration\n * @returns Conformance check results with raw responses\n *\n * @example\n * ```typescript\n * // Basic usage\n * const result = await runConformanceChecks(mcp, {\n * requiredTools: ['get_weather', 'search_docs'],\n * validateSchemas: true,\n * });\n *\n * // Check assertions\n * expect(result.pass).toBe(true);\n *\n * // With reporter integration (recommended in Playwright tests)\n * const result = await runConformanceChecks(mcp, {\n * requiredTools: ['search'],\n * }, testInfo);\n *\n * // Snapshot raw responses\n * expect(result.raw.tools).toMatchSnapshot();\n * expect(result.raw.capabilities).toMatchSnapshot();\n * ```\n */\nexport async function runConformanceChecks(\n mcp: MCPFixtureApi,\n options: MCPConformanceOptions = {},\n testInfo?: TestInfo\n): Promise<MCPConformanceResult> {\n const {\n requiredTools = [],\n validateSchemas = true,\n checkServerInfo = true,\n checkResources = true,\n checkPrompts = true,\n } = options;\n\n const checks: MCPConformanceCheck[] = [];\n const raw: MCPConformanceRaw = {\n serverInfo: null,\n capabilities: null,\n tools: [],\n resources: null,\n prompts: null,\n };\n\n // Get server info\n const serverInfo = mcp.getServerInfo();\n if (serverInfo) {\n raw.serverInfo = serverInfo as Implementation;\n }\n\n // Check 1: Server info is present\n if (checkServerInfo) {\n checks.push({\n name: 'server_info_present',\n pass: serverInfo !== null,\n message: serverInfo\n ? `Server info: ${serverInfo.name ?? 'unknown'} v${serverInfo.version ?? 'unknown'}`\n : 'Server info is missing',\n });\n }\n\n // Get capabilities from client\n const capabilities = mcp.client.getServerCapabilities();\n if (capabilities) {\n raw.capabilities = capabilities;\n }\n\n // Check 2: Capabilities are valid\n checks.push({\n name: 'capabilities_valid',\n pass: capabilities !== undefined,\n message: capabilities\n ? `Server capabilities: ${formatCapabilities(capabilities)}`\n : 'Server capabilities not available',\n });\n\n // Check 3: List tools returns valid response\n let tools: Tool[] = [];\n try {\n tools = await mcp.listTools();\n raw.tools = tools;\n checks.push({\n name: 'list_tools_succeeds',\n pass: true,\n message: `listTools returned ${tools.length} tools`,\n });\n } catch (error) {\n checks.push({\n name: 'list_tools_succeeds',\n pass: false,\n message: `listTools failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n const pass = checks.every((check) => check.pass);\n return { pass, checks, raw };\n }\n\n // Check 4: Required tools are present\n if (requiredTools.length > 0) {\n const toolNames = new Set(tools.map((t) => t.name));\n const missingTools = requiredTools.filter((name) => !toolNames.has(name));\n\n checks.push({\n name: 'required_tools_present',\n pass: missingTools.length === 0,\n message:\n missingTools.length === 0\n ? `All ${requiredTools.length} required tools are present`\n : `Missing required tools: ${missingTools.join(', ')}`,\n });\n }\n\n // Check 5: Tool schemas are valid\n if (validateSchemas && tools.length > 0) {\n const invalidTools: Array<string> = [];\n\n for (const tool of tools) {\n // Check that tool has required fields\n if (!tool.name) {\n invalidTools.push(`(unnamed tool): missing name`);\n continue;\n }\n\n if (!tool.inputSchema) {\n invalidTools.push(`${tool.name}: missing inputSchema`);\n continue;\n }\n\n // Check that inputSchema is an object schema\n if (tool.inputSchema.type !== 'object') {\n invalidTools.push(\n `${tool.name}: inputSchema.type must be \"object\", got \"${String(tool.inputSchema.type)}\"`\n );\n }\n }\n\n checks.push({\n name: 'tool_schemas_valid',\n pass: invalidTools.length === 0,\n message:\n invalidTools.length === 0\n ? `All ${tools.length} tools have valid schemas`\n : `Invalid tool schemas:\\n ${invalidTools.join('\\n ')}`,\n });\n }\n\n // Check 6: List resources (only if server declares resources capability)\n if (checkResources && capabilities?.resources) {\n try {\n const resourcesResult = await mcp.client.listResources();\n raw.resources = resourcesResult.resources;\n checks.push({\n name: 'list_resources_succeeds',\n pass: true,\n message: `listResources returned ${resourcesResult.resources.length} resources`,\n });\n } catch (error) {\n checks.push({\n name: 'list_resources_succeeds',\n pass: false,\n message: `listResources failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n // Check 7: List prompts (only if server declares prompts capability)\n if (checkPrompts && capabilities?.prompts) {\n try {\n const promptsResult = await mcp.client.listPrompts();\n raw.prompts = promptsResult.prompts;\n checks.push({\n name: 'list_prompts_succeeds',\n pass: true,\n message: `listPrompts returned ${promptsResult.prompts.length} prompts`,\n });\n } catch (error) {\n checks.push({\n name: 'list_prompts_succeeds',\n pass: false,\n message: `listPrompts failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n // Check 8: Calling invalid tool returns error\n try {\n const result = await mcp.callTool('__nonexistent_tool__', {});\n // MCP SDK may return isError: true instead of throwing\n const hasError = result.isError === true;\n checks.push({\n name: 'invalid_tool_returns_error',\n pass: hasError,\n message: hasError\n ? 'Nonexistent tool correctly returned an error'\n : 'Calling nonexistent tool should have returned an error',\n });\n } catch {\n // Or it may throw - both are acceptable\n checks.push({\n name: 'invalid_tool_returns_error',\n pass: true,\n message: 'Nonexistent tool correctly threw an error',\n });\n }\n\n const pass = checks.every((check) => check.pass);\n\n const result: MCPConformanceResult = { pass, checks, raw };\n\n // Attach results for MCP reporter if testInfo is provided\n if (testInfo) {\n await testInfo.attach('mcp-conformance-checks', {\n contentType: 'application/json',\n body: JSON.stringify(\n {\n operation: 'conformanceChecks',\n pass,\n checks,\n serverInfo: raw.serverInfo,\n capabilities: raw.capabilities,\n toolCount: raw.tools.length,\n authType: mcp.authType,\n project: mcp.project,\n },\n null,\n 2\n ),\n });\n }\n\n return result;\n}\n\n/**\n * Formats server capabilities for display\n */\nfunction formatCapabilities(capabilities: ServerCapabilities): string {\n const parts: string[] = [];\n if (capabilities.tools) parts.push('tools');\n if (capabilities.resources) parts.push('resources');\n if (capabilities.prompts) parts.push('prompts');\n if (capabilities.logging) parts.push('logging');\n if (capabilities.completions) parts.push('completions');\n if (capabilities.experimental) parts.push('experimental');\n return parts.length > 0 ? parts.join(', ') : 'none declared';\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth/oauthClientProvider.ts","../node_modules/@ai-sdk/provider/src/errors/get-error-message.ts","../node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../node_modules/@ai-sdk/provider/src/errors/api-call-error.ts","../node_modules/@ai-sdk/provider/src/errors/empty-response-body-error.ts","../node_modules/@ai-sdk/provider/src/errors/invalid-argument-error.ts","../node_modules/@ai-sdk/provider/src/errors/json-parse-error.ts","../node_modules/@ai-sdk/provider/src/errors/load-api-key-error.ts","../node_modules/@ai-sdk/provider/src/errors/load-setting-error.ts","../node_modules/@ai-sdk/provider/src/errors/type-validation-error.ts","../node_modules/eventsource-parser/src/parse.ts","../node_modules/eventsource-parser/src/errors.ts","../node_modules/eventsource-parser/src/stream.ts","../node_modules/@ai-sdk/provider-utils/src/combine-headers.ts","../node_modules/@ai-sdk/provider-utils/src/convert-async-iterator-to-readable-stream.ts","../node_modules/@ai-sdk/provider-utils/src/create-tool-name-mapping.ts","../node_modules/@ai-sdk/provider-utils/src/delay.ts","../node_modules/@ai-sdk/provider-utils/src/extract-response-headers.ts","../node_modules/@ai-sdk/provider-utils/src/uint8-utils.ts","../node_modules/@ai-sdk/provider-utils/src/convert-image-model-file-to-data-uri.ts","../node_modules/@ai-sdk/provider-utils/src/convert-to-form-data.ts","../node_modules/@ai-sdk/provider-utils/src/read-response-with-size-limit.ts","../node_modules/@ai-sdk/provider-utils/src/download-blob.ts","../node_modules/@ai-sdk/provider-utils/src/get-error-message.ts","../node_modules/@ai-sdk/provider-utils/src/is-abort-error.ts","../node_modules/@ai-sdk/provider-utils/src/handle-fetch-error.ts","../node_modules/@ai-sdk/provider-utils/src/get-runtime-environment-user-agent.ts","../node_modules/@ai-sdk/provider-utils/src/normalize-headers.ts","../node_modules/@ai-sdk/provider-utils/src/with-user-agent-suffix.ts","../node_modules/@ai-sdk/provider-utils/src/inject-json-instruction.ts","../node_modules/@ai-sdk/provider-utils/src/is-non-nullable.ts","../node_modules/@ai-sdk/provider-utils/src/is-url-supported.ts","../node_modules/@ai-sdk/provider-utils/src/load-api-key.ts","../node_modules/@ai-sdk/provider-utils/src/load-optional-setting.ts","../node_modules/@ai-sdk/provider-utils/src/load-setting.ts","../node_modules/@ai-sdk/provider-utils/src/media-type-to-extension.ts","../node_modules/@ai-sdk/provider-utils/src/secure-json-parse.ts","../node_modules/@ai-sdk/provider-utils/src/add-additional-properties-to-json-schema.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/any.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/array.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/bigint.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/boolean.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/branded.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/date.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/default.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/effects.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/enum.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/intersection.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/literal.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/string.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/record.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/map.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/native-enum.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/never.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/null.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/union.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/nullable.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/number.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/object.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/promise.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/set.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/tuple.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/undefined.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/unknown.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parse-def.ts","../node_modules/@ai-sdk/provider-utils/src/schema.ts","../node_modules/@ai-sdk/provider-utils/src/validate-types.ts","../node_modules/@ai-sdk/provider-utils/src/parse-json.ts","../node_modules/@ai-sdk/provider-utils/src/parse-json-event-stream.ts","../node_modules/@ai-sdk/provider-utils/src/parse-provider-options.ts","../node_modules/@ai-sdk/provider-utils/src/types/tool.ts","../node_modules/@ai-sdk/provider-utils/src/provider-tool-factory.ts","../node_modules/@ai-sdk/provider-utils/src/remove-undefined-entries.ts","../node_modules/@ai-sdk/provider-utils/src/resolve.ts","../node_modules/@ai-sdk/provider-utils/src/without-trailing-slash.ts","../node_modules/@ai-sdk/provider-utils/src/is-async-iterable.ts","../node_modules/@ai-sdk/provider-utils/src/types/execute-tool.ts","../node_modules/@ai-sdk/provider-utils/src/delayed-promise.ts","../node_modules/@ai-sdk/provider-utils/src/download-error.ts","../node_modules/@ai-sdk/provider-utils/src/generate-id.ts","../node_modules/@ai-sdk/provider-utils/src/version.ts","../node_modules/@ai-sdk/provider-utils/src/get-from-api.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/options.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/catch.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/optional.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/pipeline.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/parsers/readonly.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/select-parser.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/get-relative-path.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/refs.ts","../node_modules/@ai-sdk/provider-utils/src/to-json-schema/zod3-to-json-schema/zod3-to-json-schema.ts","../node_modules/@ai-sdk/provider-utils/src/post-to-api.ts","../node_modules/@ai-sdk/provider-utils/src/response-handler.ts","../node_modules/@ai-sdk/provider-utils/src/index.ts","../src/config/mcpConfig.ts","../src/index.ts","../src/auth/tokenAuth.ts","../src/auth/setupOAuth.ts","../src/debug.ts","../src/auth/oauthFlow.ts","../src/auth/discovery.ts","../src/auth/storage.ts","../src/auth/cli.ts","../package.json","../src/mcp/clientFactory.ts","../src/mcp/response.ts","../src/assertions/validators/utils.ts","../src/assertions/validators/response.ts","../src/assertions/validators/schema.ts","../src/assertions/validators/text.ts","../src/assertions/validators/pattern.ts","../src/assertions/validators/error.ts","../src/assertions/validators/size.ts","../src/assertions/validators/toolCalls.ts","../src/judge/rubrics.ts","../src/judge/judgeTypes.ts","../src/judge/anthropicJudge.ts","../src/judge/vertexAnthropicJudge.ts","../src/judge/claudeAgentJudge.ts","../src/judge/openaiJudge.ts","../src/judge/googleJudge.ts","../src/judge/judgeClient.ts","../src/judge/judgeRegistry.ts","../src/assertions/validators/judge.ts","../src/assertions/validators/types.ts","../src/mcp/fixtures/mcpFixture.ts","../src/assertions/matchers/toMatchToolResponse.ts","../src/assertions/matchers/toMatchToolSchema.ts","../src/assertions/matchers/toContainToolText.ts","../src/assertions/matchers/toMatchToolPattern.ts","../src/assertions/matchers/toMatchToolSnapshot.ts","../src/assertions/matchers/toBeToolError.ts","../src/assertions/matchers/toPassToolJudge.ts","../src/assertions/matchers/toHaveToolResponseSize.ts","../src/assertions/matchers/toSatisfyToolPredicate.ts","../src/assertions/matchers/toHaveToolCalls.ts","../src/assertions/matchers/toHaveToolCallCount.ts","../src/assertions/matchers/index.ts","../src/fixtures/mcp.ts","../src/fixtures/mcpAuth.ts","../src/evals/datasetTypes.ts","../src/evals/datasetLoader.ts","../src/evals/mcpHost/adapters/vercel.ts","../src/evals/mcpHost/adapters/cli/parsers.ts","../src/evals/mcpHost/adapters/cli/runner.ts","../src/evals/mcpHost/mcpHostSimulation.ts","../src/evals/baseline.ts","../src/utils/execFileNoThrow.ts","../src/evals/evalRunner.ts","../src/evals/serverComparison.ts","../src/spec/conformanceChecks.ts"],"names":["path","marker","symbol","_a","_b","name","init_dist","tool","resolve","getErrorMessage","mediaType","jsonSchema","ZodFirstPartyTypeKind","types","x","base","standardSchema","zodSchema","TypeValidationError","InvalidArgumentError","getOriginalFetch","fetch","APICallError","schema","loadOAuthState","createDebug","oauth2","fs2","debug","DEFAULT_TIMEOUT_MS","UndiciAgent","extractText","truncateForDisplay","z","buildJudgePrompt","parseJudgeResponse","baseExpect","test","readFile","result","mkdir","dirname","writeFile","z2","pass"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * OAuth client provider implementation for MCP SDK\n *\n * Implements the MCP SDK's OAuthClientProvider interface using file-based storage\n * for integration with Playwright's auth state pattern.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport type {\n OAuthClientMetadata,\n OAuthClientInformationFull,\n OAuthTokens,\n} from '@modelcontextprotocol/sdk/shared/auth.js';\nimport type { StoredOAuthState } from './types.js';\n\n/**\n * Configuration for the Playwright OAuth client provider\n */\nexport interface PlaywrightOAuthClientProviderConfig {\n /**\n * Path to the auth state file (e.g., playwright/.auth/oauth-state.json)\n */\n storagePath: string;\n\n /**\n * OAuth redirect URI for callback\n */\n redirectUri: string;\n\n /**\n * Client metadata for DCR or display\n */\n clientMetadata?: Partial<OAuthClientMetadata>;\n\n /**\n * Pre-registered client ID (if not using DCR)\n */\n clientId?: string;\n\n /**\n * Pre-registered client secret (if not using DCR)\n */\n clientSecret?: string;\n}\n\n/**\n * OAuth client provider that implements the MCP SDK's OAuthClientProvider interface\n *\n * Uses file-based storage for integration with Playwright's auth state pattern.\n * Auth state is persisted to disk so it can be reused across test runs.\n *\n * @example\n * ```typescript\n * const provider = new PlaywrightOAuthClientProvider({\n * storagePath: 'playwright/.auth/oauth-state.json',\n * redirectUri: 'http://localhost:3000/callback',\n * });\n *\n * const transport = new StreamableHTTPClientTransport(serverUrl, {\n * authProvider: provider,\n * });\n * ```\n */\nexport class PlaywrightOAuthClientProvider implements OAuthClientProvider {\n private readonly config: PlaywrightOAuthClientProviderConfig;\n private cachedState: StoredOAuthState | null = null;\n private stateParam: string | null = null;\n\n constructor(config: PlaywrightOAuthClientProviderConfig) {\n this.config = config;\n }\n\n /**\n * The URL to redirect the user agent to after authorization\n */\n get redirectUrl(): string {\n return this.config.redirectUri;\n }\n\n /**\n * Metadata about this OAuth client\n */\n get clientMetadata(): OAuthClientMetadata {\n return {\n redirect_uris: [this.config.redirectUri],\n token_endpoint_auth_method: this.config.clientSecret\n ? 'client_secret_basic'\n : 'none',\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n client_name: '@gleanwork/mcp-server-tester',\n ...this.config.clientMetadata,\n };\n }\n\n /**\n * Returns an OAuth2 state parameter\n */\n state(): string {\n if (!this.stateParam) {\n this.stateParam = this.generateRandomString(32);\n }\n return this.stateParam;\n }\n\n /**\n * Loads information about this OAuth client\n */\n async clientInformation(): Promise<OAuthClientInformationFull | undefined> {\n // If we have a pre-registered client, return it\n if (this.config.clientId) {\n return {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n redirect_uris: [this.config.redirectUri],\n };\n }\n\n // Otherwise, try to load from storage (DCR result)\n const state = await this.loadState();\n if (state?.clientInfo) {\n return {\n client_id: state.clientInfo.clientId,\n client_secret: state.clientInfo.clientSecret,\n client_id_issued_at: state.clientInfo.clientIdIssuedAt,\n client_secret_expires_at: state.clientInfo.clientSecretExpiresAt,\n redirect_uris: [this.config.redirectUri],\n };\n }\n\n return undefined;\n }\n\n /**\n * Saves client information from Dynamic Client Registration\n */\n async saveClientInformation(\n clientInformation: OAuthClientInformationFull\n ): Promise<void> {\n const state = (await this.loadState()) ?? this.createEmptyState();\n state.clientInfo = {\n clientId: clientInformation.client_id,\n clientSecret: clientInformation.client_secret,\n clientIdIssuedAt: clientInformation.client_id_issued_at,\n clientSecretExpiresAt: clientInformation.client_secret_expires_at,\n };\n await this.saveState(state);\n }\n\n /**\n * Loads any existing OAuth tokens for the current session\n */\n async tokens(): Promise<OAuthTokens | undefined> {\n const state = await this.loadState();\n if (state?.tokens) {\n return {\n access_token: state.tokens.accessToken,\n token_type: state.tokens.tokenType,\n refresh_token: state.tokens.refreshToken,\n expires_in: state.tokens.expiresAt\n ? Math.floor((state.tokens.expiresAt - Date.now()) / 1000)\n : undefined,\n };\n }\n return undefined;\n }\n\n /**\n * Stores new OAuth tokens for the current session\n *\n * The code verifier is cleared after a successful token exchange — it is\n * single-use per PKCE spec and must not persist beyond the exchange.\n */\n async saveTokens(tokens: OAuthTokens): Promise<void> {\n const state = (await this.loadState()) ?? this.createEmptyState();\n state.tokens = {\n accessToken: tokens.access_token,\n tokenType: tokens.token_type,\n refreshToken: tokens.refresh_token,\n expiresAt: tokens.expires_in\n ? Date.now() + tokens.expires_in * 1000\n : undefined,\n };\n // Clear codeVerifier after successful token exchange — it's single-use per PKCE spec\n delete state.codeVerifier;\n await this.saveState(state);\n }\n\n /**\n * Invoked to redirect the user agent to the given URL\n *\n * In a testing context, this is typically handled by Playwright automation.\n * This implementation throws an error to signal that the caller needs to\n * handle the redirect externally.\n */\n async redirectToAuthorization(authorizationUrl: URL): Promise<void> {\n // In a test context, the authorization flow should be handled externally\n // by Playwright automation (e.g., in globalSetup)\n throw new Error(\n `OAuth authorization required. Redirect to: ${authorizationUrl.toString()}\\n` +\n 'In a testing context, use performOAuthSetup() in your Playwright globalSetup ' +\n 'to complete the OAuth flow before running tests.'\n );\n }\n\n /**\n * Saves a PKCE code verifier for the current session\n */\n async saveCodeVerifier(codeVerifier: string): Promise<void> {\n const state = (await this.loadState()) ?? this.createEmptyState();\n state.codeVerifier = codeVerifier;\n await this.saveState(state);\n }\n\n /**\n * Loads the PKCE code verifier for the current session\n */\n async codeVerifier(): Promise<string> {\n const state = await this.loadState();\n if (!state?.codeVerifier) {\n throw new Error('No code verifier found in auth state');\n }\n return state.codeVerifier;\n }\n\n /**\n * Invalidates the specified credentials\n */\n async invalidateCredentials(\n scope: 'all' | 'client' | 'tokens' | 'verifier'\n ): Promise<void> {\n const state = await this.loadState();\n if (!state) {\n return;\n }\n\n switch (scope) {\n case 'all':\n await this.deleteState();\n break;\n case 'client':\n delete state.clientInfo;\n await this.saveState(state);\n break;\n case 'tokens':\n delete state.tokens;\n await this.saveState(state);\n break;\n case 'verifier':\n delete state.codeVerifier;\n await this.saveState(state);\n break;\n }\n }\n\n // ---- Private helper methods ----\n\n private async loadState(): Promise<StoredOAuthState | null> {\n if (this.cachedState) {\n return this.cachedState;\n }\n\n try {\n const content = await fs.readFile(this.config.storagePath, 'utf-8');\n this.cachedState = JSON.parse(content) as StoredOAuthState;\n return this.cachedState;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n }\n\n private async saveState(state: StoredOAuthState): Promise<void> {\n state.savedAt = Date.now();\n this.cachedState = state;\n\n // Ensure directory exists\n const dir = path.dirname(this.config.storagePath);\n await fs.mkdir(dir, { recursive: true, mode: 0o700 });\n\n await fs.writeFile(\n this.config.storagePath,\n JSON.stringify(state, null, 2),\n { encoding: 'utf-8', mode: 0o600 }\n );\n }\n\n private async deleteState(): Promise<void> {\n this.cachedState = null;\n try {\n await fs.unlink(this.config.storagePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n private createEmptyState(): StoredOAuthState {\n return {\n savedAt: Date.now(),\n };\n }\n\n private generateRandomString(length: number): string {\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n const randomValues = new Uint8Array(length);\n crypto.getRandomValues(randomValues);\n for (let i = 0; i < length; i++) {\n const randomValue = randomValues[i] ?? 0;\n result += chars[randomValue % chars.length];\n }\n return result;\n }\n}\n\n/**\n * Loads OAuth state from a single file (Playwright auth pattern)\n *\n * This function reads from Playwright's single-file auth state format,\n * typically created by `performOAuthSetup` in globalSetup.\n *\n * **Note:** This does NOT work with tokens stored by the CLI (`mcp-server-tester login`).\n * For CLI-stored tokens, use `loadTokens(serverUrl)` instead.\n *\n * @param storagePath - Path to the auth state file (e.g., 'playwright/.auth/oauth-state.json')\n * @returns The stored OAuth state, or null if not found\n *\n * @example\n * ```typescript\n * // Load Playwright auth state\n * const state = await loadOAuthState('playwright/.auth/oauth-state.json');\n * ```\n */\nexport async function loadOAuthState(\n storagePath: string\n): Promise<StoredOAuthState | null> {\n try {\n const content = await fs.readFile(storagePath, 'utf-8');\n return JSON.parse(content) as StoredOAuthState;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Saves OAuth state to a single file (Playwright auth pattern)\n *\n * This function writes to Playwright's single-file auth state format.\n * Used by `performOAuthSetup` in globalSetup.\n *\n * **Note:** This does NOT work with the CLI storage format (`mcp-server-tester login`).\n * For programmatic token injection compatible with CLI, use `injectTokens(serverUrl, tokens)`.\n *\n * @param storagePath - Path to the auth state file (e.g., 'playwright/.auth/oauth-state.json')\n * @param state - The OAuth state to save\n *\n * @example\n * ```typescript\n * // Save Playwright auth state\n * await saveOAuthState('playwright/.auth/oauth-state.json', {\n * tokens: { accessToken: '...', tokenType: 'Bearer' },\n * savedAt: Date.now(),\n * });\n * ```\n */\nexport async function saveOAuthState(\n storagePath: string,\n state: StoredOAuthState\n): Promise<void> {\n state.savedAt = Date.now();\n\n // Ensure directory exists\n const dir = path.dirname(storagePath);\n await fs.mkdir(dir, { recursive: true, mode: 0o700 });\n\n await fs.writeFile(storagePath, JSON.stringify(state, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","/**\n * Symbol used for identifying AI SDK Error instances.\n * Enables checking if an error is an instance of AISDKError across package versions.\n */\nconst marker = 'vercel.ai.error';\nconst symbol = Symbol.for(marker);\n\n/**\n * Custom error class for AI SDK related errors.\n * @extends Error\n */\nexport class AISDKError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n * The underlying cause of the error, if any.\n */\n readonly cause?: unknown;\n\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name,\n message,\n cause,\n }: {\n name: string;\n message: string;\n cause?: unknown;\n }) {\n super(message);\n\n this.name = name;\n this.cause = cause;\n }\n\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error: unknown): error is AISDKError {\n return AISDKError.hasMarker(error, marker);\n }\n\n protected static hasMarker(error: unknown, marker: string): boolean {\n const markerSymbol = Symbol.for(marker);\n return (\n error != null &&\n typeof error === 'object' &&\n markerSymbol in error &&\n typeof error[markerSymbol] === 'boolean' &&\n error[markerSymbol] === true\n );\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_APICallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class APICallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly requestBodyValues: unknown;\n readonly statusCode?: number;\n\n readonly responseHeaders?: Record<string, string>;\n readonly responseBody?: string;\n\n readonly isRetryable: boolean;\n readonly data?: unknown;\n\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null &&\n (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500), // server error\n data,\n }: {\n message: string;\n url: string;\n requestBodyValues: unknown;\n statusCode?: number;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n cause?: unknown;\n isRetryable?: boolean;\n data?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n\n static isInstance(error: unknown): error is APICallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_EmptyResponseBodyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class EmptyResponseBodyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'Empty response body' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is EmptyResponseBodyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A function argument is invalid.\n */\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly argument: string;\n\n constructor({\n message,\n cause,\n argument,\n }: {\n argument: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.argument = argument;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_JSONParseError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class JSONParseError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly text: string;\n\n constructor({ text, cause }: { text: string; cause: unknown }) {\n super({\n name,\n message:\n `JSON parsing failed: ` +\n `Text: ${text}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.text = text;\n }\n\n static isInstance(error: unknown): error is JSONParseError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadAPIKeyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadAPIKeyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadAPIKeyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadSettingError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadSettingError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadSettingError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_TypeValidationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport interface TypeValidationContext {\n /**\n * Field path in dot notation (e.g., \"message.metadata\", \"message.parts[3].data\")\n */\n field?: string;\n\n /**\n * Entity name (e.g., tool name, data type name)\n */\n entityName?: string;\n\n /**\n * Entity identifier (e.g., message ID, tool call ID)\n */\n entityId?: string;\n}\n\nexport class TypeValidationError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly value: unknown;\n readonly context?: TypeValidationContext;\n\n constructor({\n value,\n cause,\n context,\n }: {\n value: unknown;\n cause: unknown;\n context?: TypeValidationContext;\n }) {\n let contextPrefix = 'Type validation failed';\n\n if (context?.field) {\n contextPrefix += ` for ${context.field}`;\n }\n\n if (context?.entityName || context?.entityId) {\n contextPrefix += ' (';\n const parts: string[] = [];\n if (context.entityName) {\n parts.push(context.entityName);\n }\n if (context.entityId) {\n parts.push(`id: \"${context.entityId}\"`);\n }\n contextPrefix += parts.join(', ');\n contextPrefix += ')';\n }\n\n super({\n name,\n message:\n `${contextPrefix}: ` +\n `Value: ${JSON.stringify(value)}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.value = value;\n this.context = context;\n }\n\n static isInstance(error: unknown): error is TypeValidationError {\n return AISDKError.hasMarker(error, marker);\n }\n\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value and context, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @param {TypeValidationContext} params.context - Optional context about what is being validated.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n context,\n }: {\n value: unknown;\n cause: unknown;\n context?: TypeValidationContext;\n }): TypeValidationError {\n if (\n TypeValidationError.isInstance(cause) &&\n cause.value === value &&\n cause.context?.field === context?.field &&\n cause.context?.entityName === context?.entityName &&\n cause.context?.entityId === context?.entityId\n ) {\n return cause;\n }\n\n return new TypeValidationError({ value, cause, context });\n }\n}\n","/**\n * EventSource/Server-Sent Events parser\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html\n */\nimport {ParseError} from './errors.ts'\nimport type {EventSourceParser, ParserCallbacks} from './types.ts'\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction noop(_arg: unknown) {\n // intentional noop\n}\n\n/**\n * Creates a new EventSource parser.\n *\n * @param callbacks - Callbacks to invoke on different parsing events:\n * - `onEvent` when a new event is parsed\n * - `onError` when an error occurs\n * - `onRetry` when a new reconnection interval has been sent from the server\n * - `onComment` when a comment is encountered in the stream\n *\n * @returns A new EventSource parser, with `parse` and `reset` methods.\n * @public\n */\nexport function createParser(callbacks: ParserCallbacks): EventSourceParser {\n if (typeof callbacks === 'function') {\n throw new TypeError(\n '`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?',\n )\n }\n\n const {onEvent = noop, onError = noop, onRetry = noop, onComment} = callbacks\n\n let incompleteLine = ''\n\n let isFirstChunk = true\n let id: string | undefined\n let data = ''\n let eventType = ''\n\n function feed(newChunk: string) {\n // Strip any UTF8 byte order mark (BOM) at the start of the stream\n const chunk = isFirstChunk ? newChunk.replace(/^\\xEF\\xBB\\xBF/, '') : newChunk\n\n // If there was a previous incomplete line, append it to the new chunk,\n // so we may process it together as a new (hopefully complete) chunk.\n const [complete, incomplete] = splitLines(`${incompleteLine}${chunk}`)\n\n for (const line of complete) {\n parseLine(line)\n }\n\n incompleteLine = incomplete\n isFirstChunk = false\n }\n\n function parseLine(line: string) {\n // If the line is empty (a blank line), dispatch the event\n if (line === '') {\n dispatchEvent()\n return\n }\n\n // If the line starts with a U+003A COLON character (:), ignore the line.\n if (line.startsWith(':')) {\n if (onComment) {\n onComment(line.slice(line.startsWith(': ') ? 2 : 1))\n }\n return\n }\n\n // If the line contains a U+003A COLON character (:)\n const fieldSeparatorIndex = line.indexOf(':')\n if (fieldSeparatorIndex !== -1) {\n // Collect the characters on the line before the first U+003A COLON character (:),\n // and let `field` be that string.\n const field = line.slice(0, fieldSeparatorIndex)\n\n // Collect the characters on the line after the first U+003A COLON character (:),\n // and let `value` be that string. If value starts with a U+0020 SPACE character,\n // remove it from value.\n const offset = line[fieldSeparatorIndex + 1] === ' ' ? 2 : 1\n const value = line.slice(fieldSeparatorIndex + offset)\n\n processField(field, value, line)\n return\n }\n\n // Otherwise, the string is not empty but does not contain a U+003A COLON character (:)\n // Process the field using the whole line as the field name, and an empty string as the field value.\n // 👆 This is according to spec. That means that a line that has the value `data` will result in\n // a newline being added to the current `data` buffer, for instance.\n processField(line, '', line)\n }\n\n function processField(field: string, value: string, line: string) {\n // Field names must be compared literally, with no case folding performed.\n switch (field) {\n case 'event':\n // Set the `event type` buffer to field value\n eventType = value\n break\n case 'data':\n // Append the field value to the `data` buffer, then append a single U+000A LINE FEED(LF)\n // character to the `data` buffer.\n data = `${data}${value}\\n`\n break\n case 'id':\n // If the field value does not contain U+0000 NULL, then set the `ID` buffer to\n // the field value. Otherwise, ignore the field.\n id = value.includes('\\0') ? undefined : value\n break\n case 'retry':\n // If the field value consists of only ASCII digits, then interpret the field value as an\n // integer in base ten, and set the event stream's reconnection time to that integer.\n // Otherwise, ignore the field.\n if (/^\\d+$/.test(value)) {\n onRetry(parseInt(value, 10))\n } else {\n onError(\n new ParseError(`Invalid \\`retry\\` value: \"${value}\"`, {\n type: 'invalid-retry',\n value,\n line,\n }),\n )\n }\n break\n default:\n // Otherwise, the field is ignored.\n onError(\n new ParseError(\n `Unknown field \"${field.length > 20 ? `${field.slice(0, 20)}…` : field}\"`,\n {type: 'unknown-field', field, value, line},\n ),\n )\n break\n }\n }\n\n function dispatchEvent() {\n const shouldDispatch = data.length > 0\n if (shouldDispatch) {\n onEvent({\n id,\n event: eventType || undefined,\n // If the data buffer's last character is a U+000A LINE FEED (LF) character,\n // then remove the last character from the data buffer.\n data: data.endsWith('\\n') ? data.slice(0, -1) : data,\n })\n }\n\n // Reset for the next event\n id = undefined\n data = ''\n eventType = ''\n }\n\n function reset(options: {consume?: boolean} = {}) {\n if (incompleteLine && options.consume) {\n parseLine(incompleteLine)\n }\n\n isFirstChunk = true\n id = undefined\n data = ''\n eventType = ''\n incompleteLine = ''\n }\n\n return {feed, reset}\n}\n\n/**\n * For the given `chunk`, split it into lines according to spec, and return any remaining incomplete line.\n *\n * @param chunk - The chunk to split into lines\n * @returns A tuple containing an array of complete lines, and any remaining incomplete line\n * @internal\n */\nfunction splitLines(chunk: string): [complete: Array<string>, incomplete: string] {\n /**\n * According to the spec, a line is terminated by either:\n * - U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair\n * - a single U+000A LINE FEED(LF) character not preceded by a U+000D CARRIAGE RETURN(CR) character\n * - a single U+000D CARRIAGE RETURN(CR) character not followed by a U+000A LINE FEED(LF) character\n */\n const lines: Array<string> = []\n let incompleteLine = ''\n let searchIndex = 0\n\n while (searchIndex < chunk.length) {\n // Find next line terminator\n const crIndex = chunk.indexOf('\\r', searchIndex)\n const lfIndex = chunk.indexOf('\\n', searchIndex)\n\n // Determine line end\n let lineEnd = -1\n if (crIndex !== -1 && lfIndex !== -1) {\n // CRLF case\n lineEnd = Math.min(crIndex, lfIndex)\n } else if (crIndex !== -1) {\n // CR at the end of a chunk might be part of a CRLF sequence that spans chunks,\n // so we shouldn't treat it as a line terminator (yet)\n if (crIndex === chunk.length - 1) {\n lineEnd = -1\n } else {\n lineEnd = crIndex\n }\n } else if (lfIndex !== -1) {\n lineEnd = lfIndex\n }\n\n // Extract line if terminator found\n if (lineEnd === -1) {\n // No terminator found, rest is incomplete\n incompleteLine = chunk.slice(searchIndex)\n break\n } else {\n const line = chunk.slice(searchIndex, lineEnd)\n lines.push(line)\n\n // Move past line terminator\n searchIndex = lineEnd + 1\n if (chunk[searchIndex - 1] === '\\r' && chunk[searchIndex] === '\\n') {\n searchIndex++\n }\n }\n }\n\n return [lines, incompleteLine]\n}\n","/**\n * The type of error that occurred.\n * @public\n */\nexport type ErrorType = 'invalid-retry' | 'unknown-field'\n\n/**\n * Error thrown when encountering an issue during parsing.\n *\n * @public\n */\nexport class ParseError extends Error {\n /**\n * The type of error that occurred.\n */\n type: ErrorType\n\n /**\n * In the case of an unknown field encountered in the stream, this will be the field name.\n */\n field?: string | undefined\n\n /**\n * In the case of an unknown field encountered in the stream, this will be the value of the field.\n */\n value?: string | undefined\n\n /**\n * The line that caused the error, if available.\n */\n line?: string | undefined\n\n constructor(\n message: string,\n options: {type: ErrorType; field?: string; value?: string; line?: string},\n ) {\n super(message)\n this.name = 'ParseError'\n this.type = options.type\n this.field = options.field\n this.value = options.value\n this.line = options.line\n }\n}\n","import {createParser} from './parse.ts'\nimport type {EventSourceMessage, EventSourceParser} from './types.ts'\n\n/**\n * Options for the EventSourceParserStream.\n *\n * @public\n */\nexport interface StreamOptions {\n /**\n * Behavior when a parsing error occurs.\n *\n * - A custom function can be provided to handle the error.\n * - `'terminate'` will error the stream and stop parsing.\n * - Any other value will ignore the error and continue parsing.\n *\n * @defaultValue `undefined`\n */\n onError?: ('terminate' | ((error: Error) => void)) | undefined\n\n /**\n * Callback for when a reconnection interval is sent from the server.\n *\n * @param retry - The number of milliseconds to wait before reconnecting.\n */\n onRetry?: ((retry: number) => void) | undefined\n\n /**\n * Callback for when a comment is encountered in the stream.\n *\n * @param comment - The comment encountered in the stream.\n */\n onComment?: ((comment: string) => void) | undefined\n}\n\n/**\n * A TransformStream that ingests a stream of strings and produces a stream of `EventSourceMessage`.\n *\n * @example Basic usage\n * ```\n * const eventStream =\n * response.body\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream())\n * ```\n *\n * @example Terminate stream on parsing errors\n * ```\n * const eventStream =\n * response.body\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream({terminateOnError: true}))\n * ```\n *\n * @public\n */\nexport class EventSourceParserStream extends TransformStream<string, EventSourceMessage> {\n constructor({onError, onRetry, onComment}: StreamOptions = {}) {\n let parser!: EventSourceParser\n\n super({\n start(controller) {\n parser = createParser({\n onEvent: (event) => {\n controller.enqueue(event)\n },\n onError(error) {\n if (onError === 'terminate') {\n controller.error(error)\n } else if (typeof onError === 'function') {\n onError(error)\n }\n\n // Ignore by default\n },\n onRetry,\n onComment,\n })\n },\n transform(chunk) {\n parser.feed(chunk)\n },\n })\n }\n}\n\nexport {type ErrorType, ParseError} from './errors.ts'\nexport type {EventSourceMessage} from './types.ts'\n","export function combineHeaders(\n ...headers: Array<Record<string, string | undefined> | undefined>\n): Record<string, string | undefined> {\n return headers.reduce(\n (combinedHeaders, currentHeaders) => ({\n ...combinedHeaders,\n ...(currentHeaders ?? {}),\n }),\n {},\n ) as Record<string, string | undefined>;\n}\n","/**\n * Converts an AsyncIterator to a ReadableStream.\n *\n * @template T - The type of elements produced by the AsyncIterator.\n * @param { <T>} iterator - The AsyncIterator to convert.\n * @returns {ReadableStream<T>} - A ReadableStream that provides the same data as the AsyncIterator.\n */\nexport function convertAsyncIteratorToReadableStream<T>(\n iterator: AsyncIterator<T>,\n): ReadableStream<T> {\n let cancelled = false;\n\n return new ReadableStream<T>({\n /**\n * Called when the consumer wants to pull more data from the stream.\n *\n * @param {ReadableStreamDefaultController<T>} controller - The controller to enqueue data into the stream.\n * @returns {Promise<void>}\n */\n async pull(controller) {\n if (cancelled) return;\n try {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n },\n /**\n * Called when the consumer cancels the stream.\n */\n async cancel(reason?: unknown) {\n cancelled = true;\n if (iterator.return) {\n try {\n await iterator.return(reason);\n } catch {\n // intentionally ignore errors during cancellation\n }\n }\n },\n });\n}\n","import {\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\n} from '@ai-sdk/provider';\n\n/**\n * Interface for mapping between custom tool names and provider tool names.\n */\nexport interface ToolNameMapping {\n /**\n * Maps a custom tool name (used by the client) to the provider's tool name.\n * If the custom tool name does not have a mapping, returns the input name.\n *\n * @param customToolName - The custom name of the tool defined by the client.\n * @returns The corresponding provider tool name, or the input name if not mapped.\n */\n toProviderToolName: (customToolName: string) => string;\n\n /**\n * Maps a provider tool name to the custom tool name used by the client.\n * If the provider tool name does not have a mapping, returns the input name.\n *\n * @param providerToolName - The name of the tool as understood by the provider.\n * @returns The corresponding custom tool name, or the input name if not mapped.\n */\n toCustomToolName: (providerToolName: string) => string;\n}\n\n/**\n * @param tools - Tools that were passed to the language model.\n * @param providerToolNames - Maps the provider tool ids to the provider tool names.\n */\nexport function createToolNameMapping({\n tools = [],\n providerToolNames,\n}: {\n /**\n * Tools that were passed to the language model.\n */\n tools:\n | Array<LanguageModelV3FunctionTool | LanguageModelV3ProviderTool>\n | undefined;\n\n /**\n * Maps the provider tool ids to the provider tool names.\n */\n providerToolNames: Record<`${string}.${string}`, string>;\n}): ToolNameMapping {\n const customToolNameToProviderToolName: Record<string, string> = {};\n const providerToolNameToCustomToolName: Record<string, string> = {};\n\n for (const tool of tools) {\n if (tool.type === 'provider' && tool.id in providerToolNames) {\n const providerToolName = providerToolNames[tool.id];\n customToolNameToProviderToolName[tool.name] = providerToolName;\n providerToolNameToCustomToolName[providerToolName] = tool.name;\n }\n }\n\n return {\n toProviderToolName: (customToolName: string) =>\n customToolNameToProviderToolName[customToolName] ?? customToolName,\n toCustomToolName: (providerToolName: string) =>\n providerToolNameToCustomToolName[providerToolName] ?? providerToolName,\n };\n}\n","/**\n * Creates a Promise that resolves after a specified delay\n * @param delayInMs - The delay duration in milliseconds. If null or undefined, resolves immediately.\n * @param signal - Optional AbortSignal to cancel the delay\n * @returns A Promise that resolves after the specified delay\n * @throws {DOMException} When the signal is aborted\n */\nexport async function delay(\n delayInMs?: number | null,\n options?: {\n abortSignal?: AbortSignal;\n },\n): Promise<void> {\n if (delayInMs == null) {\n return Promise.resolve();\n }\n\n const signal = options?.abortSignal;\n\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(createAbortError());\n return;\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayInMs);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n signal?.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n reject(createAbortError());\n };\n\n signal?.addEventListener('abort', onAbort);\n });\n}\n\nfunction createAbortError(): DOMException {\n return new DOMException('Delay was aborted', 'AbortError');\n}\n","/**\n * Extracts the headers from a response object and returns them as a key-value object.\n *\n * @param response - The response object to extract headers from.\n * @returns The headers as a key-value object.\n */\nexport function extractResponseHeaders(response: Response) {\n return Object.fromEntries<string>([...response.headers]);\n}\n","// btoa and atob need to be invoked as a function call, not as a method call.\n// Otherwise CloudFlare will throw a\n// \"TypeError: Illegal invocation: function called with incorrect this reference\"\nconst { btoa, atob } = globalThis;\n\nexport function convertBase64ToUint8Array(base64String: string) {\n const base64Url = base64String.replace(/-/g, '+').replace(/_/g, '/');\n const latin1string = atob(base64Url);\n return Uint8Array.from(latin1string, byte => byte.codePointAt(0)!);\n}\n\nexport function convertUint8ArrayToBase64(array: Uint8Array): string {\n let latin1string = '';\n\n // Note: regular for loop to support older JavaScript versions that\n // do not support for..of on Uint8Array\n for (let i = 0; i < array.length; i++) {\n latin1string += String.fromCodePoint(array[i]);\n }\n\n return btoa(latin1string);\n}\n\nexport function convertToBase64(value: string | Uint8Array): string {\n return value instanceof Uint8Array ? convertUint8ArrayToBase64(value) : value;\n}\n","import { ImageModelV3File } from '@ai-sdk/provider';\nimport { convertUint8ArrayToBase64 } from './uint8-utils';\n\n/**\n * Convert an ImageModelV3File to a URL or data URI string.\n *\n * If the file is a URL, it returns the URL as-is.\n * If the file is base64 data, it returns a data URI with the base64 data.\n * If the file is a Uint8Array, it converts it to base64 and returns a data URI.\n */\nexport function convertImageModelFileToDataUri(file: ImageModelV3File): string {\n if (file.type === 'url') return file.url;\n\n return `data:${file.mediaType};base64,${\n typeof file.data === 'string'\n ? file.data\n : convertUint8ArrayToBase64(file.data)\n }`;\n}\n","/**\n * Converts an input object to FormData for multipart/form-data requests.\n *\n * Handles the following cases:\n * - `null` or `undefined` values are skipped\n * - Arrays with a single element are appended as a single value\n * - Arrays with multiple elements are appended with `[]` suffix (e.g., `image[]`)\n * unless `useArrayBrackets` is set to `false`\n * - All other values are appended directly\n *\n * @param input - The input object to convert. Use a generic type for type validation.\n * @param options - Optional configuration object.\n * @param options.useArrayBrackets - Whether to add `[]` suffix for multi-element arrays.\n * Defaults to `true`. Set to `false` for APIs that expect repeated keys without brackets.\n * @returns A FormData object containing the input values.\n *\n * @example\n * ```ts\n * type MyInput = {\n * model: string;\n * prompt: string;\n * images: Blob[];\n * };\n *\n * const formData = convertToFormData<MyInput>({\n * model: 'gpt-image-1',\n * prompt: 'A cat',\n * images: [blob1, blob2],\n * });\n * ```\n */\nexport function convertToFormData<T extends Record<string, unknown>>(\n input: T,\n options: { useArrayBrackets?: boolean } = {},\n): FormData {\n const { useArrayBrackets = true } = options;\n const formData = new FormData();\n\n for (const [key, value] of Object.entries(input)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 1) {\n formData.append(key, value[0] as string | Blob);\n continue;\n }\n\n const arrayKey = useArrayBrackets ? `${key}[]` : key;\n for (const item of value) {\n formData.append(arrayKey, item as string | Blob);\n }\n continue;\n }\n\n formData.append(key, value as string | Blob);\n }\n\n return formData;\n}\n","import { DownloadError } from './download-error';\n\n/**\n * Default maximum download size: 2 GiB.\n *\n * `fetch().arrayBuffer()` has ~2x peak memory overhead (undici buffers the\n * body internally, then creates the JS ArrayBuffer), so very large downloads\n * risk exceeding the default V8 heap limit on 64-bit systems and terminating\n * the process with an out-of-memory error.\n *\n * Setting this limit converts an unrecoverable OOM crash into a catchable\n * `DownloadError`.\n */\nexport const DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;\n\n/**\n * Reads a fetch Response body with a size limit to prevent memory exhaustion.\n *\n * Checks the Content-Length header for early rejection, then reads the body\n * incrementally via ReadableStream and aborts with a DownloadError when the\n * limit is exceeded.\n *\n * @param response - The fetch Response to read.\n * @param url - The URL being downloaded (used in error messages).\n * @param maxBytes - Maximum allowed bytes. Defaults to DEFAULT_MAX_DOWNLOAD_SIZE.\n * @returns A Uint8Array containing the response body.\n * @throws DownloadError if the response exceeds maxBytes.\n */\nexport async function readResponseWithSizeLimit({\n response,\n url,\n maxBytes = DEFAULT_MAX_DOWNLOAD_SIZE,\n}: {\n response: Response;\n url: string;\n maxBytes?: number;\n}): Promise<Uint8Array> {\n // Early rejection based on Content-Length header\n const contentLength = response.headers.get('content-length');\n if (contentLength != null) {\n const length = parseInt(contentLength, 10);\n if (!isNaN(length) && length > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes (Content-Length: ${length}).`,\n });\n }\n }\n\n const body = response.body;\n\n // Handle missing body (empty responses)\n if (body == null) {\n return new Uint8Array(0);\n }\n\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n totalBytes += value.length;\n\n if (totalBytes > maxBytes) {\n throw new DownloadError({\n url,\n message: `Download of ${url} exceeded maximum size of ${maxBytes} bytes.`,\n });\n }\n\n chunks.push(value);\n }\n } finally {\n try {\n await reader.cancel();\n } finally {\n reader.releaseLock();\n }\n }\n\n // Concatenate chunks into a single Uint8Array\n const result = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n","import { DownloadError } from './download-error';\nimport {\n readResponseWithSizeLimit,\n DEFAULT_MAX_DOWNLOAD_SIZE,\n} from './read-response-with-size-limit';\n\n/**\n * Download a file from a URL and return it as a Blob.\n *\n * @param url - The URL to download from.\n * @param options - Optional settings for the download.\n * @param options.maxBytes - Maximum allowed download size in bytes. Defaults to 100 MiB.\n * @param options.abortSignal - An optional abort signal to cancel the download.\n * @returns A Promise that resolves to the downloaded Blob.\n *\n * @throws DownloadError if the download fails or exceeds maxBytes.\n */\nexport async function downloadBlob(\n url: string,\n options?: { maxBytes?: number; abortSignal?: AbortSignal },\n): Promise<Blob> {\n try {\n const response = await fetch(url, {\n signal: options?.abortSignal,\n });\n\n if (!response.ok) {\n throw new DownloadError({\n url,\n statusCode: response.status,\n statusText: response.statusText,\n });\n }\n\n const data = await readResponseWithSizeLimit({\n response,\n url,\n maxBytes: options?.maxBytes ?? DEFAULT_MAX_DOWNLOAD_SIZE,\n });\n\n const contentType = response.headers.get('content-type') ?? undefined;\n return new Blob([data], contentType ? { type: contentType } : undefined);\n } catch (error) {\n if (DownloadError.isInstance(error)) {\n throw error;\n }\n\n throw new DownloadError({ url, cause: error });\n }\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","export function isAbortError(error: unknown): error is Error {\n return (\n (error instanceof Error || error instanceof DOMException) &&\n (error.name === 'AbortError' ||\n error.name === 'ResponseAborted' || // Next.js\n error.name === 'TimeoutError')\n );\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport { isAbortError } from './is-abort-error';\n\nconst FETCH_FAILED_ERROR_MESSAGES = ['fetch failed', 'failed to fetch'];\n\nconst BUN_ERROR_CODES = [\n 'ConnectionRefused',\n 'ConnectionClosed',\n 'FailedToOpenSocket',\n 'ECONNRESET',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'EPIPE',\n];\n\nfunction isBunNetworkError(error: unknown): error is Error & { code?: string } {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const code = (error as any).code;\n if (typeof code === 'string' && BUN_ERROR_CODES.includes(code)) {\n return true;\n }\n\n return false;\n}\n\nexport function handleFetchError({\n error,\n url,\n requestBodyValues,\n}: {\n error: unknown;\n url: string;\n requestBodyValues: unknown;\n}) {\n if (isAbortError(error)) {\n return error;\n }\n\n // unwrap original error when fetch failed (for easier debugging):\n if (\n error instanceof TypeError &&\n FETCH_FAILED_ERROR_MESSAGES.includes(error.message.toLowerCase())\n ) {\n const cause = (error as any).cause;\n\n if (cause != null) {\n // Failed to connect to server:\n return new APICallError({\n message: `Cannot connect to API: ${cause.message}`,\n cause,\n url,\n requestBodyValues,\n isRetryable: true, // retry when network error\n });\n }\n }\n\n if (isBunNetworkError(error)) {\n return new APICallError({\n message: `Cannot connect to API: ${error.message}`,\n cause: error,\n url,\n requestBodyValues,\n isRetryable: true,\n });\n }\n\n return error;\n}\n","export function getRuntimeEnvironmentUserAgent(\n globalThisAny: any = globalThis as any,\n): string {\n // Browsers\n if (globalThisAny.window) {\n return `runtime/browser`;\n }\n\n // Cloudflare Workers / Deno / Bun / Node.js >= 21.1\n if (globalThisAny.navigator?.userAgent) {\n return `runtime/${globalThisAny.navigator.userAgent.toLowerCase()}`;\n }\n\n // Nodes.js < 21.1\n if (globalThisAny.process?.versions?.node) {\n return `runtime/node.js/${globalThisAny.process.version.substring(0)}`;\n }\n\n if (globalThisAny.EdgeRuntime) {\n return `runtime/vercel-edge`;\n }\n\n return 'runtime/unknown';\n}\n","/**\n * Normalizes different header inputs into a plain record with lower-case keys.\n * Entries with `undefined` or `null` values are removed.\n *\n * @param headers - Input headers (`Headers`, tuples array, plain record) to normalize.\n * @returns A record containing the normalized header entries.\n */\nexport function normalizeHeaders(\n headers:\n | HeadersInit\n | Record<string, string | undefined>\n | Array<[string, string | undefined]>\n | undefined,\n): Record<string, string> {\n if (headers == null) {\n return {};\n }\n\n const normalized: Record<string, string> = {};\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n normalized[key.toLowerCase()] = value;\n });\n } else {\n if (!Array.isArray(headers)) {\n headers = Object.entries(headers);\n }\n\n for (const [key, value] of headers) {\n if (value != null) {\n normalized[key.toLowerCase()] = value;\n }\n }\n }\n\n return normalized;\n}\n","import { normalizeHeaders } from './normalize-headers';\n\n/**\n * Appends suffix parts to the `user-agent` header.\n * If a `user-agent` header already exists, the suffix parts are appended to it.\n * If no `user-agent` header exists, a new one is created with the suffix parts.\n * Automatically removes undefined entries from the headers.\n *\n * @param headers - The original headers.\n * @param userAgentSuffixParts - The parts to append to the `user-agent` header.\n * @returns The new headers with the `user-agent` header set or updated.\n */\nexport function withUserAgentSuffix(\n headers: HeadersInit | Record<string, string | undefined> | undefined,\n ...userAgentSuffixParts: string[]\n): Record<string, string> {\n const normalizedHeaders = new Headers(normalizeHeaders(headers));\n\n const currentUserAgentHeader = normalizedHeaders.get('user-agent') || '';\n\n normalizedHeaders.set(\n 'user-agent',\n [currentUserAgentHeader, ...userAgentSuffixParts].filter(Boolean).join(' '),\n );\n\n return Object.fromEntries(normalizedHeaders.entries());\n}\n","import {\n JSONSchema7,\n LanguageModelV3Message,\n LanguageModelV3Prompt,\n} from '@ai-sdk/provider';\n\nconst DEFAULT_SCHEMA_PREFIX = 'JSON schema:';\nconst DEFAULT_SCHEMA_SUFFIX =\n 'You MUST answer with a JSON object that matches the JSON schema above.';\nconst DEFAULT_GENERIC_SUFFIX = 'You MUST answer with JSON.';\n\nexport function injectJsonInstruction({\n prompt,\n schema,\n schemaPrefix = schema != null ? DEFAULT_SCHEMA_PREFIX : undefined,\n schemaSuffix = schema != null\n ? DEFAULT_SCHEMA_SUFFIX\n : DEFAULT_GENERIC_SUFFIX,\n}: {\n prompt?: string;\n schema?: JSONSchema7;\n schemaPrefix?: string;\n schemaSuffix?: string;\n}): string {\n return [\n prompt != null && prompt.length > 0 ? prompt : undefined,\n prompt != null && prompt.length > 0 ? '' : undefined, // add a newline if prompt is not null\n schemaPrefix,\n schema != null ? JSON.stringify(schema) : undefined,\n schemaSuffix,\n ]\n .filter(line => line != null)\n .join('\\n');\n}\n\nexport function injectJsonInstructionIntoMessages({\n messages,\n schema,\n schemaPrefix,\n schemaSuffix,\n}: {\n messages: LanguageModelV3Prompt;\n schema?: JSONSchema7;\n schemaPrefix?: string;\n schemaSuffix?: string;\n}): LanguageModelV3Prompt {\n const systemMessage: LanguageModelV3Message =\n messages[0]?.role === 'system'\n ? { ...messages[0] }\n : { role: 'system', content: '' };\n\n systemMessage.content = injectJsonInstruction({\n prompt: systemMessage.content,\n schema,\n schemaPrefix,\n schemaSuffix,\n });\n\n return [\n systemMessage,\n ...(messages[0]?.role === 'system' ? messages.slice(1) : messages),\n ];\n}\n","/**\n * Type guard that checks whether a value is not `null` or `undefined`.\n *\n * @template T - The type of the value to check.\n * @param value - The value to check.\n * @returns `true` if the value is neither `null` nor `undefined`, otherwise `false`.\n */\nexport function isNonNullable<T>(\n value: T | undefined | null,\n): value is NonNullable<T> {\n return value != null;\n}\n","/**\n * Checks if the given URL is supported natively by the model.\n *\n * @param mediaType - The media type of the URL. Case-sensitive.\n * @param url - The URL to check.\n * @param supportedUrls - A record where keys are case-sensitive media types (or '*')\n * and values are arrays of RegExp patterns for URLs.\n *\n * @returns `true` if the URL matches a pattern under the specific media type\n * or the wildcard '*', `false` otherwise.\n */\nexport function isUrlSupported({\n mediaType,\n url,\n supportedUrls,\n}: {\n mediaType: string;\n url: string;\n supportedUrls: Record<string, RegExp[]>;\n}): boolean {\n // standardize media type and url to lower case\n url = url.toLowerCase();\n mediaType = mediaType.toLowerCase();\n\n return (\n Object.entries(supportedUrls)\n // standardize supported url map into lowercase prefixes:\n .map(([key, value]) => {\n const mediaType = key.toLowerCase();\n return mediaType === '*' || mediaType === '*/*'\n ? { mediaTypePrefix: '', regexes: value }\n : { mediaTypePrefix: mediaType.replace(/\\*/, ''), regexes: value };\n })\n // gather all regexp pattern from matched media type prefixes:\n .filter(({ mediaTypePrefix }) => mediaType.startsWith(mediaTypePrefix))\n .flatMap(({ regexes }) => regexes)\n // check if any pattern matches the url:\n .some(pattern => pattern.test(url))\n );\n}\n","import { LoadAPIKeyError } from '@ai-sdk/provider';\n\nexport function loadApiKey({\n apiKey,\n environmentVariableName,\n apiKeyParameterName = 'apiKey',\n description,\n}: {\n apiKey: string | undefined;\n environmentVariableName: string;\n apiKeyParameterName?: string;\n description: string;\n}): string {\n if (typeof apiKey === 'string') {\n return apiKey;\n }\n\n if (apiKey != null) {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string.`,\n });\n }\n\n if (typeof process === 'undefined') {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter. Environment variables is not supported in this environment.`,\n });\n }\n\n apiKey = process.env[environmentVariableName];\n\n if (apiKey == null) {\n throw new LoadAPIKeyError({\n message: `${description} API key is missing. Pass it using the '${apiKeyParameterName}' parameter or the ${environmentVariableName} environment variable.`,\n });\n }\n\n if (typeof apiKey !== 'string') {\n throw new LoadAPIKeyError({\n message: `${description} API key must be a string. The value of the ${environmentVariableName} environment variable is not a string.`,\n });\n }\n\n return apiKey;\n}\n","/**\n * Loads an optional `string` setting from the environment or a parameter.\n *\n * @param settingValue - The setting value.\n * @param environmentVariableName - The environment variable name.\n * @returns The setting value.\n */\nexport function loadOptionalSetting({\n settingValue,\n environmentVariableName,\n}: {\n settingValue: string | undefined;\n environmentVariableName: string;\n}): string | undefined {\n if (typeof settingValue === 'string') {\n return settingValue;\n }\n\n if (settingValue != null || typeof process === 'undefined') {\n return undefined;\n }\n\n settingValue = process.env[environmentVariableName];\n\n if (settingValue == null || typeof settingValue !== 'string') {\n return undefined;\n }\n\n return settingValue;\n}\n","import { LoadSettingError } from '@ai-sdk/provider';\n\n/**\n * Loads a `string` setting from the environment or a parameter.\n *\n * @param settingValue - The setting value.\n * @param environmentVariableName - The environment variable name.\n * @param settingName - The setting name.\n * @param description - The description of the setting.\n * @returns The setting value.\n */\nexport function loadSetting({\n settingValue,\n environmentVariableName,\n settingName,\n description,\n}: {\n settingValue: string | undefined;\n environmentVariableName: string;\n settingName: string;\n description: string;\n}): string {\n if (typeof settingValue === 'string') {\n return settingValue;\n }\n\n if (settingValue != null) {\n throw new LoadSettingError({\n message: `${description} setting must be a string.`,\n });\n }\n\n if (typeof process === 'undefined') {\n throw new LoadSettingError({\n message:\n `${description} setting is missing. ` +\n `Pass it using the '${settingName}' parameter. ` +\n `Environment variables is not supported in this environment.`,\n });\n }\n\n settingValue = process.env[environmentVariableName];\n\n if (settingValue == null) {\n throw new LoadSettingError({\n message:\n `${description} setting is missing. ` +\n `Pass it using the '${settingName}' parameter ` +\n `or the ${environmentVariableName} environment variable.`,\n });\n }\n\n if (typeof settingValue !== 'string') {\n throw new LoadSettingError({\n message:\n `${description} setting must be a string. ` +\n `The value of the ${environmentVariableName} environment variable is not a string.`,\n });\n }\n\n return settingValue;\n}\n","/**\n * Maps a media type to its corresponding file extension.\n * It was originally introduced to set a filename for audio file uploads\n * in https://github.com/vercel/ai/pull/8159.\n *\n * @param mediaType The media type to map.\n * @returns The corresponding file extension\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/MIME_types/Common_types\n */\nexport function mediaTypeToExtension(mediaType: string) {\n const [_type, subtype = ''] = mediaType.toLowerCase().split('/');\n\n return (\n {\n mpeg: 'mp3',\n 'x-wav': 'wav',\n opus: 'ogg',\n mp4: 'm4a',\n 'x-m4a': 'm4a',\n }[subtype] ?? subtype\n );\n}\n","// Licensed under BSD-3-Clause (this file only)\n// Code adapted from https://github.com/fastify/secure-json-parse/blob/783fcb1b5434709466759847cec974381939673a/index.js\n//\n// Copyright (c) Vercel, Inc. (https://vercel.com)\n// Copyright (c) 2019 The Fastify Team\n// Copyright (c) 2019, Sideway Inc, and project contributors\n// All rights reserved.\n//\n// The complete list of contributors can be found at:\n// - https://github.com/hapijs/bourne/graphs/contributors\n// - https://github.com/fastify/secure-json-parse/graphs/contributors\n// - https://github.com/vercel/ai/commits/main/packages/provider-utils/src/secure-parse-json.ts\n//\n// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n//\n// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n//\n// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n//\n// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nconst suspectProtoRx = /\"__proto__\"\\s*:/;\nconst suspectConstructorRx = /\"constructor\"\\s*:/;\n\nfunction _parse(text: string) {\n // Parse normally\n const obj = JSON.parse(text);\n\n // Ignore null and non-objects\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (\n suspectProtoRx.test(text) === false &&\n suspectConstructorRx.test(text) === false\n ) {\n return obj;\n }\n\n // Scan result for proto keys\n return filter(obj);\n}\n\nfunction filter(obj: any) {\n let next = [obj];\n\n while (next.length) {\n const nodes = next;\n next = [];\n\n for (const node of nodes) {\n if (Object.prototype.hasOwnProperty.call(node, '__proto__')) {\n throw new SyntaxError('Object contains forbidden prototype property');\n }\n\n if (\n Object.prototype.hasOwnProperty.call(node, 'constructor') &&\n Object.prototype.hasOwnProperty.call(node.constructor, 'prototype')\n ) {\n throw new SyntaxError('Object contains forbidden prototype property');\n }\n\n for (const key in node) {\n const value = node[key];\n if (value && typeof value === 'object') {\n next.push(value);\n }\n }\n }\n }\n return obj;\n}\n\nexport function secureJsonParse(text: string) {\n const { stackTraceLimit } = Error;\n try {\n // Performance optimization, see https://github.com/fastify/secure-json-parse/pull/90\n Error.stackTraceLimit = 0;\n } catch (e) {\n // Fallback in case Error is immutable (v8 readonly)\n return _parse(text);\n }\n\n try {\n return _parse(text);\n } finally {\n Error.stackTraceLimit = stackTraceLimit;\n }\n}\n","import { JSONSchema7, JSONSchema7Definition } from '@ai-sdk/provider';\n\n/**\n * Recursively adds additionalProperties: false to the JSON schema. This is necessary because some providers (e.g. OpenAI) do not support additionalProperties: true.\n */\nexport function addAdditionalPropertiesToJsonSchema(\n jsonSchema: JSONSchema7,\n): JSONSchema7 {\n if (\n jsonSchema.type === 'object' ||\n (Array.isArray(jsonSchema.type) && jsonSchema.type.includes('object'))\n ) {\n jsonSchema.additionalProperties = false;\n const { properties } = jsonSchema;\n if (properties != null) {\n for (const key of Object.keys(properties)) {\n properties[key] = visit(properties[key]);\n }\n }\n }\n\n if (jsonSchema.items != null) {\n jsonSchema.items = Array.isArray(jsonSchema.items)\n ? jsonSchema.items.map(visit)\n : visit(jsonSchema.items);\n }\n\n if (jsonSchema.anyOf != null) {\n jsonSchema.anyOf = jsonSchema.anyOf.map(visit);\n }\n\n if (jsonSchema.allOf != null) {\n jsonSchema.allOf = jsonSchema.allOf.map(visit);\n }\n\n if (jsonSchema.oneOf != null) {\n jsonSchema.oneOf = jsonSchema.oneOf.map(visit);\n }\n\n const { definitions } = jsonSchema;\n if (definitions != null) {\n for (const key of Object.keys(definitions)) {\n definitions[key] = visit(definitions[key]);\n }\n }\n\n return jsonSchema;\n}\n\nfunction visit(def: JSONSchema7Definition): JSONSchema7Definition {\n if (typeof def === 'boolean') return def;\n return addAdditionalPropertiesToJsonSchema(def);\n}\n","export type JsonSchema7AnyType = { $ref?: string };\n\nexport function parseAnyDef(): JsonSchema7AnyType {\n return {};\n}\n","import { ZodArrayDef, ZodFirstPartyTypeKind } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport type JsonSchema7ArrayType = {\n type: 'array';\n items?: JsonSchema7Type;\n minItems?: number;\n maxItems?: number;\n};\n\nexport function parseArrayDef(def: ZodArrayDef, refs: Refs) {\n const res: JsonSchema7ArrayType = {\n type: 'array',\n };\n if (\n def.type?._def &&\n def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny\n ) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items'],\n });\n }\n\n if (def.minLength) {\n res.minItems = def.minLength.value;\n }\n if (def.maxLength) {\n res.maxItems = def.maxLength.value;\n }\n if (def.exactLength) {\n res.minItems = def.exactLength.value;\n res.maxItems = def.exactLength.value;\n }\n return res;\n}\n","import { ZodBigIntDef } from 'zod/v3';\n\nexport type JsonSchema7BigintType = {\n type: 'integer';\n format: 'int64';\n minimum?: BigInt;\n exclusiveMinimum?: BigInt;\n maximum?: BigInt;\n exclusiveMaximum?: BigInt;\n multipleOf?: BigInt;\n};\n\nexport function parseBigintDef(def: ZodBigIntDef): JsonSchema7BigintType {\n const res: JsonSchema7BigintType = {\n type: 'integer',\n format: 'int64',\n };\n\n if (!def.checks) return res;\n\n for (const check of def.checks) {\n switch (check.kind) {\n case 'min':\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case 'max':\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n\n break;\n case 'multipleOf':\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n","export type JsonSchema7BooleanType = {\n type: 'boolean';\n};\n\nexport function parseBooleanDef(): JsonSchema7BooleanType {\n return { type: 'boolean' };\n}\n","import { ZodBrandedDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { Refs } from '../refs';\n\nexport function parseBrandedDef(_def: ZodBrandedDef<any>, refs: Refs) {\n return parseDef(_def.type._def, refs);\n}\n","import { ZodDateDef } from 'zod/v3';\nimport { Refs } from '../refs';\nimport { DateStrategy } from '../options';\n\nexport type JsonSchema7DateType =\n | {\n type: 'integer' | 'string';\n format: 'unix-time' | 'date-time' | 'date';\n minimum?: number;\n maximum?: number;\n }\n | {\n anyOf: JsonSchema7DateType[];\n };\n\nexport function parseDateDef(\n def: ZodDateDef,\n refs: Refs,\n overrideDateStrategy?: DateStrategy,\n): JsonSchema7DateType {\n const strategy = overrideDateStrategy ?? refs.dateStrategy;\n\n if (Array.isArray(strategy)) {\n return {\n anyOf: strategy.map((item, i) => parseDateDef(def, refs, item)),\n };\n }\n\n switch (strategy) {\n case 'string':\n case 'format:date-time':\n return {\n type: 'string',\n format: 'date-time',\n };\n case 'format:date':\n return {\n type: 'string',\n format: 'date',\n };\n case 'integer':\n return integerDateParser(def);\n }\n}\n\nconst integerDateParser = (def: ZodDateDef) => {\n const res: JsonSchema7DateType = {\n type: 'integer',\n format: 'unix-time',\n };\n\n for (const check of def.checks) {\n switch (check.kind) {\n case 'min':\n res.minimum = check.value;\n break;\n case 'max':\n res.maximum = check.value;\n break;\n }\n }\n\n return res;\n};\n","import { ZodDefaultDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport function parseDefaultDef(\n _def: ZodDefaultDef,\n refs: Refs,\n): JsonSchema7Type & { default: any } {\n return {\n ...parseDef(_def.innerType._def, refs),\n default: _def.defaultValue(),\n };\n}\n","import { ZodEffectsDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { parseAnyDef } from './any';\n\nexport function parseEffectsDef(\n _def: ZodEffectsDef,\n refs: Refs,\n): JsonSchema7Type | undefined {\n return refs.effectStrategy === 'input'\n ? parseDef(_def.schema._def, refs)\n : parseAnyDef();\n}\n","import { ZodEnumDef } from 'zod/v3';\n\nexport type JsonSchema7EnumType = {\n type: 'string';\n enum: string[];\n};\n\nexport function parseEnumDef(def: ZodEnumDef): JsonSchema7EnumType {\n return {\n type: 'string',\n enum: Array.from(def.values),\n };\n}\n","import { ZodIntersectionDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { JsonSchema7StringType } from './string';\n\nexport type JsonSchema7AllOfType = {\n allOf: JsonSchema7Type[];\n unevaluatedProperties?: boolean;\n};\n\nconst isJsonSchema7AllOfType = (\n type: JsonSchema7Type | JsonSchema7StringType,\n): type is JsonSchema7AllOfType => {\n if ('type' in type && type.type === 'string') return false;\n return 'allOf' in type;\n};\n\nexport function parseIntersectionDef(\n def: ZodIntersectionDef,\n refs: Refs,\n): JsonSchema7AllOfType | JsonSchema7Type | undefined {\n const allOf = [\n parseDef(def.left._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'allOf', '0'],\n }),\n parseDef(def.right._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'allOf', '1'],\n }),\n ].filter((x): x is JsonSchema7Type => !!x);\n\n const mergedAllOf: JsonSchema7Type[] = [];\n // If either of the schemas is an allOf, merge them into a single allOf\n allOf.forEach(schema => {\n if (isJsonSchema7AllOfType(schema)) {\n mergedAllOf.push(...schema.allOf);\n } else {\n let nestedSchema: JsonSchema7Type = schema;\n if (\n 'additionalProperties' in schema &&\n schema.additionalProperties === false\n ) {\n const { additionalProperties, ...rest } = schema;\n nestedSchema = rest;\n }\n mergedAllOf.push(nestedSchema);\n }\n });\n return mergedAllOf.length ? { allOf: mergedAllOf } : undefined;\n}\n","import { ZodLiteralDef } from 'zod/v3';\n\nexport type JsonSchema7LiteralType =\n | {\n type: 'string' | 'number' | 'integer' | 'boolean';\n const: string | number | boolean;\n }\n | {\n type: 'object' | 'array';\n };\n\nexport function parseLiteralDef(def: ZodLiteralDef): JsonSchema7LiteralType {\n const parsedType = typeof def.value;\n if (\n parsedType !== 'bigint' &&\n parsedType !== 'number' &&\n parsedType !== 'boolean' &&\n parsedType !== 'string'\n ) {\n return {\n type: Array.isArray(def.value) ? 'array' : 'object',\n };\n }\n\n return {\n type: parsedType === 'bigint' ? 'integer' : parsedType,\n const: def.value,\n };\n}\n","import { ZodStringDef } from 'zod/v3';\nimport { Refs } from '../refs';\n\nlet emojiRegex: RegExp | undefined = undefined;\n\n/**\n * Generated from the regular expressions found here as of 2024-05-22:\n * https://github.com/colinhacks/zod/blob/master/src/types.ts.\n *\n * Expressions with /i flag have been changed accordingly.\n */\nexport const zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email:\n /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === undefined) {\n emojiRegex = RegExp(\n '^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$',\n 'u',\n );\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr:\n /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr:\n /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url:\n /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/,\n} as const;\n\nexport type JsonSchema7StringType = {\n type: 'string';\n minLength?: number;\n maxLength?: number;\n format?:\n | 'email'\n | 'idn-email'\n | 'uri'\n | 'uuid'\n | 'date-time'\n | 'ipv4'\n | 'ipv6'\n | 'date'\n | 'time'\n | 'duration';\n pattern?: string;\n allOf?: {\n pattern: string;\n }[];\n anyOf?: {\n format: string;\n }[];\n contentEncoding?: string;\n};\n\nexport function parseStringDef(\n def: ZodStringDef,\n refs: Refs,\n): JsonSchema7StringType {\n const res: JsonSchema7StringType = {\n type: 'string',\n };\n\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case 'min':\n res.minLength =\n typeof res.minLength === 'number'\n ? Math.max(res.minLength, check.value)\n : check.value;\n break;\n case 'max':\n res.maxLength =\n typeof res.maxLength === 'number'\n ? Math.min(res.maxLength, check.value)\n : check.value;\n\n break;\n case 'email':\n switch (refs.emailStrategy) {\n case 'format:email':\n addFormat(res, 'email', check.message, refs);\n break;\n case 'format:idn-email':\n addFormat(res, 'idn-email', check.message, refs);\n break;\n case 'pattern:zod':\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n\n break;\n case 'url':\n addFormat(res, 'uri', check.message, refs);\n break;\n case 'uuid':\n addFormat(res, 'uuid', check.message, refs);\n break;\n case 'regex':\n addPattern(res, check.regex, check.message, refs);\n break;\n case 'cuid':\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case 'cuid2':\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case 'startsWith':\n addPattern(\n res,\n RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`),\n check.message,\n refs,\n );\n break;\n case 'endsWith':\n addPattern(\n res,\n RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`),\n check.message,\n refs,\n );\n break;\n case 'datetime':\n addFormat(res, 'date-time', check.message, refs);\n break;\n case 'date':\n addFormat(res, 'date', check.message, refs);\n break;\n case 'time':\n addFormat(res, 'time', check.message, refs);\n break;\n case 'duration':\n addFormat(res, 'duration', check.message, refs);\n break;\n case 'length':\n res.minLength =\n typeof res.minLength === 'number'\n ? Math.max(res.minLength, check.value)\n : check.value;\n res.maxLength =\n typeof res.maxLength === 'number'\n ? Math.min(res.maxLength, check.value)\n : check.value;\n break;\n case 'includes': {\n addPattern(\n res,\n RegExp(escapeLiteralCheckValue(check.value, refs)),\n check.message,\n refs,\n );\n break;\n }\n case 'ip': {\n if (check.version !== 'v6') {\n addFormat(res, 'ipv4', check.message, refs);\n }\n if (check.version !== 'v4') {\n addFormat(res, 'ipv6', check.message, refs);\n }\n break;\n }\n case 'base64url':\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case 'jwt':\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case 'cidr': {\n if (check.version !== 'v6') {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== 'v4') {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case 'emoji':\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case 'ulid': {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case 'base64': {\n switch (refs.base64Strategy) {\n case 'format:binary': {\n addFormat(res, 'binary' as any, check.message, refs);\n break;\n }\n\n case 'contentEncoding:base64': {\n res.contentEncoding = 'base64';\n break;\n }\n\n case 'pattern:zod': {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case 'nanoid': {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case 'toLowerCase':\n case 'toUpperCase':\n case 'trim':\n break;\n default:\n /* c8 ignore next */\n ((_: never) => {})(check);\n }\n }\n }\n\n return res;\n}\n\nfunction escapeLiteralCheckValue(literal: string, refs: Refs): string {\n return refs.patternStrategy === 'escape'\n ? escapeNonAlphaNumeric(literal)\n : literal;\n}\n\nconst ALPHA_NUMERIC = new Set(\n 'ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789',\n);\n\nfunction escapeNonAlphaNumeric(source: string) {\n let result = '';\n\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += '\\\\';\n }\n\n result += source[i];\n }\n\n return result;\n}\n\n// Adds a \"format\" keyword to the schema. If a format exists, both formats will be joined in an allOf-node, along with subsequent ones.\nfunction addFormat(\n schema: JsonSchema7StringType,\n value: Required<JsonSchema7StringType>['format'],\n message: string | undefined,\n refs: Refs,\n) {\n if (schema.format || schema.anyOf?.some(x => x.format)) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n\n if (schema.format) {\n schema.anyOf!.push({\n format: schema.format,\n });\n delete schema.format;\n }\n\n schema.anyOf!.push({\n format: value,\n ...(message &&\n refs.errorMessages && { errorMessage: { format: message } }),\n });\n } else {\n schema.format = value;\n }\n}\n\n// Adds a \"pattern\" keyword to the schema. If a pattern exists, both patterns will be joined in an allOf-node, along with subsequent ones.\nfunction addPattern(\n schema: JsonSchema7StringType,\n regex: RegExp,\n message: string | undefined,\n refs: Refs,\n) {\n if (schema.pattern || schema.allOf?.some(x => x.pattern)) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n\n if (schema.pattern) {\n schema.allOf!.push({\n pattern: schema.pattern,\n });\n delete schema.pattern;\n }\n\n schema.allOf!.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...(message &&\n refs.errorMessages && { errorMessage: { pattern: message } }),\n });\n } else {\n schema.pattern = stringifyRegExpWithFlags(regex, refs);\n }\n}\n\n// Mutate z.string.regex() in a best attempt to accommodate for regex flags when applyRegexFlags is true\nfunction stringifyRegExpWithFlags(regex: RegExp, refs: Refs): string {\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n\n // Currently handled flags\n const flags = {\n i: regex.flags.includes('i'), // Case-insensitive\n m: regex.flags.includes('m'), // `^` and `$` matches adjacent to newline characters\n s: regex.flags.includes('s'), // `.` matches newlines\n };\n\n // The general principle here is to step through each character, one at a time, applying mutations as flags require. We keep track when the current character is escaped, and when it's inside a group /like [this]/ or (also) a range like /[a-z]/. The following is fairly brittle imperative code; edit at your peril!\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = '';\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n } else if (source[i + 1] === '-' && source[i + 2]?.match(/[a-z]/)) {\n pattern += source[i];\n inCharRange = true;\n } else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n } else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n\n if (flags.m) {\n if (source[i] === '^') {\n pattern += `(^|(?<=[\\r\\n]))`;\n continue;\n } else if (source[i] === '$') {\n pattern += `($|(?=[\\r\\n]))`;\n continue;\n }\n }\n\n if (flags.s && source[i] === '.') {\n pattern += inCharGroup ? `${source[i]}\\r\\n` : `[${source[i]}\\r\\n]`;\n continue;\n }\n\n pattern += source[i];\n if (source[i] === '\\\\') {\n isEscaped = true;\n } else if (inCharGroup && source[i] === ']') {\n inCharGroup = false;\n } else if (!inCharGroup && source[i] === '[') {\n inCharGroup = true;\n }\n }\n\n try {\n new RegExp(pattern);\n } catch {\n console.warn(\n `Could not convert regex pattern at ${refs.currentPath.join(\n '/',\n )} to a flag-independent form! Falling back to the flag-ignorant source`,\n );\n return regex.source;\n }\n\n return pattern;\n}\n","import {\n ZodFirstPartyTypeKind,\n ZodMapDef,\n ZodRecordDef,\n ZodTypeAny,\n} from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { parseBrandedDef } from './branded';\nimport { JsonSchema7EnumType } from './enum';\nimport { JsonSchema7StringType, parseStringDef } from './string';\n\ntype JsonSchema7RecordPropertyNamesType =\n | Omit<JsonSchema7StringType, 'type'>\n | Omit<JsonSchema7EnumType, 'type'>;\n\nexport type JsonSchema7RecordType = {\n type: 'object';\n additionalProperties?: JsonSchema7Type | true;\n propertyNames?: JsonSchema7RecordPropertyNamesType;\n};\n\nexport function parseRecordDef(\n def: ZodRecordDef<ZodTypeAny, ZodTypeAny> | ZodMapDef,\n refs: Refs,\n): JsonSchema7RecordType {\n const schema: JsonSchema7RecordType = {\n type: 'object',\n additionalProperties:\n parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'additionalProperties'],\n }) ?? refs.allowedAdditionalProperties,\n };\n\n if (\n def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodString &&\n def.keyType._def.checks?.length\n ) {\n const { type, ...keyType } = parseStringDef(def.keyType._def, refs);\n\n return {\n ...schema,\n propertyNames: keyType,\n };\n } else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values,\n },\n };\n } else if (\n def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodBranded &&\n def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind.ZodString &&\n def.keyType._def.type._def.checks?.length\n ) {\n const { type, ...keyType } = parseBrandedDef(\n def.keyType._def,\n refs,\n ) as JsonSchema7StringType;\n\n return {\n ...schema,\n propertyNames: keyType,\n };\n }\n\n return schema;\n}\n","import { ZodMapDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { parseAnyDef } from './any';\nimport { JsonSchema7RecordType, parseRecordDef } from './record';\n\nexport type JsonSchema7MapType = {\n type: 'array';\n maxItems: 125;\n items: {\n type: 'array';\n items: [JsonSchema7Type, JsonSchema7Type];\n minItems: 2;\n maxItems: 2;\n };\n};\n\nexport function parseMapDef(\n def: ZodMapDef,\n refs: Refs,\n): JsonSchema7MapType | JsonSchema7RecordType {\n if (refs.mapStrategy === 'record') {\n return parseRecordDef(def, refs);\n }\n\n const keys =\n parseDef(def.keyType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items', 'items', '0'],\n }) || parseAnyDef();\n const values =\n parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items', 'items', '1'],\n }) || parseAnyDef();\n return {\n type: 'array',\n maxItems: 125,\n items: {\n type: 'array',\n items: [keys, values],\n minItems: 2,\n maxItems: 2,\n },\n };\n}\n","import { ZodNativeEnumDef } from 'zod/v3';\n\nexport type JsonSchema7NativeEnumType = {\n type: 'string' | 'number' | ['string', 'number'];\n enum: (string | number)[];\n};\n\nexport function parseNativeEnumDef(\n def: ZodNativeEnumDef,\n): JsonSchema7NativeEnumType {\n const object = def.values;\n const actualKeys = Object.keys(def.values).filter((key: string) => {\n return typeof object[object[key]] !== 'number';\n });\n\n const actualValues = actualKeys.map((key: string) => object[key]);\n\n const parsedTypes = Array.from(\n new Set(actualValues.map((values: string | number) => typeof values)),\n );\n\n return {\n type:\n parsedTypes.length === 1\n ? parsedTypes[0] === 'string'\n ? 'string'\n : 'number'\n : ['string', 'number'],\n enum: actualValues,\n };\n}\n","import { JsonSchema7AnyType, parseAnyDef } from './any';\n\nexport type JsonSchema7NeverType = {\n not: JsonSchema7AnyType;\n};\n\nexport function parseNeverDef(): JsonSchema7NeverType | undefined {\n return { not: parseAnyDef() };\n}\n","export type JsonSchema7NullType = {\n type: 'null';\n};\n\nexport function parseNullDef(): JsonSchema7NullType {\n return {\n type: 'null',\n };\n}\n","import {\n ZodDiscriminatedUnionDef,\n ZodLiteralDef,\n ZodTypeAny,\n ZodUnionDef,\n} from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport const primitiveMappings = {\n ZodString: 'string',\n ZodNumber: 'number',\n ZodBigInt: 'integer',\n ZodBoolean: 'boolean',\n ZodNull: 'null',\n} as const;\ntype ZodPrimitive = keyof typeof primitiveMappings;\ntype JsonSchema7Primitive =\n (typeof primitiveMappings)[keyof typeof primitiveMappings];\n\nexport type JsonSchema7UnionType =\n | JsonSchema7PrimitiveUnionType\n | JsonSchema7AnyOfType;\n\ntype JsonSchema7PrimitiveUnionType =\n | {\n type: JsonSchema7Primitive | JsonSchema7Primitive[];\n }\n | {\n type: JsonSchema7Primitive | JsonSchema7Primitive[];\n enum: (string | number | bigint | boolean | null)[];\n };\n\ntype JsonSchema7AnyOfType = {\n anyOf: JsonSchema7Type[];\n};\n\nexport function parseUnionDef(\n def: ZodUnionDef | ZodDiscriminatedUnionDef<any, any>,\n refs: Refs,\n): JsonSchema7PrimitiveUnionType | JsonSchema7AnyOfType | undefined {\n const options: readonly ZodTypeAny[] =\n def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n\n // This blocks tries to look ahead a bit to produce nicer looking schemas with type array instead of anyOf.\n if (\n options.every(\n x =>\n x._def.typeName in primitiveMappings &&\n (!x._def.checks || !x._def.checks.length),\n )\n ) {\n // all types in union are primitive and lack checks, so might as well squash into {type: [...]}\n\n const types = options.reduce((types: JsonSchema7Primitive[], x) => {\n const type = primitiveMappings[x._def.typeName as ZodPrimitive]; //Can be safely casted due to row 43\n return type && !types.includes(type) ? [...types, type] : types;\n }, []);\n\n return {\n type: types.length > 1 ? types : types[0],\n };\n } else if (\n options.every(x => x._def.typeName === 'ZodLiteral' && !x.description)\n ) {\n // all options literals\n\n const types = options.reduce(\n (acc: JsonSchema7Primitive[], x: { _def: ZodLiteralDef }) => {\n const type = typeof x._def.value;\n switch (type) {\n case 'string':\n case 'number':\n case 'boolean':\n return [...acc, type];\n case 'bigint':\n return [...acc, 'integer' as const];\n case 'object':\n if (x._def.value === null) return [...acc, 'null' as const];\n case 'symbol':\n case 'undefined':\n case 'function':\n default:\n return acc;\n }\n },\n [],\n );\n\n if (types.length === options.length) {\n // all the literals are primitive, as far as null can be considered primitive\n\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce(\n (acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n },\n [] as (string | number | bigint | boolean | null)[],\n ),\n };\n }\n } else if (options.every(x => x._def.typeName === 'ZodEnum')) {\n return {\n type: 'string',\n enum: options.reduce(\n (acc: string[], x) => [\n ...acc,\n ...x._def.values.filter((x: string) => !acc.includes(x)),\n ],\n [],\n ),\n };\n }\n\n return asAnyOf(def, refs);\n}\n\nconst asAnyOf = (\n def: ZodUnionDef | ZodDiscriminatedUnionDef<any, any>,\n refs: Refs,\n): JsonSchema7PrimitiveUnionType | JsonSchema7AnyOfType | undefined => {\n const anyOf = (\n (def.options instanceof Map\n ? Array.from(def.options.values())\n : def.options) as any[]\n )\n .map((x, i) =>\n parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'anyOf', `${i}`],\n }),\n )\n .filter(\n (x): x is JsonSchema7Type =>\n !!x &&\n (!refs.strictUnions ||\n (typeof x === 'object' && Object.keys(x).length > 0)),\n );\n\n return anyOf.length ? { anyOf } : undefined;\n};\n","import { ZodNullableDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { JsonSchema7NullType } from './null';\nimport { primitiveMappings } from './union';\n\nexport type JsonSchema7NullableType =\n | {\n anyOf: [JsonSchema7Type, JsonSchema7NullType];\n }\n | {\n type: [string, 'null'];\n };\n\nexport function parseNullableDef(\n def: ZodNullableDef,\n refs: Refs,\n): JsonSchema7NullableType | undefined {\n if (\n ['ZodString', 'ZodNumber', 'ZodBigInt', 'ZodBoolean', 'ZodNull'].includes(\n def.innerType._def.typeName,\n ) &&\n (!def.innerType._def.checks || !def.innerType._def.checks.length)\n ) {\n return {\n type: [\n primitiveMappings[\n def.innerType._def.typeName as keyof typeof primitiveMappings\n ],\n 'null',\n ],\n };\n }\n\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'anyOf', '0'],\n });\n\n return base && { anyOf: [base, { type: 'null' }] };\n}\n","import { ZodNumberDef } from 'zod/v3';\n\nexport type JsonSchema7NumberType = {\n type: 'number' | 'integer';\n minimum?: number;\n exclusiveMinimum?: number;\n maximum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n};\n\nexport function parseNumberDef(def: ZodNumberDef): JsonSchema7NumberType {\n const res: JsonSchema7NumberType = {\n type: 'number',\n };\n\n if (!def.checks) return res;\n\n for (const check of def.checks) {\n switch (check.kind) {\n case 'int':\n res.type = 'integer';\n break;\n case 'min':\n if (check.inclusive) {\n res.minimum = check.value;\n } else {\n res.exclusiveMinimum = check.value;\n }\n break;\n case 'max':\n if (check.inclusive) {\n res.maximum = check.value;\n } else {\n res.exclusiveMaximum = check.value;\n }\n break;\n case 'multipleOf':\n res.multipleOf = check.value;\n break;\n }\n }\n return res;\n}\n","import { ZodObjectDef, ZodTypeAny } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport type JsonSchema7ObjectType = {\n type: 'object';\n properties: Record<string, JsonSchema7Type>;\n additionalProperties?: boolean | JsonSchema7Type;\n required?: string[];\n};\n\nexport function parseObjectDef(def: ZodObjectDef, refs: Refs) {\n const result: JsonSchema7ObjectType = {\n type: 'object',\n properties: {},\n };\n\n const required: string[] = [];\n\n const shape = def.shape();\n\n for (const propName in shape) {\n let propDef = shape[propName];\n\n if (propDef === undefined || propDef._def === undefined) {\n continue;\n }\n\n const propOptional = safeIsOptional(propDef);\n\n const parsedDef = parseDef(propDef._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'properties', propName],\n propertyPath: [...refs.currentPath, 'properties', propName],\n });\n\n if (parsedDef === undefined) {\n continue;\n }\n\n result.properties[propName] = parsedDef;\n\n if (!propOptional) {\n required.push(propName);\n }\n }\n\n if (required.length) {\n result.required = required;\n }\n\n const additionalProperties = decideAdditionalProperties(def, refs);\n\n if (additionalProperties !== undefined) {\n result.additionalProperties = additionalProperties;\n }\n\n return result;\n}\n\nfunction decideAdditionalProperties(def: ZodObjectDef, refs: Refs) {\n if (def.catchall._def.typeName !== 'ZodNever') {\n return parseDef(def.catchall._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'additionalProperties'],\n });\n }\n\n switch (def.unknownKeys) {\n case 'passthrough':\n return refs.allowedAdditionalProperties;\n case 'strict':\n return refs.rejectedAdditionalProperties;\n case 'strip':\n return refs.removeAdditionalStrategy === 'strict'\n ? refs.allowedAdditionalProperties\n : refs.rejectedAdditionalProperties;\n }\n}\n\nfunction safeIsOptional(schema: ZodTypeAny): boolean {\n try {\n return schema.isOptional();\n } catch {\n return true;\n }\n}\n","import { ZodPromiseDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport function parsePromiseDef(\n def: ZodPromiseDef,\n refs: Refs,\n): JsonSchema7Type | undefined {\n return parseDef(def.type._def, refs);\n}\n","import { ZodSetDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport type JsonSchema7SetType = {\n type: 'array';\n uniqueItems: true;\n items?: JsonSchema7Type;\n minItems?: number;\n maxItems?: number;\n};\n\nexport function parseSetDef(def: ZodSetDef, refs: Refs): JsonSchema7SetType {\n const items = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items'],\n });\n\n const schema: JsonSchema7SetType = {\n type: 'array',\n uniqueItems: true,\n items,\n };\n\n if (def.minSize) {\n schema.minItems = def.minSize.value;\n }\n\n if (def.maxSize) {\n schema.maxItems = def.maxSize.value;\n }\n\n return schema;\n}\n","import { ZodTupleDef, ZodTupleItems, ZodTypeAny } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\n\nexport type JsonSchema7TupleType = {\n type: 'array';\n minItems: number;\n items: JsonSchema7Type[];\n} & (\n | {\n maxItems: number;\n }\n | {\n additionalItems?: JsonSchema7Type;\n }\n);\n\nexport function parseTupleDef(\n def: ZodTupleDef<ZodTupleItems | [], ZodTypeAny | null>,\n refs: Refs,\n): JsonSchema7TupleType {\n if (def.rest) {\n return {\n type: 'array',\n minItems: def.items.length,\n items: def.items\n .map((x, i) =>\n parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items', `${i}`],\n }),\n )\n .reduce(\n (acc: JsonSchema7Type[], x) => (x === undefined ? acc : [...acc, x]),\n [],\n ),\n additionalItems: parseDef(def.rest._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'additionalItems'],\n }),\n };\n } else {\n return {\n type: 'array',\n minItems: def.items.length,\n maxItems: def.items.length,\n items: def.items\n .map((x, i) =>\n parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'items', `${i}`],\n }),\n )\n .reduce(\n (acc: JsonSchema7Type[], x) => (x === undefined ? acc : [...acc, x]),\n [],\n ),\n };\n }\n}\n","import { JsonSchema7AnyType, parseAnyDef } from './any';\n\nexport type JsonSchema7UndefinedType = {\n not: JsonSchema7AnyType;\n};\n\nexport function parseUndefinedDef(): JsonSchema7UndefinedType {\n return {\n not: parseAnyDef(),\n };\n}\n","import { JsonSchema7AnyType, parseAnyDef } from './any';\n\nexport type JsonSchema7UnknownType = JsonSchema7AnyType;\n\nexport function parseUnknownDef(): JsonSchema7UnknownType {\n return parseAnyDef();\n}\n","import { ZodTypeDef } from 'zod/v3';\nimport { Refs, Seen } from './refs';\nimport { ignoreOverride } from './options';\nimport { JsonSchema7Type } from './parse-types';\nimport { selectParser } from './select-parser';\nimport { getRelativePath } from './get-relative-path';\nimport { parseAnyDef } from './parsers/any';\n\nexport function parseDef(\n def: ZodTypeDef,\n refs: Refs,\n forceResolution = false, // Forces a new schema to be instantiated even though its def has been seen. Used for improving refs in definitions. See https://github.com/StefanTerdell/zod-to-json-schema/pull/61.\n): JsonSchema7Type | undefined {\n const seenItem = refs.seen.get(def);\n\n if (refs.override) {\n const overrideResult = refs.override?.(\n def,\n refs,\n seenItem,\n forceResolution,\n );\n\n if (overrideResult !== ignoreOverride) {\n return overrideResult;\n }\n }\n\n if (seenItem && !forceResolution) {\n const seenSchema = get$ref(seenItem, refs);\n\n if (seenSchema !== undefined) {\n return seenSchema;\n }\n }\n\n const newItem: Seen = { def, path: refs.currentPath, jsonSchema: undefined };\n\n refs.seen.set(def, newItem);\n\n const jsonSchemaOrGetter = selectParser(def, (def as any).typeName, refs);\n\n // If the return was a function, then the inner definition needs to be extracted before a call to parseDef (recursive)\n const jsonSchema =\n typeof jsonSchemaOrGetter === 'function'\n ? parseDef(jsonSchemaOrGetter(), refs)\n : jsonSchemaOrGetter;\n\n if (jsonSchema) {\n addMeta(def, refs, jsonSchema);\n }\n\n if (refs.postProcess) {\n const postProcessResult = refs.postProcess(jsonSchema, def, refs);\n\n newItem.jsonSchema = jsonSchema;\n\n return postProcessResult;\n }\n\n newItem.jsonSchema = jsonSchema;\n\n return jsonSchema;\n}\n\nconst get$ref = (\n item: Seen,\n refs: Refs,\n):\n | {\n $ref: string;\n }\n | {}\n | undefined => {\n switch (refs.$refStrategy) {\n case 'root':\n return { $ref: item.path.join('/') };\n case 'relative':\n return { $ref: getRelativePath(refs.currentPath, item.path) };\n case 'none':\n case 'seen': {\n if (\n item.path.length < refs.currentPath.length &&\n item.path.every((value, index) => refs.currentPath[index] === value)\n ) {\n console.warn(\n `Recursive reference detected at ${refs.currentPath.join(\n '/',\n )}! Defaulting to any`,\n );\n\n return parseAnyDef();\n }\n\n return refs.$refStrategy === 'seen' ? parseAnyDef() : undefined;\n }\n }\n};\n\nconst addMeta = (\n def: ZodTypeDef,\n refs: Refs,\n jsonSchema: JsonSchema7Type,\n): JsonSchema7Type => {\n if (def.description) {\n jsonSchema.description = def.description;\n }\n return jsonSchema;\n};\n","import { JSONSchema7, TypeValidationError } from '@ai-sdk/provider';\nimport { StandardSchemaV1, StandardJSONSchemaV1 } from '@standard-schema/spec';\nimport * as z3 from 'zod/v3';\nimport * as z4 from 'zod/v4';\nimport { addAdditionalPropertiesToJsonSchema } from './add-additional-properties-to-json-schema';\nimport { zod3ToJsonSchema } from './to-json-schema/zod3-to-json-schema';\n\n/**\n * Used to mark schemas so we can support both Zod and custom schemas.\n */\nconst schemaSymbol = Symbol.for('vercel.ai.schema');\n\nexport type ValidationResult<OBJECT> =\n | { success: true; value: OBJECT }\n | { success: false; error: Error };\n\nexport type Schema<OBJECT = unknown> = {\n /**\n * Used to mark schemas so we can support both Zod and custom schemas.\n */\n [schemaSymbol]: true;\n\n /**\n * Schema type for inference.\n */\n _type: OBJECT;\n\n /**\n * Optional. Validates that the structure of a value matches this schema,\n * and returns a typed version of the value if it does.\n */\n readonly validate?: (\n value: unknown,\n ) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>;\n\n /**\n * The JSON Schema for the schema. It is passed to the providers.\n */\n readonly jsonSchema: JSONSchema7 | PromiseLike<JSONSchema7>;\n};\n\n/**\n * Creates a schema with deferred creation.\n * This is important to reduce the startup time of the library\n * and to avoid initializing unused validators.\n *\n * @param createValidator A function that creates a schema.\n * @returns A function that returns a schema.\n */\nexport function lazySchema<SCHEMA>(\n createSchema: () => Schema<SCHEMA>,\n): LazySchema<SCHEMA> {\n // cache the validator to avoid initializing it multiple times\n let schema: Schema<SCHEMA> | undefined;\n return () => {\n if (schema == null) {\n schema = createSchema();\n }\n return schema;\n };\n}\n\nexport type LazySchema<SCHEMA> = () => Schema<SCHEMA>;\n\nexport type ZodSchema<SCHEMA = any> =\n | z3.Schema<SCHEMA, z3.ZodTypeDef, any>\n | z4.core.$ZodType<SCHEMA, any>;\n\nexport type StandardSchema<SCHEMA = any> = StandardSchemaV1<unknown, SCHEMA> &\n StandardJSONSchemaV1<unknown, SCHEMA>;\n\nexport type FlexibleSchema<SCHEMA = any> =\n | Schema<SCHEMA>\n | LazySchema<SCHEMA>\n | ZodSchema<SCHEMA>\n | StandardSchema<SCHEMA>;\n\nexport type InferSchema<SCHEMA> =\n SCHEMA extends ZodSchema<infer T>\n ? T\n : SCHEMA extends StandardSchema<infer T>\n ? T\n : SCHEMA extends LazySchema<infer T>\n ? T\n : SCHEMA extends Schema<infer T>\n ? T\n : never;\n\n/**\n * Create a schema using a JSON Schema.\n *\n * @param jsonSchema The JSON Schema for the schema.\n * @param options.validate Optional. A validation function for the schema.\n */\nexport function jsonSchema<OBJECT = unknown>(\n jsonSchema:\n | JSONSchema7\n | PromiseLike<JSONSchema7>\n | (() => JSONSchema7 | PromiseLike<JSONSchema7>),\n {\n validate,\n }: {\n validate?: (\n value: unknown,\n ) => ValidationResult<OBJECT> | PromiseLike<ValidationResult<OBJECT>>;\n } = {},\n): Schema<OBJECT> {\n return {\n [schemaSymbol]: true,\n _type: undefined as OBJECT, // should never be used directly\n get jsonSchema() {\n if (typeof jsonSchema === 'function') {\n jsonSchema = jsonSchema(); // cache the function results\n }\n return jsonSchema;\n },\n validate,\n };\n}\n\nfunction isSchema(value: unknown): value is Schema {\n return (\n typeof value === 'object' &&\n value !== null &&\n schemaSymbol in value &&\n value[schemaSymbol] === true &&\n 'jsonSchema' in value &&\n 'validate' in value\n );\n}\n\nexport function asSchema<OBJECT>(\n schema: FlexibleSchema<OBJECT> | undefined,\n): Schema<OBJECT> {\n return schema == null\n ? jsonSchema({ properties: {}, additionalProperties: false })\n : isSchema(schema)\n ? schema\n : '~standard' in schema\n ? schema['~standard'].vendor === 'zod'\n ? zodSchema(schema as ZodSchema<OBJECT>)\n : standardSchema(schema as StandardSchema<OBJECT>)\n : schema();\n}\n\nfunction standardSchema<OBJECT>(\n standardSchema: StandardSchema<OBJECT>,\n): Schema<OBJECT> {\n return jsonSchema(\n () =>\n addAdditionalPropertiesToJsonSchema(\n standardSchema['~standard'].jsonSchema.input({\n target: 'draft-07',\n }) as JSONSchema7,\n ),\n {\n validate: async value => {\n const result = await standardSchema['~standard'].validate(value);\n return 'value' in result\n ? { success: true, value: result.value }\n : {\n success: false,\n error: new TypeValidationError({\n value,\n cause: result.issues,\n }),\n };\n },\n },\n );\n}\n\nexport function zod3Schema<OBJECT>(\n zodSchema: z3.Schema<OBJECT, z3.ZodTypeDef, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n // default to no references (to support openapi conversion for google)\n const useReferences = options?.useReferences ?? false;\n\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () =>\n zod3ToJsonSchema(zodSchema, {\n $refStrategy: useReferences ? 'root' : 'none',\n }) as JSONSchema7,\n {\n validate: async value => {\n const result = await zodSchema.safeParseAsync(value);\n return result.success\n ? { success: true, value: result.data }\n : { success: false, error: result.error };\n },\n },\n );\n}\n\nexport function zod4Schema<OBJECT>(\n zodSchema: z4.core.$ZodType<OBJECT, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n // default to no references (to support openapi conversion for google)\n const useReferences = options?.useReferences ?? false;\n\n return jsonSchema(\n // defer json schema creation to avoid unnecessary computation when only validation is needed\n () =>\n addAdditionalPropertiesToJsonSchema(\n z4.toJSONSchema(zodSchema, {\n target: 'draft-7',\n io: 'input',\n reused: useReferences ? 'ref' : 'inline',\n }) as JSONSchema7,\n ),\n {\n validate: async value => {\n const result = await z4.safeParseAsync(zodSchema, value);\n return result.success\n ? { success: true, value: result.data }\n : { success: false, error: result.error };\n },\n },\n );\n}\n\nexport function isZod4Schema(\n zodSchema: z4.core.$ZodType<any, any> | z3.Schema<any, z3.ZodTypeDef, any>,\n): zodSchema is z4.core.$ZodType<any, any> {\n // https://zod.dev/library-authors?id=how-to-support-zod-3-and-zod-4-simultaneously\n return '_zod' in zodSchema;\n}\n\nexport function zodSchema<OBJECT>(\n zodSchema:\n | z4.core.$ZodType<OBJECT, any>\n | z3.Schema<OBJECT, z3.ZodTypeDef, any>,\n options?: {\n /**\n * Enables support for references in the schema.\n * This is required for recursive schemas, e.g. with `z.lazy`.\n * However, not all language models and providers support such references.\n * Defaults to `false`.\n */\n useReferences?: boolean;\n },\n): Schema<OBJECT> {\n if (isZod4Schema(zodSchema)) {\n return zod4Schema(zodSchema, options);\n } else {\n return zod3Schema(zodSchema, options);\n }\n}\n","import { TypeValidationContext, TypeValidationError } from '@ai-sdk/provider';\nimport { FlexibleSchema, asSchema } from './schema';\n\n/**\n * Validates the types of an unknown object using a schema and\n * return a strongly-typed object.\n *\n * @template T - The type of the object to validate.\n * @param {string} options.value - The object to validate.\n * @param {Validator<T>} options.schema - The schema to use for validating the JSON.\n * @param {TypeValidationContext} options.context - Optional context about what is being validated.\n * @returns {Promise<T>} - The typed object.\n */\nexport async function validateTypes<OBJECT>({\n value,\n schema,\n context,\n}: {\n value: unknown;\n schema: FlexibleSchema<OBJECT>;\n context?: TypeValidationContext;\n}): Promise<OBJECT> {\n const result = await safeValidateTypes({ value, schema, context });\n\n if (!result.success) {\n throw TypeValidationError.wrap({ value, cause: result.error, context });\n }\n\n return result.value;\n}\n\n/**\n * Safely validates the types of an unknown object using a schema and\n * return a strongly-typed object.\n *\n * @template T - The type of the object to validate.\n * @param {string} options.value - The JSON object to validate.\n * @param {Validator<T>} options.schema - The schema to use for validating the JSON.\n * @param {TypeValidationContext} options.context - Optional context about what is being validated.\n * @returns An object with either a `success` flag and the parsed and typed data, or a `success` flag and an error object.\n */\nexport async function safeValidateTypes<OBJECT>({\n value,\n schema,\n context,\n}: {\n value: unknown;\n schema: FlexibleSchema<OBJECT>;\n context?: TypeValidationContext;\n}): Promise<\n | {\n success: true;\n value: OBJECT;\n rawValue: unknown;\n }\n | {\n success: false;\n error: TypeValidationError;\n rawValue: unknown;\n }\n> {\n const actualSchema = asSchema(schema);\n\n try {\n if (actualSchema.validate == null) {\n return { success: true, value: value as OBJECT, rawValue: value };\n }\n\n const result = await actualSchema.validate(value);\n\n if (result.success) {\n return { success: true, value: result.value, rawValue: value };\n }\n\n return {\n success: false,\n error: TypeValidationError.wrap({ value, cause: result.error, context }),\n rawValue: value,\n };\n } catch (error) {\n return {\n success: false,\n error: TypeValidationError.wrap({ value, cause: error, context }),\n rawValue: value,\n };\n }\n}\n","import {\n JSONParseError,\n JSONValue,\n TypeValidationError,\n} from '@ai-sdk/provider';\nimport { secureJsonParse } from './secure-json-parse';\nimport { safeValidateTypes, validateTypes } from './validate-types';\nimport { FlexibleSchema } from './schema';\n\n/**\n * Parses a JSON string into an unknown object.\n *\n * @param text - The JSON string to parse.\n * @returns {JSONValue} - The parsed JSON object.\n */\nexport async function parseJSON(options: {\n text: string;\n schema?: undefined;\n}): Promise<JSONValue>;\n/**\n * Parses a JSON string into a strongly-typed object using the provided schema.\n *\n * @template T - The type of the object to parse the JSON into.\n * @param {string} text - The JSON string to parse.\n * @param {Validator<T>} schema - The schema to use for parsing the JSON.\n * @returns {Promise<T>} - The parsed object.\n */\nexport async function parseJSON<T>(options: {\n text: string;\n schema: FlexibleSchema<T>;\n}): Promise<T>;\nexport async function parseJSON<T>({\n text,\n schema,\n}: {\n text: string;\n schema?: FlexibleSchema<T>;\n}): Promise<T> {\n try {\n const value = secureJsonParse(text);\n\n if (schema == null) {\n return value;\n }\n\n return validateTypes<T>({ value, schema });\n } catch (error) {\n if (\n JSONParseError.isInstance(error) ||\n TypeValidationError.isInstance(error)\n ) {\n throw error;\n }\n\n throw new JSONParseError({ text, cause: error });\n }\n}\n\nexport type ParseResult<T> =\n | { success: true; value: T; rawValue: unknown }\n | {\n success: false;\n error: JSONParseError | TypeValidationError;\n rawValue: unknown;\n };\n\n/**\n * Safely parses a JSON string and returns the result as an object of type `unknown`.\n *\n * @param text - The JSON string to parse.\n * @returns {Promise<object>} Either an object with `success: true` and the parsed data, or an object with `success: false` and the error that occurred.\n */\nexport async function safeParseJSON(options: {\n text: string;\n schema?: undefined;\n}): Promise<ParseResult<JSONValue>>;\n/**\n * Safely parses a JSON string into a strongly-typed object, using a provided schema to validate the object.\n *\n * @template T - The type of the object to parse the JSON into.\n * @param {string} text - The JSON string to parse.\n * @param {Validator<T>} schema - The schema to use for parsing the JSON.\n * @returns An object with either a `success` flag and the parsed and typed data, or a `success` flag and an error object.\n */\nexport async function safeParseJSON<T>(options: {\n text: string;\n schema: FlexibleSchema<T>;\n}): Promise<ParseResult<T>>;\nexport async function safeParseJSON<T>({\n text,\n schema,\n}: {\n text: string;\n schema?: FlexibleSchema<T>;\n}): Promise<ParseResult<T>> {\n try {\n const value = secureJsonParse(text);\n\n if (schema == null) {\n return { success: true, value: value as T, rawValue: value };\n }\n\n return await safeValidateTypes<T>({ value, schema });\n } catch (error) {\n return {\n success: false,\n error: JSONParseError.isInstance(error)\n ? error\n : new JSONParseError({ text, cause: error }),\n rawValue: undefined,\n };\n }\n}\n\nexport function isParsableJson(input: string): boolean {\n try {\n secureJsonParse(input);\n return true;\n } catch {\n return false;\n }\n}\n","import {\n EventSourceMessage,\n EventSourceParserStream,\n} from 'eventsource-parser/stream';\nimport { ParseResult, safeParseJSON } from './parse-json';\nimport { FlexibleSchema } from './schema';\n\n/**\n * Parses a JSON event stream into a stream of parsed JSON objects.\n */\nexport function parseJsonEventStream<T>({\n stream,\n schema,\n}: {\n stream: ReadableStream<Uint8Array>;\n schema: FlexibleSchema<T>;\n}): ReadableStream<ParseResult<T>> {\n return stream\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new EventSourceParserStream())\n .pipeThrough(\n new TransformStream<EventSourceMessage, ParseResult<T>>({\n async transform({ data }, controller) {\n // ignore the 'DONE' event that e.g. OpenAI sends:\n if (data === '[DONE]') {\n return;\n }\n\n controller.enqueue(await safeParseJSON({ text: data, schema }));\n },\n }),\n );\n}\n","import { InvalidArgumentError } from '@ai-sdk/provider';\nimport { safeValidateTypes } from './validate-types';\nimport { FlexibleSchema } from './schema';\n\nexport async function parseProviderOptions<OPTIONS>({\n provider,\n providerOptions,\n schema,\n}: {\n provider: string;\n providerOptions: Record<string, unknown> | undefined;\n schema: FlexibleSchema<OPTIONS>;\n}): Promise<OPTIONS | undefined> {\n if (providerOptions?.[provider] == null) {\n return undefined;\n }\n\n const parsedProviderOptions = await safeValidateTypes<OPTIONS | undefined>({\n value: providerOptions[provider],\n schema,\n });\n\n if (!parsedProviderOptions.success) {\n throw new InvalidArgumentError({\n argument: 'providerOptions',\n message: `invalid ${provider} provider options`,\n cause: parsedProviderOptions.error,\n });\n }\n\n return parsedProviderOptions.value;\n}\n","import { JSONValue } from '@ai-sdk/provider';\nimport { FlexibleSchema } from '../schema';\nimport { ToolResultOutput } from './content-part';\nimport { ModelMessage } from './model-message';\nimport { ProviderOptions } from './provider-options';\n\n/**\n * Additional options that are sent into each tool call.\n */\nexport interface ToolExecutionOptions {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * Messages that were sent to the language model to initiate the response that contained the tool call.\n * The messages **do not** include the system prompt nor the assistant response that contained the tool call.\n */\n messages: ModelMessage[];\n\n /**\n * An optional abort signal that indicates that the overall operation should be aborted.\n */\n abortSignal?: AbortSignal;\n\n /**\n * User-defined context.\n *\n * Treat the context object as immutable inside tools.\n * Mutating the context object can lead to race conditions and unexpected results\n * when tools are called in parallel.\n *\n * If you need to mutate the context, analyze the tool calls and results\n * in `prepareStep` and update it there.\n *\n * Experimental (can break in patch releases).\n */\n experimental_context?: unknown;\n}\n\n/**\n * Function that is called to determine if the tool needs approval before it can be executed.\n */\nexport type ToolNeedsApprovalFunction<INPUT> = (\n input: INPUT,\n options: {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * Messages that were sent to the language model to initiate the response that contained the tool call.\n * The messages **do not** include the system prompt nor the assistant response that contained the tool call.\n */\n messages: ModelMessage[];\n\n /**\n * Additional context.\n *\n * Experimental (can break in patch releases).\n */\n experimental_context?: unknown;\n },\n) => boolean | PromiseLike<boolean>;\n\nexport type ToolExecuteFunction<INPUT, OUTPUT> = (\n input: INPUT,\n options: ToolExecutionOptions,\n) => AsyncIterable<OUTPUT> | PromiseLike<OUTPUT> | OUTPUT;\n\n// 0 extends 1 & N checks for any\n// [N] extends [never] checks for never\ntype NeverOptional<N, T> = 0 extends 1 & N\n ? Partial<T>\n : [N] extends [never]\n ? Partial<Record<keyof T, undefined>>\n : T;\n\ntype ToolOutputProperties<INPUT, OUTPUT> = NeverOptional<\n OUTPUT,\n | {\n /**\n * An async function that is called with the arguments from the tool call and produces a result.\n * If not provided, the tool will not be executed automatically.\n *\n * @args is the input of the tool call.\n * @options.abortSignal is a signal that can be used to abort the tool call.\n */\n execute: ToolExecuteFunction<INPUT, OUTPUT>;\n\n outputSchema?: FlexibleSchema<OUTPUT>;\n }\n | {\n outputSchema: FlexibleSchema<OUTPUT>;\n\n execute?: never;\n }\n>;\n\n/**\n * A tool contains the description and the schema of the input that the tool expects.\n * This enables the language model to generate the input.\n *\n * The tool can also contain an optional execute function for the actual execution function of the tool.\n */\nexport type Tool<\n INPUT extends JSONValue | unknown | never = any,\n OUTPUT extends JSONValue | unknown | never = any,\n> = {\n /**\n * An optional description of what the tool does.\n * Will be used by the language model to decide whether to use the tool.\n * Not used for provider-defined tools.\n */\n description?: string;\n\n /**\n * An optional title of the tool.\n */\n title?: string;\n\n /**\n * Additional provider-specific metadata. They are passed through\n * to the provider from the AI SDK and enable provider-specific\n * functionality that can be fully encapsulated in the provider.\n */\n providerOptions?: ProviderOptions;\n\n /**\n * The schema of the input that the tool expects.\n * The language model will use this to generate the input.\n * It is also used to validate the output of the language model.\n *\n * You can use descriptions on the schema properties to make the input understandable for the language model.\n */\n inputSchema: FlexibleSchema<INPUT>;\n\n /**\n * An optional list of input examples that show the language\n * model what the input should look like.\n */\n inputExamples?: Array<{ input: NoInfer<INPUT> }>;\n\n /**\n * Whether the tool needs approval before it can be executed.\n */\n needsApproval?:\n | boolean\n | ToolNeedsApprovalFunction<[INPUT] extends [never] ? unknown : INPUT>;\n\n /**\n * Strict mode setting for the tool.\n *\n * Providers that support strict mode will use this setting to determine\n * how the input should be generated. Strict mode will always produce\n * valid inputs, but it might limit what input schemas are supported.\n */\n strict?: boolean;\n\n /**\n * Optional function that is called when the argument streaming starts.\n * Only called when the tool is used in a streaming context.\n */\n onInputStart?: (options: ToolExecutionOptions) => void | PromiseLike<void>;\n\n /**\n * Optional function that is called when an argument streaming delta is available.\n * Only called when the tool is used in a streaming context.\n */\n onInputDelta?: (\n options: { inputTextDelta: string } & ToolExecutionOptions,\n ) => void | PromiseLike<void>;\n\n /**\n * Optional function that is called when a tool call can be started,\n * even if the execute function is not provided.\n */\n onInputAvailable?: (\n options: {\n input: [INPUT] extends [never] ? unknown : INPUT;\n } & ToolExecutionOptions,\n ) => void | PromiseLike<void>;\n} & ToolOutputProperties<INPUT, OUTPUT> & {\n /**\n * Optional conversion function that maps the tool result to an output that can be used by the language model.\n *\n * If not provided, the tool result will be sent as a JSON object.\n */\n toModelOutput?: (options: {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * The input of the tool call.\n */\n input: [INPUT] extends [never] ? unknown : INPUT;\n\n /**\n * The output of the tool call.\n */\n output: 0 extends 1 & OUTPUT\n ? any\n : [OUTPUT] extends [never]\n ? any\n : NoInfer<OUTPUT>;\n }) => ToolResultOutput | PromiseLike<ToolResultOutput>;\n } & (\n | {\n /**\n * Tool with user-defined input and output schemas.\n */\n type?: undefined | 'function';\n }\n | {\n /**\n * Tool that is defined at runtime (e.g. an MCP tool).\n * The types of input and output are not known at development time.\n */\n type: 'dynamic';\n }\n | {\n /**\n * Tool with provider-defined input and output schemas.\n */\n type: 'provider';\n\n /**\n * The ID of the tool. Must follow the format `<provider-name>.<unique-tool-name>`.\n */\n id: `${string}.${string}`;\n\n /**\n * The arguments for configuring the tool. Must match the expected arguments defined by the provider for this tool.\n */\n args: Record<string, unknown>;\n\n /**\n * Whether this provider-executed tool supports deferred results.\n *\n * When true, the tool result may not be returned in the same turn as the\n * tool call (e.g., when using programmatic tool calling where a server tool\n * triggers a client-executed tool, and the server tool's result is deferred\n * until the client tool is resolved).\n *\n * This flag allows the AI SDK to handle tool results that arrive without\n * a matching tool call in the current response.\n *\n * @default false\n */\n supportsDeferredResults?: boolean;\n }\n );\n\n/**\n * Infer the input type of a tool.\n */\nexport type InferToolInput<TOOL extends Tool> =\n TOOL extends Tool<infer INPUT, any> ? INPUT : never;\n\n/**\n * Infer the output type of a tool.\n */\nexport type InferToolOutput<TOOL extends Tool> =\n TOOL extends Tool<any, infer OUTPUT> ? OUTPUT : never;\n\n/**\n * Helper function for inferring the execute args of a tool.\n */\n// Note: overload order is important for auto-completion\nexport function tool<INPUT, OUTPUT>(\n tool: Tool<INPUT, OUTPUT>,\n): Tool<INPUT, OUTPUT>;\nexport function tool<INPUT>(tool: Tool<INPUT, never>): Tool<INPUT, never>;\nexport function tool<OUTPUT>(tool: Tool<never, OUTPUT>): Tool<never, OUTPUT>;\nexport function tool(tool: Tool<never, never>): Tool<never, never>;\nexport function tool(tool: any): any {\n return tool;\n}\n\n/**\n * Defines a dynamic tool.\n */\nexport function dynamicTool(tool: {\n description?: string;\n title?: string;\n providerOptions?: ProviderOptions;\n inputSchema: FlexibleSchema<unknown>;\n execute: ToolExecuteFunction<unknown, unknown>;\n\n /**\n * Optional conversion function that maps the tool result to an output that can be used by the language model.\n *\n * If not provided, the tool result will be sent as a JSON object.\n */\n toModelOutput?: (options: {\n /**\n * The ID of the tool call. You can use it e.g. when sending tool-call related information with stream data.\n */\n toolCallId: string;\n\n /**\n * The input of the tool call.\n */\n input: unknown;\n\n /**\n * The output of the tool call.\n */\n output: unknown;\n }) => ToolResultOutput | PromiseLike<ToolResultOutput>;\n\n /**\n * Whether the tool needs approval before it can be executed.\n */\n needsApproval?: boolean | ToolNeedsApprovalFunction<unknown>;\n}): Tool<unknown, unknown> & {\n type: 'dynamic';\n} {\n return { ...tool, type: 'dynamic' };\n}\n","import { tool, Tool, ToolExecuteFunction } from './types/tool';\nimport { FlexibleSchema } from './schema';\n\nexport type ProviderToolFactory<INPUT, ARGS extends object> = <OUTPUT>(\n options: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n },\n) => Tool<INPUT, OUTPUT>;\n\nexport function createProviderToolFactory<INPUT, ARGS extends object>({\n id,\n inputSchema,\n}: {\n id: `${string}.${string}`;\n inputSchema: FlexibleSchema<INPUT>;\n}): ProviderToolFactory<INPUT, ARGS> {\n return <OUTPUT>({\n execute,\n outputSchema,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n outputSchema?: FlexibleSchema<OUTPUT>;\n needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n }): Tool<INPUT, OUTPUT> =>\n tool({\n type: 'provider',\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n });\n}\n\nexport type ProviderToolFactoryWithOutputSchema<\n INPUT,\n OUTPUT,\n ARGS extends object,\n> = (\n options: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n },\n) => Tool<INPUT, OUTPUT>;\n\nexport function createProviderToolFactoryWithOutputSchema<\n INPUT,\n OUTPUT,\n ARGS extends object,\n>({\n id,\n inputSchema,\n outputSchema,\n supportsDeferredResults,\n}: {\n id: `${string}.${string}`;\n inputSchema: FlexibleSchema<INPUT>;\n outputSchema: FlexibleSchema<OUTPUT>;\n /**\n * Whether this provider-executed tool supports deferred results.\n *\n * When true, the tool result may not be returned in the same turn as the\n * tool call (e.g., when using programmatic tool calling where a server tool\n * triggers a client-executed tool, and the server tool's result is deferred\n * until the client tool is resolved).\n *\n * @default false\n */\n supportsDeferredResults?: boolean;\n}): ProviderToolFactoryWithOutputSchema<INPUT, OUTPUT, ARGS> {\n return ({\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n ...args\n }: ARGS & {\n execute?: ToolExecuteFunction<INPUT, OUTPUT>;\n needsApproval?: Tool<INPUT, OUTPUT>['needsApproval'];\n toModelOutput?: Tool<INPUT, OUTPUT>['toModelOutput'];\n onInputStart?: Tool<INPUT, OUTPUT>['onInputStart'];\n onInputDelta?: Tool<INPUT, OUTPUT>['onInputDelta'];\n onInputAvailable?: Tool<INPUT, OUTPUT>['onInputAvailable'];\n }): Tool<INPUT, OUTPUT> =>\n tool({\n type: 'provider',\n id,\n args,\n inputSchema,\n outputSchema,\n execute,\n needsApproval,\n toModelOutput,\n onInputStart,\n onInputDelta,\n onInputAvailable,\n supportsDeferredResults,\n });\n}\n","/**\n * Removes entries from a record where the value is null or undefined.\n * @param record - The input object whose entries may be null or undefined.\n * @returns A new object containing only entries with non-null and non-undefined values.\n */\nexport function removeUndefinedEntries<T>(\n record: Record<string, T | undefined>,\n): Record<string, T> {\n return Object.fromEntries(\n Object.entries(record).filter(([_key, value]) => value != null),\n ) as Record<string, T>;\n}\n","import { MaybePromiseLike } from './maybe-promise-like';\n\nexport type Resolvable<T> = MaybePromiseLike<T> | (() => MaybePromiseLike<T>);\n\n/**\n * Resolves a value that could be a raw value, a Promise, a function returning a value,\n * or a function returning a Promise.\n */\nexport async function resolve<T>(value: Resolvable<T>): Promise<T> {\n // If it's a function, call it to get the value/promise\n if (typeof value === 'function') {\n value = (value as Function)();\n }\n\n // Otherwise just resolve whatever we got (value or promise)\n return Promise.resolve(value as T);\n}\n","export function withoutTrailingSlash(url: string | undefined) {\n return url?.replace(/\\/$/, '');\n}\n","export function isAsyncIterable<T = any>(obj: any): obj is AsyncIterable<T> {\n return obj != null && typeof obj[Symbol.asyncIterator] === 'function';\n}\n","import { isAsyncIterable } from '../is-async-iterable';\nimport { ToolExecutionOptions, ToolExecuteFunction } from './tool';\n\nexport async function* executeTool<INPUT, OUTPUT>({\n execute,\n input,\n options,\n}: {\n execute: ToolExecuteFunction<INPUT, OUTPUT>;\n input: INPUT;\n options: ToolExecutionOptions;\n}): AsyncGenerator<\n { type: 'preliminary'; output: OUTPUT } | { type: 'final'; output: OUTPUT }\n> {\n const result = execute(input, options);\n\n if (isAsyncIterable(result)) {\n let lastOutput: OUTPUT | undefined;\n for await (const output of result) {\n lastOutput = output;\n yield { type: 'preliminary', output };\n }\n yield { type: 'final', output: lastOutput! };\n } else {\n yield { type: 'final', output: await result };\n }\n}\n","/**\n * Delayed promise. It is only constructed once the value is accessed.\n * This is useful to avoid unhandled promise rejections when the promise is created\n * but not accessed.\n */\nexport class DelayedPromise<T> {\n private status:\n | { type: 'pending' }\n | { type: 'resolved'; value: T }\n | { type: 'rejected'; error: unknown } = { type: 'pending' };\n private _promise: Promise<T> | undefined;\n private _resolve: undefined | ((value: T) => void) = undefined;\n private _reject: undefined | ((error: unknown) => void) = undefined;\n\n get promise(): Promise<T> {\n if (this._promise) {\n return this._promise;\n }\n\n this._promise = new Promise<T>((resolve, reject) => {\n if (this.status.type === 'resolved') {\n resolve(this.status.value);\n } else if (this.status.type === 'rejected') {\n reject(this.status.error);\n }\n\n this._resolve = resolve;\n this._reject = reject;\n });\n\n return this._promise;\n }\n\n resolve(value: T): void {\n this.status = { type: 'resolved', value };\n\n if (this._promise) {\n this._resolve?.(value);\n }\n }\n\n reject(error: unknown): void {\n this.status = { type: 'rejected', error };\n\n if (this._promise) {\n this._reject?.(error);\n }\n }\n\n isResolved(): boolean {\n return this.status.type === 'resolved';\n }\n\n isRejected(): boolean {\n return this.status.type === 'rejected';\n }\n\n isPending(): boolean {\n return this.status.type === 'pending';\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_DownloadError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class DownloadError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly statusCode?: number;\n readonly statusText?: string;\n\n constructor({\n url,\n statusCode,\n statusText,\n cause,\n message = cause == null\n ? `Failed to download ${url}: ${statusCode} ${statusText}`\n : `Failed to download ${url}: ${cause}`,\n }: {\n url: string;\n statusCode?: number;\n statusText?: string;\n message?: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.statusCode = statusCode;\n this.statusText = statusText;\n }\n\n static isInstance(error: unknown): error is DownloadError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { InvalidArgumentError } from '@ai-sdk/provider';\n\n/**\n * Creates an ID generator.\n * The total length of the ID is the sum of the prefix, separator, and random part length.\n * Not cryptographically secure.\n *\n * @param alphabet - The alphabet to use for the ID. Default: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.\n * @param prefix - The prefix of the ID to generate. Optional.\n * @param separator - The separator between the prefix and the random part of the ID. Default: '-'.\n * @param size - The size of the random part of the ID to generate. Default: 16.\n */\nexport const createIdGenerator = ({\n prefix,\n size = 16,\n alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n separator = '-',\n}: {\n prefix?: string;\n separator?: string;\n size?: number;\n alphabet?: string;\n} = {}): IdGenerator => {\n const generator = () => {\n const alphabetLength = alphabet.length;\n const chars = new Array(size);\n for (let i = 0; i < size; i++) {\n chars[i] = alphabet[(Math.random() * alphabetLength) | 0];\n }\n return chars.join('');\n };\n\n if (prefix == null) {\n return generator;\n }\n\n // check that the prefix is not part of the alphabet (otherwise prefix checking can fail randomly)\n if (alphabet.includes(separator)) {\n throw new InvalidArgumentError({\n argument: 'separator',\n message: `The separator \"${separator}\" must not be part of the alphabet \"${alphabet}\".`,\n });\n }\n\n return () => `${prefix}${separator}${generator()}`;\n};\n\n/**\n * A function that generates an ID.\n */\nexport type IdGenerator = () => string;\n\n/**\n * Generates a 16-character random string to use for IDs.\n * Not cryptographically secure.\n */\nexport const generateId = createIdGenerator();\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { APICallError } from '@ai-sdk/provider';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { FetchFunction } from './fetch-function';\nimport { handleFetchError } from './handle-fetch-error';\nimport { isAbortError } from './is-abort-error';\nimport { ResponseHandler } from './response-handler';\nimport { getRuntimeEnvironmentUserAgent } from './get-runtime-environment-user-agent';\nimport { withUserAgentSuffix } from './with-user-agent-suffix';\nimport { VERSION } from './version';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => globalThis.fetch;\n\nexport const getFromApi = async <T>({\n url,\n headers = {},\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch = getOriginalFetch(),\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n failedResponseHandler: ResponseHandler<Error>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) => {\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n ),\n signal: abortSignal,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.ok) {\n let errorInformation: {\n value: Error;\n responseHeaders?: Record<string, string> | undefined;\n };\n\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: {},\n });\n } catch (error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n\n throw new APICallError({\n message: 'Failed to process error response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {},\n });\n }\n\n throw errorInformation.value;\n }\n\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: {},\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n }\n\n throw new APICallError({\n message: 'Failed to process successful response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: {},\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: {} });\n }\n};\n","import { ZodSchema, ZodTypeDef } from 'zod/v3';\nimport { Refs, Seen } from './refs';\nimport { JsonSchema7Type } from './parse-types';\n\nexport type DateStrategy =\n | 'format:date-time'\n | 'format:date'\n | 'string'\n | 'integer';\n\nexport const ignoreOverride = Symbol(\n 'Let zodToJsonSchema decide on which parser to use',\n);\n\nexport type OverrideCallback = (\n def: ZodTypeDef,\n refs: Refs,\n seen: Seen | undefined,\n forceResolution?: boolean,\n) => JsonSchema7Type | undefined | typeof ignoreOverride;\n\nexport type PostProcessCallback = (\n jsonSchema: JsonSchema7Type | undefined,\n def: ZodTypeDef,\n refs: Refs,\n) => JsonSchema7Type | undefined;\n\nexport const jsonDescription: PostProcessCallback = (jsonSchema, def) => {\n if (def.description) {\n try {\n return {\n ...jsonSchema,\n ...JSON.parse(def.description),\n };\n } catch {}\n }\n\n return jsonSchema;\n};\n\nexport type Options = {\n name: string | undefined;\n $refStrategy: 'root' | 'relative' | 'none' | 'seen';\n basePath: string[];\n effectStrategy: 'input' | 'any';\n pipeStrategy: 'input' | 'output' | 'all';\n dateStrategy: DateStrategy | DateStrategy[];\n mapStrategy: 'entries' | 'record';\n removeAdditionalStrategy: 'passthrough' | 'strict';\n allowedAdditionalProperties: true | undefined;\n rejectedAdditionalProperties: false | undefined;\n strictUnions: boolean;\n definitionPath: string;\n definitions: Record<string, ZodSchema>;\n errorMessages: boolean;\n patternStrategy: 'escape' | 'preserve';\n applyRegexFlags: boolean;\n emailStrategy: 'format:email' | 'format:idn-email' | 'pattern:zod';\n base64Strategy: 'format:binary' | 'contentEncoding:base64' | 'pattern:zod';\n nameStrategy: 'ref' | 'title';\n override?: OverrideCallback;\n postProcess?: PostProcessCallback;\n};\n\nexport const defaultOptions: Options = {\n name: undefined,\n $refStrategy: 'root',\n basePath: ['#'],\n effectStrategy: 'input',\n pipeStrategy: 'all',\n dateStrategy: 'format:date-time',\n mapStrategy: 'entries',\n removeAdditionalStrategy: 'passthrough',\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: 'definitions',\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n patternStrategy: 'escape',\n applyRegexFlags: false,\n emailStrategy: 'format:email',\n base64Strategy: 'contentEncoding:base64',\n nameStrategy: 'ref',\n};\n\nexport const getDefaultOptions = (\n options: Partial<Options> | string | undefined,\n) =>\n (typeof options === 'string'\n ? {\n ...defaultOptions,\n name: options,\n }\n : {\n ...defaultOptions,\n ...options,\n }) as Options;\n","import { ZodCatchDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { Refs } from '../refs';\n\nexport const parseCatchDef = (def: ZodCatchDef<any>, refs: Refs) => {\n return parseDef(def.innerType._def, refs);\n};\n","import { ZodOptionalDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { parseAnyDef } from './any';\n\nexport const parseOptionalDef = (\n def: ZodOptionalDef,\n refs: Refs,\n): JsonSchema7Type | undefined => {\n if (refs.currentPath.toString() === refs.propertyPath?.toString()) {\n return parseDef(def.innerType._def, refs);\n }\n\n const innerSchema = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'anyOf', '1'],\n });\n\n return innerSchema\n ? { anyOf: [{ not: parseAnyDef() }, innerSchema] }\n : parseAnyDef();\n};\n","import { ZodPipelineDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { JsonSchema7Type } from '../parse-types';\nimport { Refs } from '../refs';\nimport { JsonSchema7AllOfType } from './intersection';\n\nexport const parsePipelineDef = (\n def: ZodPipelineDef<any, any>,\n refs: Refs,\n): JsonSchema7AllOfType | JsonSchema7Type | undefined => {\n if (refs.pipeStrategy === 'input') {\n return parseDef(def.in._def, refs);\n } else if (refs.pipeStrategy === 'output') {\n return parseDef(def.out._def, refs);\n }\n\n const a = parseDef(def.in._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'allOf', '0'],\n });\n const b = parseDef(def.out._def, {\n ...refs,\n currentPath: [...refs.currentPath, 'allOf', a ? '1' : '0'],\n });\n\n return {\n allOf: [a, b].filter((x): x is JsonSchema7Type => x !== undefined),\n };\n};\n","import { ZodReadonlyDef } from 'zod/v3';\nimport { parseDef } from '../parse-def';\nimport { Refs } from '../refs';\n\nexport const parseReadonlyDef = (def: ZodReadonlyDef<any>, refs: Refs) => {\n return parseDef(def.innerType._def, refs);\n};\n","import { ZodFirstPartyTypeKind } from 'zod/v3';\nimport { parseAnyDef } from './parsers/any';\nimport { parseArrayDef } from './parsers/array';\nimport { parseBigintDef } from './parsers/bigint';\nimport { parseBooleanDef } from './parsers/boolean';\nimport { parseBrandedDef } from './parsers/branded';\nimport { parseCatchDef } from './parsers/catch';\nimport { parseDateDef } from './parsers/date';\nimport { parseDefaultDef } from './parsers/default';\nimport { parseEffectsDef } from './parsers/effects';\nimport { parseEnumDef } from './parsers/enum';\nimport { parseIntersectionDef } from './parsers/intersection';\nimport { parseLiteralDef } from './parsers/literal';\nimport { parseMapDef } from './parsers/map';\nimport { parseNativeEnumDef } from './parsers/native-enum';\nimport { parseNeverDef } from './parsers/never';\nimport { parseNullDef } from './parsers/null';\nimport { parseNullableDef } from './parsers/nullable';\nimport { parseNumberDef } from './parsers/number';\nimport { parseObjectDef } from './parsers/object';\nimport { parseOptionalDef } from './parsers/optional';\nimport { parsePipelineDef } from './parsers/pipeline';\nimport { parsePromiseDef } from './parsers/promise';\nimport { parseRecordDef } from './parsers/record';\nimport { parseSetDef } from './parsers/set';\nimport { parseStringDef } from './parsers/string';\nimport { parseTupleDef } from './parsers/tuple';\nimport { parseUndefinedDef } from './parsers/undefined';\nimport { parseUnionDef } from './parsers/union';\nimport { parseUnknownDef } from './parsers/unknown';\nimport { Refs } from './refs';\nimport { parseReadonlyDef } from './parsers/readonly';\nimport { JsonSchema7Type } from './parse-types';\n\nexport type InnerDefGetter = () => any;\n\nexport const selectParser = (\n def: any,\n typeName: ZodFirstPartyTypeKind,\n refs: Refs,\n): JsonSchema7Type | undefined | InnerDefGetter => {\n switch (typeName) {\n case ZodFirstPartyTypeKind.ZodString:\n return parseStringDef(def, refs);\n case ZodFirstPartyTypeKind.ZodNumber:\n return parseNumberDef(def);\n case ZodFirstPartyTypeKind.ZodObject:\n return parseObjectDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBigInt:\n return parseBigintDef(def);\n case ZodFirstPartyTypeKind.ZodBoolean:\n return parseBooleanDef();\n case ZodFirstPartyTypeKind.ZodDate:\n return parseDateDef(def, refs);\n case ZodFirstPartyTypeKind.ZodUndefined:\n return parseUndefinedDef();\n case ZodFirstPartyTypeKind.ZodNull:\n return parseNullDef();\n case ZodFirstPartyTypeKind.ZodArray:\n return parseArrayDef(def, refs);\n case ZodFirstPartyTypeKind.ZodUnion:\n case ZodFirstPartyTypeKind.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case ZodFirstPartyTypeKind.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case ZodFirstPartyTypeKind.ZodTuple:\n return parseTupleDef(def, refs);\n case ZodFirstPartyTypeKind.ZodRecord:\n return parseRecordDef(def, refs);\n case ZodFirstPartyTypeKind.ZodLiteral:\n return parseLiteralDef(def);\n case ZodFirstPartyTypeKind.ZodEnum:\n return parseEnumDef(def);\n case ZodFirstPartyTypeKind.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case ZodFirstPartyTypeKind.ZodNullable:\n return parseNullableDef(def, refs);\n case ZodFirstPartyTypeKind.ZodOptional:\n return parseOptionalDef(def, refs);\n case ZodFirstPartyTypeKind.ZodMap:\n return parseMapDef(def, refs);\n case ZodFirstPartyTypeKind.ZodSet:\n return parseSetDef(def, refs);\n case ZodFirstPartyTypeKind.ZodLazy:\n return () => (def as any).getter()._def;\n case ZodFirstPartyTypeKind.ZodPromise:\n return parsePromiseDef(def, refs);\n case ZodFirstPartyTypeKind.ZodNaN:\n case ZodFirstPartyTypeKind.ZodNever:\n return parseNeverDef();\n case ZodFirstPartyTypeKind.ZodEffects:\n return parseEffectsDef(def, refs);\n case ZodFirstPartyTypeKind.ZodAny:\n return parseAnyDef();\n case ZodFirstPartyTypeKind.ZodUnknown:\n return parseUnknownDef();\n case ZodFirstPartyTypeKind.ZodDefault:\n return parseDefaultDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBranded:\n return parseBrandedDef(def, refs);\n case ZodFirstPartyTypeKind.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case ZodFirstPartyTypeKind.ZodCatch:\n return parseCatchDef(def, refs);\n case ZodFirstPartyTypeKind.ZodPipeline:\n return parsePipelineDef(def, refs);\n case ZodFirstPartyTypeKind.ZodFunction:\n case ZodFirstPartyTypeKind.ZodVoid:\n case ZodFirstPartyTypeKind.ZodSymbol:\n return undefined;\n default:\n /* c8 ignore next */\n return ((_: never) => undefined)(typeName);\n }\n};\n","export const getRelativePath = (pathA: string[], pathB: string[]) => {\n let i = 0;\n for (; i < pathA.length && i < pathB.length; i++) {\n if (pathA[i] !== pathB[i]) break;\n }\n return [(pathA.length - i).toString(), ...pathB.slice(i)].join('/');\n};\n","import { ZodTypeDef } from 'zod/v3';\nimport { getDefaultOptions, Options } from './options';\nimport { JsonSchema7Type } from './parse-types';\n\nexport type Refs = {\n seen: Map<ZodTypeDef, Seen>;\n currentPath: string[];\n propertyPath: string[] | undefined;\n} & Options;\n\nexport type Seen = {\n def: ZodTypeDef;\n path: string[];\n jsonSchema: JsonSchema7Type | undefined;\n};\n\nexport const getRefs = (options?: string | Partial<Options>): Refs => {\n const _options = getDefaultOptions(options);\n const currentPath =\n _options.name !== undefined\n ? [..._options.basePath, _options.definitionPath, _options.name]\n : _options.basePath;\n return {\n ..._options,\n currentPath: currentPath,\n propertyPath: undefined,\n seen: new Map(\n Object.entries(_options.definitions).map(([name, def]) => [\n def._def,\n {\n def: def._def,\n path: [..._options.basePath, _options.definitionPath, name],\n // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.\n jsonSchema: undefined,\n },\n ]),\n ),\n };\n};\n","import { ZodSchema } from 'zod/v3';\nimport { Options } from './options';\nimport { parseDef } from './parse-def';\nimport { JsonSchema7Type } from './parse-types';\nimport { getRefs } from './refs';\nimport { parseAnyDef } from './parsers/any';\n\nconst zod3ToJsonSchema = (\n schema: ZodSchema<any>,\n options?: Partial<Options> | string,\n): JsonSchema7Type & {\n $schema?: string;\n definitions?: {\n [key: string]: JsonSchema7Type;\n };\n} => {\n const refs = getRefs(options);\n\n let definitions =\n typeof options === 'object' && options.definitions\n ? Object.entries(options.definitions).reduce(\n (acc: { [key: string]: JsonSchema7Type }, [name, schema]) => ({\n ...acc,\n [name]:\n parseDef(\n schema._def,\n {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name],\n },\n true,\n ) ?? parseAnyDef(),\n }),\n {},\n )\n : undefined;\n\n const name =\n typeof options === 'string'\n ? options\n : options?.nameStrategy === 'title'\n ? undefined\n : options?.name;\n\n const main =\n parseDef(\n schema._def,\n name === undefined\n ? refs\n : {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name],\n },\n false,\n ) ?? (parseAnyDef() as JsonSchema7Type);\n\n const title =\n typeof options === 'object' &&\n options.name !== undefined &&\n options.nameStrategy === 'title'\n ? options.name\n : undefined;\n\n if (title !== undefined) {\n main.title = title;\n }\n\n const combined: ReturnType<typeof zod3ToJsonSchema> =\n name === undefined\n ? definitions\n ? {\n ...main,\n [refs.definitionPath]: definitions,\n }\n : main\n : {\n $ref: [\n ...(refs.$refStrategy === 'relative' ? [] : refs.basePath),\n refs.definitionPath,\n name,\n ].join('/'),\n [refs.definitionPath]: {\n ...definitions,\n [name]: main,\n },\n };\n\n combined.$schema = 'http://json-schema.org/draft-07/schema#';\n\n return combined;\n};\n\nexport { zod3ToJsonSchema };\n","import { APICallError } from '@ai-sdk/provider';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { FetchFunction } from './fetch-function';\nimport { handleFetchError } from './handle-fetch-error';\nimport { isAbortError } from './is-abort-error';\nimport { ResponseHandler } from './response-handler';\nimport { getRuntimeEnvironmentUserAgent } from './get-runtime-environment-user-agent';\nimport { withUserAgentSuffix } from './with-user-agent-suffix';\nimport { VERSION } from './version';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => globalThis.fetch;\n\nexport const postJsonToApi = async <T>({\n url,\n headers,\n body,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n body: unknown;\n failedResponseHandler: ResponseHandler<APICallError>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) =>\n postToApi({\n url,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: {\n content: JSON.stringify(body),\n values: body,\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n });\n\nexport const postFormDataToApi = async <T>({\n url,\n headers,\n formData,\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n formData: FormData;\n failedResponseHandler: ResponseHandler<APICallError>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) =>\n postToApi({\n url,\n headers,\n body: {\n content: formData,\n values: Object.fromEntries((formData as any).entries()),\n },\n failedResponseHandler,\n successfulResponseHandler,\n abortSignal,\n fetch,\n });\n\nexport const postToApi = async <T>({\n url,\n headers = {},\n body,\n successfulResponseHandler,\n failedResponseHandler,\n abortSignal,\n fetch = getOriginalFetch(),\n}: {\n url: string;\n headers?: Record<string, string | undefined>;\n body: {\n content: string | FormData | Uint8Array;\n values: unknown;\n };\n failedResponseHandler: ResponseHandler<Error>;\n successfulResponseHandler: ResponseHandler<T>;\n abortSignal?: AbortSignal;\n fetch?: FetchFunction;\n}) => {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: withUserAgentSuffix(\n headers,\n `ai-sdk/provider-utils/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n ),\n body: body.content,\n signal: abortSignal,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.ok) {\n let errorInformation: {\n value: Error;\n responseHeaders?: Record<string, string> | undefined;\n };\n\n try {\n errorInformation = await failedResponseHandler({\n response,\n url,\n requestBodyValues: body.values,\n });\n } catch (error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n\n throw new APICallError({\n message: 'Failed to process error response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values,\n });\n }\n\n throw errorInformation.value;\n }\n\n try {\n return await successfulResponseHandler({\n response,\n url,\n requestBodyValues: body.values,\n });\n } catch (error) {\n if (error instanceof Error) {\n if (isAbortError(error) || APICallError.isInstance(error)) {\n throw error;\n }\n }\n\n throw new APICallError({\n message: 'Failed to process successful response',\n cause: error,\n statusCode: response.status,\n url,\n responseHeaders,\n requestBodyValues: body.values,\n });\n }\n } catch (error) {\n throw handleFetchError({ error, url, requestBodyValues: body.values });\n }\n};\n","import { APICallError, EmptyResponseBodyError } from '@ai-sdk/provider';\nimport { extractResponseHeaders } from './extract-response-headers';\nimport { parseJSON, ParseResult, safeParseJSON } from './parse-json';\nimport { parseJsonEventStream } from './parse-json-event-stream';\nimport { FlexibleSchema } from './schema';\n\nexport type ResponseHandler<RETURN_TYPE> = (options: {\n url: string;\n requestBodyValues: unknown;\n response: Response;\n}) => PromiseLike<{\n value: RETURN_TYPE;\n rawValue?: unknown;\n responseHeaders?: Record<string, string>;\n}>;\n\nexport const createJsonErrorResponseHandler =\n <T>({\n errorSchema,\n errorToMessage,\n isRetryable,\n }: {\n errorSchema: FlexibleSchema<T>;\n errorToMessage: (error: T) => string;\n isRetryable?: (response: Response, error?: T) => boolean;\n }): ResponseHandler<APICallError> =>\n async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n const responseHeaders = extractResponseHeaders(response);\n\n // Some providers return an empty response body for some errors:\n if (responseBody.trim() === '') {\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable?.(response),\n }),\n };\n }\n\n // resilient parsing in case the response is not JSON or does not match the schema:\n try {\n const parsedError = await parseJSON({\n text: responseBody,\n schema: errorSchema,\n });\n\n return {\n responseHeaders,\n value: new APICallError({\n message: errorToMessage(parsedError),\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n data: parsedError,\n isRetryable: isRetryable?.(response, parsedError),\n }),\n };\n } catch (parseError) {\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n isRetryable: isRetryable?.(response),\n }),\n };\n }\n };\n\nexport const createEventSourceResponseHandler =\n <T>(\n chunkSchema: FlexibleSchema<T>,\n ): ResponseHandler<ReadableStream<ParseResult<T>>> =>\n async ({ response }: { response: Response }) => {\n const responseHeaders = extractResponseHeaders(response);\n\n if (response.body == null) {\n throw new EmptyResponseBodyError({});\n }\n\n return {\n responseHeaders,\n value: parseJsonEventStream({\n stream: response.body,\n schema: chunkSchema,\n }),\n };\n };\n\nexport const createJsonResponseHandler =\n <T>(responseSchema: FlexibleSchema<T>): ResponseHandler<T> =>\n async ({ response, url, requestBodyValues }) => {\n const responseBody = await response.text();\n\n const parsedResult = await safeParseJSON({\n text: responseBody,\n schema: responseSchema,\n });\n\n const responseHeaders = extractResponseHeaders(response);\n\n if (!parsedResult.success) {\n throw new APICallError({\n message: 'Invalid JSON response',\n cause: parsedResult.error,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n url,\n requestBodyValues,\n });\n }\n\n return {\n responseHeaders,\n value: parsedResult.value,\n rawValue: parsedResult.rawValue,\n };\n };\n\nexport const createBinaryResponseHandler =\n (): ResponseHandler<Uint8Array> =>\n async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n\n if (!response.body) {\n throw new APICallError({\n message: 'Response body is empty',\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: undefined,\n });\n }\n\n try {\n const buffer = await response.arrayBuffer();\n return {\n responseHeaders,\n value: new Uint8Array(buffer),\n };\n } catch (error) {\n throw new APICallError({\n message: 'Failed to read response as array buffer',\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody: undefined,\n cause: error,\n });\n }\n };\n\nexport const createStatusCodeErrorResponseHandler =\n (): ResponseHandler<APICallError> =>\n async ({ response, url, requestBodyValues }) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await response.text();\n\n return {\n responseHeaders,\n value: new APICallError({\n message: response.statusText,\n url,\n requestBodyValues: requestBodyValues as Record<string, unknown>,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n }),\n };\n };\n","export * from './combine-headers';\nexport { convertAsyncIteratorToReadableStream } from './convert-async-iterator-to-readable-stream';\nexport {\n createToolNameMapping,\n type ToolNameMapping,\n} from './create-tool-name-mapping';\nexport * from './delay';\nexport { DelayedPromise } from './delayed-promise';\nexport * from './extract-response-headers';\nexport { convertImageModelFileToDataUri } from './convert-image-model-file-to-data-uri';\nexport { convertToFormData } from './convert-to-form-data';\nexport { downloadBlob } from './download-blob';\nexport { DownloadError } from './download-error';\nexport {\n readResponseWithSizeLimit,\n DEFAULT_MAX_DOWNLOAD_SIZE,\n} from './read-response-with-size-limit';\nexport * from './fetch-function';\nexport { createIdGenerator, generateId, type IdGenerator } from './generate-id';\nexport * from './get-error-message';\nexport * from './get-from-api';\nexport { getRuntimeEnvironmentUserAgent } from './get-runtime-environment-user-agent';\nexport { injectJsonInstructionIntoMessages } from './inject-json-instruction';\nexport * from './is-abort-error';\nexport { isNonNullable } from './is-non-nullable';\nexport { isUrlSupported } from './is-url-supported';\nexport * from './load-api-key';\nexport { loadOptionalSetting } from './load-optional-setting';\nexport { loadSetting } from './load-setting';\nexport { type MaybePromiseLike } from './maybe-promise-like';\nexport { mediaTypeToExtension } from './media-type-to-extension';\nexport { normalizeHeaders } from './normalize-headers';\nexport * from './parse-json';\nexport { parseJsonEventStream } from './parse-json-event-stream';\nexport { parseProviderOptions } from './parse-provider-options';\nexport * from './post-to-api';\nexport {\n createProviderToolFactory,\n createProviderToolFactoryWithOutputSchema,\n type ProviderToolFactory,\n type ProviderToolFactoryWithOutputSchema,\n} from './provider-tool-factory';\nexport * from './remove-undefined-entries';\nexport * from './resolve';\nexport * from './response-handler';\nexport {\n asSchema,\n jsonSchema,\n lazySchema,\n zodSchema,\n type FlexibleSchema,\n type InferSchema,\n type LazySchema,\n type Schema,\n type ValidationResult,\n} from './schema';\nexport * from './uint8-utils';\nexport * from './validate-types';\nexport { VERSION } from './version';\nexport { withUserAgentSuffix } from './with-user-agent-suffix';\nexport * from './without-trailing-slash';\n\n// folder re-exports\nexport * from './types';\n\n// external re-exports\nexport type * from '@standard-schema/spec';\nexport {\n EventSourceParserStream,\n type EventSourceMessage,\n} from 'eventsource-parser/stream';\n","import { z } from 'zod';\n\n/**\n * OAuth configuration for MCP authentication\n */\nexport interface MCPOAuthConfig {\n /**\n * OAuth authorization server metadata URL\n * (e.g., https://auth.example.com/.well-known/oauth-authorization-server)\n */\n serverUrl: string;\n\n /**\n * Scopes to request during authorization\n */\n scopes?: Array<string>;\n\n /**\n * Resource indicator (RFC 8707, required by MCP 2025-06-18 spec)\n */\n resource?: string;\n\n /**\n * Path to Playwright auth state file\n * (e.g., playwright/.auth/oauth-state.json)\n */\n authStatePath?: string;\n\n /**\n * Client ID (if pre-registered; otherwise uses Dynamic Client Registration)\n */\n clientId?: string;\n\n /**\n * Client secret (for confidential clients)\n */\n clientSecret?: string;\n\n /**\n * Redirect URI for OAuth callback\n */\n redirectUri?: string;\n}\n\n/**\n * OAuth 2.1 client credentials configuration for machine-to-machine (CI/CD) authentication.\n * Credentials can be provided here or via MCP_CLIENT_ID/MCP_CLIENT_SECRET environment variables.\n */\nexport interface MCPClientCredentialsConfig {\n /**\n * OAuth client ID (falls back to MCP_CLIENT_ID env var)\n */\n clientId?: string;\n\n /**\n * OAuth client secret (falls back to MCP_CLIENT_SECRET env var)\n */\n clientSecret?: string;\n\n /**\n * Token endpoint URL (required)\n */\n tokenEndpoint?: string;\n\n /**\n * Scopes to request\n */\n scopes?: string[];\n}\n\n/**\n * Authentication configuration for MCP connections\n */\nexport interface MCPAuthConfig {\n /**\n * Pre-acquired access token (simplest authentication mode)\n */\n accessToken?: string;\n\n /**\n * Full OAuth configuration for browser-based authentication\n */\n oauth?: MCPOAuthConfig;\n\n /**\n * OAuth 2.1 client credentials grant for machine-to-machine authentication\n */\n clientCredentials?: MCPClientCredentialsConfig;\n}\n\n/**\n * MCP host capabilities that can be registered with the server\n */\nexport interface MCPHostCapabilities {\n /**\n * Sampling capabilities (for LLM sampling)\n */\n sampling?: Record<string, unknown>;\n\n /**\n * Roots capabilities (for file system roots)\n */\n roots?: {\n /**\n * Whether the client can notify the server when roots change\n */\n listChanged: boolean;\n };\n}\n\n/**\n * Configuration for MCP client connection via stdio transport (local process)\n */\nexport interface StdioMCPConfig {\n /**\n * Transport type discriminant\n */\n transport: 'stdio';\n\n /**\n * Command to execute (required for stdio transport)\n */\n command: string;\n\n /**\n * Command arguments\n */\n args?: Array<string>;\n\n /**\n * Working directory for the command\n */\n cwd?: string;\n\n /**\n * Environment variables to pass to the subprocess.\n * Merged with the current process environment.\n */\n env?: Record<string, string>;\n\n /**\n * Suppress stderr output from the server process.\n * When true, server stderr is ignored instead of inherited.\n */\n quiet?: boolean;\n\n /**\n * Host capabilities to register with the server\n */\n capabilities?: MCPHostCapabilities;\n\n /**\n * Connection timeout in milliseconds\n */\n connectTimeoutMs?: number;\n\n /**\n * Request timeout in milliseconds\n */\n requestTimeoutMs?: number;\n\n /**\n * Timeout in milliseconds for MCP tool/list operations. Default: 30000\n */\n callTimeoutMs?: number;\n}\n\n/**\n * Configuration for MCP client connection via HTTP transport (remote server)\n */\nexport interface HttpMCPConfig {\n /**\n * Transport type discriminant\n */\n transport: 'http';\n\n /**\n * Server URL (required for http transport)\n */\n serverUrl: string;\n\n /**\n * HTTP headers (e.g., Authorization)\n */\n headers?: Record<string, string>;\n\n /**\n * Authentication configuration\n */\n auth?: MCPAuthConfig;\n\n /**\n * Host capabilities to register with the server\n */\n capabilities?: MCPHostCapabilities;\n\n /**\n * Connection timeout in milliseconds\n */\n connectTimeoutMs?: number;\n\n /**\n * Request timeout in milliseconds\n */\n requestTimeoutMs?: number;\n\n /**\n * Timeout in milliseconds for MCP tool/list operations. Default: 30000\n */\n callTimeoutMs?: number;\n\n /**\n * HTTP proxy configuration. Falls back to HTTPS_PROXY/HTTP_PROXY environment variables.\n */\n proxy?: {\n /**\n * Proxy URL. Credentials can be embedded directly if required:\n * `http://user:pass@proxy.example.com:8080`\n */\n url: string;\n };\n\n /**\n * Number of retry attempts for transient connection failures and 429 rate limit responses.\n * Uses exponential backoff with Retry-After header awareness. Defaults to 0 (no retries).\n */\n retryAttempts?: number;\n\n /**\n * TLS/mTLS configuration for custom certificates or disabling cert validation.\n * File paths should point to PEM-encoded certificate files.\n */\n tls?: {\n /**\n * Path to CA certificate PEM file (for custom/self-signed CAs)\n */\n ca?: string;\n\n /**\n * Path to client certificate PEM file (for mutual TLS)\n */\n cert?: string;\n\n /**\n * Path to client private key PEM file (for mutual TLS)\n */\n key?: string;\n\n /**\n * Whether to reject unauthorized certificates. Defaults to true.\n * Set to false to disable certificate validation (not recommended for production).\n */\n rejectUnauthorized?: boolean;\n };\n}\n\n/**\n * Configuration for MCP client connection.\n *\n * This is a discriminated union — narrow with `isStdioConfig()` or `isHttpConfig()`\n * before accessing transport-specific fields.\n *\n * Supports both stdio (local) and HTTP (remote) transports.\n */\nexport type MCPConfig = StdioMCPConfig | HttpMCPConfig;\n\n/**\n * Zod schema for MCPHostCapabilities\n */\nconst MCPHostCapabilitiesSchema = z.object({\n sampling: z.record(z.string(), z.unknown()).optional(),\n roots: z\n .object({\n listChanged: z.boolean(),\n })\n .optional(),\n});\n\n/**\n * Zod schema for MCPOAuthConfig\n */\nconst MCPOAuthConfigSchema = z.object({\n serverUrl: z.string().url('serverUrl must be a valid URL'),\n scopes: z.array(z.string()).optional(),\n resource: z.string().url().optional(),\n authStatePath: z.string().optional(),\n clientId: z.string().optional(),\n clientSecret: z.string().optional(),\n redirectUri: z.string().url().optional(),\n});\n\n/**\n * Zod schema for MCPClientCredentialsConfig\n */\nconst MCPClientCredentialsConfigSchema = z.object({\n clientId: z.string().optional(),\n clientSecret: z.string().optional(),\n tokenEndpoint: z.string().url('tokenEndpoint must be a valid URL').optional(),\n scopes: z.array(z.string()).optional(),\n});\n\n/**\n * Zod schema for MCPAuthConfig\n */\nconst MCPAuthConfigSchema = z\n .object({\n accessToken: z.string().optional(),\n oauth: MCPOAuthConfigSchema.optional(),\n clientCredentials: MCPClientCredentialsConfigSchema.optional(),\n })\n .refine(\n (data) => !(data.accessToken && data.oauth),\n 'Cannot specify both accessToken and oauth configuration'\n );\n\n/**\n * Zod schema for stdio transport config\n */\nconst StdioConfigSchema = z.object({\n transport: z.literal('stdio'),\n command: z.string().min(1, 'command is required for stdio transport'),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n capabilities: MCPHostCapabilitiesSchema.optional(),\n connectTimeoutMs: z.number().positive().optional(),\n requestTimeoutMs: z.number().positive().optional(),\n callTimeoutMs: z.number().positive().optional(),\n quiet: z.boolean().optional(),\n});\n\n/**\n * Returns true if the hostname refers to the loopback interface\n */\nfunction isLocalhost(hostname: string): boolean {\n return (\n hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1'\n );\n}\n\n/**\n * Zod schema for HTTP transport config\n */\nconst HttpConfigSchema = z.object({\n transport: z.literal('http'),\n serverUrl: z\n .string()\n .url('serverUrl must be a valid URL')\n .refine((url) => {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return true;\n }\n if (parsed.protocol === 'http:' && !isLocalhost(parsed.hostname)) {\n console.warn(\n `[mcp-server-tester] serverUrl uses http:// for non-localhost address \"${parsed.hostname}\". ` +\n `This transmits tokens unencrypted. Use https:// for remote servers.`\n );\n }\n return true;\n }),\n headers: z.record(z.string(), z.string()).optional(),\n capabilities: MCPHostCapabilitiesSchema.optional(),\n connectTimeoutMs: z.number().positive().optional(),\n requestTimeoutMs: z.number().positive().optional(),\n callTimeoutMs: z.number().positive().optional(),\n auth: MCPAuthConfigSchema.optional(),\n proxy: z\n .object({\n url: z.string().url('proxy.url must be a valid URL'),\n })\n .optional(),\n retryAttempts: z.number().int().min(0).optional(),\n tls: z\n .object({\n ca: z.string().optional(),\n cert: z.string().optional(),\n key: z.string().optional(),\n rejectUnauthorized: z.boolean().optional(),\n })\n .optional(),\n});\n\n/**\n * Union schema for MCPConfig (validates based on transport type)\n */\nexport const MCPConfigSchema = z.discriminatedUnion('transport', [\n StdioConfigSchema,\n HttpConfigSchema,\n]);\n\n/**\n * Validates an MCPConfig object\n *\n * @param config - The config to validate\n * @returns The validated config\n * @throws {z.ZodError} If validation fails\n */\nexport function validateMCPConfig(config: unknown): MCPConfig {\n return MCPConfigSchema.parse(config);\n}\n\n/**\n * Type guard to check if a config is for stdio transport\n */\nexport function isStdioConfig(config: MCPConfig): config is StdioMCPConfig {\n return config.transport === 'stdio';\n}\n\n/**\n * Type guard to check if a config is for HTTP transport\n */\nexport function isHttpConfig(config: MCPConfig): config is HttpMCPConfig {\n return config.transport === 'http';\n}\n","/**\n * @gleanwork/mcp-server-tester\n *\n * Playwright-based testing framework for MCP servers\n *\n * @packageDocumentation\n */\n\n// Config\nexport type {\n MCPConfig,\n StdioMCPConfig,\n HttpMCPConfig,\n MCPHostCapabilities,\n MCPAuthConfig,\n MCPOAuthConfig,\n MCPClientCredentialsConfig,\n} from './config/mcpConfig.js';\nexport {\n MCPConfigSchema,\n validateMCPConfig,\n isStdioConfig,\n isHttpConfig,\n} from './config/mcpConfig.js';\n\n// Auth\nexport type {\n StoredTokens,\n StoredClientInfo,\n StoredOAuthState,\n OAuthSetupConfig,\n TokenResult,\n} from './auth/types.js';\nexport {\n PlaywrightOAuthClientProvider,\n type PlaywrightOAuthClientProviderConfig,\n} from './auth/oauthClientProvider.js';\nexport {\n createTokenAuthHeaders,\n validateAccessToken,\n isTokenExpired,\n isTokenExpiringSoon,\n} from './auth/tokenAuth.js';\nexport {\n performOAuthSetup,\n performOAuthSetupIfNeeded,\n} from './auth/setupOAuth.js';\nexport {\n performClientCredentialsFlow,\n refreshAccessToken,\n type ClientCredentialsConfig,\n} from './auth/oauthFlow.js';\n\n// Discovery (RFC 9728)\nexport {\n discoverProtectedResource,\n discoverAuthorizationServer,\n DiscoveryError,\n MCP_PROTOCOL_VERSION,\n type ProtectedResourceMetadata,\n type ProtectedResourceDiscoveryResult,\n} from './auth/discovery.js';\n\n// Token Storage\nexport {\n loadTokens,\n hasValidTokens,\n injectTokens,\n loadTokensFromEnv,\n ENV_VAR_NAMES,\n type StoredServerMetadata,\n} from './auth/storage.js';\n\n// CLI OAuth\nexport {\n CLIOAuthClient,\n type CLIOAuthClientConfig,\n type CLIOAuthResult,\n} from './auth/cli.js';\n\n// MCP Client\nexport {\n createMCPClientForConfig,\n closeMCPClient,\n type CreateMCPClientOptions,\n} from './mcp/clientFactory.js';\n\n// Response Normalization\nexport type { ContentBlock, NormalizedToolResponse } from './mcp/response.js';\nexport { normalizeToolResponse, extractText } from './mcp/response.js';\n\n// Assertions - Matchers (primary API)\n// The extended expect with MCP tool matchers is exported via fixtures\n// Use: import { expect } from '@gleanwork/mcp-server-tester'\n\n// Assertions - Validators (for programmatic use)\nexport {\n validateResponse,\n validateSchema,\n validateText,\n validatePattern,\n validateError,\n validateSize,\n validateToolCalls,\n validateToolCallCount,\n validateJudge,\n getResponseSizeBytes,\n normalizeWhitespace,\n} from './assertions/validators/index.js';\n\nexport { SnapshotSanitizers } from './assertions/validators/types.js';\nexport type {\n ValidationResult,\n TextValidatorOptions,\n SizeValidatorOptions,\n SchemaValidatorOptions,\n PatternValidatorOptions,\n SnapshotSanitizer,\n BuiltInSanitizer,\n RegexSanitizer,\n FieldRemovalSanitizer,\n SchemaRegistry,\n} from './assertions/validators/types.js';\n\nexport type {\n ToolCallExpectation,\n ToolCallCountOptions,\n} from './assertions/validators/toolCalls.js';\n\nexport type { JudgeValidatorConfig } from './assertions/validators/judge.js';\n\nexport type {\n JudgeMatcherOptions,\n ToolPredicate,\n PredicateResult,\n} from './assertions/matchers/types.js';\n\n// Fixtures\nexport type {\n MCPFixtureApi,\n MCPFixtureOptions,\n AuthType,\n} from './mcp/fixtures/mcpFixture.js';\nexport { createMCPFixture } from './mcp/fixtures/mcpFixture.js';\nexport { test, expect } from './fixtures/mcp.js';\n\n// Auth fixtures — re-exported from main path for convenience.\n// The auth `test` is aliased to avoid a name collision with the MCP `test` above.\n// Use `mcpAuthTest` when you need to extend auth fixtures (e.g., base.extend<MCPAuthFixtures>).\nexport type { MCPAuthFixtures } from './fixtures/mcpAuth.js';\nexport { test as mcpAuthTest } from './fixtures/mcpAuth.js';\n\n// Canonical Types (single source of truth)\nexport type {\n ResultSource,\n ExpectationType,\n ExpectationBreakdown,\n ExpectationResultMap,\n} from './types/index.js';\n\n// Eval Dataset\nexport type {\n EvalCase,\n EvalDataset,\n EvalExpectBlock,\n JudgeExpectConfig,\n SerializedEvalDataset,\n EvalMode,\n} from './evals/datasetTypes.js';\nexport {\n EvalCaseSchema,\n EvalDatasetSchema,\n validateEvalCase,\n validateEvalDataset,\n} from './evals/datasetTypes.js';\n\n// Eval Loader\nexport type { LoadDatasetOptions } from './evals/datasetLoader.js';\nexport {\n loadEvalDataset,\n loadEvalDatasetFromObject,\n} from './evals/datasetLoader.js';\n\n// Eval Runner\nexport type {\n EvalCaseRequest,\n EvalContext,\n EvalExpectationResult,\n EvalCaseResult,\n EvalRunMetadata,\n IterationResult,\n EvalRunnerResult,\n EvalRunnerOptions,\n} from './evals/evalRunner.js';\nexport { runEvalDataset, runEvalCase } from './evals/evalRunner.js';\n\n// Baseline eval comparison\nexport {\n saveBaseline,\n loadBaseline,\n type SaveBaselineOptions,\n} from './evals/baseline.js';\n\n// Multi-server A/B comparison\nexport type {\n ComparisonOutcome,\n CaseComparisonResult,\n ServerComparisonResult,\n ServerComparisonOptions,\n} from './evals/serverComparison.js';\nexport { runServerComparison } from './evals/serverComparison.js';\n\n// MCP Host Simulation\nexport type {\n HostType,\n CLIOutputFormat,\n CLIConfig,\n LLMProvider,\n MCPHostConfig,\n LLMToolCall,\n MCPHostSimulationResult,\n MCPHostSimulator,\n} from './evals/mcpHost/index.js';\nexport {\n simulateMCPHost,\n isProviderAvailable,\n getMissingDependencyMessage,\n} from './evals/mcpHost/index.js';\n\n// Judge\nexport type {\n JudgeConfig,\n Judge,\n JudgeResult,\n UsageMetrics,\n ProviderKind,\n BuiltInRubric,\n RubricSpec,\n} from './judge/judgeTypes.js';\nexport { createJudge } from './judge/judgeClient.js';\nexport {\n BUILT_IN_RUBRICS,\n resolveRubric,\n isBuiltInRubric,\n} from './judge/judgeTypes.js';\n\n// Custom Judge Registry\nexport type {\n CustomJudgeExecutor,\n CustomJudgeResult,\n} from './judge/judgeRegistry.js';\nexport {\n registerJudge,\n getRegisteredJudge,\n clearJudgeRegistry,\n} from './judge/judgeRegistry.js';\n\n// Conformance\nexport type {\n MCPConformanceOptions,\n MCPConformanceResult,\n MCPConformanceCheck,\n MCPConformanceRaw,\n} from './spec/conformanceChecks.js';\nexport { runConformanceChecks } from './spec/conformanceChecks.js';\n\n// Reporter types — primarily used by the mcpReporter plugin.\n// These types are available for custom reporter implementations or\n// when consuming reporter output programmatically.\n// Import the reporter itself from '@gleanwork/mcp-server-tester/reporters/mcpReporter'\nexport type {\n MCPEvalReporterConfig,\n MCPEvalRunData,\n MCPEvalHistoricalSummary,\n MCPConformanceResultData,\n MCPServerCapabilitiesData,\n MCPEvalData,\n} from './reporters/types.js';\n","/**\n * Static token authentication utilities\n *\n * Simple utilities for pre-acquired token authentication\n */\n\n/**\n * Creates HTTP headers for static token authentication\n *\n * @param accessToken - The pre-acquired access token\n * @param tokenType - The token type (default: \"Bearer\")\n * @returns HTTP headers with Authorization header\n *\n * @example\n * ```typescript\n * const headers = createTokenAuthHeaders(process.env.MCP_ACCESS_TOKEN);\n * // { Authorization: 'Bearer eyJ...' }\n * ```\n */\nexport function createTokenAuthHeaders(\n accessToken: string,\n tokenType: string = 'Bearer'\n): Record<string, string> {\n return {\n Authorization: `${tokenType} ${accessToken}`,\n };\n}\n\n/**\n * Validates that an access token is present and non-empty\n *\n * @param accessToken - The access token to validate\n * @throws Error if token is missing or empty\n */\nexport function validateAccessToken(accessToken: string | undefined): void {\n if (!accessToken) {\n throw new Error('Access token is required but was not provided');\n }\n\n if (accessToken.trim().length === 0) {\n throw new Error('Access token cannot be empty');\n }\n}\n\n/**\n * Checks if a token appears to be expired based on common JWT structure\n *\n * Note: This is a best-effort check and may not work for all token formats.\n * For reliable expiration checking, use the token's associated expiration time.\n *\n * @param accessToken - The access token to check\n * @returns true if the token appears to be expired, false otherwise\n */\nexport function isTokenExpired(accessToken: string): boolean {\n try {\n // Try to decode as JWT\n const parts = accessToken.split('.');\n if (parts.length !== 3) {\n // Not a JWT, can't determine expiration\n return false;\n }\n\n const payloadPart = parts[1];\n if (!payloadPart) {\n return false;\n }\n\n const payload = JSON.parse(\n Buffer.from(payloadPart, 'base64url').toString('utf-8')\n ) as Record<string, unknown>;\n\n if (typeof payload.exp === 'number') {\n // exp is in seconds, Date.now() is in milliseconds\n return payload.exp * 1000 < Date.now();\n }\n\n return false;\n } catch {\n // If we can't parse the token, assume it's not expired\n return false;\n }\n}\n\n/**\n * Checks if a token will expire within the specified buffer time\n *\n * @param expiresAt - Token expiration timestamp in milliseconds\n * @param bufferMs - Buffer time in milliseconds (default: 60000 = 1 minute)\n * @returns true if the token will expire within the buffer time\n */\nexport function isTokenExpiringSoon(\n expiresAt: number | undefined,\n bufferMs: number = 60000\n): boolean {\n if (expiresAt === undefined) {\n return false;\n }\n\n return expiresAt - bufferMs < Date.now();\n}\n","/**\n * OAuth setup utility for Playwright globalSetup\n *\n * Performs the browser-based OAuth flow and saves the auth state\n * for reuse across tests following Playwright's auth state pattern.\n */\n\nimport { chromium, type Page } from '@playwright/test';\nimport {\n discoverAuthorizationServerMetadata,\n startAuthorization,\n exchangeAuthorization,\n} from '@modelcontextprotocol/sdk/client/auth.js';\nimport type {\n OAuthSetupConfig,\n OAuthLoginSelectors,\n StoredOAuthState,\n} from './types.js';\nimport { saveOAuthState } from './oauthClientProvider.js';\nimport { debugOAuth } from '../debug.js';\n\n/**\n * Default timeout for OAuth login flow (30 seconds)\n */\nconst DEFAULT_TIMEOUT_MS = 30000;\n\n/**\n * Default redirect URI for OAuth callback\n */\nconst DEFAULT_REDIRECT_URI = 'http://localhost:3000/oauth/callback';\n\n/**\n * Performs the OAuth authorization flow using Playwright browser automation\n *\n * This function is designed to be used in Playwright's globalSetup to\n * authenticate once before running tests. The resulting auth state is\n * saved to disk and reused across tests.\n *\n * @param config - OAuth setup configuration\n *\n * @example\n * ```typescript\n * // global-setup.ts\n * import { performOAuthSetup } from '@gleanwork/mcp-server-tester';\n *\n * export default async function globalSetup() {\n * await performOAuthSetup({\n * authServerUrl: 'https://auth.example.com',\n * scopes: ['mcp:read', 'mcp:write'],\n * loginSelectors: {\n * usernameInput: '#username',\n * passwordInput: '#password',\n * submitButton: 'button[type=\"submit\"]',\n * },\n * credentials: {\n * username: process.env.TEST_USER!,\n * password: process.env.TEST_PASSWORD!,\n * },\n * outputPath: 'playwright/.auth/oauth-state.json',\n * });\n * }\n * ```\n */\nexport async function performOAuthSetup(\n config: OAuthSetupConfig\n): Promise<void> {\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const redirectUri = config.redirectUri ?? DEFAULT_REDIRECT_URI;\n\n // 1. Discover OAuth authorization server metadata\n const metadata = await discoverAuthorizationServerMetadata(\n config.authServerUrl\n );\n\n if (!metadata) {\n throw new Error(\n `Could not discover OAuth metadata at ${config.authServerUrl}`\n );\n }\n\n // 2. Build client information\n const clientInformation = {\n client_id: config.clientId ?? 'mcp-server-tester-client',\n client_secret: config.clientSecret,\n };\n\n // 3. Start authorization flow (generates PKCE, builds auth URL)\n const { authorizationUrl, codeVerifier } = await startAuthorization(\n config.authServerUrl,\n {\n metadata,\n clientInformation,\n redirectUrl: redirectUri,\n scope: config.scopes.join(' '),\n resource: config.resource ? new URL(config.resource) : undefined,\n }\n );\n\n // 4. Launch browser and complete login flow\n const browser = await chromium.launch({\n headless: process.env.OAUTH_DEBUG !== 'true',\n });\n\n try {\n const context = await browser.newContext();\n const page = await context.newPage();\n\n // Set timeout for the entire flow\n page.setDefaultTimeout(timeoutMs);\n\n // Navigate to authorization URL\n await page.goto(authorizationUrl.toString());\n\n // Complete login — custom flow or standard form\n if ('customLoginFlow' in config && config.customLoginFlow) {\n await config.customLoginFlow(page);\n } else {\n await completeLoginForm(page, config);\n }\n\n // Wait for redirect with authorization code\n await page.waitForURL(\n (url) => url.href.startsWith(redirectUri) && url.searchParams.has('code'),\n { timeout: timeoutMs }\n );\n\n // Extract authorization code from callback URL\n const callbackUrl = new URL(page.url());\n const code = callbackUrl.searchParams.get('code');\n const error = callbackUrl.searchParams.get('error');\n\n if (error) {\n const errorDescription =\n callbackUrl.searchParams.get('error_description');\n throw new Error(\n `OAuth authorization failed: ${error}${errorDescription ? ` - ${errorDescription}` : ''}`\n );\n }\n\n if (!code) {\n throw new Error('No authorization code in callback URL');\n }\n\n // 5. Exchange authorization code for tokens\n const tokens = await exchangeAuthorization(config.authServerUrl, {\n metadata,\n clientInformation,\n authorizationCode: code,\n codeVerifier,\n redirectUri,\n resource: config.resource ? new URL(config.resource) : undefined,\n });\n\n // 6. Save auth state to disk\n // codeVerifier is intentionally excluded: it is single-use per PKCE spec\n // and must not be persisted after a successful token exchange.\n const state: StoredOAuthState = {\n tokens: {\n accessToken: tokens.access_token,\n tokenType: tokens.token_type,\n refreshToken: tokens.refresh_token,\n expiresAt: tokens.expires_in\n ? Date.now() + tokens.expires_in * 1000\n : undefined,\n },\n clientInfo: config.clientId\n ? {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n }\n : undefined,\n savedAt: Date.now(),\n };\n\n await saveOAuthState(config.outputPath, state);\n\n debugOAuth('Auth state saved to %s', config.outputPath);\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Completes the login form using the provided selectors\n */\nasync function completeLoginForm(\n page: Page,\n config: {\n loginSelectors: OAuthLoginSelectors;\n credentials: { username: string; password: string };\n }\n): Promise<void> {\n const { loginSelectors, credentials } = config;\n\n // Wait for and fill username\n await page.waitForSelector(loginSelectors.usernameInput, {\n state: 'visible',\n });\n await page.fill(loginSelectors.usernameInput, credentials.username);\n\n // Wait for and fill password\n await page.waitForSelector(loginSelectors.passwordInput, {\n state: 'visible',\n });\n await page.fill(loginSelectors.passwordInput, credentials.password);\n\n // Click submit button\n await page.waitForSelector(loginSelectors.submitButton, {\n state: 'visible',\n });\n await page.click(loginSelectors.submitButton);\n\n // Handle consent button if present\n if (loginSelectors.consentButton) {\n try {\n await page.waitForSelector(loginSelectors.consentButton, {\n state: 'visible',\n timeout: 5000,\n });\n await page.click(loginSelectors.consentButton);\n } catch {\n // Consent button may not appear if already consented\n }\n }\n}\n\n/**\n * Checks if OAuth state exists and contains valid tokens (Playwright auth pattern)\n *\n * This function checks Playwright's single-file auth state format,\n * typically created by `performOAuthSetup` in globalSetup.\n *\n * **Note:** This does NOT work with tokens stored by the CLI (`mcp-server-tester login`).\n * For CLI-stored tokens, use `hasValidTokens(serverUrl)` instead.\n *\n * @param storagePath - Path to the auth state file (e.g., 'playwright/.auth/oauth-state.json')\n * @returns true if valid auth state exists\n *\n * @example\n * ```typescript\n * // Check Playwright auth state\n * if (await hasValidOAuthState('playwright/.auth/oauth-state.json')) {\n * console.log('Auth state is valid, skipping OAuth setup');\n * }\n * ```\n */\nexport async function hasValidOAuthState(\n storagePath: string\n): Promise<boolean> {\n try {\n const { loadOAuthState } = await import('./oauthClientProvider.js');\n const state = await loadOAuthState(storagePath);\n\n if (!state?.tokens?.accessToken) {\n return false;\n }\n\n // Check if token is expired (with 1 minute buffer)\n if (state.tokens.expiresAt) {\n const bufferMs = 60000;\n if (state.tokens.expiresAt - bufferMs < Date.now()) {\n return false;\n }\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Performs OAuth setup only if valid state doesn't already exist\n *\n * Use this in globalSetup to avoid re-authenticating on every test run.\n *\n * @param config - OAuth setup configuration\n *\n * @example\n * ```typescript\n * // global-setup.ts\n * export default async function globalSetup() {\n * await performOAuthSetupIfNeeded({\n * authServerUrl: 'https://auth.example.com',\n * scopes: ['mcp:read'],\n * loginSelectors: { ... },\n * credentials: { ... },\n * outputPath: 'playwright/.auth/oauth-state.json',\n * });\n * }\n * ```\n */\nexport async function performOAuthSetupIfNeeded(\n config: OAuthSetupConfig\n): Promise<void> {\n const hasValid = await hasValidOAuthState(config.outputPath);\n\n if (hasValid) {\n debugOAuth('Using existing auth state from %s', config.outputPath);\n return;\n }\n\n debugOAuth('No valid auth state found, performing OAuth flow...');\n await performOAuthSetup(config);\n}\n","/**\n * Debug logging utilities\n *\n * Uses the `debug` package for conditional logging.\n * Enable via DEBUG environment variable:\n *\n * @example\n * ```bash\n * # Enable all mcp-server-tester logs\n * DEBUG=mcp-server-tester:* npm test\n *\n * # Enable only client logs\n * DEBUG=mcp-server-tester:client npm test\n *\n * # Enable only OAuth logs\n * DEBUG=mcp-server-tester:oauth npm test\n *\n * # Enable HTTP-level trace logging (URL, headers, transport selection)\n * DEBUG=mcp-server-tester:http npx playwright test\n * ```\n */\n\nimport createDebug from 'debug';\n\nconst NAMESPACE = 'mcp-server-tester';\n\n/**\n * Debug logger for MCP client operations\n */\nexport const debugClient = createDebug(`${NAMESPACE}:client`);\n\n/**\n * Debug logger for OAuth operations\n */\nexport const debugOAuth = createDebug(`${NAMESPACE}:oauth`);\n\n/**\n * Debug logger for eval operations\n */\nexport const debugEval = createDebug(`${NAMESPACE}:eval`);\n\n/**\n * Debug logger for HTTP-level trace logging.\n *\n * Enable with:\n * ```bash\n * DEBUG=mcp-server-tester:http npx playwright test\n * ```\n *\n * Logs: server URL, transport type selected (Streamable HTTP vs SSE),\n * outgoing request header names, and connection outcomes.\n */\nexport const debugHttp = createDebug(`${NAMESPACE}:http`);\n","/**\n * OAuth flow utilities using oauth4webapi\n *\n * Implements OAuth 2.1 with PKCE as required by MCP specification\n */\n\nimport * as oauth from 'oauth4webapi';\nimport createDebug from 'debug';\nimport type { TokenResult } from './types.js';\n\nconst debug = createDebug('mcp-server-tester:oauth-flow');\n\n/**\n * Discovered OAuth authorization server metadata\n */\nexport interface AuthServerMetadata {\n /**\n * The oauth4webapi AuthorizationServer object\n */\n server: oauth.AuthorizationServer;\n\n /**\n * Issuer URL\n */\n issuer: string;\n}\n\n/**\n * PKCE code verifier and challenge pair\n */\nexport interface PKCEPair {\n /**\n * Random code verifier string\n */\n codeVerifier: string;\n\n /**\n * S256 hashed code challenge\n */\n codeChallenge: string;\n}\n\n/**\n * Configuration for building authorization URL\n */\nexport interface AuthorizationUrlConfig {\n /**\n * Authorization server metadata\n */\n authServer: AuthServerMetadata;\n\n /**\n * Client ID\n */\n clientId: string;\n\n /**\n * Redirect URI for callback\n */\n redirectUri: string;\n\n /**\n * Requested scopes\n */\n scopes: Array<string>;\n\n /**\n * PKCE code challenge\n */\n codeChallenge: string;\n\n /**\n * OAuth state parameter for CSRF protection\n */\n state: string;\n\n /**\n * Resource indicator (RFC 8707)\n */\n resource?: string;\n}\n\n/**\n * Configuration for token exchange\n */\nexport interface TokenExchangeConfig {\n /**\n * Authorization server metadata\n */\n authServer: AuthServerMetadata;\n\n /**\n * Client ID\n */\n clientId: string;\n\n /**\n * Client secret (for confidential clients)\n */\n clientSecret?: string;\n\n /**\n * Authorization code from callback\n */\n code: string;\n\n /**\n * OAuth state parameter for CSRF validation\n */\n state: string;\n\n /**\n * PKCE code verifier\n */\n codeVerifier: string;\n\n /**\n * Redirect URI used in authorization request\n */\n redirectUri: string;\n}\n\n/**\n * Configuration for token refresh\n */\nexport interface TokenRefreshConfig {\n /**\n * Authorization server metadata\n */\n authServer: AuthServerMetadata;\n\n /**\n * Client ID\n */\n clientId: string;\n\n /**\n * Client secret (for confidential clients)\n */\n clientSecret?: string;\n\n /**\n * Refresh token\n */\n refreshToken: string;\n}\n\n/**\n * Discovers OAuth authorization server metadata from a well-known URL\n *\n * @param issuerUrl - The authorization server URL (will append /.well-known/oauth-authorization-server)\n * @returns Authorization server metadata\n */\nexport async function discoverAuthServer(\n issuerUrl: string\n): Promise<AuthServerMetadata> {\n const issuer = new URL(issuerUrl);\n const response = await oauth.discoveryRequest(issuer, {\n algorithm: 'oauth2',\n });\n\n const metadata = await oauth.processDiscoveryResponse(issuer, response);\n\n return {\n server: metadata,\n issuer: issuerUrl,\n };\n}\n\n/**\n * Generates a PKCE code verifier and challenge pair\n *\n * Uses S256 challenge method as required by OAuth 2.1 and MCP specification\n *\n * @returns PKCE code verifier and challenge\n */\nexport async function generatePKCE(): Promise<PKCEPair> {\n const codeVerifier = oauth.generateRandomCodeVerifier();\n const codeChallenge = await oauth.calculatePKCECodeChallenge(codeVerifier);\n\n return {\n codeVerifier,\n codeChallenge,\n };\n}\n\n/**\n * Generates a random state parameter for CSRF protection\n *\n * @returns Random state string\n */\nexport function generateState(): string {\n return oauth.generateRandomState();\n}\n\n/**\n * Builds the OAuth authorization URL for browser redirect\n *\n * @param config - Authorization URL configuration\n * @returns Authorization URL to redirect the user to\n */\nexport function buildAuthorizationUrl(config: AuthorizationUrlConfig): URL {\n const authorizationEndpoint = config.authServer.server.authorization_endpoint;\n if (!authorizationEndpoint) {\n throw new Error(\n 'Authorization server does not have an authorization_endpoint'\n );\n }\n\n const authorizationUrl = new URL(authorizationEndpoint);\n\n authorizationUrl.searchParams.set('client_id', config.clientId);\n authorizationUrl.searchParams.set('redirect_uri', config.redirectUri);\n authorizationUrl.searchParams.set('response_type', 'code');\n authorizationUrl.searchParams.set('scope', config.scopes.join(' '));\n authorizationUrl.searchParams.set('code_challenge', config.codeChallenge);\n authorizationUrl.searchParams.set('code_challenge_method', 'S256');\n authorizationUrl.searchParams.set('state', config.state);\n\n if (config.resource) {\n authorizationUrl.searchParams.set('resource', config.resource);\n }\n\n return authorizationUrl;\n}\n\n/**\n * Exchanges an authorization code for tokens\n *\n * @param config - Token exchange configuration\n * @returns Token result\n */\nexport async function exchangeCodeForTokens(\n config: TokenExchangeConfig\n): Promise<TokenResult> {\n const client: oauth.Client = {\n client_id: config.clientId,\n token_endpoint_auth_method: config.clientSecret\n ? 'client_secret_basic'\n : 'none',\n };\n\n const clientAuth = config.clientSecret\n ? oauth.ClientSecretBasic(config.clientSecret)\n : oauth.None();\n\n // Build callback URL with code and state for validation\n const callbackUrl = new URL(config.redirectUri);\n callbackUrl.searchParams.set('code', config.code);\n callbackUrl.searchParams.set('state', config.state);\n\n // Validate the auth response - oauth4webapi requires this before token exchange\n // This throws on error, returns URLSearchParams on success\n const validatedParams = oauth.validateAuthResponse(\n config.authServer.server,\n client,\n callbackUrl,\n config.state\n );\n\n const response = await oauth.authorizationCodeGrantRequest(\n config.authServer.server,\n client,\n clientAuth,\n validatedParams,\n config.redirectUri,\n config.codeVerifier\n );\n\n const result = await oauth.processAuthorizationCodeResponse(\n config.authServer.server,\n client,\n response\n );\n\n return {\n accessToken: result.access_token,\n tokenType: result.token_type,\n expiresIn: result.expires_in,\n refreshToken: result.refresh_token,\n scope: result.scope,\n };\n}\n\n/**\n * Refreshes an access token using a refresh token\n *\n * @param config - Token refresh configuration\n * @returns New token result\n */\nexport async function refreshAccessToken(\n config: TokenRefreshConfig\n): Promise<TokenResult> {\n const client: oauth.Client = {\n client_id: config.clientId,\n token_endpoint_auth_method: config.clientSecret\n ? 'client_secret_basic'\n : 'none',\n };\n\n const clientAuth = config.clientSecret\n ? oauth.ClientSecretBasic(config.clientSecret)\n : oauth.None();\n\n const response = await oauth.refreshTokenGrantRequest(\n config.authServer.server,\n client,\n clientAuth,\n config.refreshToken\n );\n\n // Handle non-OK responses that may not be JSON (oauth4webapi requires application/json)\n if (!response.ok) {\n const contentType = response.headers.get('content-type') ?? '';\n let errorMessage = `Token refresh failed: ${response.status} ${response.statusText}`;\n\n try {\n if (contentType.includes('application/json')) {\n // Try to extract OAuth error from JSON response\n const errorBody = (await response.clone().json()) as {\n error?: string;\n error_description?: string;\n };\n if (errorBody.error) {\n errorMessage = `Token refresh failed: ${errorBody.error}`;\n if (errorBody.error_description) {\n errorMessage += ` - ${errorBody.error_description}`;\n }\n }\n } else {\n // Non-JSON response (e.g., text/plain) - read the body as text\n const textBody = await response.clone().text();\n if (textBody) {\n errorMessage = `Token refresh failed: ${response.status} - ${textBody}`;\n }\n }\n } catch {\n // If we can't parse the error body, use the status message\n }\n\n throw new Error(errorMessage);\n }\n\n const result = await oauth.processRefreshTokenResponse(\n config.authServer.server,\n client,\n response\n );\n\n return {\n accessToken: result.access_token,\n tokenType: result.token_type,\n expiresIn: result.expires_in,\n refreshToken: result.refresh_token,\n scope: result.scope,\n };\n}\n\n/**\n * Configuration for client credentials grant\n */\nexport interface ClientCredentialsConfig {\n /**\n * Token endpoint URL\n */\n tokenEndpoint: string;\n\n /**\n * OAuth client ID\n */\n clientId: string;\n\n /**\n * OAuth client secret\n */\n clientSecret: string;\n\n /**\n * Scopes to request (optional)\n */\n scopes?: string[];\n}\n\n/**\n * Performs the OAuth 2.1 client credentials grant to obtain an access token.\n * Suitable for CI/CD machine-to-machine authentication.\n *\n * Uses oauth4webapi for spec-compliant request construction and response validation,\n * consistent with how the rest of this module handles OAuth flows.\n *\n * @param config - Client credentials configuration\n * @returns Token result\n */\nexport async function performClientCredentialsFlow(\n config: ClientCredentialsConfig\n): Promise<TokenResult> {\n // Construct minimal AuthorizationServer from the token endpoint URL.\n // oauth4webapi requires an issuer; we use the origin of the token endpoint.\n const tokenEndpointUrl = new URL(config.tokenEndpoint);\n const authServer: oauth.AuthorizationServer = {\n issuer: tokenEndpointUrl.origin,\n token_endpoint: config.tokenEndpoint,\n };\n\n const client: oauth.Client = {\n client_id: config.clientId,\n };\n\n // ClientSecretBasic transmits credentials via Authorization: Basic header (RFC 6749 §2.3.1).\n // This is the recommended method — avoids placing secrets in the request body.\n const clientAuth = oauth.ClientSecretBasic(config.clientSecret);\n\n const parameters: Record<string, string> = {};\n if (config.scopes && config.scopes.length > 0) {\n parameters['scope'] = config.scopes.join(' ');\n }\n\n const response = await oauth.clientCredentialsGrantRequest(\n authServer,\n client,\n clientAuth,\n parameters\n );\n\n const result = await oauth.processClientCredentialsResponse(\n authServer,\n client,\n response\n );\n\n const requestedScopes = new Set(\n config.scopes && config.scopes.length > 0 ? config.scopes : []\n );\n const grantedScopes = new Set(\n (result.scope ?? '').split(' ').filter(Boolean)\n );\n const missingScopes = [...requestedScopes].filter(\n (s) => !grantedScopes.has(s)\n );\n if (\n missingScopes.length > 0 &&\n requestedScopes.size > 0 &&\n grantedScopes.size > 0\n ) {\n debug(\n '[oauth] Warning: Token server granted fewer scopes than requested. Missing: %s',\n missingScopes.join(', ')\n );\n }\n\n return {\n accessToken: result.access_token,\n tokenType: result.token_type,\n expiresIn: result.expires_in,\n scope: result.scope,\n };\n}\n\n/**\n * Validates the callback URL from OAuth redirect\n *\n * @param callbackUrl - The full callback URL with query parameters\n * @param expectedState - The state parameter sent in the authorization request\n * @returns The authorization code\n * @throws Error if validation fails\n */\nexport function validateCallback(\n callbackUrl: URL,\n expectedState: string\n): string {\n const error = callbackUrl.searchParams.get('error');\n if (error) {\n const errorDescription = callbackUrl.searchParams.get('error_description');\n throw new Error(\n `OAuth error: ${error}${errorDescription ? ` - ${errorDescription}` : ''}`\n );\n }\n\n const state = callbackUrl.searchParams.get('state');\n if (state !== expectedState) {\n throw new Error('OAuth state mismatch - possible CSRF attack');\n }\n\n const code = callbackUrl.searchParams.get('code');\n if (!code) {\n throw new Error('No authorization code in callback URL');\n }\n\n return code;\n}\n","/**\n * OAuth Protected Resource and Authorization Server discovery\n *\n * Implements RFC 9728 (OAuth Protected Resource Metadata) and\n * RFC 8414 (Authorization Server Metadata) for MCP servers.\n */\n\nimport * as oauth from 'oauth4webapi';\nimport type { AuthServerMetadata } from './oauthFlow.js';\n\n/**\n * Returns true if the hostname refers to the loopback interface\n */\nfunction isLocalhostUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n const h = parsed.hostname;\n return h === 'localhost' || h === '127.0.0.1' || h === '::1';\n } catch {\n return false;\n }\n}\n\n/**\n * Validates that critical OAuth endpoints returned by discovery use HTTPS.\n * Localhost URLs are exempt to support local development and testing.\n *\n * @throws Error if any endpoint uses a non-HTTPS, non-localhost scheme\n */\nfunction validateAuthServerEndpoints(authServer: {\n authorization_endpoint?: string;\n token_endpoint?: string;\n issuer?: string;\n}): void {\n const endpoints = [\n { name: 'authorization_endpoint', url: authServer.authorization_endpoint },\n { name: 'token_endpoint', url: authServer.token_endpoint },\n ];\n\n for (const { name, url } of endpoints) {\n if (url && !url.startsWith('https://') && !isLocalhostUrl(url)) {\n throw new Error(\n `OAuth discovery returned an insecure ${name}: \"${url}\". ` +\n `Only HTTPS endpoints are permitted for OAuth flows to prevent token interception.`\n );\n }\n }\n}\n\n/**\n * MCP Protocol version header value\n */\nexport const MCP_PROTOCOL_VERSION = '2025-06-18';\n\n/**\n * Protected Resource Metadata (RFC 9728)\n */\nexport interface ProtectedResourceMetadata {\n /**\n * The protected resource URL\n */\n resource: string;\n\n /**\n * Array of authorization server URLs\n */\n authorization_servers?: Array<string>;\n\n /**\n * Scopes supported by the protected resource\n */\n scopes_supported?: Array<string>;\n\n /**\n * Bearer token formats supported\n */\n bearer_methods_supported?: Array<string>;\n\n /**\n * Resource documentation URL\n */\n resource_documentation?: string;\n\n /**\n * Resource signing algorithms\n */\n resource_signing_alg_values_supported?: Array<string>;\n}\n\n/**\n * Result of protected resource discovery\n */\nexport interface ProtectedResourceDiscoveryResult {\n /**\n * The discovered metadata\n */\n metadata: ProtectedResourceMetadata;\n\n /**\n * The URL where metadata was found\n */\n discoveryUrl: string;\n\n /**\n * Whether path-aware discovery was used (vs base discovery)\n */\n usedPathAwareDiscovery: boolean;\n}\n\n/**\n * Discovers protected resource metadata per RFC 9728\n *\n * Follows RFC 9728 Section 4.1 for path-aware discovery:\n * 1. First tries: {origin}/.well-known/oauth-protected-resource{pathname}\n * 2. Falls back to: {origin}/.well-known/oauth-protected-resource\n *\n * @param mcpServerUrl - The MCP server URL\n * @returns Protected resource discovery result\n * @throws Error if discovery fails completely\n *\n * @example\n * const result = await discoverProtectedResource('https://api.example.com/mcp/default');\n * console.log(result.metadata.authorization_servers);\n */\nexport async function discoverProtectedResource(\n mcpServerUrl: string\n): Promise<ProtectedResourceDiscoveryResult> {\n const url = new URL(mcpServerUrl);\n const origin = url.origin;\n const pathname = url.pathname;\n\n // Try path-aware discovery first (RFC 9728 Section 4.1)\n const pathAwareUrl = `${origin}/.well-known/oauth-protected-resource${pathname}`;\n\n try {\n const metadata = await fetchProtectedResourceMetadata(pathAwareUrl);\n return {\n metadata,\n discoveryUrl: pathAwareUrl,\n usedPathAwareDiscovery: true,\n };\n } catch (error) {\n // If path-aware fails with 404, try base discovery\n if (error instanceof DiscoveryError && error.status === 404) {\n const baseUrl = `${origin}/.well-known/oauth-protected-resource`;\n\n // This will throw if base discovery also fails\n const metadata = await fetchProtectedResourceMetadata(baseUrl);\n return {\n metadata,\n discoveryUrl: baseUrl,\n usedPathAwareDiscovery: false,\n };\n }\n\n // Non-404 error from path-aware discovery\n throw error;\n }\n}\n\n/**\n * Error thrown when discovery fails\n */\nexport class DiscoveryError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly url?: string\n ) {\n super(message);\n this.name = 'DiscoveryError';\n }\n}\n\n/**\n * Fetches protected resource metadata from a discovery URL\n */\nasync function fetchProtectedResourceMetadata(\n discoveryUrl: string\n): Promise<ProtectedResourceMetadata> {\n const response = await fetch(discoveryUrl, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n 'MCP-Protocol-Version': MCP_PROTOCOL_VERSION,\n },\n });\n\n if (!response.ok) {\n throw new DiscoveryError(\n `Protected resource discovery failed: ${response.status} ${response.statusText}`,\n response.status,\n discoveryUrl\n );\n }\n\n const metadata = (await response.json()) as ProtectedResourceMetadata;\n\n // Validate required field\n if (!metadata.resource) {\n throw new DiscoveryError(\n 'Invalid protected resource metadata: missing required \"resource\" field',\n undefined,\n discoveryUrl\n );\n }\n\n return metadata;\n}\n\n/**\n * Discovers OAuth Authorization Server metadata per RFC 8414\n *\n * Wraps oauth4webapi's discovery with MCP-specific headers.\n *\n * @param authServerUrl - The authorization server URL\n * @returns Authorization server metadata\n * @throws Error if discovery fails\n *\n * @example\n * const authServer = await discoverAuthorizationServer('https://auth.example.com');\n * console.log(authServer.server.token_endpoint);\n */\nexport async function discoverAuthorizationServer(\n authServerUrl: string\n): Promise<AuthServerMetadata> {\n const issuer = new URL(authServerUrl);\n\n // Use oauth4webapi for discovery with custom headers\n const response = await oauth.discoveryRequest(issuer, {\n algorithm: 'oauth2',\n headers: new Headers({\n 'MCP-Protocol-Version': MCP_PROTOCOL_VERSION,\n }),\n });\n\n const metadata = await oauth.processDiscoveryResponse(issuer, response);\n\n validateAuthServerEndpoints(metadata);\n\n return {\n server: metadata,\n issuer: authServerUrl,\n };\n}\n","/**\n * OAuth token storage with environment variable support for CI/CD\n *\n * Provides file-based storage for OAuth state per MCP server, with support\n * for token injection via environment variables for automated testing.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { homedir } from 'node:os';\nimport type { StoredTokens, StoredClientInfo } from './types.js';\nimport type { AuthServerMetadata } from './oauthFlow.js';\nimport type { ProtectedResourceMetadata } from './discovery.js';\n\n/**\n * Combined server metadata (auth server + protected resource)\n */\nexport interface StoredServerMetadata {\n /**\n * Authorization server metadata\n */\n authServer: AuthServerMetadata;\n\n /**\n * Protected resource metadata\n */\n protectedResource: ProtectedResourceMetadata;\n\n /**\n * Timestamp when metadata was discovered\n */\n discoveredAt: number;\n}\n\n/**\n * Interface for OAuth storage operations\n */\nexport interface OAuthStorage {\n /**\n * Load combined server metadata\n */\n loadServerMetadata(): Promise<StoredServerMetadata | null>;\n\n /**\n * Save combined server metadata\n */\n saveServerMetadata(metadata: StoredServerMetadata): Promise<void>;\n\n /**\n * Load registered client information\n */\n loadClient(): Promise<StoredClientInfo | null>;\n\n /**\n * Save registered client information\n */\n saveClient(client: StoredClientInfo): Promise<void>;\n\n /**\n * Load stored tokens\n */\n loadTokens(): Promise<StoredTokens | null>;\n\n /**\n * Save tokens\n */\n saveTokens(tokens: StoredTokens): Promise<void>;\n\n /**\n * Delete stored tokens\n */\n deleteTokens(): Promise<void>;\n\n /**\n * Check if valid (non-expired) token exists\n * @param bufferMs - Buffer time in milliseconds before expiration (default: 60000)\n */\n hasValidToken(bufferMs?: number): Promise<boolean>;\n}\n\n/**\n * Configuration for file-based OAuth storage\n */\nexport interface FileOAuthStorageConfig {\n /**\n * MCP server URL (used to generate storage key)\n */\n serverUrl: string;\n\n /**\n * Custom state directory (overrides default)\n */\n stateDir?: string;\n}\n\n/**\n * Environment variable names for CI/CD token injection\n */\nexport const ENV_VAR_NAMES = {\n accessToken: 'MCP_ACCESS_TOKEN',\n refreshToken: 'MCP_REFRESH_TOKEN',\n tokenType: 'MCP_TOKEN_TYPE',\n expiresAt: 'MCP_TOKEN_EXPIRES_AT',\n} as const;\n\n/**\n * Default buffer time before token expiration (60 seconds)\n */\nconst DEFAULT_EXPIRY_BUFFER_MS = 60_000;\n\n/**\n * Generates a filesystem-safe key from a server URL\n *\n * @param serverUrl - The MCP server URL\n * @returns A filesystem-safe key string\n *\n * @example\n * generateServerKey('https://api.example.com:8080/mcp')\n * // Returns: 'api.example.com_8080_mcp'\n */\nexport function generateServerKey(serverUrl: string): string {\n const url = new URL(serverUrl);\n\n // Start with hostname\n let key = url.hostname;\n\n // Add port if non-standard\n if (url.port) {\n key += `_${url.port}`;\n }\n\n // Add path, replacing slashes with underscores\n if (url.pathname && url.pathname !== '/') {\n const cleanPath = url.pathname\n .replace(/^\\/+|\\/+$/g, '') // Remove leading/trailing slashes\n .replace(/\\//g, '_'); // Replace remaining slashes with underscores\n if (cleanPath) {\n key += `_${cleanPath}`;\n }\n }\n\n // Make filesystem-safe: replace any remaining problematic characters\n return key.replace(/[^a-zA-Z0-9_.-]/g, '_');\n}\n\n/**\n * Gets the state directory for a server\n *\n * Default locations:\n * - Linux: $XDG_STATE_HOME/mcp-tests/{serverKey}/ or ~/.local/state/mcp-tests/{serverKey}/\n * - macOS: ~/.local/state/mcp-tests/{serverKey}/\n * - Windows: %LOCALAPPDATA%\\mcp-tests\\{serverKey}\\\n *\n * @param serverUrl - The MCP server URL\n * @param customDir - Optional custom base directory\n * @returns The state directory path\n */\nexport function getStateDir(serverUrl: string, customDir?: string): string {\n const serverKey = generateServerKey(serverUrl);\n\n if (customDir) {\n return path.join(customDir, serverKey);\n }\n\n // Platform-specific defaults\n if (process.platform === 'win32') {\n const localAppData = process.env.LOCALAPPDATA;\n if (localAppData) {\n return path.join(localAppData, 'mcp-tests', serverKey);\n }\n // Fallback for Windows\n return path.join(homedir(), 'AppData', 'Local', 'mcp-tests', serverKey);\n }\n\n // Linux: Honor XDG_STATE_HOME\n if (process.platform === 'linux' && process.env.XDG_STATE_HOME) {\n return path.join(process.env.XDG_STATE_HOME, 'mcp-tests', serverKey);\n }\n\n // Default for macOS and Linux\n return path.join(homedir(), '.local', 'state', 'mcp-tests', serverKey);\n}\n\n/**\n * Get the base directory for all MCP token storage\n */\nexport function getBaseStateDir(): string {\n if (process.platform === 'win32') {\n const localAppData = process.env.LOCALAPPDATA;\n if (localAppData) {\n return path.join(localAppData, 'mcp-tests');\n }\n return path.join(homedir(), 'AppData', 'Local', 'mcp-tests');\n }\n\n if (process.platform === 'linux' && process.env.XDG_STATE_HOME) {\n return path.join(process.env.XDG_STATE_HOME, 'mcp-tests');\n }\n\n return path.join(homedir(), '.local', 'state', 'mcp-tests');\n}\n\n/**\n * Known server info\n */\nexport interface KnownServer {\n /** The server key (directory name) */\n key: string;\n /** Reconstructed URL (best effort) */\n url: string;\n /** Whether valid tokens exist */\n hasTokens: boolean;\n}\n\n/**\n * List all known authenticated servers from the token storage directory\n *\n * @returns Array of known servers with their URLs and token status\n */\nexport async function listKnownServers(): Promise<KnownServer[]> {\n const baseDir = getBaseStateDir();\n const servers: KnownServer[] = [];\n\n try {\n const entries = await fs.readdir(baseDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const serverKey = entry.name;\n const tokensPath = path.join(baseDir, serverKey, 'tokens.json');\n\n let hasTokens = false;\n try {\n await fs.access(tokensPath);\n hasTokens = true;\n } catch {\n // No tokens file\n }\n\n // Reconstruct URL from server key (best effort)\n // Format: hostname_port_path or hostname_path\n const parts = serverKey.split('_');\n const hostname = parts[0];\n const rest = parts.slice(1).join('/');\n const url = `https://${hostname}/${rest}`;\n\n servers.push({ key: serverKey, url, hasTokens });\n }\n } catch {\n // Directory doesn't exist or not readable\n }\n\n return servers;\n}\n\n/**\n * Reads tokens from environment variables (for CI/CD)\n *\n * @returns StoredTokens if MCP_ACCESS_TOKEN is set, null otherwise\n */\nexport function loadTokensFromEnv(): StoredTokens | null {\n const accessToken = process.env[ENV_VAR_NAMES.accessToken];\n\n if (!accessToken) {\n return null;\n }\n\n const expiresAtStr = process.env[ENV_VAR_NAMES.expiresAt];\n const expiresAt = expiresAtStr ? parseInt(expiresAtStr, 10) : undefined;\n\n return {\n accessToken,\n refreshToken: process.env[ENV_VAR_NAMES.refreshToken],\n tokenType: process.env[ENV_VAR_NAMES.tokenType] ?? 'Bearer',\n expiresAt: expiresAt && !isNaN(expiresAt) ? expiresAt : undefined,\n };\n}\n\n/**\n * Programmatically inject tokens into storage (for CI/CD setup)\n *\n * @param serverUrl - The MCP server URL\n * @param tokens - The tokens to inject\n * @param stateDir - Optional custom state directory\n */\nexport async function injectTokens(\n serverUrl: string,\n tokens: StoredTokens,\n stateDir?: string\n): Promise<void> {\n const storage = createFileOAuthStorage({ serverUrl, stateDir });\n await storage.saveTokens(tokens);\n}\n\n/**\n * Load stored OAuth tokens for an MCP server\n *\n * Reads tokens from the standard storage location for the given server URL.\n * Tokens are stored by `mcp-server-tester login` or `injectTokens()`.\n *\n * @param serverUrl - The MCP server URL\n * @param stateDir - Optional custom state directory\n * @returns StoredTokens if found, null otherwise\n *\n * @example\n * ```typescript\n * // After running: npx mcp-server-tester login https://api.example.com/mcp\n * const tokens = await loadTokens('https://api.example.com/mcp');\n * if (tokens?.accessToken) {\n * // Use the token — never log raw token values\n * headers.Authorization = `Bearer ${tokens.accessToken}`;\n * }\n * ```\n */\nexport async function loadTokens(\n serverUrl: string,\n stateDir?: string\n): Promise<StoredTokens | null> {\n const storage = createFileOAuthStorage({ serverUrl, stateDir });\n return storage.loadTokens();\n}\n\n/**\n * Check if valid OAuth tokens exist for an MCP server\n *\n * Returns true if tokens exist and are not expired (with buffer).\n * Use this to check if authentication is needed before making requests.\n *\n * @param serverUrl - The MCP server URL\n * @param options - Optional configuration\n * @param options.stateDir - Custom state directory\n * @param options.bufferMs - Buffer time before expiration (default: 60000ms)\n * @returns true if valid (non-expired) tokens exist\n *\n * @example\n * ```typescript\n * if (await hasValidTokens('https://api.example.com/mcp')) {\n * // Use stored tokens\n * const tokens = await loadTokens('https://api.example.com/mcp');\n * } else {\n * console.log('Run: npx mcp-server-tester login https://api.example.com/mcp');\n * }\n * ```\n */\nexport async function hasValidTokens(\n serverUrl: string,\n options?: { stateDir?: string; bufferMs?: number }\n): Promise<boolean> {\n const storage = createFileOAuthStorage({\n serverUrl,\n stateDir: options?.stateDir,\n });\n return storage.hasValidToken(options?.bufferMs);\n}\n\n/**\n * Creates a file-based OAuth storage instance\n *\n * @param config - Storage configuration\n * @returns OAuthStorage instance\n */\nexport function createFileOAuthStorage(\n config: FileOAuthStorageConfig\n): OAuthStorage {\n return new FileOAuthStorage(config);\n}\n\n/**\n * File-based OAuth storage implementation\n */\nclass FileOAuthStorage implements OAuthStorage {\n private readonly stateDir: string;\n\n constructor(config: FileOAuthStorageConfig) {\n this.stateDir = getStateDir(config.serverUrl, config.stateDir);\n }\n\n private get serverMetadataPath(): string {\n return path.join(this.stateDir, 'server.json');\n }\n\n private get clientPath(): string {\n return path.join(this.stateDir, 'client.json');\n }\n\n private get tokensPath(): string {\n return path.join(this.stateDir, 'tokens.json');\n }\n\n async loadServerMetadata(): Promise<StoredServerMetadata | null> {\n return this.loadFile<StoredServerMetadata>(this.serverMetadataPath);\n }\n\n async saveServerMetadata(metadata: StoredServerMetadata): Promise<void> {\n await this.atomicWrite(this.serverMetadataPath, metadata);\n }\n\n async loadClient(): Promise<StoredClientInfo | null> {\n return this.loadFile<StoredClientInfo>(this.clientPath);\n }\n\n async saveClient(client: StoredClientInfo): Promise<void> {\n await this.atomicWrite(this.clientPath, client);\n }\n\n async loadTokens(): Promise<StoredTokens | null> {\n return this.loadFile<StoredTokens>(this.tokensPath);\n }\n\n async saveTokens(tokens: StoredTokens): Promise<void> {\n await this.atomicWrite(this.tokensPath, tokens);\n }\n\n async deleteTokens(): Promise<void> {\n await this.deleteFile(this.tokensPath);\n }\n\n async hasValidToken(\n bufferMs: number = DEFAULT_EXPIRY_BUFFER_MS\n ): Promise<boolean> {\n const tokens = await this.loadTokens();\n\n if (!tokens?.accessToken) {\n return false;\n }\n\n // If no expiration, assume valid\n if (!tokens.expiresAt) {\n return true;\n }\n\n // Check if token is expired (with buffer)\n return tokens.expiresAt > Date.now() + bufferMs;\n }\n\n /**\n * Load a JSON file, returning null if not found\n */\n private async loadFile<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Write data atomically: write to .tmp file, then rename\n * Files are created with 0o600 permissions (user read/write only)\n */\n private async atomicWrite(filePath: string, data: unknown): Promise<void> {\n // Note: The `mode` parameter is ignored on Windows (Win32) where file\n // permissions are controlled by NTFS ACLs, not Unix permission bits.\n // On Windows, token files may be readable by other users on the system\n // depending on the directory's inherited ACL. This is a Node.js fs\n // limitation. Windows users should verify %LOCALAPPDATA% permissions manually.\n await fs.mkdir(this.stateDir, { recursive: true, mode: 0o700 });\n\n const tmpPath = `${filePath}.tmp`;\n const content = JSON.stringify(data, null, 2);\n\n // Write to temp file with restrictive permissions (user read/write only)\n await fs.writeFile(tmpPath, content, { encoding: 'utf-8', mode: 0o600 });\n\n // Atomic rename\n await fs.rename(tmpPath, filePath);\n }\n\n /**\n * Delete a file, ignoring errors if the file doesn't exist\n */\n private async deleteFile(filePath: string): Promise<void> {\n try {\n await fs.unlink(filePath);\n } catch (error) {\n // Ignore ENOENT (file doesn't exist)\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n}\n","/**\n * CLI OAuth client for command-line authentication flows\n *\n * Provides browser-based OAuth authentication for CLI environments,\n * with support for environment variable token injection for CI/CD.\n */\n\nimport * as http from 'node:http';\nimport type { AddressInfo, Socket } from 'node:net';\nimport createDebug from 'debug';\nimport {\n generatePKCE,\n generateState,\n buildAuthorizationUrl,\n exchangeCodeForTokens,\n refreshAccessToken,\n type AuthServerMetadata,\n} from './oauthFlow.js';\nimport {\n discoverProtectedResource,\n discoverAuthorizationServer,\n MCP_PROTOCOL_VERSION,\n type ProtectedResourceMetadata,\n} from './discovery.js';\nimport {\n createFileOAuthStorage,\n loadTokensFromEnv,\n type OAuthStorage,\n type StoredServerMetadata,\n} from './storage.js';\nimport type { StoredTokens, StoredClientInfo, TokenResult } from './types.js';\n\nconst debug = createDebug('mcp-server-tester:cli-oauth');\n\n/**\n * Configuration for CLI OAuth client\n */\nexport interface CLIOAuthClientConfig {\n /**\n * MCP server URL (for protected resource discovery)\n */\n mcpServerUrl: string;\n\n /**\n * Scopes to request (optional, uses discovered scopes if not provided)\n */\n scopes?: Array<string>;\n\n /**\n * Custom storage directory\n */\n stateDir?: string;\n\n /**\n * Pre-registered client ID (skips DCR if provided)\n */\n clientId?: string;\n\n /**\n * Pre-registered client secret\n */\n clientSecret?: string;\n\n /**\n * Preferred callback port (default: random available port)\n */\n callbackPort?: number;\n\n /**\n * Timeout for OAuth flow in milliseconds (default: 300000 = 5 min)\n */\n timeoutMs?: number;\n\n /**\n * Client name for DCR registration\n */\n clientName?: string;\n}\n\n/**\n * Result of CLI OAuth authentication\n */\nexport interface CLIOAuthResult {\n /**\n * Access token\n */\n accessToken: string;\n\n /**\n * Token type (typically \"Bearer\")\n */\n tokenType: string;\n\n /**\n * Expiration timestamp (Unix ms)\n */\n expiresAt?: number;\n\n /**\n * Whether token was refreshed vs newly acquired\n */\n refreshed: boolean;\n\n /**\n * Scopes that were requested (only set for new authentications)\n */\n requestedScopes?: string[];\n\n /**\n * Whether token came from environment variables\n */\n fromEnv: boolean;\n}\n\n/**\n * Default timeout for OAuth flow (5 minutes)\n */\nconst DEFAULT_TIMEOUT_MS = 300_000;\n\n/**\n * Default client name for DCR\n */\nconst DEFAULT_CLIENT_NAME = '@gleanwork/mcp-server-tester';\n\n/**\n * Default TTL for cached server metadata (24 hours)\n * After this time, metadata will be re-discovered\n */\nconst DEFAULT_METADATA_TTL_MS = 24 * 60 * 60 * 1000;\n\n/**\n * CLI OAuth client for command-line authentication flows\n */\nexport class CLIOAuthClient {\n private readonly config: CLIOAuthClientConfig;\n private readonly storage: OAuthStorage;\n\n constructor(config: CLIOAuthClientConfig) {\n this.config = config;\n this.storage = createFileOAuthStorage({\n serverUrl: config.mcpServerUrl,\n stateDir: config.stateDir,\n });\n }\n\n /**\n * Get a valid access token, authenticating if necessary\n *\n * Token resolution priority:\n * 1. Check environment variables (for CI/CD)\n * 2. Check file storage for cached tokens\n * 3. Try to refresh if expired but refresh token exists\n * 4. Run full OAuth flow if needed\n */\n async getAccessToken(): Promise<CLIOAuthResult> {\n // 1. Check environment variables first (CI/CD support)\n const envTokens = loadTokensFromEnv();\n if (envTokens) {\n debug('Using tokens from environment variables');\n return {\n accessToken: envTokens.accessToken,\n tokenType: envTokens.tokenType,\n expiresAt: envTokens.expiresAt,\n refreshed: false,\n fromEnv: true,\n };\n }\n\n // 2. Check file storage for cached tokens\n const storedTokens = await this.storage.loadTokens();\n\n if (storedTokens?.accessToken) {\n // Check if token is still valid\n const isValid = await this.storage.hasValidToken();\n\n if (isValid) {\n debug('Using cached tokens from storage');\n return {\n accessToken: storedTokens.accessToken,\n tokenType: storedTokens.tokenType,\n expiresAt: storedTokens.expiresAt,\n refreshed: false,\n fromEnv: false,\n };\n }\n\n // 3. Try to refresh if we have a refresh token\n if (storedTokens.refreshToken) {\n debug('Token expired, attempting refresh');\n try {\n const refreshedTokens = await this.refreshStoredToken(storedTokens);\n return {\n accessToken: refreshedTokens.accessToken,\n tokenType: refreshedTokens.tokenType,\n expiresAt: refreshedTokens.expiresAt,\n refreshed: true,\n fromEnv: false,\n };\n } catch (error) {\n debug('Token refresh failed, will re-authenticate:', error);\n // Fall through to full authentication\n }\n }\n }\n\n // 4. Run full OAuth flow\n debug('Performing full OAuth authentication');\n return this.authenticate();\n }\n\n /**\n * Try to get a valid access token without triggering browser auth\n *\n * Returns null if no valid token is available (no stored tokens,\n * expired without refresh token, or refresh failed). Unlike getAccessToken(),\n * this will NOT open a browser for authentication.\n *\n * Use this for CLI commands that should prompt the user to run `login`\n * instead of automatically starting the OAuth flow.\n */\n async tryGetAccessToken(): Promise<CLIOAuthResult | null> {\n // 1. Check environment variables first (CI/CD support)\n const envTokens = loadTokensFromEnv();\n if (envTokens) {\n debug('Using tokens from environment variables');\n return {\n accessToken: envTokens.accessToken,\n tokenType: envTokens.tokenType,\n expiresAt: envTokens.expiresAt,\n refreshed: false,\n fromEnv: true,\n };\n }\n\n // 2. Check file storage for cached tokens\n const storedTokens = await this.storage.loadTokens();\n\n if (storedTokens?.accessToken) {\n // Check if token is still valid\n const isValid = await this.storage.hasValidToken();\n\n if (isValid) {\n debug('Using cached tokens from storage');\n return {\n accessToken: storedTokens.accessToken,\n tokenType: storedTokens.tokenType,\n expiresAt: storedTokens.expiresAt,\n refreshed: false,\n fromEnv: false,\n };\n }\n\n // 3. Try to refresh if we have a refresh token\n if (storedTokens.refreshToken) {\n debug('Token expired, attempting refresh');\n try {\n const refreshedTokens = await this.refreshStoredToken(storedTokens);\n return {\n accessToken: refreshedTokens.accessToken,\n tokenType: refreshedTokens.tokenType,\n expiresAt: refreshedTokens.expiresAt,\n refreshed: true,\n fromEnv: false,\n };\n } catch (error) {\n debug('Token refresh failed:', error);\n // Return null - don't fall through to browser auth\n return null;\n }\n }\n }\n\n // No valid token available - return null instead of opening browser\n debug('No valid token available');\n return null;\n }\n\n /**\n * Force a new authentication flow\n */\n async authenticate(): Promise<CLIOAuthResult> {\n // Discover servers\n const { protectedResource, authServer } = await this.discoverServers();\n\n // Get or register client\n const client = await this.getOrRegisterClient(authServer);\n\n // Perform OAuth flow\n const { tokens, requestedScopes } = await this.performOAuthFlow(\n authServer,\n client,\n protectedResource\n );\n\n return {\n accessToken: tokens.accessToken,\n tokenType: tokens.tokenType,\n expiresAt: tokens.expiresAt,\n refreshed: false,\n fromEnv: false,\n requestedScopes,\n };\n }\n\n /**\n * Check if stored credentials exist (may be expired)\n */\n async hasStoredCredentials(): Promise<boolean> {\n const tokens = await this.storage.loadTokens();\n return tokens?.accessToken !== undefined;\n }\n\n /**\n * Clear stored credentials\n */\n async clearCredentials(): Promise<void> {\n await this.storage.deleteTokens();\n debug('Cleared stored credentials');\n }\n\n /**\n * Discover protected resource and authorization server\n */\n private async discoverServers(): Promise<{\n protectedResource: ProtectedResourceMetadata;\n authServer: AuthServerMetadata;\n }> {\n // Check cached server metadata\n const cachedMetadata = await this.storage.loadServerMetadata();\n if (cachedMetadata) {\n // Check if metadata is stale (older than TTL)\n const age = Date.now() - cachedMetadata.discoveredAt;\n if (age < DEFAULT_METADATA_TTL_MS) {\n debug('Using cached server metadata (age: %dms)', age);\n debug(\n 'Cached protected resource scopes: %O',\n cachedMetadata.protectedResource.scopes_supported\n );\n debug(\n 'Cached auth server scopes: %O',\n cachedMetadata.authServer.server.scopes_supported\n );\n return {\n protectedResource: cachedMetadata.protectedResource,\n authServer: cachedMetadata.authServer,\n };\n }\n debug('Cached server metadata is stale (age: %dms), re-discovering', age);\n }\n\n // Discover protected resource\n debug('Discovering protected resource:', this.config.mcpServerUrl);\n const prResult = await discoverProtectedResource(this.config.mcpServerUrl);\n debug('Found protected resource:', prResult.metadata.resource);\n debug(\n 'Protected resource scopes_supported: %O',\n prResult.metadata.scopes_supported\n );\n\n // Get authorization server URL\n const authServerUrl = prResult.metadata.authorization_servers?.[0];\n if (!authServerUrl) {\n throw new Error(\n 'No authorization servers found in protected resource metadata'\n );\n }\n\n // Discover authorization server\n debug('Discovering authorization server:', authServerUrl);\n const authServer = await discoverAuthorizationServer(authServerUrl);\n debug('Found authorization server:', authServer.issuer);\n debug(\n 'Auth server scopes_supported: %O',\n authServer.server.scopes_supported\n );\n\n // Cache metadata\n const metadata: StoredServerMetadata = {\n authServer,\n protectedResource: prResult.metadata,\n discoveredAt: Date.now(),\n };\n await this.storage.saveServerMetadata(metadata);\n\n return {\n protectedResource: prResult.metadata,\n authServer,\n };\n }\n\n /**\n * Get existing client or register new one via DCR\n */\n private async getOrRegisterClient(\n authServer: AuthServerMetadata\n ): Promise<StoredClientInfo> {\n // Use pre-configured client if provided\n if (this.config.clientId) {\n debug('Using pre-configured client ID');\n return {\n clientId: this.config.clientId,\n clientSecret: this.config.clientSecret,\n };\n }\n\n // Check cached client\n const cachedClient = await this.storage.loadClient();\n if (cachedClient?.clientId) {\n debug('Using cached client registration');\n return cachedClient;\n }\n\n // Register new client via DCR\n debug('Registering new client via DCR');\n const client = await this.registerClient(authServer);\n await this.storage.saveClient(client);\n\n return client;\n }\n\n /**\n * Register a new client via Dynamic Client Registration\n */\n private async registerClient(\n authServer: AuthServerMetadata\n ): Promise<StoredClientInfo> {\n const registrationEndpoint = authServer.server.registration_endpoint;\n if (!registrationEndpoint) {\n throw new Error(\n 'Authorization server does not support Dynamic Client Registration. ' +\n 'Please provide a clientId in the configuration.'\n );\n }\n\n // We'll use a placeholder redirect URI for now\n // The actual port will be determined when we start the callback server\n const redirectUri = 'http://127.0.0.1:0/callback';\n\n const response = await fetch(registrationEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'MCP-Protocol-Version': MCP_PROTOCOL_VERSION,\n },\n body: JSON.stringify({\n redirect_uris: [redirectUri],\n token_endpoint_auth_method: 'none',\n grant_types: ['authorization_code', 'refresh_token'],\n response_types: ['code'],\n client_name: this.config.clientName ?? DEFAULT_CLIENT_NAME,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Dynamic Client Registration failed: ${response.status} ${response.statusText}\\n${errorText}`\n );\n }\n\n const data = (await response.json()) as {\n client_id: string;\n client_secret?: string;\n client_id_issued_at?: number;\n client_secret_expires_at?: number;\n };\n\n debug('Client registered:', data.client_id);\n\n return {\n clientId: data.client_id,\n clientSecret: data.client_secret,\n clientIdIssuedAt: data.client_id_issued_at,\n clientSecretExpiresAt: data.client_secret_expires_at,\n };\n }\n\n /**\n * Perform the full OAuth authorization flow\n */\n private async performOAuthFlow(\n authServer: AuthServerMetadata,\n client: StoredClientInfo,\n protectedResource: ProtectedResourceMetadata\n ): Promise<{ tokens: StoredTokens; requestedScopes: string[] }> {\n // Generate PKCE and state\n const pkce = await generatePKCE();\n const state = generateState();\n\n // Start callback server\n const { port, codePromise, close } = await this.startCallbackServer(state);\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n try {\n // Determine scopes: user-provided > protected resource > auth server > fallback\n // Try multiple sources since not all servers advertise scopes in the same place\n const requestedScopes = this.config.scopes ??\n protectedResource.scopes_supported ??\n authServer.server.scopes_supported ?? ['openid'];\n\n debug('Scope resolution:');\n debug(' - User config scopes: %O', this.config.scopes);\n debug(\n ' - Protected resource scopes_supported: %O',\n protectedResource.scopes_supported\n );\n debug(\n ' - Auth server scopes_supported: %O',\n authServer.server.scopes_supported\n );\n debug(' - Final requested scopes: %O', requestedScopes);\n\n const authUrl = buildAuthorizationUrl({\n authServer,\n clientId: client.clientId,\n redirectUri,\n scopes: requestedScopes,\n codeChallenge: pkce.codeChallenge,\n state,\n resource: protectedResource.resource,\n });\n\n // Log only non-sensitive parts of the authorization URL.\n // Do NOT log: state, code_challenge, code_challenge_method (security-sensitive).\n debug(\n 'Authorization URL (base): %s',\n `${authUrl.origin}${authUrl.pathname}`\n );\n debug('Authorization URL params:');\n debug(' - client_id: %s', authUrl.searchParams.get('client_id'));\n debug(' - redirect_uri: %s', authUrl.searchParams.get('redirect_uri'));\n debug(' - scope: %s', authUrl.searchParams.get('scope'));\n debug(' - resource: %s', authUrl.searchParams.get('resource'));\n\n // Open browser or print URL\n await this.openBrowserOrPrintUrl(authUrl);\n\n // Wait for callback\n debug('Waiting for OAuth callback...');\n const code = await codePromise;\n debug('Received authorization code');\n\n // Exchange code for tokens\n const tokenResult = await exchangeCodeForTokens({\n authServer,\n clientId: client.clientId,\n clientSecret: client.clientSecret,\n code,\n state,\n codeVerifier: pkce.codeVerifier,\n redirectUri,\n });\n\n // Store tokens with the client ID used to obtain them\n const tokens = this.tokenResultToStoredTokens(\n tokenResult,\n client.clientId\n );\n await this.storage.saveTokens(tokens);\n\n return { tokens, requestedScopes };\n } finally {\n // Clean up callback server and all connections\n close();\n }\n }\n\n /**\n * Refresh an expired token\n *\n * Uses the clientId stored with the tokens (if available) to ensure\n * the refresh request uses the same client that obtained the original tokens.\n * This is important because refresh tokens are bound to the client_id.\n */\n private async refreshStoredToken(\n storedTokens: StoredTokens\n ): Promise<StoredTokens> {\n if (!storedTokens.refreshToken) {\n throw new Error('No refresh token available');\n }\n\n // Get cached server metadata\n const metadata = await this.storage.loadServerMetadata();\n if (!metadata) {\n throw new Error('No cached server metadata for refresh');\n }\n\n // Determine which client credentials to use for refresh.\n // Priority: tokens.clientId > stored client.json > error\n let clientId: string;\n let clientSecret: string | undefined;\n\n if (storedTokens.clientId) {\n // Use the client ID that was used to obtain these tokens\n debug('Using clientId from stored tokens for refresh');\n clientId = storedTokens.clientId;\n\n // Try to get the client secret from stored client info if it matches\n const storedClient = await this.storage.loadClient();\n if (storedClient?.clientId === clientId) {\n clientSecret = storedClient.clientSecret;\n }\n } else {\n // Legacy tokens without clientId - fall back to stored client\n debug(\n 'No clientId in stored tokens, falling back to stored client (legacy behavior)'\n );\n const client = await this.getOrRegisterClient(metadata.authServer);\n clientId = client.clientId;\n clientSecret = client.clientSecret;\n }\n\n // Refresh token\n const tokenResult = await refreshAccessToken({\n authServer: metadata.authServer,\n clientId,\n clientSecret,\n refreshToken: storedTokens.refreshToken,\n });\n\n // Store new tokens with the clientId that was used\n const tokens = this.tokenResultToStoredTokens(tokenResult, clientId);\n await this.storage.saveTokens(tokens);\n\n return tokens;\n }\n\n /**\n * Start local callback server\n */\n private async startCallbackServer(expectedState: string): Promise<{\n port: number;\n codePromise: Promise<string>;\n close: () => void;\n }> {\n const timeoutMs = this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n const server = http.createServer();\n\n // Track active connections so we can force-close them\n const connections = new Set<Socket>();\n server.on('connection', (socket) => {\n connections.add(socket);\n socket.on('close', () => connections.delete(socket));\n });\n\n // Helper to force-close the server\n const forceClose = () => {\n for (const socket of connections) {\n socket.destroy();\n }\n server.close();\n };\n\n let codeResolve: (code: string) => void;\n let codeReject: (error: Error) => void;\n\n const codePromise = new Promise<string>((res, rej) => {\n codeResolve = res;\n codeReject = rej;\n });\n\n // Set up timeout\n const timeout = setTimeout(() => {\n forceClose();\n codeReject(new Error(`OAuth flow timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n // Handle incoming requests\n server.on('request', (req, res) => {\n const url = new URL(\n req.url ?? '/',\n `http://127.0.0.1:${(server.address() as AddressInfo).port}`\n );\n\n if (url.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not Found');\n return;\n }\n\n // Check for errors\n const error = url.searchParams.get('error');\n if (error) {\n const errorDescription = url.searchParams.get('error_description');\n clearTimeout(timeout);\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(this.errorHtml(error, errorDescription ?? undefined));\n codeReject(\n new Error(\n `OAuth error: ${error}${errorDescription ? ` - ${errorDescription}` : ''}`\n )\n );\n return;\n }\n\n // Validate state\n const state = url.searchParams.get('state');\n if (state !== expectedState) {\n clearTimeout(timeout);\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(this.errorHtml('invalid_state', 'State parameter mismatch'));\n codeReject(new Error('OAuth state mismatch - possible CSRF attack'));\n return;\n }\n\n // Get authorization code\n const code = url.searchParams.get('code');\n if (!code) {\n clearTimeout(timeout);\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(\n this.errorHtml('missing_code', 'No authorization code received')\n );\n codeReject(new Error('No authorization code in callback'));\n return;\n }\n\n // Success!\n clearTimeout(timeout);\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(this.successHtml());\n codeResolve(code);\n });\n\n // Listen on preferred port or random port\n const preferredPort = this.config.callbackPort ?? 0;\n\n server.listen(preferredPort, '127.0.0.1', () => {\n const address = server.address() as AddressInfo;\n debug('Callback server listening on port', address.port);\n resolve({ port: address.port, codePromise, close: forceClose });\n });\n\n server.on('error', (err) => {\n reject(err);\n });\n });\n }\n\n /**\n * Open browser or print URL for headless environments\n */\n private async openBrowserOrPrintUrl(url: URL): Promise<void> {\n if (isHeadless()) {\n console.log('\\n' + '='.repeat(60));\n console.log(\n 'Please open the following URL in your browser to authenticate:'\n );\n console.log('\\n' + url.toString() + '\\n');\n console.log('='.repeat(60) + '\\n');\n return;\n }\n\n try {\n // Dynamic import of 'open' package\n const open = await import('open');\n await open.default(url.toString());\n debug('Opened browser for authentication');\n } catch (error) {\n // If browser opening fails, fall back to printing URL\n debug('Failed to open browser:', error);\n console.log('\\nFailed to open browser automatically.');\n console.log('Please open the following URL manually:\\n');\n console.log(url.toString() + '\\n');\n }\n }\n\n /**\n * Convert TokenResult to StoredTokens\n *\n * @param result - Token result from exchange or refresh\n * @param clientId - Client ID that was used to obtain these tokens\n */\n private tokenResultToStoredTokens(\n result: TokenResult,\n clientId: string\n ): StoredTokens {\n return {\n accessToken: result.accessToken,\n tokenType: result.tokenType,\n refreshToken: result.refreshToken,\n expiresAt: result.expiresIn\n ? Date.now() + result.expiresIn * 1000\n : undefined,\n clientId,\n };\n }\n\n /**\n * HTML page for successful authentication\n */\n private successHtml(): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <title>Authentication Successful</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\n background: #f8fafc; }\n .container { text-align: center; background: white; padding: 48px 64px; border-radius: 8px;\n border: 1px solid #e2e8f0; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n .icon { width: 48px; height: 48px; margin: 0 auto 24px; background: #dcfce7; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; }\n .icon svg { width: 24px; height: 24px; color: #16a34a; }\n h1 { color: #0f172a; margin: 0 0 8px 0; font-size: 20px; font-weight: 600; }\n p { color: #64748b; margin: 0; font-size: 14px; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"/>\n </svg>\n </div>\n <h1>Authentication Successful</h1>\n <p>You can close this window and return to the terminal.</p>\n </div>\n</body>\n</html>`;\n }\n\n /**\n * HTML page for authentication error\n */\n private errorHtml(error: string, description?: string): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <title>Authentication Failed</title>\n <style>\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\n background: #f8fafc; }\n .container { text-align: center; background: white; padding: 48px 64px; border-radius: 8px;\n border: 1px solid #e2e8f0; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }\n .icon { width: 48px; height: 48px; margin: 0 auto 24px; background: #fee2e2; border-radius: 50%;\n display: flex; align-items: center; justify-content: center; }\n .icon svg { width: 24px; height: 24px; color: #dc2626; }\n h1 { color: #0f172a; margin: 0 0 8px 0; font-size: 20px; font-weight: 600; }\n p { color: #64748b; margin: 0 0 8px 0; font-size: 14px; }\n code { background: #f1f5f9; padding: 2px 8px; border-radius: 4px; color: #dc2626; font-size: 13px; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/>\n </svg>\n </div>\n <h1>Authentication Failed</h1>\n <p>Error: <code>${escapeHtml(error)}</code></p>\n ${description ? `<p>${escapeHtml(description)}</p>` : ''}\n </div>\n</body>\n</html>`;\n }\n}\n\n/**\n * Detect if running in a headless environment\n */\nfunction isHeadless(): boolean {\n // CI environment\n if (process.env.CI) {\n return true;\n }\n\n // No TTY (piped input)\n if (!process.stdin.isTTY) {\n return true;\n }\n\n // Linux without DISPLAY (no X server)\n if (\n process.platform === 'linux' &&\n !process.env.DISPLAY &&\n !process.env.WAYLAND_DISPLAY\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n","{\n \"name\": \"@gleanwork/mcp-server-tester\",\n \"version\": \"1.0.0\",\n \"description\": \"Playwright-based testing and evaluation framework for MCP servers\",\n \"keywords\": [\n \"playwright\",\n \"mcp\",\n \"model-context-protocol\",\n \"evals\",\n \"testing\",\n \"llm\",\n \"server-testing\"\n ],\n \"homepage\": \"https://github.com/gleanwork/mcp-server-tester#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/gleanwork/mcp-server-tester/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/gleanwork/mcp-server-tester.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Glean Contributors\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./fixtures/mcp\": {\n \"types\": \"./dist/fixtures/mcp.d.ts\",\n \"import\": \"./dist/fixtures/mcp.js\"\n },\n \"./fixtures/mcpAuth\": {\n \"types\": \"./dist/fixtures/mcpAuth.d.ts\",\n \"import\": \"./dist/fixtures/mcpAuth.js\"\n },\n \"./reporters/mcpReporter\": {\n \"types\": \"./dist/reporters/mcpReporter.d.ts\",\n \"import\": \"./dist/reporters/mcpReporter.js\",\n \"require\": \"./dist/reporters/mcpReporter.cjs\"\n }\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"mcp-server-tester\": \"./dist/cli/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"npm run build:ui && tsup && npm run build:copy-ui\",\n \"build:copy-ui\": \"cp -r src/reporters/ui-dist dist/reporters/\",\n \"build:ui\": \"tsx src/reporters/build-ui.ts\",\n \"dev\": \"tsup --watch\",\n \"dev:ui\": \"tsx src/reporters/build-ui.ts --watch\",\n \"format\": \"prettier --write \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"format:check\": \"prettier --check \\\"**/*.{ts,tsx,json,md}\\\"\",\n \"lint\": \"eslint . --ext .ts,.tsx\",\n \"lint:fix\": \"eslint . --ext .ts,.tsx --fix\",\n \"prepublishOnly\": \"npm run test:all\",\n \"docs:check\": \"markdown-code check\",\n \"docs:sync\": \"markdown-code sync\",\n \"preview-reporter\": \"tsx scripts/preview-reporter.ts\",\n \"test\": \"vitest run\",\n \"test:all\": \"npm run build && npm run format:check && npm run lint && npm run typecheck && npm test\",\n \"test:playwright\": \"playwright test\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"^0.2.71\",\n \"@inkjs/ui\": \"^2.0.0\",\n \"@modelcontextprotocol/sdk\": \"^1.27.1\",\n \"commander\": \"^14.0.2\",\n \"debug\": \"^4.4.3\",\n \"ink\": \"^5.2.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"oauth4webapi\": \"^3.0.0\",\n \"open\": \"^10.1.0\",\n \"react\": \"^18.3.1\",\n \"undici\": \"^7.24.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@ai-sdk/provider-utils\": \"^4.0.15\",\n \"@playwright/test\": \"^1.49.0\",\n \"@release-it-plugins/lerna-changelog\": \"^8.0.1\",\n \"@types/debug\": \"^4.1.12\",\n \"@types/node\": \"^22.10.2\",\n \"@types/react\": \"^18.3.12\",\n \"@types/react-dom\": \"^18.3.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.18.2\",\n \"@typescript-eslint/parser\": \"^8.18.2\",\n \"@vitest/ui\": \"^4.1.2\",\n \"autoprefixer\": \"^10.4.20\",\n \"bintastic\": \"^4.0.1\",\n \"esbuild\": \"^0.28.0\",\n \"eslint\": \"^8.57.1\",\n \"ink-testing-library\": \"^4.0.0\",\n \"lucide-react\": \"^0.460.0\",\n \"markdown-code\": \"^0.6.1\",\n \"memfs\": \"^4.51.1\",\n \"postcss\": \"^8.4.49\",\n \"prettier\": \"^3.4.2\",\n \"react-dom\": \"^18.3.1\",\n \"recharts\": \"^3.7.0\",\n \"release-it\": \"^19.2.4\",\n \"tailwindcss\": \"^3.4.15\",\n \"tsup\": \"^8.3.5\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.7.2\",\n \"vitest\": \"^4.1.2\"\n },\n \"peerDependencies\": {\n \"@ai-sdk/anthropic\": \"^3.0.46\",\n \"@ai-sdk/azure\": \"^3.0.0\",\n \"@ai-sdk/deepseek\": \"^2.0.0\",\n \"@ai-sdk/google\": \"^3.0.0\",\n \"@ai-sdk/google-vertex\": \"^4.0.0\",\n \"@ai-sdk/mistral\": \"^3.0.0\",\n \"@ai-sdk/openai\": \"^3.0.31\",\n \"@ai-sdk/xai\": \"^3.0.0\",\n \"@openrouter/ai-sdk-provider\": \"^2.0.0\",\n \"@playwright/test\": \"^1.40.0\",\n \"ai\": \"^6.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"ai\": {\n \"optional\": true\n },\n \"@ai-sdk/anthropic\": {\n \"optional\": true\n },\n \"@ai-sdk/azure\": {\n \"optional\": true\n },\n \"@ai-sdk/deepseek\": {\n \"optional\": true\n },\n \"@ai-sdk/google\": {\n \"optional\": true\n },\n \"@ai-sdk/google-vertex\": {\n \"optional\": true\n },\n \"@ai-sdk/mistral\": {\n \"optional\": true\n },\n \"@ai-sdk/openai\": {\n \"optional\": true\n },\n \"@ai-sdk/xai\": {\n \"optional\": true\n },\n \"@openrouter/ai-sdk-provider\": {\n \"optional\": true\n }\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org\"\n },\n \"release-it\": {\n \"plugins\": {\n \"@release-it-plugins/lerna-changelog\": {\n \"infile\": \"CHANGELOG.md\",\n \"launchEditor\": true\n }\n },\n \"git\": {\n \"tagName\": \"v${version}\"\n },\n \"github\": {\n \"release\": true,\n \"tokenRef\": \"GITHUB_AUTH\"\n }\n },\n \"optionalDependencies\": {\n \"@ai-sdk/anthropic\": \"^3.0.46\",\n \"@ai-sdk/azure\": \"^3.0.0\",\n \"@ai-sdk/deepseek\": \"^2.0.0\",\n \"@ai-sdk/google\": \"^3.0.0\",\n \"@ai-sdk/google-vertex\": \"^4.0.68\",\n \"@ai-sdk/mistral\": \"^3.0.0\",\n \"@ai-sdk/openai\": \"^3.0.31\",\n \"@ai-sdk/xai\": \"^3.0.0\",\n \"@openrouter/ai-sdk-provider\": \"^2.0.0\",\n \"ai\": \"^6.0.97\"\n },\n \"overrides\": {\n \"release-it\": {\n \"undici\": \"6.24.1\"\n }\n }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport type { MCPConfig } from '../config/mcpConfig.js';\nimport {\n validateMCPConfig,\n isStdioConfig,\n isHttpConfig,\n} from '../config/mcpConfig.js';\nimport { debugClient, debugHttp } from '../debug.js';\nimport { ProxyAgent, Agent as UndiciAgent } from 'undici';\nimport { readFileSync } from 'node:fs';\nimport packageJson from '../../package.json' with { type: 'json' };\nimport { performClientCredentialsFlow } from '../auth/oauthFlow.js';\n\n/**\n * Extracts the Retry-After delay in milliseconds from an error response, if present.\n * Returns null if no Retry-After header is found or parseable.\n */\nfunction getRetryAfterDelayMs(err: unknown): number | null {\n const response = (err as Record<string, unknown>)?.response as\n | Response\n | undefined;\n const retryAfter = response?.headers?.get?.('Retry-After');\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) return seconds * 1000;\n }\n return null;\n}\n\n/**\n * Returns true if the error is a 429 rate limit response\n */\nfunction isRateLimitError(err: unknown): boolean {\n const response = (err as Record<string, unknown>)?.response as\n | Response\n | undefined;\n return response?.status === 429;\n}\n\n/**\n * Returns true if the error is a transient network error that may succeed on retry\n */\nfunction isTransientNetworkError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes('econnreset') ||\n msg.includes('econnrefused') ||\n msg.includes('etimedout') ||\n msg.includes('enotfound') ||\n msg.includes('network') ||\n msg.includes('socket hang up') ||\n msg.includes('fetch failed')\n );\n}\n\n/**\n * Returns true if the error should be retried\n */\nfunction isRetryableError(err: unknown): boolean {\n return isTransientNetworkError(err) || isRateLimitError(err);\n}\n\n/**\n * Retries an async operation with exponential backoff.\n * Respects Retry-After headers for 429 rate limit responses.\n */\nasync function retryWithBackoff<T>(\n fn: () => Promise<T>,\n maxAttempts: number\n): Promise<T> {\n let lastErr: unknown;\n for (let attempt = 0; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastErr = err;\n if (attempt < maxAttempts && isRetryableError(err)) {\n const retryAfterMs = getRetryAfterDelayMs(err);\n const delayMs =\n retryAfterMs !== null\n ? retryAfterMs\n : Math.min(1000 * 2 ** attempt, 30000);\n debugClient(\n 'Retryable error on attempt %d/%d, retrying in %dms: %s',\n attempt + 1,\n maxAttempts + 1,\n delayMs,\n (err as Error).message\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n } else {\n throw err;\n }\n }\n }\n throw lastErr;\n}\n\n/**\n * Tracks undici agents that need to be closed when their associated client is closed.\n * Keyed by Client instance identity.\n */\nconst agentRegistry = new WeakMap<object, UndiciAgent | ProxyAgent>();\n\n/**\n * Options for creating an MCP client\n */\nexport interface CreateMCPClientOptions {\n /**\n * Client information (name and version)\n */\n clientInfo?: {\n name?: string;\n version?: string;\n };\n\n /**\n * OAuth client provider for authentication\n *\n * When provided, the MCP SDK handles OAuth flow automatically.\n * This takes precedence over static token auth in config.auth.accessToken.\n */\n authProvider?: OAuthClientProvider;\n\n /**\n * Sampling handler callback for LLM sampling requests from the server.\n *\n * When provided, the client will advertise sampling capability to the server.\n * When absent, sampling is removed from declared capabilities so the client\n * does not falsely advertise support it cannot fulfill.\n */\n samplingHandler?: (...args: unknown[]) => unknown;\n}\n\n/**\n * Creates and connects an MCP client based on the provided configuration\n *\n * @param config - MCP configuration (will be validated)\n * @param options - Optional client options including auth provider\n * @returns Connected MCP Client instance\n * @throws {Error} If config is invalid or connection fails\n *\n * @example\n * // Stdio transport\n * const client = await createMCPClientForConfig({\n * transport: 'stdio',\n * command: 'node',\n * args: ['server.js']\n * });\n *\n * @example\n * // HTTP transport with static token auth\n * const client = await createMCPClientForConfig({\n * transport: 'http',\n * serverUrl: 'http://localhost:3000/mcp',\n * auth: { accessToken: 'your-token' }\n * });\n *\n * @example\n * // HTTP transport with OAuth provider\n * const client = await createMCPClientForConfig(\n * { transport: 'http', serverUrl: 'http://localhost:3000/mcp' },\n * { authProvider: myOAuthProvider }\n * );\n */\nexport async function createMCPClientForConfig(\n config: MCPConfig,\n options?: CreateMCPClientOptions\n): Promise<Client> {\n // Validate config\n const validatedConfig = validateMCPConfig(config);\n\n // Create client with info\n const client = new Client(\n {\n name: options?.clientInfo?.name ?? '@gleanwork/mcp-server-tester',\n version: options?.clientInfo?.version ?? packageJson.version,\n },\n {\n capabilities: {\n ...(validatedConfig.capabilities ?? {}),\n // Only advertise sampling if a handler has been registered;\n // declaring sampling capability without a handler violates the MCP spec\n sampling: options?.samplingHandler\n ? (validatedConfig.capabilities?.sampling ?? {})\n : undefined,\n },\n }\n );\n\n // Create appropriate transport and connect\n if (isStdioConfig(validatedConfig)) {\n const transport = new StdioClientTransport({\n command: validatedConfig.command,\n args: validatedConfig.args ?? [],\n ...(validatedConfig.cwd && { cwd: validatedConfig.cwd }),\n // Suppress server stderr when quiet mode is enabled\n ...(validatedConfig.quiet && { stderr: 'ignore' as const }),\n ...(validatedConfig.env && {\n env: Object.fromEntries(\n Object.entries({ ...process.env, ...validatedConfig.env }).filter(\n (entry): entry is [string, string] => entry[1] !== undefined\n )\n ),\n }),\n });\n\n debugClient('Connecting via stdio: %O', {\n command: validatedConfig.command,\n args: validatedConfig.args,\n cwd: validatedConfig.cwd,\n });\n\n await client.connect(\n transport,\n validatedConfig.connectTimeoutMs !== undefined\n ? { timeout: validatedConfig.connectTimeoutMs }\n : undefined\n );\n } else if (isHttpConfig(validatedConfig)) {\n // Build headers, including static token auth if configured and no authProvider.\n // User-provided headers take precedence over defaults (spread order).\n const headers: Record<string, string> = {\n 'User-Agent': `@gleanwork/mcp-server-tester/${packageJson.version}`,\n ...validatedConfig.headers,\n };\n\n // If using client credentials grant, fetch a token first\n if (validatedConfig.auth?.clientCredentials && !options?.authProvider) {\n const ccConfig = validatedConfig.auth.clientCredentials;\n const clientId = ccConfig.clientId ?? process.env['MCP_CLIENT_ID'];\n const clientSecret =\n ccConfig.clientSecret ?? process.env['MCP_CLIENT_SECRET'];\n\n if (!clientId || !clientSecret) {\n throw new Error(\n 'Client credentials require clientId/clientSecret in config or MCP_CLIENT_ID/MCP_CLIENT_SECRET env vars'\n );\n }\n\n if (!ccConfig.tokenEndpoint) {\n throw new Error(\n 'Client credentials require tokenEndpoint in auth.clientCredentials config'\n );\n }\n\n debugClient('Fetching token via client credentials grant');\n const tokenResult = await performClientCredentialsFlow({\n tokenEndpoint: ccConfig.tokenEndpoint,\n clientId,\n clientSecret,\n scopes: ccConfig.scopes,\n });\n headers.Authorization = `Bearer ${tokenResult.accessToken}`;\n }\n\n // If using static token auth (no authProvider), add Authorization header\n if (validatedConfig.auth?.accessToken && !options?.authProvider) {\n headers.Authorization = `Bearer ${validatedConfig.auth.accessToken}`;\n }\n\n const url = new URL(validatedConfig.serverUrl);\n let requestInit: RequestInit | undefined =\n Object.keys(headers).length > 0 ? { headers } : undefined;\n\n // Apply proxy if configured or available from environment\n const proxyUrl =\n validatedConfig.proxy?.url ??\n process.env['HTTPS_PROXY'] ??\n process.env['HTTP_PROXY'];\n\n if (proxyUrl) {\n const proxyAgent = new ProxyAgent(proxyUrl);\n try {\n const sanitized = new URL(proxyUrl);\n debugClient(\n 'Using proxy: %s://%s:%s',\n sanitized.protocol.slice(0, -1),\n sanitized.hostname,\n sanitized.port\n );\n } catch {\n debugClient('Using proxy (unparseable URL)');\n }\n requestInit = {\n ...requestInit,\n dispatcher: proxyAgent,\n } as unknown as RequestInit;\n }\n\n // Apply TLS configuration if present\n if (validatedConfig.tls) {\n const tlsCfg = validatedConfig.tls;\n try {\n const dispatcher = new UndiciAgent({\n connect: {\n ...(tlsCfg.ca && { ca: readFileSync(tlsCfg.ca) }),\n ...(tlsCfg.cert && { cert: readFileSync(tlsCfg.cert) }),\n ...(tlsCfg.key && { key: readFileSync(tlsCfg.key) }),\n rejectUnauthorized: tlsCfg.rejectUnauthorized ?? true,\n },\n });\n agentRegistry.set(client, dispatcher);\n requestInit = {\n ...requestInit,\n dispatcher,\n } as unknown as RequestInit;\n debugClient('TLS configuration applied');\n } catch (error) {\n const filePath = tlsCfg.ca ?? tlsCfg.cert ?? tlsCfg.key;\n const fileType = tlsCfg.ca\n ? 'CA certificate'\n : tlsCfg.cert\n ? 'client certificate'\n : 'client key';\n throw new Error(\n `Failed to load TLS ${fileType} from ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n } else if (proxyUrl) {\n // Track ProxyAgent for cleanup (already created above in the proxy branch)\n // Re-extract if already set via requestInit\n const existingDispatcher = (\n requestInit as unknown as { dispatcher?: ProxyAgent }\n )?.dispatcher;\n if (existingDispatcher) {\n agentRegistry.set(client, existingDispatcher);\n }\n }\n\n debugClient('Connecting via HTTP: %O', {\n serverUrl: validatedConfig.serverUrl,\n headers:\n Object.keys(headers).length > 0 ? Object.keys(headers) : undefined,\n hasAuthProvider: !!options?.authProvider,\n });\n\n debugHttp('Connecting to %s', validatedConfig.serverUrl);\n if (Object.keys(headers).length > 0) {\n debugHttp('Request header names: %O', Object.keys(headers));\n }\n\n const retryAttempts = validatedConfig.retryAttempts ?? 0;\n const connectOptions =\n validatedConfig.connectTimeoutMs !== undefined\n ? { timeout: validatedConfig.connectTimeoutMs }\n : undefined;\n\n // Try Streamable HTTP first (MCP spec 2025-03-26), fall back to SSE (2024-11-05)\n await retryWithBackoff(async () => {\n try {\n debugHttp('Attempting transport: streamableHttp');\n const streamableTransport = new StreamableHTTPClientTransport(url, {\n requestInit,\n authProvider: options?.authProvider,\n });\n await client.connect(streamableTransport, connectOptions);\n debugClient('Connected via Streamable HTTP');\n debugHttp('Connection established via streamableHttp');\n } catch (err) {\n debugHttp(\n 'streamableHttp failed (%s), falling back to SSE',\n (err as Error).message\n );\n debugClient('Streamable HTTP failed, falling back to SSE transport');\n debugHttp('Attempting transport: sse');\n const sseTransport = new SSEClientTransport(url, {\n requestInit,\n authProvider: options?.authProvider,\n });\n await client.connect(sseTransport, connectOptions);\n debugClient('Connected via SSE');\n debugHttp('Connection established via sse');\n }\n }, retryAttempts);\n }\n\n debugClient('Connected successfully');\n const serverInfo = client.getServerVersion();\n if (serverInfo) {\n debugClient('Server info: %O', serverInfo);\n }\n\n return client;\n}\n\n/**\n * Safely closes an MCP client connection\n *\n * @param client - The client to close\n */\nexport async function closeMCPClient(client: Client): Promise<void> {\n // notifications/cancelled requires a specific requestId to be useful — without one\n // the server cannot identify which request to abort. The MCP SDK does not expose\n // outstanding request IDs as a public API, so we close directly and let the\n // transport teardown signal disconnection to the server.\n try {\n // Terminate the MCP session before closing so stateful servers can clean up.\n // TODO: Remove once MCP moves to stateless protocol (see roadmap: https://blog.modelcontextprotocol.io/posts/2026-mcp-roadmap/)\n const transport = client.transport;\n if (transport instanceof StreamableHTTPClientTransport) {\n try {\n await transport.terminateSession();\n } catch (sessionError) {\n debugClient(\n 'Error terminating session: %s',\n sessionError instanceof Error\n ? sessionError.message\n : String(sessionError)\n );\n }\n }\n\n await client.close();\n } catch (error) {\n debugClient(\n 'Error closing client: %s',\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n } finally {\n // Close any pooled undici agent associated with this client\n const agent = agentRegistry.get(client);\n if (agent) {\n agentRegistry.delete(client);\n try {\n await agent.close();\n } catch (agentError) {\n debugClient(\n 'Error closing undici agent: %s',\n (agentError as Error).message\n );\n }\n }\n }\n}\n","import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * A single content block from an MCP response\n */\nexport interface ContentBlock {\n type: string;\n text?: string;\n data?: unknown;\n mimeType?: string;\n}\n\n/**\n * Normalized representation of an MCP tool response\n *\n * This provides a consistent interface regardless of the response format\n * returned by the MCP server.\n */\nexport interface NormalizedToolResponse {\n /**\n * Extracted text content (concatenated from all text blocks)\n */\n text: string;\n\n /**\n * Original raw response from the MCP SDK\n */\n raw: CallToolResult;\n\n /**\n * Whether the tool call resulted in an error\n */\n isError: boolean;\n\n /**\n * Parsed content blocks from the response\n */\n contentBlocks: ContentBlock[];\n\n /**\n * Structured content if present (parsed JSON or raw data)\n */\n structuredContent: unknown;\n}\n\n/**\n * Normalizes an MCP CallToolResult into a consistent format\n *\n * @param result - Raw CallToolResult from the MCP SDK\n * @returns Normalized response with extracted text, content blocks, etc.\n *\n * @example\n * ```typescript\n * const result = await client.callTool({ name: 'read_file', arguments: { path: 'readme.txt' } });\n * const normalized = normalizeToolResponse(result);\n *\n * console.log(normalized.text); // \"Hello World\"\n * console.log(normalized.isError); // false\n * console.log(normalized.contentBlocks); // [{ type: 'text', text: 'Hello World' }]\n * ```\n */\nexport function normalizeToolResponse(\n result: CallToolResult\n): NormalizedToolResponse {\n const isError = result.isError ?? false;\n const contentBlocks: ContentBlock[] = [];\n const textParts: string[] = [];\n\n // Parse content array if present\n if (Array.isArray(result.content)) {\n for (const block of result.content) {\n if (block == null || typeof block !== 'object') {\n continue;\n }\n\n const b = block as Record<string, unknown>;\n const contentBlock: ContentBlock = {\n type: typeof b.type === 'string' ? b.type : 'unknown',\n };\n\n // Extract text if present\n if (typeof b.text === 'string') {\n contentBlock.text = b.text;\n textParts.push(b.text);\n }\n\n // Extract data/blob if present\n if (b.data !== undefined) {\n contentBlock.data = b.data;\n }\n\n // Extract mimeType if present\n if (typeof b.mimeType === 'string') {\n contentBlock.mimeType = b.mimeType;\n }\n\n contentBlocks.push(contentBlock);\n }\n }\n\n // Handle structuredContent\n let structuredContent: unknown = null;\n if (result.structuredContent !== undefined) {\n structuredContent = result.structuredContent;\n\n // If no text was extracted from content blocks, try to get text from structuredContent\n if (textParts.length === 0) {\n if (typeof result.structuredContent === 'string') {\n textParts.push(result.structuredContent);\n } else if (result.structuredContent != null) {\n // For objects/arrays, stringify for text representation\n textParts.push(JSON.stringify(result.structuredContent));\n }\n }\n }\n\n // Build final text by joining all parts\n const text = textParts.join('\\n');\n\n return {\n text,\n raw: result,\n isError,\n contentBlocks,\n structuredContent,\n };\n}\n\n/**\n * Extracts just the text content from a normalized or raw response\n *\n * This is a convenience function that works with both:\n * - Raw CallToolResult from the MCP SDK\n * - NormalizedToolResponse from normalizeToolResponse()\n * - Plain strings or other legacy formats\n *\n * @param response - Response in any supported format\n * @returns Extracted text content\n */\nexport function extractText(response: unknown): string {\n // Handle null/undefined\n if (response == null) {\n return '';\n }\n\n // Plain string\n if (typeof response === 'string') {\n return response;\n }\n\n // Already normalized response\n if (isNormalizedResponse(response)) {\n return response.text;\n }\n\n // Raw CallToolResult - normalize it first\n if (isCallToolResult(response)) {\n return normalizeToolResponse(response).text;\n }\n\n // Array of content blocks (direct content)\n if (Array.isArray(response)) {\n return extractTextFromContentArray(response);\n }\n\n // Generic object - try common patterns\n if (typeof response === 'object') {\n const r = response as Record<string, unknown>;\n\n // Check for content array\n if (Array.isArray(r.content)) {\n return extractTextFromContentArray(r.content);\n }\n\n // Check for content as a direct string (single content block format)\n if (typeof r.content === 'string') {\n return r.content;\n }\n\n // Check for structuredContent\n if (r.structuredContent !== undefined) {\n if (typeof r.structuredContent === 'string') {\n return r.structuredContent;\n }\n return JSON.stringify(r.structuredContent);\n }\n\n // Check for direct text field\n if (typeof r.text === 'string') {\n return r.text;\n }\n\n // Fallback to JSON\n return JSON.stringify(r);\n }\n\n // Primitives (number, boolean, bigint, symbol)\n if (\n typeof response === 'number' ||\n typeof response === 'boolean' ||\n typeof response === 'bigint'\n ) {\n return String(response);\n }\n\n // Symbol or other edge cases\n return '';\n}\n\n/**\n * Type guard for NormalizedToolResponse\n */\nfunction isNormalizedResponse(value: unknown): value is NormalizedToolResponse {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const v = value as Record<string, unknown>;\n return (\n typeof v.text === 'string' &&\n typeof v.isError === 'boolean' &&\n Array.isArray(v.contentBlocks) &&\n v.raw !== undefined\n );\n}\n\n/**\n * Type guard for CallToolResult\n */\nfunction isCallToolResult(value: unknown): value is CallToolResult {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const v = value as Record<string, unknown>;\n // Per MCP spec, content is required in CallToolResult — isError alone is insufficient\n return Array.isArray(v.content);\n}\n\n/**\n * Extracts text from a content block array\n */\nfunction extractTextFromContentArray(content: unknown[]): string {\n const textParts: string[] = [];\n\n for (const block of content) {\n if (block == null || typeof block !== 'object') {\n continue;\n }\n const b = block as Record<string, unknown>;\n if (b.type === 'text' && typeof b.text === 'string') {\n textParts.push(b.text);\n }\n }\n\n if (textParts.length > 0) {\n return textParts.join('\\n');\n }\n\n // No text blocks found, stringify the whole array\n return JSON.stringify(content);\n}\n","/**\n * Validator Utilities\n *\n * Shared utility functions for validation operations.\n * Re-exports core utilities from mcp/response.ts and adds validation-specific helpers.\n */\n\nimport { extractText as extractTextFromResponse } from '../../mcp/response.js';\n\n/**\n * Re-export extractText from mcp/response.ts\n * This extracts text content from any response format.\n */\nexport const extractText = extractTextFromResponse;\n\n/**\n * Gets the size of a response in bytes\n *\n * Serializes the response to JSON (with pretty printing for consistency)\n * and returns the byte length using UTF-8 encoding.\n *\n * @param response - Response in any format\n * @returns Size in bytes\n */\nexport function getResponseSizeBytes(response: unknown): number {\n if (response === null || response === undefined) {\n return 0;\n }\n\n // For strings, get direct byte length\n if (typeof response === 'string') {\n return Buffer.byteLength(response, 'utf8');\n }\n\n // For objects/arrays, serialize with formatting\n const serialized = JSON.stringify(response, null, 2);\n return Buffer.byteLength(serialized, 'utf8');\n}\n\n/**\n * Converts a response to a string for comparison\n *\n * @param response - Response in any format\n * @returns String representation\n */\nexport function stringifyResponse(response: unknown): string {\n if (response === null || response === undefined) {\n return '';\n }\n\n if (typeof response === 'string') {\n return response;\n }\n\n return JSON.stringify(response, null, 2);\n}\n\n/**\n * Checks if a response represents an error\n *\n * @param response - Response to check\n * @returns true if the response is an error\n */\nexport function isErrorResponse(response: unknown): boolean {\n if (response === null || response === undefined) {\n return false;\n }\n\n if (typeof response !== 'object') {\n return false;\n }\n\n const r = response as Record<string, unknown>;\n\n // Check isError flag directly\n if (r.isError === true) {\n return true;\n }\n\n // Check for normalized response with isError\n if ('raw' in r && typeof r.raw === 'object' && r.raw !== null) {\n const raw = r.raw as Record<string, unknown>;\n return raw.isError === true;\n }\n\n return false;\n}\n\n/**\n * Extracts error message from an error response\n *\n * @param response - Error response\n * @returns Error message or empty string if not an error\n */\nexport function extractErrorMessage(response: unknown): string {\n if (!isErrorResponse(response)) {\n return '';\n }\n\n // Extract text content which typically contains the error message\n return extractText(response);\n}\n\n/**\n * Normalizes whitespace in text for consistent comparison\n *\n * Collapses multiple whitespace characters (spaces, tabs, newlines) into single spaces\n * and trims leading/trailing whitespace.\n *\n * @param text - Text to normalize\n * @returns Normalized text with collapsed whitespace\n *\n * @example\n * ```typescript\n * normalizeWhitespace(' hello\\n\\n world ');\n * // Returns: \"hello world\"\n * ```\n */\nexport function normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n","/**\n * Response Validator\n *\n * Validates that a response exactly matches an expected value.\n */\n\nimport type { ValidationResult } from './types.js';\nimport { stringifyResponse } from './utils.js';\n\n/**\n * Validates that a response exactly matches the expected value\n *\n * Performs deep equality comparison using JSON serialization.\n *\n * @param actual - The actual response\n * @param expected - The expected response\n * @returns Validation result\n *\n * @example\n * ```typescript\n * const result = validateResponse(response, { status: 'ok', count: 42 });\n * if (!result.pass) {\n * console.log(result.message);\n * }\n * ```\n */\nexport function validateResponse(\n actual: unknown,\n expected: unknown\n): ValidationResult {\n const actualStr = stringifyResponse(actual);\n const expectedStr = stringifyResponse(expected);\n\n if (actualStr === expectedStr) {\n return {\n pass: true,\n message: 'Response matches expected value',\n };\n }\n\n return {\n pass: false,\n message: `Response does not match expected value`,\n details: {\n actual: truncateForDisplay(actualStr),\n expected: truncateForDisplay(expectedStr),\n },\n };\n}\n\n/**\n * Truncates a string for display in error messages\n */\nfunction truncateForDisplay(str: string, maxLength = 500): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Schema Validator\n *\n * Validates that a response matches a Zod schema.\n */\n\nimport type { ZodType, ZodError } from 'zod';\nimport type { ValidationResult, SchemaValidatorOptions } from './types.js';\nimport { extractText, stringifyResponse } from './utils.js';\n\n/**\n * Validates that a response matches a Zod schema\n *\n * Attempts to parse the response with the provided Zod schema.\n * If the response is a text representation of JSON, it will be parsed first.\n *\n * @param response - The response to validate\n * @param schema - The Zod schema to validate against\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n *\n * const WeatherSchema = z.object({\n * temperature: z.number(),\n * conditions: z.string(),\n * });\n *\n * const result = validateSchema(response, WeatherSchema);\n * if (!result.pass) {\n * console.log(result.message);\n * }\n * ```\n */\nexport function validateSchema(\n response: unknown,\n schema: ZodType,\n options: SchemaValidatorOptions = {}\n): ValidationResult {\n // Get the value to validate\n const valueToValidate = getValidatableValue(response);\n\n // If strict mode is enabled and we have an object schema with .strict(),\n // the schema itself should handle this - the option is for documentation\n if (options.strict && valueToValidate !== null) {\n // Strict mode is handled by the schema itself (using z.object().strict())\n // This option documents the intent but the actual strictness comes from the schema\n }\n\n try {\n // Attempt to parse with the schema\n schema.parse(valueToValidate);\n\n return {\n pass: true,\n message: 'Response matches schema',\n };\n } catch (error) {\n const zodError = error as ZodError;\n const issues = formatZodIssues(zodError);\n\n const text = stringifyResponse(response);\n return {\n pass: false,\n message: `Response does not match schema: ${issues}`,\n details: {\n issues: zodError.issues,\n textPreview: truncateForDisplay(text),\n },\n };\n }\n}\n\n/**\n * Extracts a validatable value from a response\n *\n * Handles various response formats:\n * - NormalizedToolResponse: extracts structuredContent or parses text\n * - CallToolResult: extracts structuredContent or parses content\n * - Plain objects: used directly\n * - Strings: parsed as JSON\n */\nfunction getValidatableValue(response: unknown): unknown {\n if (response === null || response === undefined) {\n return null;\n }\n\n // Plain object - use directly (might be a schema-ready value)\n if (typeof response === 'object' && !Array.isArray(response)) {\n const r = response as Record<string, unknown>;\n\n // Check for structuredContent (MCP response with structured data)\n if ('structuredContent' in r && r.structuredContent !== undefined) {\n return r.structuredContent;\n }\n\n // Check for normalized response format\n if ('raw' in r && 'text' in r && 'isError' in r && 'contentBlocks' in r) {\n // It's a NormalizedToolResponse\n if (r.structuredContent !== undefined) {\n return r.structuredContent;\n }\n // Try to parse text as JSON\n const text = r.text as string;\n return tryParseJson(text) ?? response;\n }\n\n // Check for raw CallToolResult format\n if ('content' in r && Array.isArray(r.content)) {\n // Try to extract and parse text content\n const text = extractText(response);\n return tryParseJson(text) ?? response;\n }\n\n // Regular object - use as-is\n return response;\n }\n\n // String - try to parse as JSON\n if (typeof response === 'string') {\n return tryParseJson(response) ?? response;\n }\n\n // Array or primitive - use directly\n return response;\n}\n\n/**\n * Attempts to parse a string as JSON\n */\nfunction tryParseJson(text: string): unknown {\n if (!text || typeof text !== 'string') {\n return null;\n }\n\n const trimmed = text.trim();\n // Quick check for JSON-like strings\n if (\n !(trimmed.startsWith('{') || trimmed.startsWith('[')) ||\n !(trimmed.endsWith('}') || trimmed.endsWith(']'))\n ) {\n return null;\n }\n\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\n/**\n * Formats Zod issues into a human-readable string\n */\nfunction formatZodIssues(error: ZodError): string {\n const issues = error.issues.map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\n return `${path}: ${issue.message}`;\n });\n\n return issues.join('; ');\n}\n\nfunction truncateForDisplay(str: string, maxLength = 200): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Text Validator\n *\n * Validates that a response contains expected text substrings.\n */\n\nimport type { ValidationResult, TextValidatorOptions } from './types.js';\nimport { extractText } from './utils.js';\n\n/**\n * Validates that a response contains all expected text substrings\n *\n * Extracts text from the response and checks that each expected substring\n * is present. By default, matching is case-sensitive.\n *\n * @param response - The response to validate\n * @param expected - Expected substring(s) to find\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * const result = validateText(response, ['temperature', 'conditions']);\n * if (!result.pass) {\n * console.log(result.message);\n * }\n *\n * // Case-insensitive matching\n * const result2 = validateText(response, 'HELLO', { caseSensitive: false });\n * ```\n */\nexport function validateText(\n response: unknown,\n expected: string | string[],\n options: TextValidatorOptions = {}\n): ValidationResult {\n const { caseSensitive = true } = options;\n\n // Normalize expected to array\n const expectedStrings = Array.isArray(expected) ? expected : [expected];\n\n // Extract text from response\n const text = extractText(response);\n\n // Apply case sensitivity\n const compareText = caseSensitive ? text : text.toLowerCase();\n\n // Check each expected substring\n const missing: string[] = [];\n for (const substring of expectedStrings) {\n const compareSubstring = caseSensitive\n ? substring\n : substring.toLowerCase();\n\n if (!compareText.includes(compareSubstring)) {\n missing.push(substring);\n }\n }\n\n if (missing.length === 0) {\n return {\n pass: true,\n message:\n expectedStrings.length === 1\n ? `Response contains expected text`\n : `Response contains all ${expectedStrings.length} expected substrings`,\n };\n }\n\n return {\n pass: false,\n message:\n missing.length === 1\n ? `Response does not contain expected text: \"${missing[0]}\"`\n : `Response is missing ${missing.length} expected substrings: ${missing.map((s) => `\"${s}\"`).join(', ')}`,\n details: {\n missing,\n textLength: text.length,\n textPreview: truncateForDisplay(text),\n },\n };\n}\n\n/**\n * Truncates a string for display in error messages\n */\nfunction truncateForDisplay(str: string, maxLength = 200): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Pattern Validator\n *\n * Validates that a response matches regex patterns.\n */\n\nimport type { ValidationResult, PatternValidatorOptions } from './types.js';\nimport { extractText } from './utils.js';\n\n/**\n * Validates that a response matches all expected regex patterns\n *\n * Extracts text from the response and checks that each pattern matches.\n * Patterns can be strings (which are compiled to RegExp) or RegExp objects.\n *\n * @param response - The response to validate\n * @param patterns - Expected pattern(s) to match\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * // String pattern\n * const result = validatePattern(response, 'temperature: \\\\d+');\n *\n * // RegExp pattern\n * const result2 = validatePattern(response, /temperature: \\d+/);\n *\n * // Multiple patterns\n * const result3 = validatePattern(response, [\n * /temperature: \\d+/,\n * /humidity: \\d+%/,\n * ]);\n *\n * // Case-insensitive matching\n * const result4 = validatePattern(response, 'HELLO', { caseSensitive: false });\n * ```\n */\nexport function validatePattern(\n response: unknown,\n patterns: string | RegExp | (string | RegExp)[],\n options: PatternValidatorOptions = {}\n): ValidationResult {\n const { caseSensitive = true } = options;\n const caseInsensitive = !caseSensitive;\n\n // Normalize patterns to array\n const patternList = Array.isArray(patterns) ? patterns : [patterns];\n\n // Extract text from response\n const text = extractText(response);\n\n // Check each pattern\n const unmatched: string[] = [];\n for (const pattern of patternList) {\n const regex = toRegExp(pattern, caseInsensitive);\n if (!regex.test(text)) {\n unmatched.push(patternToString(pattern));\n }\n }\n\n if (unmatched.length === 0) {\n return {\n pass: true,\n message:\n patternList.length === 1\n ? `Response matches pattern`\n : `Response matches all ${patternList.length} patterns`,\n };\n }\n\n return {\n pass: false,\n message:\n unmatched.length === 1\n ? `Response does not match pattern: ${unmatched[0]}`\n : `Response does not match ${unmatched.length} patterns: ${unmatched.join(', ')}`,\n details: {\n unmatched,\n textLength: text.length,\n textPreview: truncateForDisplay(text),\n },\n };\n}\n\n/**\n * Converts a pattern to a RegExp\n */\nfunction toRegExp(pattern: string | RegExp, caseInsensitive: boolean): RegExp {\n if (pattern instanceof RegExp) {\n // If caseInsensitive option is set but regex doesn't have it, add it\n if (caseInsensitive && !pattern.flags.includes('i')) {\n return new RegExp(pattern.source, pattern.flags + 'i');\n }\n return pattern;\n }\n\n // Compile string to RegExp\n const flags = caseInsensitive ? 'i' : '';\n return new RegExp(pattern, flags);\n}\n\n/**\n * Converts a pattern to a display string\n */\nfunction patternToString(pattern: string | RegExp): string {\n if (pattern instanceof RegExp) {\n return pattern.toString();\n }\n return `/${pattern}/`;\n}\n\n/**\n * Truncates a string for display in error messages\n */\nfunction truncateForDisplay(str: string, maxLength = 200): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Error Validator\n *\n * Validates error response behavior.\n */\n\nimport type { ValidationResult } from './types.js';\nimport { isErrorResponse, extractErrorMessage, extractText } from './utils.js';\n\n/**\n * Validates that a response is (or is not) an error\n *\n * Can check for:\n * - Any error (expected = true)\n * - No error (expected = false)\n * - Error with specific message(s) (expected = string or string[])\n *\n * @param response - The response to validate\n * @param expected - What to expect (true for any error, false for no error, string for specific message)\n * @returns Validation result\n *\n * @example\n * ```typescript\n * // Expect any error\n * const result = validateError(response, true);\n *\n * // Expect no error\n * const result2 = validateError(response, false);\n *\n * // Expect error with specific message\n * const result3 = validateError(response, 'File not found');\n *\n * // Expect error containing one of several messages\n * const result4 = validateError(response, ['not found', 'does not exist']);\n * ```\n */\nexport function validateError(\n response: unknown,\n expected: boolean | string | string[] = true\n): ValidationResult {\n const actualIsError = isErrorResponse(response);\n const errorMessage = actualIsError ? extractErrorMessage(response) : '';\n\n // Handle boolean expectation\n if (typeof expected === 'boolean') {\n if (expected) {\n // Expect an error\n if (actualIsError) {\n return {\n pass: true,\n message: 'Response is an error as expected',\n };\n }\n return {\n pass: false,\n message: 'Expected an error response but got success',\n details: {\n textPreview: truncateForDisplay(extractText(response)),\n },\n };\n } else {\n // Expect no error\n if (!actualIsError) {\n return {\n pass: true,\n message: 'Response is not an error as expected',\n };\n }\n return {\n pass: false,\n message: `Expected a success response but got error: \"${truncateForDisplay(errorMessage)}\"`,\n details: {\n errorMessage,\n },\n };\n }\n }\n\n // Handle string or string[] expectation\n const expectedMessages = Array.isArray(expected) ? expected : [expected];\n\n // Must be an error first\n if (!actualIsError) {\n return {\n pass: false,\n message: `Expected an error containing \"${expectedMessages[0]}\" but got success`,\n details: {\n textPreview: truncateForDisplay(extractText(response)),\n },\n };\n }\n\n // Check if error message contains any of the expected strings\n const matched = expectedMessages.some((msg) =>\n errorMessage.toLowerCase().includes(msg.toLowerCase())\n );\n\n if (matched) {\n return {\n pass: true,\n message: 'Error message contains expected text',\n };\n }\n\n return {\n pass: false,\n message:\n expectedMessages.length === 1\n ? `Error message does not contain \"${expectedMessages[0]}\"`\n : `Error message does not contain any of: ${expectedMessages.map((m) => `\"${m}\"`).join(', ')}`,\n details: {\n actualErrorMessage: errorMessage,\n expectedToContain: expectedMessages,\n },\n };\n}\n\n/**\n * Truncates a string for display in error messages\n */\nfunction truncateForDisplay(str: string, maxLength = 200): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.slice(0, maxLength) + '... (truncated)';\n}\n","/**\n * Size Validator\n *\n * Validates that a response meets size constraints.\n */\n\nimport type { ValidationResult, SizeValidatorOptions } from './types.js';\nimport { getResponseSizeBytes } from './utils.js';\n\n/**\n * Validates that a response meets size constraints\n *\n * Checks that the response size in bytes is within the specified bounds.\n * At least one of minBytes or maxBytes must be provided.\n *\n * @param response - The response to validate\n * @param options - Size constraints\n * @returns Validation result\n *\n * @example\n * ```typescript\n * // Maximum size check\n * const result = validateSize(response, { maxBytes: 10000 });\n *\n * // Minimum size check\n * const result2 = validateSize(response, { minBytes: 100 });\n *\n * // Both bounds\n * const result3 = validateSize(response, { minBytes: 100, maxBytes: 10000 });\n * ```\n */\nexport function validateSize(\n response: unknown,\n options: SizeValidatorOptions\n): ValidationResult {\n const { maxBytes, minBytes } = options;\n\n // Require at least one bound\n if (maxBytes === undefined && minBytes === undefined) {\n return {\n pass: false,\n message: 'Size validation requires at least one of maxBytes or minBytes',\n };\n }\n\n const actualSize = getResponseSizeBytes(response);\n const issues: string[] = [];\n\n // Check minimum\n if (minBytes !== undefined && actualSize < minBytes) {\n issues.push(\n `Response size (${formatBytes(actualSize)}) is below minimum (${formatBytes(minBytes)})`\n );\n }\n\n // Check maximum\n if (maxBytes !== undefined && actualSize > maxBytes) {\n issues.push(\n `Response size (${formatBytes(actualSize)}) exceeds maximum (${formatBytes(maxBytes)})`\n );\n }\n\n if (issues.length === 0) {\n return {\n pass: true,\n message: `Response size (${formatBytes(actualSize)}) is within bounds`,\n details: {\n actualBytes: actualSize,\n },\n };\n }\n\n return {\n pass: false,\n message: issues.join('; '),\n details: {\n actualBytes: actualSize,\n minBytes,\n maxBytes,\n },\n };\n}\n\n/**\n * Formats bytes as a human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} bytes`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/**\n * Tool call validators for mcp_host simulation results.\n *\n * These validators extract the tool call trace from an MCPHostSimulationResult\n * and apply assertions against expected call lists and counts.\n */\nimport type { ValidationResult } from './types.js';\nimport type {\n MCPHostSimulationResult,\n LLMToolCall,\n} from '../../evals/mcpHost/mcpHostTypes.js';\n\nexport interface ToolCallExpectation {\n calls: Array<{\n name: string;\n arguments?: Record<string, unknown>;\n required?: boolean;\n }>;\n order?: 'strict' | 'any';\n exclusive?: boolean;\n}\n\nexport interface ToolCallCountOptions {\n min?: number;\n max?: number;\n exact?: number;\n}\n\nfunction isSimulationResult(value: unknown): value is MCPHostSimulationResult {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'success' in value &&\n 'toolCalls' in value &&\n Array.isArray((value as MCPHostSimulationResult).toolCalls)\n );\n}\n\n/**\n * Checks whether a value is a `{ $pattern: \"regex\" }` matcher object.\n */\nfunction isPatternMatcher(\n v: unknown\n): v is { $pattern: string; $flags?: string } {\n return (\n typeof v === 'object' &&\n v !== null &&\n '$pattern' in v &&\n typeof (v as Record<string, unknown>)['$pattern'] === 'string'\n );\n}\n\nfunction partialMatch(\n actual: Record<string, unknown>,\n expected: Record<string, unknown>\n): boolean {\n return Object.entries(expected).every(([k, v]) => {\n const actualVal = actual[k];\n\n // { $pattern: \"regex\", $flags?: \"i\" } — match actual string against regex\n if (isPatternMatcher(v)) {\n if (typeof actualVal !== 'string') return false;\n const re = new RegExp(v.$pattern, v.$flags);\n return re.test(actualVal);\n }\n\n if (\n typeof v === 'object' &&\n v !== null &&\n typeof actualVal === 'object' &&\n actualVal !== null\n ) {\n return partialMatch(\n actualVal as Record<string, unknown>,\n v as Record<string, unknown>\n );\n }\n // Key order in nested objects is handled by recursion — this branch only\n // reaches leaf primitives (strings, numbers, booleans, null) and arrays,\n // where JSON.stringify comparison is correct.\n return JSON.stringify(actualVal) === JSON.stringify(v);\n });\n}\n\nfunction findMatchingCall(\n actual: LLMToolCall[],\n expected: ToolCallExpectation['calls'][number],\n startIndex = 0\n): number {\n for (let i = startIndex; i < actual.length; i++) {\n const call = actual[i]!;\n if (call.name !== expected.name) continue;\n if (\n expected.arguments !== undefined &&\n !partialMatch(call.arguments ?? {}, expected.arguments)\n ) {\n continue;\n }\n return i;\n }\n return -1;\n}\n\n/**\n * Validates tool calls made during an MCP host simulation.\n *\n * @param response - Must be an MCPHostSimulationResult (from mcp_host mode)\n * @param expectation - Expected tool call specification\n */\nexport function validateToolCalls(\n response: unknown,\n expectation: ToolCallExpectation\n): ValidationResult {\n if (!isSimulationResult(response)) {\n return {\n pass: false,\n message:\n 'toolsTriggered expectation requires mcp_host mode — response must be an MCPHostSimulationResult',\n };\n }\n\n const actual = response.toolCalls;\n\n // Compute recall: fraction of required calls that were made\n const requiredCalls = expectation.calls.filter((c) => c.required !== false);\n const calledRequiredCount = requiredCalls.filter(\n (expected) => findMatchingCall(actual, expected) !== -1\n ).length;\n const recall =\n requiredCalls.length > 0 ? calledRequiredCount / requiredCalls.length : 1.0;\n\n // Compute precision: fraction of actual calls that were expected.\n // Always computed so the metric reflects actual tool call efficiency.\n // Whether unexpected calls cause a FAILURE is controlled separately by exclusive=true (lines below).\n const allowedNames = new Set(expectation.calls.map((c) => c.name));\n const precision =\n actual.length > 0\n ? actual.filter((c) => allowedNames.has(c.name)).length / actual.length\n : 1.0;\n\n const metrics = { precision, recall };\n\n const order = expectation.order ?? 'any';\n\n if (order === 'strict') {\n // All calls must appear in the specified sequence\n let searchFrom = 0;\n for (const expected of expectation.calls) {\n const idx = findMatchingCall(actual, expected, searchFrom);\n if (idx === -1) {\n if (expected.required !== false) {\n return {\n pass: false,\n message: `Expected tool '${expected.name}' to be called in sequence (starting from position ${searchFrom}), but it was not found`,\n details: {\n actual: actual.map((c) => c.name),\n expected: expected.name,\n },\n metrics,\n };\n }\n } else {\n searchFrom = idx + 1;\n }\n }\n } else {\n // Any order: each required call must appear somewhere\n const required = expectation.calls.filter((c) => c.required !== false);\n for (const expected of required) {\n const idx = findMatchingCall(actual, expected);\n if (idx === -1) {\n const argsNote =\n expected.arguments !== undefined\n ? ` with args ${JSON.stringify(expected.arguments)}`\n : '';\n return {\n pass: false,\n message: `Expected tool '${expected.name}'${argsNote} to be called, but it was not`,\n details: {\n actual: actual.map((c) => c.name),\n expected: expected.name,\n },\n metrics,\n };\n }\n }\n }\n\n if (expectation.exclusive === true) {\n const unexpected = actual.filter((c) => !allowedNames.has(c.name));\n if (unexpected.length > 0) {\n const names = unexpected.map((c) => `'${c.name}'`).join(', ');\n return {\n pass: false,\n message: `Unexpected tool calls: ${names}. Only ${[...allowedNames].map((n) => `'${n}'`).join(', ')} are allowed`,\n details: {\n actual: actual.map((c) => c.name),\n unexpected: unexpected.map((c) => c.name),\n },\n metrics,\n };\n }\n }\n\n return { pass: true, message: 'All tool call expectations met', metrics };\n}\n\n/**\n * Validates the number of tool calls made during an MCP host simulation.\n *\n * @param response - Must be an MCPHostSimulationResult (from mcp_host mode)\n * @param options - Count constraints (min, max, exact)\n */\nexport function validateToolCallCount(\n response: unknown,\n options: ToolCallCountOptions\n): ValidationResult {\n if (!isSimulationResult(response)) {\n return {\n pass: false,\n message:\n 'toolCallCount expectation requires mcp_host mode — response must be an MCPHostSimulationResult',\n };\n }\n\n const count = response.toolCalls.length;\n const { min, max, exact } = options;\n\n if (exact !== undefined && count !== exact) {\n return {\n pass: false,\n message: `Expected exactly ${exact} tool call(s), but got ${count}`,\n details: { actual: count, expected: exact },\n };\n }\n\n if (min !== undefined && count < min) {\n return {\n pass: false,\n message: `Expected at least ${min} tool call(s), but got ${count}`,\n details: { actual: count, min },\n };\n }\n\n if (max !== undefined && count > max) {\n return {\n pass: false,\n message: `Expected at most ${max} tool call(s), but got ${count}`,\n details: { actual: count, max },\n };\n }\n\n return {\n pass: true,\n message: `Tool call count (${count}) is within expected range`,\n };\n}\n","/**\n * Built-in judge rubrics matching Glean EvalV2's named judge types.\n * Use these for consistent, standardized evaluations across teams.\n *\n * All built-in rubrics use a 5-point scale: 0.0 / 0.25 / 0.5 / 0.75 / 1.0\n */\nexport type BuiltInRubric =\n | 'correctness'\n | 'completeness'\n | 'groundedness'\n | 'instruction-following'\n | 'conciseness';\n\nexport const BUILT_IN_RUBRICS: Record<BuiltInRubric, string> = {\n correctness:\n 'Evaluate whether the response is factually correct and accurately answers the question. ' +\n 'Compare against the reference answer if provided. ' +\n 'Score 1.0 for fully correct with no errors; ' +\n 'Score 0.75 for mostly correct with one minor inaccuracy or omission; ' +\n 'Score 0.5 for partially correct — answers part of the question but misses key elements; ' +\n 'Score 0.25 for minimally relevant but substantially incorrect or missing most key details; ' +\n 'Score 0.0 for incorrect, irrelevant, or directly contradicting the reference.',\n\n completeness:\n 'Evaluate whether the response fully addresses all aspects of the question. ' +\n 'Score 1.0 if the response covers all key points comprehensively; ' +\n 'Score 0.75 if the response covers most key points with one minor gap; ' +\n 'Score 0.5 if the response partially answers — covers some aspects but misses others; ' +\n 'Score 0.25 if the response touches on the topic but misses most key aspects; ' +\n 'Score 0.0 if major aspects of the question are entirely missing or the response is off-topic.',\n\n groundedness:\n 'Evaluate whether all claims in the response are supported by the retrieved context or reference. ' +\n 'Penalize unsupported assertions or hallucinated facts. ' +\n 'Score 1.0 for fully grounded — every claim is traceable to the provided context; ' +\n 'Score 0.75 for mostly grounded with one minor unsupported detail; ' +\n 'Score 0.5 for partially grounded — some claims are supported but notable hallucinations are present; ' +\n 'Score 0.25 for minimally grounded — most claims are unsupported or invented; ' +\n 'Score 0.0 for completely hallucinated or contradicting the provided context.',\n\n 'instruction-following':\n 'Evaluate whether the response follows the instructions given in the question. ' +\n 'Check format, tone, constraints, and task completion. ' +\n 'Score 1.0 for full compliance — all instructions are followed precisely; ' +\n 'Score 0.75 for mostly compliant with one minor deviation from the instructions; ' +\n 'Score 0.5 for partial compliance — some instructions followed but key constraints violated; ' +\n 'Score 0.25 for minimal compliance — the response loosely addresses the task but ignores most instructions; ' +\n 'Score 0.0 for non-compliance — the response disregards the instructions entirely.',\n\n conciseness:\n 'Evaluate whether the response is appropriately concise without losing important information. ' +\n 'Penalize unnecessary verbosity, padding, or repetition. ' +\n 'Score 1.0 for well-sized — concise and complete with no unnecessary content; ' +\n 'Score 0.75 for slightly verbose but no information is lost or repeated; ' +\n 'Score 0.5 for moderately verbose — some padding or repetition that reduces clarity; ' +\n 'Score 0.25 for excessively verbose — significantly overlong with substantial filler or repetition; ' +\n 'Score 0.0 for extremely verbose — so padded or repetitive that the core answer is obscured.',\n};\n\n/** A rubric specification: either a built-in named rubric or custom text. */\nexport type RubricSpec = BuiltInRubric | { text: string };\n\n/**\n * Returns true if `s` is a built-in rubric name.\n */\nexport function isBuiltInRubric(s: unknown): s is BuiltInRubric {\n return typeof s === 'string' && s in BUILT_IN_RUBRICS;\n}\n\n/**\n * Resolves a RubricSpec to its full rubric text.\n * - Built-in name → returns the expanded rubric text from BUILT_IN_RUBRICS\n * - Custom object → returns rubric.text as-is\n */\nexport function resolveRubric(rubric: RubricSpec): string {\n if (typeof rubric === 'string') {\n return BUILT_IN_RUBRICS[rubric];\n }\n return rubric.text;\n}\n","import { z } from 'zod';\n\n/**\n * Zod schema for validating judge LLM responses.\n * Ensures the response has the required structure before it is used.\n */\nexport const JudgeResponseSchema = z.object({\n pass: z.boolean(),\n score: z.number().min(0).max(1),\n reasoning: z.string(),\n});\n\n/**\n * The validated shape returned by a judge LLM.\n */\nexport type JudgeResponse = z.infer<typeof JudgeResponseSchema>;\n\n/**\n * Usage metrics from Claude Agent SDK response\n */\nexport interface UsageMetrics {\n /**\n * Number of input tokens consumed\n */\n inputTokens: number;\n\n /**\n * Number of output tokens generated\n */\n outputTokens: number;\n\n /**\n * Total cost in USD\n */\n totalCostUsd: number;\n\n /**\n * Execution duration in milliseconds\n */\n durationMs: number;\n\n /**\n * API call duration in milliseconds (excluding network overhead)\n */\n durationApiMs?: number;\n\n /**\n * Number of tokens read from cache\n */\n cacheReadInputTokens?: number;\n\n /**\n * Number of tokens written to cache\n */\n cacheCreationInputTokens?: number;\n}\n\n/** Valid LLM judge provider kinds. */\nexport type ProviderKind =\n | 'anthropic'\n | 'vertex-anthropic'\n | 'anthropic-agent-sdk'\n | 'openai'\n | 'google';\n\n/**\n * Configuration for an LLM judge\n */\nexport interface JudgeConfig {\n /**\n * LLM provider to use\n * @default 'anthropic'\n */\n provider?: ProviderKind;\n\n /**\n * Environment variable name containing the API key\n * @default 'ANTHROPIC_API_KEY'\n */\n apiKeyEnvVar?: string;\n\n /**\n * Model to use for judging\n * @default 'claude-sonnet-4-20250514'\n */\n model?: string;\n\n /**\n * Maximum tokens for response\n * @default 1000\n */\n maxTokens?: number;\n\n /**\n * Temperature (0-1, lower is more deterministic)\n * @default 0.0\n */\n temperature?: number;\n\n /**\n * Maximum budget in USD for the judge evaluation\n * @default 0.10\n */\n maxBudgetUsd?: number;\n\n /**\n * Maximum size (in bytes) for tool output before failing the test\n * When set, the judge will fail if the candidate response exceeds this size\n */\n maxToolOutputSize?: number;\n}\n\n/**\n * Result from LLM judge evaluation\n */\nexport interface JudgeResult {\n /**\n * Whether the evaluation passed\n */\n pass: boolean;\n\n /**\n * Numeric score (0-1, where 1 is best)\n */\n score?: number;\n\n /**\n * Reasoning/explanation from the judge\n */\n reasoning?: string;\n\n /**\n * Usage metrics from the Claude Agent SDK\n */\n usage?: UsageMetrics;\n\n /**\n * Size of the candidate response in bytes (for maxToolOutputSize tracking)\n */\n candidateSizeBytes?: number;\n\n /**\n * Whether the candidate exceeded maxToolOutputSize\n */\n exceedsMaxToolOutputSize?: boolean;\n\n /**\n * Standard deviation of individual rep scores.\n * Only populated when the judge was run with reps > 1.\n */\n scoreStdDev?: number;\n\n /**\n * True when the standard deviation across reps exceeds 0.2, indicating\n * that the rubric may be ambiguous or the judge is non-deterministic.\n * Only populated when the judge was run with reps > 1.\n */\n highVariance?: boolean;\n\n /**\n * Individual scores from each judge rep.\n * Only populated when the judge was run with reps > 1.\n */\n scores?: number[];\n}\n\nexport type { BuiltInRubric, RubricSpec } from './rubrics.js';\nexport { BUILT_IN_RUBRICS, resolveRubric, isBuiltInRubric } from './rubrics.js';\n\n/**\n * LLM judge client interface\n */\nexport interface Judge {\n /**\n * Evaluates a candidate response against a reference\n *\n * @param candidate - The actual response to evaluate\n * @param reference - The expected/reference response (or null if not applicable)\n * @param rubric - The evaluation rubric/criteria\n * @returns Evaluation result with usage metrics\n */\n evaluate(\n candidate: unknown,\n reference: unknown,\n rubric: string\n ): Promise<JudgeResult>;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\nimport type { Judge, JudgeConfig, JudgeResult } from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates an Anthropic-backed LLM judge using the Anthropic SDK directly.\n * Requires the `@anthropic-ai/sdk` package and an Anthropic API key.\n */\nexport function createAnthropicJudge(config: JudgeConfig = {}): Judge {\n const apiKeyEnvVar = config.apiKeyEnvVar ?? 'ANTHROPIC_API_KEY';\n const apiKey = process.env[apiKeyEnvVar];\n if (!apiKey) {\n throw new Error(\n `Anthropic judge requires an API key. Set the ${apiKeyEnvVar} environment variable.`\n );\n }\n\n const model = config.model ?? 'claude-sonnet-4-20250514';\n const maxTokens = config.maxTokens ?? 1000;\n const temperature = config.temperature ?? 0.0;\n\n return {\n async evaluate(candidate, reference, rubric): Promise<JudgeResult> {\n let anthropicModule: any;\n try {\n // @ts-expect-error - optional: npm install @anthropic-ai/sdk\n anthropicModule = await import('@anthropic-ai/sdk');\n } catch (err) {\n throw new Error(\n 'Anthropic judge requires the `@anthropic-ai/sdk` package. ' +\n 'Install it with: npm install @anthropic-ai/sdk\\n' +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const client = new anthropicModule.default({ apiKey });\n const prompt = buildJudgePrompt(candidate, reference, rubric);\n\n const startTime = Date.now();\n const response = await client.messages.create({\n model,\n max_tokens: maxTokens,\n temperature,\n system:\n 'You are an expert evaluator. Respond with valid JSON only: {\"pass\": true|false, \"score\": 0.0-1.0, \"reasoning\": \"explanation\"}',\n messages: [{ role: 'user', content: prompt }],\n });\n const durationMs = Date.now() - startTime;\n\n const textBlock = (response.content as any[]).find(\n (b: any) => b.type === 'text'\n );\n const text = (textBlock?.text as string) ?? '';\n const parsed = parseJudgeResponse(text);\n\n return {\n pass: parsed.pass,\n score: parsed.score,\n reasoning: parsed.reasoning,\n usage: {\n inputTokens: (response.usage?.input_tokens as number) ?? 0,\n outputTokens: (response.usage?.output_tokens as number) ?? 0,\n totalCostUsd: 0,\n durationMs,\n },\n };\n },\n };\n}\n\nfunction buildJudgePrompt(\n candidate: unknown,\n reference: unknown,\n rubric: string\n): string {\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n return (\n `Rubric:\\n${rubric}\\n\\n` +\n `<candidate_response>\\n${candidateStr}\\n</candidate_response>\\n\\n` +\n `<reference_answer>\\n${referenceStr ?? 'No reference provided.'}\\n</reference_answer>\\n\\n` +\n `Evaluate and return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}`\n );\n}\n\nfunction parseJudgeResponse(text: string): {\n pass: boolean;\n score: number;\n reasoning: string;\n} {\n const cleaned = text\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n\n const result = JudgeResponseSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${cleaned.slice(0, 500)}\\nValidation errors: ${JSON.stringify(result.error.issues)}`\n );\n }\n return result.data;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\nimport type { Judge, JudgeConfig, JudgeResult } from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates an Anthropic-backed LLM judge that routes through Google Vertex AI.\n * Requires the `@anthropic-ai/vertex-sdk` package and Application Default Credentials.\n * Set GOOGLE_VERTEX_PROJECT and GOOGLE_VERTEX_LOCATION env vars.\n */\nexport function createVertexAnthropicJudge(config: JudgeConfig = {}): Judge {\n const model = config.model ?? 'claude-sonnet-4-20250514';\n const maxTokens = config.maxTokens ?? 1000;\n const temperature = config.temperature ?? 0.0;\n\n return {\n async evaluate(candidate, reference, rubric): Promise<JudgeResult> {\n let vertexModule: any;\n try {\n // @ts-expect-error - optional: npm install @anthropic-ai/vertex-sdk\n vertexModule = await import('@anthropic-ai/vertex-sdk');\n } catch (err) {\n throw new Error(\n 'Vertex Anthropic judge requires the `@anthropic-ai/vertex-sdk` package. ' +\n 'Install it with: npm install @anthropic-ai/vertex-sdk\\n' +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const client = new vertexModule.AnthropicVertex({\n projectId:\n process.env.GOOGLE_VERTEX_PROJECT ?? process.env.CLOUD_ML_PROJECT_ID,\n region: process.env.GOOGLE_VERTEX_LOCATION ?? 'us-east5',\n });\n\n const prompt = buildJudgePrompt(candidate, reference, rubric);\n\n const startTime = Date.now();\n const response = await client.messages.create({\n model,\n max_tokens: maxTokens,\n temperature,\n system:\n 'You are an expert evaluator. Respond with valid JSON only: {\"pass\": true|false, \"score\": 0.0-1.0, \"reasoning\": \"explanation\"}',\n messages: [{ role: 'user', content: prompt }],\n });\n const durationMs = Date.now() - startTime;\n\n const textBlock = (response.content as any[]).find(\n (b: any) => b.type === 'text'\n );\n const text = (textBlock?.text as string) ?? '';\n const parsed = parseJudgeResponse(text);\n\n return {\n pass: parsed.pass,\n score: parsed.score,\n reasoning: parsed.reasoning,\n usage: {\n inputTokens: (response.usage?.input_tokens as number) ?? 0,\n outputTokens: (response.usage?.output_tokens as number) ?? 0,\n totalCostUsd: 0,\n durationMs,\n },\n };\n },\n };\n}\n\nfunction buildJudgePrompt(\n candidate: unknown,\n reference: unknown,\n rubric: string\n): string {\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n return (\n `Rubric:\\n${rubric}\\n\\n` +\n `<candidate_response>\\n${candidateStr}\\n</candidate_response>\\n\\n` +\n `<reference_answer>\\n${referenceStr ?? 'No reference provided.'}\\n</reference_answer>\\n\\n` +\n `Evaluate and return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}`\n );\n}\n\nfunction parseJudgeResponse(text: string): {\n pass: boolean;\n score: number;\n reasoning: string;\n} {\n const cleaned = text\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n\n const result = JudgeResponseSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${cleaned.slice(0, 500)}\\nValidation errors: ${JSON.stringify(result.error.issues)}`\n );\n }\n return result.data;\n}\n","import { query } from '@anthropic-ai/claude-agent-sdk';\nimport type {\n JudgeConfig,\n Judge,\n JudgeResult,\n UsageMetrics,\n} from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates a Claude Agent SDK-based LLM judge client\n *\n * Uses the Claude Agent SDK query() function for evaluation.\n * This is a response-only judge that does not use any tools.\n *\n * @param config - Judge configuration\n * @returns Claude agent judge client\n */\nexport function createClaudeAgentJudge(config: JudgeConfig): Judge {\n const model = config.model ?? 'claude-sonnet-4-20250514';\n const maxBudgetUsd = config.maxBudgetUsd ?? 0.1;\n const maxToolOutputSize = config.maxToolOutputSize;\n\n return {\n async evaluate(\n candidate: unknown,\n reference: unknown,\n rubric: string\n ): Promise<JudgeResult> {\n // Calculate candidate size for threshold check\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n const candidateSizeBytes = Buffer.byteLength(candidateStr, 'utf8');\n\n // Check maxToolOutputSize threshold before calling API (fail fast, save money)\n if (\n maxToolOutputSize !== undefined &&\n candidateSizeBytes > maxToolOutputSize\n ) {\n return {\n pass: false,\n score: 0,\n reasoning: `Tool output size (${candidateSizeBytes} bytes) exceeds maximum allowed size (${maxToolOutputSize} bytes)`,\n candidateSizeBytes,\n exceedsMaxToolOutputSize: true,\n };\n }\n\n // Build evaluation prompt\n const prompt = buildJudgePrompt(candidate, reference, rubric);\n\n try {\n // Use query() with no tools for response-only mode\n // Iterate through the generator to get the final result message\n let resultMessage:\n | {\n type: 'result';\n result?: string;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n total_cost_usd?: number;\n duration_ms?: number;\n duration_api_ms?: number;\n subtype?: string;\n errors?: string[];\n }\n | undefined;\n\n for await (const message of query({\n prompt,\n options: {\n model,\n maxBudgetUsd,\n // Use empty tools array for response-only mode\n tools: [],\n // Bypass permissions since we're not using any tools\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n // Use a custom system prompt for JSON output\n systemPrompt: buildSystemPrompt(),\n // Limit to 1 turn since this is a simple evaluation\n maxTurns: 1,\n },\n })) {\n // The final message will be the SDKResultMessage\n if (message.type === 'result') {\n resultMessage = message as unknown as typeof resultMessage;\n }\n }\n\n if (!resultMessage) {\n throw new Error('No result message received from Claude Agent SDK');\n }\n\n // Check for errors\n if (\n resultMessage.subtype !== 'success' &&\n resultMessage.errors?.length\n ) {\n throw new Error(\n `Claude Agent SDK error: ${resultMessage.errors.join(', ')}`\n );\n }\n\n // Extract text response from the result\n const responseText = resultMessage.result ?? '';\n\n // Parse the JSON response\n const parsed = parseJudgeResponse(responseText);\n\n // Build usage metrics from SDK response\n const usage: UsageMetrics = {\n inputTokens: resultMessage.usage?.input_tokens ?? 0,\n outputTokens: resultMessage.usage?.output_tokens ?? 0,\n totalCostUsd: resultMessage.total_cost_usd ?? 0,\n durationMs: resultMessage.duration_ms ?? 0,\n durationApiMs: resultMessage.duration_api_ms,\n cacheReadInputTokens: resultMessage.usage?.cache_read_input_tokens,\n cacheCreationInputTokens:\n resultMessage.usage?.cache_creation_input_tokens,\n };\n\n return {\n pass: parsed.pass,\n score: parsed.score,\n reasoning: parsed.reasoning,\n usage,\n candidateSizeBytes,\n exceedsMaxToolOutputSize: false,\n };\n } catch (error) {\n throw new Error(\n `Claude Agent judge evaluation failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n },\n };\n}\n\n/**\n * Builds the system prompt for the judge\n */\nfunction buildSystemPrompt(): string {\n return (\n 'You are an expert evaluator. Evaluate the candidate response based on the rubric provided. ' +\n 'Respond ONLY with valid JSON in this exact format: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}. ' +\n 'Do not include any other text, markdown formatting, or code blocks.'\n );\n}\n\n/**\n * Builds the user prompt for evaluation\n */\nfunction buildJudgePrompt(\n candidate: unknown,\n reference: unknown,\n rubric: string\n): string {\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n const parts: Array<string> = [];\n\n parts.push('Rubric:\\n');\n parts.push(rubric);\n parts.push('\\n\\n<candidate_response>\\n');\n parts.push(candidateStr);\n parts.push('\\n</candidate_response>\\n\\n');\n\n parts.push('<reference_answer>\\n');\n parts.push(referenceStr ?? 'No reference provided.');\n parts.push('\\n</reference_answer>\\n\\n');\n\n parts.push(\n 'Evaluate the candidate response against the rubric' +\n (referenceStr !== null\n ? ', comparing it with the reference answer if helpful'\n : '') +\n '. Return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}'\n );\n\n return parts.join('');\n}\n\n/**\n * Parses and validates the JSON response from the judge, handling markdown code blocks.\n * Throws a descriptive error if the response cannot be parsed or fails schema validation.\n */\nfunction parseJudgeResponse(text: string): {\n pass: boolean;\n score: number;\n reasoning: string;\n} {\n let jsonText = text.trim();\n\n // Strip markdown code blocks if present\n if (jsonText.startsWith('```json')) {\n jsonText = jsonText.slice(7);\n }\n if (jsonText.startsWith('```')) {\n jsonText = jsonText.slice(3);\n }\n if (jsonText.endsWith('```')) {\n jsonText = jsonText.slice(0, -3);\n }\n jsonText = jsonText.trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonText);\n } catch {\n // If JSON parsing fails, try to extract from the text\n // Sometimes the model adds extra text before/after JSON\n const jsonMatch = jsonText.match(/\\{[\\s\\S]*\"pass\"[\\s\\S]*\\}/);\n if (jsonMatch) {\n parsed = JSON.parse(jsonMatch[0]);\n } else {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n }\n\n const result = JudgeResponseSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${jsonText.slice(0, 500)}\\nValidation errors: ${JSON.stringify(result.error.issues)}`\n );\n }\n return result.data;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\nimport type { Judge, JudgeConfig, JudgeResult } from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates an OpenAI-backed LLM judge.\n * Requires the `openai` package and an OpenAI API key.\n */\nexport function createOpenAIJudge(config: JudgeConfig = {}): Judge {\n const apiKeyEnvVar = config.apiKeyEnvVar ?? 'OPENAI_API_KEY';\n const apiKey = process.env[apiKeyEnvVar];\n if (!apiKey) {\n throw new Error(\n `OpenAI judge requires an API key. Set the ${apiKeyEnvVar} environment variable.`\n );\n }\n\n const model = config.model ?? 'gpt-4o';\n const maxTokens = config.maxTokens ?? 1000;\n const temperature = config.temperature ?? 0.0;\n\n return {\n async evaluate(candidate, reference, rubric): Promise<JudgeResult> {\n // Dynamic import keeps `openai` an optional runtime dep.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let openaiModule: any;\n try {\n // @ts-expect-error - optional: npm install openai\n openaiModule = await import('openai');\n } catch (err) {\n throw new Error(\n 'OpenAI judge requires the `openai` package. Install it with: npm install openai\\n' +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const client = new openaiModule.default({ apiKey });\n const prompt = buildJudgePrompt(candidate, reference, rubric);\n\n const startTime = Date.now();\n const completion = await client.chat.completions.create({\n model,\n max_tokens: maxTokens,\n temperature,\n messages: [\n {\n role: 'system',\n content:\n 'You are an expert evaluator. Respond with valid JSON only: {\"pass\": true|false, \"score\": 0.0-1.0, \"reasoning\": \"explanation\"}',\n },\n { role: 'user', content: prompt },\n ],\n });\n const durationMs = Date.now() - startTime;\n\n const text =\n (completion.choices[0]?.message.content as string | null | undefined) ??\n '';\n const parsed = parseJudgeResponse(text);\n\n return {\n pass: parsed.pass,\n score: parsed.score,\n reasoning: parsed.reasoning,\n usage: {\n inputTokens:\n (completion.usage?.prompt_tokens as number | undefined) ?? 0,\n outputTokens:\n (completion.usage?.completion_tokens as number | undefined) ?? 0,\n totalCostUsd: 0,\n durationMs,\n },\n };\n },\n };\n}\n\nfunction buildJudgePrompt(\n candidate: unknown,\n reference: unknown,\n rubric: string\n): string {\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n return (\n `Rubric:\\n${rubric}\\n\\n` +\n `<candidate_response>\\n${candidateStr}\\n</candidate_response>\\n\\n` +\n `<reference_answer>\\n${referenceStr ?? 'No reference provided.'}\\n</reference_answer>\\n\\n` +\n `Evaluate and return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}`\n );\n}\n\nfunction parseJudgeResponse(text: string): {\n pass: boolean;\n score: number;\n reasoning: string;\n} {\n const cleaned = text\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n\n const result = JudgeResponseSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${cleaned.slice(0, 500)}\\nValidation errors: ${JSON.stringify(result.error.issues)}`\n );\n }\n return result.data;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any */\nimport type { Judge, JudgeConfig, JudgeResult } from './judgeTypes.js';\nimport { JudgeResponseSchema } from './judgeTypes.js';\n\n/**\n * Creates a Google Gemini-backed LLM judge.\n * Requires the `@google/generative-ai` package and a Google API key.\n */\nexport function createGoogleJudge(config: JudgeConfig = {}): Judge {\n const apiKeyEnvVar = config.apiKeyEnvVar ?? 'GOOGLE_API_KEY';\n const apiKey = process.env[apiKeyEnvVar];\n if (!apiKey) {\n throw new Error(\n `Google judge requires an API key. Set the ${apiKeyEnvVar} environment variable.`\n );\n }\n\n const model = config.model ?? 'gemini-2.0-flash';\n const maxTokens = config.maxTokens ?? 1000;\n\n return {\n async evaluate(candidate, reference, rubric): Promise<JudgeResult> {\n // Dynamic import keeps `@google/generative-ai` an optional runtime dep.\n let googleModule: any;\n try {\n // @ts-expect-error - optional: npm install @google/generative-ai\n googleModule = await import('@google/generative-ai');\n } catch (err) {\n throw new Error(\n 'Google judge requires the `@google/generative-ai` package. Install it with: npm install @google/generative-ai\\n' +\n `Original error: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const genAI = new googleModule.GoogleGenerativeAI(apiKey);\n const gemini = genAI.getGenerativeModel({\n model,\n generationConfig: {\n maxOutputTokens: maxTokens,\n temperature: 0.0,\n },\n systemInstruction:\n 'You are an expert evaluator. Respond with valid JSON only: {\"pass\": true|false, \"score\": 0.0-1.0, \"reasoning\": \"explanation\"}',\n });\n\n const candidateStr =\n typeof candidate === 'string'\n ? candidate\n : JSON.stringify(candidate, null, 2);\n\n const referenceStr =\n reference !== null && reference !== undefined\n ? typeof reference === 'string'\n ? reference\n : JSON.stringify(reference, null, 2)\n : null;\n\n const prompt =\n `Rubric:\\n${rubric}\\n\\n` +\n `<candidate_response>\\n${candidateStr}\\n</candidate_response>\\n\\n` +\n `<reference_answer>\\n${referenceStr ?? 'No reference provided.'}\\n</reference_answer>\\n\\n` +\n `Evaluate and return JSON: {\"pass\": boolean, \"score\": number (0-1), \"reasoning\": string}`;\n\n const startTime = Date.now();\n const result = await gemini.generateContent(prompt);\n const durationMs = Date.now() - startTime;\n\n const text = result.response.text() as string;\n const cleaned = text\n .replace(/```json\\n?/g, '')\n .replace(/```\\n?/g, '')\n .trim();\n\n let parsedRaw: unknown;\n try {\n parsedRaw = JSON.parse(cleaned);\n } catch {\n throw new Error(`Failed to parse judge response as JSON: ${text}`);\n }\n\n const validation = JudgeResponseSchema.safeParse(parsedRaw);\n if (!validation.success) {\n throw new Error(\n `Judge returned invalid response. Expected {pass, score, reasoning} but got: ${cleaned.slice(0, 500)}\\nValidation errors: ${JSON.stringify(validation.error.issues)}`\n );\n }\n const { pass, score, reasoning } = validation.data;\n\n return {\n pass,\n score,\n reasoning,\n usage: {\n inputTokens:\n (result.response.usageMetadata?.promptTokenCount as\n | number\n | undefined) ?? 0,\n outputTokens:\n (result.response.usageMetadata?.candidatesTokenCount as\n | number\n | undefined) ?? 0,\n totalCostUsd: 0,\n durationMs,\n },\n };\n },\n };\n}\n","import type { Judge, JudgeConfig, ProviderKind } from './judgeTypes.js';\nimport { createAnthropicJudge } from './anthropicJudge.js';\nimport { createVertexAnthropicJudge } from './vertexAnthropicJudge.js';\nimport { createClaudeAgentJudge } from './claudeAgentJudge.js';\nimport { createOpenAIJudge } from './openaiJudge.js';\nimport { createGoogleJudge } from './googleJudge.js';\n\n/**\n * Creates an LLM judge for evaluating tool responses\n *\n * Uses Claude Agent SDK for evaluation with usage metrics tracking.\n *\n * @param config - Judge configuration\n * @returns Judge instance\n * @throws {Error} If provider is unsupported or configuration is invalid\n *\n * @example\n * // Default Claude judge\n * const judge = createJudge();\n *\n * @example\n * // With configuration\n * const judge = createJudge({\n * model: 'claude-sonnet-4-20250514',\n * maxToolOutputSize: 50000, // Fail if response > 50KB\n * maxBudgetUsd: 0.05,\n * });\n *\n * // Evaluate a response\n * const result = await judge.evaluate(\n * candidateResponse,\n * referenceResponse,\n * 'Evaluate for accuracy and completeness'\n * );\n *\n * // Access usage metrics\n * console.log('Cost:', result.usage?.totalCostUsd);\n * console.log('Tokens:', result.usage?.inputTokens, result.usage?.outputTokens);\n */\nexport function createJudge(config: JudgeConfig = {}): Judge {\n const provider: ProviderKind = config.provider ?? 'anthropic';\n\n switch (provider) {\n case 'anthropic':\n return createAnthropicJudge(config);\n\n case 'vertex-anthropic':\n return createVertexAnthropicJudge(config);\n\n case 'anthropic-agent-sdk':\n return createClaudeAgentJudge(config);\n\n case 'openai':\n return createOpenAIJudge(config);\n\n case 'google':\n return createGoogleJudge(config);\n\n default:\n throw new Error(\n `Unsupported LLM provider: ${String(provider)}. Valid providers: 'anthropic', 'vertex-anthropic', 'anthropic-agent-sdk', 'openai', 'google'`\n );\n }\n}\n","/**\n * Custom Judge Registry\n *\n * Allows consumers to register named judge executors that can be referenced\n * by string ID in eval fixtures and programmatic tests. This enables\n * multi-step judge pipelines (LLM call + post-processing), custom scoring\n * logic, and reusable judge configurations without duplicating rubrics.\n */\n\n/**\n * Result returned by a custom judge executor.\n *\n * Custom judges must return a normalized score (0–1). The framework applies\n * the caller's `threshold` (default 0.7) to determine pass/fail. This keeps\n * judges reusable — the same judge can be used with different thresholds in\n * different tests.\n */\nexport interface CustomJudgeResult {\n /** Normalized score (0–1, where 1 is best) */\n score: number;\n /** Optional reasoning/explanation */\n reasoning?: string;\n}\n\n/**\n * A user-defined judge executor function.\n *\n * Custom executors own their entire evaluation pipeline — prompt construction,\n * LLM calls, and post-processing — but return a normalized score. The framework\n * determines pass/fail by comparing the score against the caller's threshold.\n *\n * @param candidate - The actual response to evaluate\n * @param reference - Optional reference/expected response\n * @returns Evaluation result with a normalized score and optional reasoning\n *\n * @example\n * ```typescript\n * const completenessJudge: CustomJudgeExecutor = async (candidate, reference) => {\n * // Step 1: LLM call with your own prompt and schema\n * const llmResult = await callLLM(COMPLETENESS_PROMPT, candidate);\n * const { verdict, reasoning } = JSON.parse(llmResult);\n *\n * // Step 2: Deterministic post-processing into a normalized score\n * const score = { Complete: 1.0, Incomplete: 0.5 }[verdict] ?? 0.0;\n *\n * return { score, reasoning };\n * };\n * ```\n */\nexport type CustomJudgeExecutor = (\n candidate: unknown,\n reference?: unknown\n) => Promise<CustomJudgeResult>;\n\nconst registry = new Map<string, CustomJudgeExecutor>();\n\n/**\n * Registers a named custom judge executor.\n *\n * Call this in your test setup (e.g., `playwright.config.ts` or a global setup file)\n * before tests run. The name can then be referenced in JSON eval fixtures via the\n * `judge` field on `passesJudge`.\n *\n * @param name - Unique identifier for the judge\n * @param executor - The judge executor function\n * @throws {Error} If a judge with the same name is already registered\n *\n * @example\n * ```typescript\n * import { registerJudge } from '@gleanwork/mcp-server-tester';\n *\n * registerJudge('glean-completeness', async (candidate, reference) => {\n * // Step 1: LLM call with your own prompt and schema\n * const llmResult = await callLLM(COMPLETENESS_PROMPT, candidate);\n * const { verdict, reasoning } = JSON.parse(llmResult);\n *\n * // Step 2: Deterministic post-processing into a normalized score\n * const score = { Complete: 1.0, Incomplete: 0.5 }[verdict] ?? 0.0;\n *\n * return { score, reasoning };\n * });\n *\n * // Then in tests — same judge, different thresholds:\n * // expect(result).toPassToolJudge({ judge: 'glean-completeness', passingThreshold: 0.8 });\n * // expect(result).toPassToolJudge({ judge: 'glean-completeness', passingThreshold: 0.5 });\n * ```\n */\nexport function registerJudge(\n name: string,\n executor: CustomJudgeExecutor\n): void {\n const existing = registry.get(name);\n if (existing !== undefined) {\n if (existing === executor) {\n return; // same function re-registered (e.g., shared setup imported by multiple files)\n }\n throw new Error(\n `Judge \"${name}\" is already registered with a different executor. ` +\n `Use clearJudgeRegistry() first if you need to replace it.`\n );\n }\n registry.set(name, executor);\n}\n\n/**\n * Retrieves a registered custom judge executor by name.\n *\n * @param name - The judge name to look up\n * @returns The registered executor\n * @throws {Error} If no judge with the given name is registered\n */\nexport function getRegisteredJudge(name: string): CustomJudgeExecutor {\n const executor = registry.get(name);\n if (!executor) {\n const available =\n registry.size > 0\n ? ` Available judges: ${[...registry.keys()].join(', ')}`\n : ' No judges are registered.';\n throw new Error(\n `Judge \"${name}\" is not registered.${available} ` +\n `Register it with registerJudge() before tests run.`\n );\n }\n return executor;\n}\n\n/**\n * Clears all registered judges. Intended for test teardown.\n */\nexport function clearJudgeRegistry(): void {\n registry.clear();\n}\n","/**\n * Judge Validator\n *\n * Validates a response using an LLM-as-a-judge evaluation.\n */\n\nimport type { ValidationResult } from './types.js';\nimport type { ProviderKind } from '../../judge/judgeTypes.js';\nimport type { RubricSpec } from '../../judge/rubrics.js';\nimport { createJudge } from '../../judge/judgeClient.js';\nimport { resolveRubric } from '../../judge/rubrics.js';\nimport { getRegisteredJudge } from '../../judge/judgeRegistry.js';\n\n/**\n * Configuration for the judge validator\n */\nexport interface JudgeValidatorConfig {\n /**\n * The evaluation rubric: a built-in name or custom { text: string }.\n * Required when no named `judge` is specified.\n */\n rubric?: RubricSpec;\n /** Optional reference response to compare against */\n reference?: unknown;\n /** Minimum score required to pass (0-1, default: 0.7) */\n threshold?: number;\n /** Number of judge evaluations to run. Scores averaged. @default 1 */\n reps?: number;\n /** Judge provider. @default 'claude' */\n provider?: ProviderKind;\n /** Model override (e.g., 'claude-opus-4-20250514') */\n model?: string;\n /** Environment variable name for API key */\n apiKeyEnvVar?: string;\n /** Max tokens for judge response */\n maxTokens?: number;\n /** Temperature for judge LLM (0–1) */\n temperature?: number;\n /** Max budget in USD per evaluation */\n maxBudgetUsd?: number;\n /** Fail if response exceeds this size in bytes before judging */\n maxToolOutputSize?: number;\n /**\n * Name of a registered custom judge executor.\n * When set, the named judge handles the entire evaluation pipeline\n * and returns a normalized score. The `threshold` determines pass/fail.\n * Register judges with `registerJudge()` before tests run.\n */\n judge?: string;\n}\n\n/**\n * Validates a response using an LLM-as-a-judge evaluation\n *\n * Calls the configured judge with the response and rubric, then checks whether\n * the resulting score meets the threshold. Returns a ValidationResult compatible\n * with the unified assertion architecture.\n *\n * @param response - The response to evaluate\n * @param config - Judge evaluation configuration (rubric, reference, threshold, provider, model, etc.)\n * @returns Validation result indicating pass/fail with judge reasoning\n *\n * @example\n * ```typescript\n * const result = await validateJudge(\n * response,\n * { rubric: 'Does the response accurately describe the weather?' }\n * );\n * if (!result.pass) {\n * console.log(result.message);\n * }\n *\n * // With inline judge config and threshold\n * const result2 = await validateJudge(\n * response,\n * { rubric: 'Is this helpful?', threshold: 0.9, model: 'claude-opus-4-20250514', temperature: 0 }\n * );\n * ```\n */\n/**\n * Computes population standard deviation of an array of scores.\n * Returns 0 when there are fewer than 2 values.\n */\nfunction computeStdDev(scores: number[], mean: number): number {\n if (scores.length <= 1) return 0;\n const variance =\n scores.reduce((sum, s) => sum + (s - mean) ** 2, 0) / scores.length;\n return Math.sqrt(variance);\n}\n\nexport async function validateJudge(\n response: unknown,\n config: JudgeValidatorConfig\n): Promise<ValidationResult> {\n const {\n judge: judgeName,\n rubric,\n reference,\n threshold = 0.7,\n reps = 1,\n provider,\n model,\n apiKeyEnvVar,\n maxTokens,\n temperature,\n maxBudgetUsd,\n maxToolOutputSize,\n } = config;\n\n // Named custom judge — executor returns a score, threshold determines pass/fail\n if (judgeName !== undefined) {\n try {\n const executor = getRegisteredJudge(judgeName);\n const judgeResult = await executor(response, reference ?? undefined);\n\n const score = judgeResult.score;\n const passed = score >= threshold;\n\n return {\n pass: passed,\n message: passed\n ? `Custom judge \"${judgeName}\" passed with score ${score.toFixed(2)}`\n : `Custom judge \"${judgeName}\" failed with score ${score.toFixed(2)} (threshold: ${threshold}). ${judgeResult.reasoning ?? ''}`,\n };\n } catch (err) {\n return {\n pass: false,\n message: `Custom judge \"${judgeName}\" error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n // Built-in LLM judge — requires rubric\n if (rubric === undefined) {\n return {\n pass: false,\n message:\n 'Judge evaluation failed: either \"judge\" or \"rubric\" must be provided',\n };\n }\n\n const resolvedRubric = resolveRubric(rubric);\n\n const judgeConfig = {\n ...(provider !== undefined && { provider }),\n ...(model !== undefined && { model }),\n ...(apiKeyEnvVar !== undefined && { apiKeyEnvVar }),\n ...(maxTokens !== undefined && { maxTokens }),\n ...(temperature !== undefined && { temperature }),\n ...(maxBudgetUsd !== undefined && { maxBudgetUsd }),\n ...(maxToolOutputSize !== undefined && { maxToolOutputSize }),\n };\n\n try {\n const judge = createJudge(judgeConfig);\n\n const scores: number[] = [];\n let lastReasoning: string | undefined;\n\n for (let i = 0; i < reps; i++) {\n const judgeResult = await judge.evaluate(\n response,\n reference ?? null,\n resolvedRubric\n );\n scores.push(judgeResult.score ?? (judgeResult.pass ? 1.0 : 0.0));\n lastReasoning = judgeResult.reasoning;\n }\n\n if (scores.length === 0) {\n return {\n pass: false,\n message: 'Judge evaluation failed: no scores collected',\n };\n }\n\n const meanScore = scores.reduce((a, b) => a + b, 0) / scores.length;\n const passed = meanScore >= threshold;\n const repNote =\n reps > 1\n ? ` (mean of ${reps} reps: [${scores.map((s) => s.toFixed(2)).join(', ')}])`\n : '';\n\n let stdDev: number | undefined;\n let highVariance: boolean | undefined;\n\n if (reps > 1) {\n stdDev = computeStdDev(scores, meanScore);\n highVariance = stdDev > 0.2;\n\n if (highVariance) {\n console.warn(\n `[mcp-server-tester] Judge scores have high variance ` +\n `(stdDev=${stdDev.toFixed(2)}, scores=[${scores.map((s) => s.toFixed(2)).join(', ')}]). ` +\n `The rubric may be ambiguous.`\n );\n }\n }\n\n return {\n pass: passed,\n message: passed\n ? `Judge passed with score ${meanScore.toFixed(2)}${repNote}`\n : `Judge failed with score ${meanScore.toFixed(2)} (threshold: ${threshold})${repNote}. ${lastReasoning ?? ''}`,\n details: {\n score: meanScore,\n reasoning: lastReasoning,\n judgeProvider: provider ?? 'anthropic',\n judgeModel: model,\n ...(reps > 1 && {\n scores,\n scoreStdDev: stdDev,\n highVariance,\n }),\n },\n };\n } catch (err) {\n return {\n pass: false,\n message: `Judge evaluation error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n","/**\n * Validator Types\n *\n * Core types for the unified assertion architecture.\n * These types are used by both Playwright matchers and the eval runner.\n */\n\nimport type { ZodType } from 'zod';\n\n/**\n * Result of a validation operation\n */\nexport interface ValidationResult {\n /** Whether the validation passed */\n pass: boolean;\n /** Human-readable message explaining the result */\n message: string;\n /** Additional structured details about the validation */\n details?: Record<string, unknown>;\n /**\n * Optional quantitative metrics from the validation.\n * Populated by validateToolCalls for precision/recall.\n */\n metrics?: {\n precision?: number;\n recall?: number;\n };\n}\n\n/**\n * Options for text validation\n */\nexport interface TextValidatorOptions {\n /** Whether to perform case-sensitive matching (default: true) */\n caseSensitive?: boolean;\n}\n\n/**\n * Options for response size validation\n */\nexport interface SizeValidatorOptions {\n /** Maximum allowed size in bytes */\n maxBytes?: number;\n /** Minimum required size in bytes */\n minBytes?: number;\n}\n\n/**\n * Options for schema validation\n */\nexport interface SchemaValidatorOptions {\n /** Whether to use strict mode (fail on extra properties) */\n strict?: boolean;\n}\n\n/**\n * Options for pattern validation\n */\nexport interface PatternValidatorOptions {\n /** Whether to perform case-sensitive matching (default: true) */\n caseSensitive?: boolean;\n}\n\n/**\n * Built-in snapshot sanitizer names for use with toMatchToolSnapshot.\n * Pass these values in the sanitizers array to replace non-deterministic\n * values with stable placeholders before snapshot comparison.\n *\n * @example\n * expect(result).toMatchToolSnapshot('my-snapshot', [\n * SnapshotSanitizers.UUID,\n * SnapshotSanitizers.ISO_DATE,\n * ]);\n */\nexport const SnapshotSanitizers = {\n /** Replaces Unix timestamps (seconds and milliseconds) with a stable placeholder */\n TIMESTAMP: 'timestamp' as const,\n /** Replaces UUID v1-v5 strings with a stable placeholder */\n UUID: 'uuid' as const,\n /** Replaces ISO 8601 date/datetime strings with a stable placeholder */\n ISO_DATE: 'iso-date' as const,\n /** Replaces MongoDB ObjectId strings with a stable placeholder */\n OBJECT_ID: 'objectId' as const,\n /** Replaces JWT tokens with a stable placeholder */\n JWT: 'jwt' as const,\n} as const;\n\n/**\n * Built-in sanitizer names for common variable patterns\n */\nexport type BuiltInSanitizer =\n (typeof SnapshotSanitizers)[keyof typeof SnapshotSanitizers];\n\n/**\n * Custom regex-based sanitizer\n */\nexport interface RegexSanitizer {\n /** Regex pattern to match */\n pattern: string | RegExp;\n /** Replacement string (default: \"[SANITIZED]\") */\n replacement?: string;\n}\n\n/**\n * Field removal sanitizer - removes specified fields from objects\n */\nexport interface FieldRemovalSanitizer {\n /** Field paths to remove (supports dot notation for nested fields) */\n remove: string[];\n}\n\n/**\n * Snapshot sanitizer configuration\n *\n * Sanitizers transform response data before snapshot comparison,\n * allowing variable content (timestamps, IDs, etc.) to be normalized.\n *\n * Can be:\n * - A built-in sanitizer name: 'timestamp', 'uuid', 'iso-date', 'objectId', 'jwt'\n * - A regex sanitizer: { pattern: /regex/, replacement: '[REPLACED]' }\n * - A field removal sanitizer: { remove: ['field1', 'nested.field'] }\n */\nexport type SnapshotSanitizer =\n | BuiltInSanitizer\n | RegexSanitizer\n | FieldRemovalSanitizer;\n\n/**\n * Schema registry for named schemas in datasets\n */\nexport type SchemaRegistry = Record<string, ZodType>;\n","import type { TestInfo } from '@playwright/test';\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport type {\n Tool,\n CallToolResult,\n ListToolsResult,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { AuthType } from '../../types/index.js';\n\n// Re-export AuthType for backwards compatibility\nexport type { AuthType } from '../../types/index.js';\n\nconst DEFAULT_CALL_TIMEOUT_MS = 30_000;\n\nfunction withCallTimeout<T>(\n promise: Promise<T>,\n ms: number,\n opName: string\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () =>\n reject(\n new Error(`MCP operation \"${opName}\" timed out after ${ms}ms`)\n ),\n ms\n );\n }),\n ]).finally(() => clearTimeout(timer));\n}\n\n// Dynamic import of test for conditional step tracking\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet testStep:\n | ((name: string, fn: () => Promise<unknown>) => Promise<unknown>)\n | null = null;\n\n// Try to load test.step() dynamically\ntry {\n /* eslint-disable @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n const playwright = require('@playwright/test');\n if (playwright && playwright.test && playwright.test.step) {\n testStep = playwright.test.step.bind(playwright.test) as typeof testStep;\n }\n /* eslint-enable @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */\n} catch {\n // Not in a test context, that's fine\n}\n\n/**\n * Options for creating an MCP fixture\n */\nexport interface MCPFixtureOptions {\n /**\n * Authentication type used for this test\n * - 'oauth': Interactive OAuth 2.1 with PKCE (browser-based authentication)\n * - 'api-token': Static API token (e.g., from a dashboard or environment variable)\n * - 'none': No authentication\n */\n authType?: AuthType;\n\n /**\n * Playwright project name for this test\n * Used for filtering and grouping in the reporter\n */\n project?: string;\n\n /**\n * Timeout in milliseconds for MCP tool/list operations. Default: 30000\n */\n callTimeoutMs?: number;\n}\n\n/**\n * High-level API for interacting with MCP servers in tests\n *\n * This interface wraps the raw MCP Client with test-friendly methods\n */\nexport interface MCPFixtureApi {\n /**\n * The underlying MCP client (for advanced usage)\n */\n client: Client;\n\n /**\n * Authentication type used for this test session\n */\n authType: AuthType;\n\n /**\n * Playwright project name for this test session\n */\n project?: string;\n\n /**\n * Lists all available tools from the MCP server\n *\n * @returns Array of tool definitions\n */\n listTools(): Promise<Array<Tool>>;\n\n /**\n * Calls a tool on the MCP server\n *\n * @param name - Tool name\n * @param args - Tool arguments\n * @returns Tool call result\n */\n callTool<TArgs extends Record<string, unknown> = Record<string, unknown>>(\n name: string,\n args: TArgs\n ): Promise<CallToolResult>;\n\n /**\n * Gets information about the connected server\n */\n getServerInfo(): {\n name?: string;\n version?: string;\n } | null;\n}\n\n/**\n * Creates an MCP fixture wrapper around a Client, providing a high-level\n * {@link MCPFixtureApi} without requiring Playwright's `test.extend` pattern.\n *\n * Use this when you need to set up an MCP fixture manually — for example in\n * custom fixture hierarchies, non-Playwright test runners (e.g. Vitest,\n * Jest), or when you want to compose the fixture with other lifecycle\n * management logic that doesn't fit the standard `test.extend` model.\n *\n * For the typical Playwright use case, prefer importing `test` and `mcp`\n * directly from `@gleanwork/mcp-server-tester/fixtures/mcp`, which wires\n * this function up automatically.\n *\n * When `testInfo` is provided, all MCP operations are automatically wrapped\n * in `test.step()` calls and attachments are created for the MCP Test\n * Reporter. Omit `testInfo` for lightweight usage outside Playwright.\n *\n * @param client - The MCP client to wrap (created via `createMCPClientForConfig`)\n * @param testInfo - Optional Playwright TestInfo for auto-tracking and reporter attachments\n * @param options - Optional fixture options (authType, project)\n * @returns MCPFixtureApi instance\n *\n * @example\n * ```typescript\n * // Advanced: custom fixture setup inside test.extend\n * const test = base.extend<{ mcp: MCPFixtureApi }>({\n * mcp: async ({}, use, testInfo) => {\n * const client = await createMCPClientForConfig(config);\n * const api = createMCPFixture(client, testInfo, { authType: 'api-token' });\n * await use(api);\n * await closeMCPClient(client);\n * }\n * });\n *\n * // Non-Playwright usage (no reporter attachments)\n * const client = await createMCPClientForConfig(config);\n * const api = createMCPFixture(client);\n * const tools = await api.listTools();\n * ```\n */\nexport function createMCPFixture(\n client: Client,\n testInfo?: TestInfo,\n options?: MCPFixtureOptions\n): MCPFixtureApi {\n const authType = options?.authType ?? 'none';\n const project = options?.project;\n const callTimeout = options?.callTimeoutMs ?? DEFAULT_CALL_TIMEOUT_MS;\n // If no testInfo, return basic API without tracking\n if (!testInfo) {\n return {\n client,\n authType,\n project,\n\n async listTools(): Promise<Array<Tool>> {\n const result = await withCallTimeout(\n client.listTools() as Promise<ListToolsResult>,\n callTimeout,\n 'listTools'\n );\n return result.tools;\n },\n\n async callTool<TArgs extends Record<string, unknown>>(\n name: string,\n args: TArgs\n ): Promise<CallToolResult> {\n const result = await withCallTimeout(\n client.callTool({\n name,\n arguments: args,\n }) as Promise<CallToolResult>,\n callTimeout,\n `callTool(\"${name}\")`\n );\n return result;\n },\n\n getServerInfo() {\n const serverVersion = client.getServerVersion();\n if (!serverVersion) {\n return null;\n }\n return {\n name: serverVersion.name,\n version: serverVersion.version,\n };\n },\n };\n }\n\n // With testInfo, return tracked API\n return {\n client,\n authType,\n project,\n\n async listTools(): Promise<Array<Tool>> {\n const execute = async () => {\n const result = await withCallTimeout(\n client.listTools() as Promise<ListToolsResult>,\n callTimeout,\n 'listTools'\n );\n const tools = result.tools;\n\n // Auto-attach for reporter\n await testInfo.attach('mcp-list-tools', {\n contentType: 'application/json',\n body: JSON.stringify(\n {\n operation: 'listTools',\n toolCount: tools.length,\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n })),\n },\n null,\n 2\n ),\n });\n\n return tools;\n };\n\n // Wrap in test.step if available\n return (\n testStep ? testStep('MCP: listTools()', execute) : execute()\n ) as Promise<Array<Tool>>;\n },\n\n async callTool<TArgs extends Record<string, unknown>>(\n name: string,\n args: TArgs\n ): Promise<CallToolResult> {\n const execute = async () => {\n const startTime = Date.now();\n const result = await withCallTimeout(\n client.callTool({\n name,\n arguments: args,\n }) as Promise<CallToolResult>,\n callTimeout,\n `callTool(\"${name}\")`\n );\n const durationMs = Date.now() - startTime;\n\n // Auto-attach for reporter\n await testInfo.attach(`mcp-call-${name}`, {\n contentType: 'application/json',\n body: JSON.stringify(\n {\n operation: 'callTool',\n toolName: name,\n args,\n result,\n durationMs,\n isError: result.isError || false,\n authType,\n project,\n },\n null,\n 2\n ),\n });\n\n return result;\n };\n\n // Wrap in test.step if available\n return (\n testStep ? testStep(`MCP: callTool(\"${name}\")`, execute) : execute()\n ) as Promise<CallToolResult>;\n },\n\n getServerInfo() {\n const serverVersion = client.getServerVersion();\n const result = serverVersion\n ? {\n name: serverVersion.name,\n version: serverVersion.version,\n }\n : null;\n\n // Fire-and-forget attachment (don't block synchronous call)\n testInfo\n .attach('mcp-server-info', {\n contentType: 'application/json',\n body: JSON.stringify(\n {\n operation: 'getServerInfo',\n serverInfo: result,\n },\n null,\n 2\n ),\n })\n .catch((err) => {\n console.error('[MCPFixture] Failed to attach server info:', err);\n });\n\n return result;\n },\n };\n}\n","/**\n * toMatchToolResponse Matcher\n *\n * Validates that a response exactly matches an expected value.\n */\n\nimport { validateResponse } from '../validators/response.js';\n\n/**\n * Creates the toMatchToolResponse matcher function\n */\nexport function toMatchToolResponse(\n this: { isNot: boolean },\n received: unknown,\n expected: unknown\n) {\n const result = validateResponse(received, expected);\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n return result.pass\n ? 'Expected response NOT to match, but it did'\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toMatchToolSchema Matcher\n *\n * Validates that a response matches a Zod schema.\n */\n\nimport type { ZodType } from 'zod';\nimport { validateSchema } from '../validators/schema.js';\nimport type { SchemaValidatorOptions } from '../validators/types.js';\n\n/**\n * Creates the toMatchToolSchema matcher function\n */\nexport function toMatchToolSchema(\n this: { isNot: boolean },\n received: unknown,\n schema: ZodType,\n options: SchemaValidatorOptions = {}\n) {\n const result = validateSchema(received, schema, options);\n\n const preview = result.details?.textPreview as string | undefined;\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n return result.pass\n ? 'Expected response NOT to match schema, but it did'\n : result.message;\n }\n if (!result.pass && preview) {\n return `${result.message}\\n\\nActual response (truncated):\\n${preview}`;\n }\n return result.message;\n },\n };\n}\n","/**\n * toContainToolText Matcher\n *\n * Validates that a response contains expected text substrings.\n */\n\nimport { validateText } from '../validators/text.js';\nimport type { TextValidatorOptions } from '../validators/types.js';\n\n/**\n * Creates the toContainToolText matcher function\n */\nexport function toContainToolText(\n this: { isNot: boolean },\n received: unknown,\n expected: string | string[],\n options: TextValidatorOptions = {}\n) {\n const result = validateText(received, expected, options);\n\n const preview = result.details?.textPreview as string | undefined;\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n const expectedStr = Array.isArray(expected)\n ? expected.map((s) => `\"${s}\"`).join(', ')\n : `\"${expected}\"`;\n return result.pass\n ? `Expected response NOT to contain ${expectedStr}, but it did`\n : result.message;\n }\n if (!result.pass && preview) {\n return `${result.message}\\n\\nActual response (truncated):\\n${preview}`;\n }\n return result.message;\n },\n };\n}\n","/**\n * toMatchToolPattern Matcher\n *\n * Validates that a response matches regex patterns.\n */\n\nimport { validatePattern } from '../validators/pattern.js';\nimport type { PatternValidatorOptions } from '../validators/types.js';\n\n/**\n * Creates the toMatchToolPattern matcher function\n */\nexport function toMatchToolPattern(\n this: { isNot: boolean },\n received: unknown,\n patterns: string | RegExp | (string | RegExp)[],\n options: PatternValidatorOptions = {}\n) {\n const result = validatePattern(received, patterns, options);\n\n const preview = result.details?.textPreview as string | undefined;\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n return result.pass\n ? 'Expected response NOT to match pattern(s), but it did'\n : result.message;\n }\n if (!result.pass && preview) {\n return `${result.message}\\n\\nActual response (truncated):\\n${preview}`;\n }\n return result.message;\n },\n };\n}\n","/**\n * toMatchToolSnapshot Matcher\n *\n * Validates that a response matches a saved snapshot.\n * Uses Playwright's native snapshot testing functionality.\n */\n\nimport { expect as baseExpect } from '@playwright/test';\nimport type { SnapshotSanitizer } from '../validators/types.js';\nimport { extractText } from '../validators/utils.js';\n\n/**\n * Built-in regex patterns for common variable data\n */\nconst BUILT_IN_PATTERNS: Record<\n string,\n { pattern: RegExp; replacement: string }\n> = {\n timestamp: {\n pattern: /\\b\\d{10,13}\\b/g,\n replacement: '[TIMESTAMP]',\n },\n uuid: {\n pattern:\n /\\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\b/gi,\n replacement: '[UUID]',\n },\n 'iso-date': {\n pattern:\n /\\b\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?(Z|[+-]\\d{2}:?\\d{2})?)?\\b/g,\n replacement: '[ISO_DATE]',\n },\n objectId: {\n pattern: /\\b[0-9a-f]{24}\\b/gi,\n replacement: '[OBJECT_ID]',\n },\n jwt: {\n pattern: /\\beyJ[A-Za-z0-9_-]*\\.eyJ[A-Za-z0-9_-]*\\.[A-Za-z0-9_-]+\\b/g,\n replacement: '[JWT]',\n },\n};\n\n/**\n * Type guard for regex sanitizer\n */\nfunction isRegexSanitizer(\n sanitizer: SnapshotSanitizer\n): sanitizer is { pattern: string | RegExp; replacement?: string } {\n return (\n typeof sanitizer === 'object' &&\n sanitizer !== null &&\n 'pattern' in sanitizer\n );\n}\n\n/**\n * Type guard for field removal sanitizer\n */\nfunction isFieldRemovalSanitizer(\n sanitizer: SnapshotSanitizer\n): sanitizer is { remove: string[] } {\n return (\n typeof sanitizer === 'object' && sanitizer !== null && 'remove' in sanitizer\n );\n}\n\n/**\n * Apply sanitizers to a string value\n *\n * Handles three types of sanitizers:\n * 1. Built-in names: 'timestamp', 'uuid', 'iso-date', 'objectId', 'jwt'\n * 2. Regex sanitizers: { pattern: string | RegExp, replacement?: string }\n * 3. Field removal sanitizers: { remove: string[] } - only works on JSON strings\n */\nfunction applySanitizers(\n value: string,\n sanitizers: SnapshotSanitizer[]\n): string {\n let result = value;\n\n for (const sanitizer of sanitizers) {\n // Handle built-in sanitizer names\n if (typeof sanitizer === 'string') {\n const builtIn = BUILT_IN_PATTERNS[sanitizer];\n if (builtIn) {\n result = result.replace(builtIn.pattern, builtIn.replacement);\n }\n continue;\n }\n\n // Handle regex sanitizers\n if (isRegexSanitizer(sanitizer)) {\n let pattern: RegExp;\n if (sanitizer.pattern instanceof RegExp) {\n pattern = sanitizer.pattern;\n } else {\n try {\n pattern = new RegExp(sanitizer.pattern, 'g');\n } catch {\n throw new Error(\n `toMatchToolSnapshot: invalid regex pattern \"${sanitizer.pattern}\" in sanitizer`\n );\n }\n }\n const replacement = sanitizer.replacement ?? '[SANITIZED]';\n result = result.replace(pattern, replacement);\n continue;\n }\n\n // Handle field removal sanitizers\n if (isFieldRemovalSanitizer(sanitizer)) {\n try {\n const parsed: unknown = JSON.parse(result);\n removeFields(parsed, sanitizer.remove);\n result = JSON.stringify(parsed, null, 2);\n } catch {\n // Not valid JSON, skip field removal\n }\n }\n }\n\n return result;\n}\n\n/**\n * Remove fields from an object by dot-notation paths\n */\nfunction removeFields(obj: unknown, paths: string[]): void {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n\n for (const path of paths) {\n const parts = path.split('.');\n if (parts.length === 0) {\n continue;\n }\n\n let current: unknown = obj;\n\n // Navigate to parent of target field\n for (let i = 0; i < parts.length - 1; i++) {\n if (typeof current !== 'object' || current === null) {\n break;\n }\n const key = parts[i];\n if (key !== undefined) {\n current = (current as Record<string, unknown>)[key];\n }\n }\n\n // Delete the target field\n if (typeof current === 'object' && current !== null) {\n const lastKey = parts[parts.length - 1];\n if (lastKey !== undefined) {\n delete (current as Record<string, unknown>)[lastKey];\n }\n }\n }\n}\n\n/**\n * Creates the toMatchToolSnapshot matcher function\n *\n * @remarks\n * **Requires Playwright test context.** This matcher calls `expect(content).toMatchSnapshot()`\n * internally, which only works inside a Playwright test (i.e., when `testInfo` is available).\n * Calling it outside a Playwright test will throw a cryptic context error.\n *\n * To test sanitizer logic without a Playwright context, use the exported `applySanitizers`\n * function directly.\n *\n * Note: This is an async matcher that uses Playwright's snapshot testing.\n */\nexport async function toMatchToolSnapshot(\n this: { isNot: boolean },\n received: unknown,\n name: string,\n sanitizers: SnapshotSanitizer[] = []\n): Promise<{ pass: boolean; message: () => string }> {\n // Extract text content from response\n let content = extractText(received);\n\n // Apply sanitizers\n if (sanitizers.length > 0) {\n content = applySanitizers(content, sanitizers);\n }\n\n // .not is not really meaningful for snapshots, but handle it gracefully\n if (this.isNot) {\n // For .not, we want to verify it does NOT match - this is unusual for snapshots\n // but we can try and check if it throws\n try {\n // eslint-disable-next-line @typescript-eslint/await-thenable\n await baseExpect(content).toMatchSnapshot(name);\n // If it didn't throw, the snapshot matched - so .not fails\n return {\n pass: false,\n message: () =>\n `Expected response NOT to match snapshot \"${name}\", but it did`,\n };\n } catch {\n // Snapshot didn't match - .not passes\n return {\n pass: true,\n message: () => `Response does not match snapshot \"${name}\" as expected`,\n };\n }\n }\n\n try {\n // Use Playwright's native snapshot testing\n // eslint-disable-next-line @typescript-eslint/await-thenable\n await baseExpect(content).toMatchSnapshot(name);\n return {\n pass: true,\n message: () => `Response matches snapshot \"${name}\"`,\n };\n } catch (error) {\n return {\n pass: false,\n message: () =>\n error instanceof Error\n ? error.message\n : `Response does not match snapshot \"${name}\"`,\n };\n }\n}\n\nexport { BUILT_IN_PATTERNS, applySanitizers };\n","/**\n * toBeToolError Matcher\n *\n * Validates that a response is (or is not) an error.\n */\n\nimport { validateError } from '../validators/error.js';\n\n/**\n * Creates the toBeToolError matcher function\n */\nexport function toBeToolError(\n this: { isNot: boolean },\n received: unknown,\n expected: boolean | string | string[] = true\n) {\n // Handle .not case specially\n const effectiveExpected = this.isNot\n ? typeof expected === 'boolean'\n ? !expected\n : false // .not with string message means \"should not be error\"\n : expected;\n\n const result = validateError(received, effectiveExpected);\n\n return {\n pass: this.isNot ? !result.pass : result.pass,\n message: () => {\n if (this.isNot) {\n // When using .not, we want the opposite behavior\n if (typeof expected === 'boolean') {\n return result.pass\n ? 'Expected response NOT to be an error, but it was'\n : 'Response is not an error as expected';\n }\n const expectedStr = Array.isArray(expected)\n ? expected.join(', ')\n : expected;\n return result.pass\n ? `Expected response NOT to be an error with \"${expectedStr}\", but it was`\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toPassToolJudge Matcher\n *\n * Validates that a response passes LLM-as-judge evaluation.\n * Delegates evaluation logic to validateJudge() for consistency\n * with the validator/matcher duality pattern.\n *\n * Supports three call signatures:\n * - toPassToolJudge(rubric, options?) — built-in LLM judge with rubric\n * - toPassToolJudge({ judge: 'name', ... }) — named custom judge\n * - toPassToolJudge([...judges]) — multi-judge (all must pass)\n */\n\nimport { validateJudge } from '../validators/judge.js';\nimport type { RubricSpec } from '../../judge/rubrics.js';\nimport type { JudgeMatcherOptions } from './types.js';\n\n// Default passing threshold\nconst DEFAULT_PASSING_THRESHOLD = 0.7;\n\n/**\n * Runs a single judge evaluation and returns the result.\n */\nasync function runSingleJudge(\n received: unknown,\n rubric: RubricSpec | undefined,\n options: JudgeMatcherOptions\n): Promise<{ pass: boolean; message: string }> {\n const {\n reference = null,\n passingThreshold = DEFAULT_PASSING_THRESHOLD,\n reps,\n provider,\n model,\n judge,\n } = options;\n\n const validation = await validateJudge(received, {\n ...(rubric !== undefined && { rubric }),\n reference: reference ?? undefined,\n threshold: passingThreshold,\n ...(reps !== undefined && { reps }),\n ...(provider !== undefined && { provider }),\n ...(model !== undefined && { model }),\n ...(judge !== undefined && { judge }),\n });\n\n return { pass: validation.pass, message: validation.message };\n}\n\n/**\n * The toPassToolJudge matcher function.\n *\n * Accepts either:\n * (received, rubric, options?) — rubric-based LLM judge\n * (received, options) — named custom judge (options.judge required)\n * (received, judges[]) — multi-judge (all must pass)\n */\nexport async function toPassToolJudge(\n this: { isNot: boolean },\n received: unknown,\n rubricOrOptions:\n | RubricSpec\n | JudgeMatcherOptions\n | Array<JudgeMatcherOptions & { rubric?: RubricSpec }>,\n maybeOptions?: JudgeMatcherOptions\n): Promise<{ pass: boolean; message: () => string }> {\n // Multi-judge: array of judge configs\n if (Array.isArray(rubricOrOptions)) {\n const results = await Promise.all(\n rubricOrOptions.map(async (judgeConfig) => {\n const { rubric: r, ...opts } = judgeConfig;\n return runSingleJudge(received, r, opts);\n })\n );\n\n const allPassed = results.every((r) => r.pass);\n const passCount = results.filter((r) => r.pass).length;\n const summary = `${passCount}/${results.length} judges passed`;\n const details = results.map((r) => r.message).join('\\n');\n\n if (this.isNot) {\n return {\n pass: !allPassed,\n message: () =>\n allPassed\n ? `Expected all judges to fail, but ${summary}`\n : `Judges failed as expected: ${summary}`,\n };\n }\n\n return {\n pass: allPassed,\n message: () => `${summary}\\n${details}`,\n };\n }\n\n // Single judge\n let rubric: RubricSpec | undefined;\n let options: JudgeMatcherOptions;\n\n if (\n typeof rubricOrOptions === 'string' ||\n (typeof rubricOrOptions === 'object' &&\n rubricOrOptions !== null &&\n 'text' in rubricOrOptions)\n ) {\n rubric = rubricOrOptions as RubricSpec;\n options = maybeOptions ?? {};\n } else {\n options = rubricOrOptions;\n }\n\n const result = await runSingleJudge(received, rubric, options);\n\n if (this.isNot) {\n return {\n pass: !result.pass,\n message: () =>\n result.pass\n ? `Expected judge evaluation to fail, but it passed`\n : `Judge evaluation failed as expected`,\n };\n }\n\n return {\n pass: result.pass,\n message: () => result.message,\n };\n}\n","/**\n * toHaveToolResponseSize Matcher\n *\n * Validates that a response meets size constraints.\n */\n\nimport { validateSize } from '../validators/size.js';\nimport type { SizeValidatorOptions } from '../validators/types.js';\n\n/**\n * Creates the toHaveToolResponseSize matcher function\n */\nexport function toHaveToolResponseSize(\n this: { isNot: boolean },\n received: unknown,\n options: SizeValidatorOptions\n) {\n const result = validateSize(received, options);\n\n return {\n pass: result.pass,\n message: () => {\n if (this.isNot) {\n return result.pass\n ? 'Expected response size NOT to be within bounds, but it was'\n : result.message;\n }\n return result.message;\n },\n };\n}\n","/**\n * toSatisfyToolPredicate Matcher\n *\n * Validates that a response satisfies a custom predicate function.\n * This is an escape hatch for custom validation logic when built-in\n * matchers don't cover the use case.\n */\n\nimport { extractText } from '../validators/utils.js';\nimport type { PredicateResult, ToolPredicate } from './types.js';\n\n/**\n * Normalizes predicate result to PredicateResult object\n */\nfunction normalizeResult(result: boolean | PredicateResult): PredicateResult {\n if (typeof result === 'boolean') {\n return {\n pass: result,\n message: result ? 'Predicate passed' : 'Predicate returned false',\n };\n }\n return result;\n}\n\n/**\n * Creates the toSatisfyToolPredicate matcher function\n *\n * This matcher allows custom validation logic via a predicate function.\n * The predicate receives both the raw response and extracted text.\n *\n * @example\n * ```typescript\n * // Simple boolean predicate\n * expect(result).toSatisfyToolPredicate((response) => {\n * return response.data?.length > 0;\n * });\n *\n * // Predicate with custom message\n * expect(result).toSatisfyToolPredicate((response, text) => {\n * const hasTemperature = text.includes('temperature');\n * return {\n * pass: hasTemperature,\n * message: hasTemperature\n * ? 'Found temperature in response'\n * : 'Expected response to contain temperature',\n * };\n * });\n *\n * // Async predicate\n * expect(result).toSatisfyToolPredicate(async (response) => {\n * const isValid = await validateWithExternalService(response);\n * return isValid;\n * });\n * ```\n */\nexport async function toSatisfyToolPredicate(\n this: { isNot: boolean },\n received: unknown,\n predicate: ToolPredicate,\n description?: string\n): Promise<{ pass: boolean; message: () => string }> {\n const predicateDescription = description ?? 'custom predicate';\n\n try {\n // Extract text for convenience\n const text = extractText(received);\n\n // Run the predicate\n const rawResult = await predicate(received, text);\n const result = normalizeResult(rawResult);\n\n // Handle .not\n if (this.isNot) {\n return {\n pass: !result.pass,\n message: () =>\n result.pass\n ? `Expected response NOT to satisfy ${predicateDescription}`\n : `Response does not satisfy ${predicateDescription} as expected`,\n };\n }\n\n return {\n pass: result.pass,\n message: () =>\n result.pass\n ? (result.message ?? `Response satisfies ${predicateDescription}`)\n : (result.message ??\n `Expected response to satisfy ${predicateDescription}`),\n };\n } catch (error) {\n // Predicate threw an error\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n return {\n pass: this.isNot, // If using .not, an error means the predicate didn't pass\n message: () => `Predicate threw error: ${errorMessage}`,\n };\n }\n}\n","/**\n * toHaveToolCalls Matcher\n *\n * Validates which tools the LLM called during a mcp_host simulation.\n */\n\nimport { validateToolCalls } from '../validators/toolCalls.js';\nimport type { ToolCallExpectation } from '../validators/toolCalls.js';\n\n/**\n * Creates the toHaveToolCalls matcher function\n */\nexport function toHaveToolCalls(\n this: { isNot: boolean },\n received: unknown,\n expectation: ToolCallExpectation\n) {\n const result = validateToolCalls(received, expectation);\n\n return {\n pass: result.pass,\n message: () => result.message,\n };\n}\n","/**\n * toHaveToolCallCount Matcher\n *\n * Validates the number of tool calls made during a mcp_host simulation.\n */\n\nimport { validateToolCallCount } from '../validators/toolCalls.js';\nimport type { ToolCallCountOptions } from '../validators/toolCalls.js';\n\n/**\n * Creates the toHaveToolCallCount matcher function\n */\nexport function toHaveToolCallCount(\n this: { isNot: boolean },\n received: unknown,\n options: ToolCallCountOptions\n) {\n const result = validateToolCallCount(received, options);\n\n return {\n pass: result.pass,\n message: () => result.message,\n };\n}\n","/**\n * Matchers Module\n *\n * Custom Playwright matchers for MCP tool response validation.\n * These matchers use the validators internally and provide a clean\n * assertion API for Playwright tests.\n */\n\nimport { expect as baseExpect } from '@playwright/test';\n\n// Import matcher functions\nimport { toMatchToolResponse } from './toMatchToolResponse.js';\nimport { toMatchToolSchema } from './toMatchToolSchema.js';\nimport { toContainToolText } from './toContainToolText.js';\nimport { toMatchToolPattern } from './toMatchToolPattern.js';\nimport { toMatchToolSnapshot } from './toMatchToolSnapshot.js';\nimport { toBeToolError } from './toBeToolError.js';\nimport { toPassToolJudge } from './toPassToolJudge.js';\nimport { toHaveToolResponseSize } from './toHaveToolResponseSize.js';\nimport { toSatisfyToolPredicate } from './toSatisfyToolPredicate.js';\nimport { toHaveToolCalls } from './toHaveToolCalls.js';\nimport { toHaveToolCallCount } from './toHaveToolCallCount.js';\n\n// Import types for global declaration\nimport './types.js';\n\n/**\n * Extended Playwright expect with MCP tool matchers\n *\n * @example\n * ```typescript\n * import { expect } from '@gleanwork/mcp-server-tester';\n *\n * test('weather tool', async ({ mcp }) => {\n * const result = await mcp.callTool('get_weather', { city: 'London' });\n *\n * expect(result).toContainToolText('temperature');\n * expect(result).toMatchToolSchema(WeatherSchema);\n * expect(result).not.toBeToolError();\n * });\n * ```\n */\nexport const expect = baseExpect.extend({\n toMatchToolResponse,\n toMatchToolSchema,\n toContainToolText,\n toMatchToolPattern,\n toMatchToolSnapshot,\n toBeToolError,\n toPassToolJudge,\n toHaveToolResponseSize,\n toSatisfyToolPredicate,\n toHaveToolCalls,\n toHaveToolCallCount,\n});\n\n// Re-export types\nexport type {\n JudgeMatcherOptions,\n ToolPredicate,\n PredicateResult,\n} from './types.js';\n","import { test as base } from '@playwright/test';\nimport { expect } from '../assertions/matchers/index.js';\nimport type { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport {\n createMCPClientForConfig,\n closeMCPClient,\n} from '../mcp/clientFactory.js';\nimport {\n createMCPFixture,\n type MCPFixtureApi,\n type AuthType,\n} from '../mcp/fixtures/mcpFixture.js';\nimport { PlaywrightOAuthClientProvider } from '../auth/oauthClientProvider.js';\nimport { CLIOAuthClient } from '../auth/cli.js';\nimport { isHttpConfig, type MCPConfig } from '../config/mcpConfig.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Internal fixture state for passing auth type between fixtures\n */\ninterface MCPFixtureState {\n /**\n * The resolved authentication type (may differ from config if CLI tokens are used)\n */\n resolvedAuthType: AuthType;\n}\n\n/**\n * Extended test fixtures for MCP testing\n */\ntype MCPFixtures = {\n /**\n * Raw MCP client instance (automatically connected and cleaned up)\n */\n mcpClient: Client;\n\n /**\n * High-level MCP API for tests\n */\n mcp: MCPFixtureApi;\n\n /**\n * Internal fixture state (not for external use)\n */\n _mcpFixtureState: MCPFixtureState;\n};\n\n/**\n * Extended Playwright test with MCP fixtures\n *\n * @example\n * import { test, expect } from '@gleanwork/mcp-server-tester';\n *\n * test('lists tools from MCP server', async ({ mcp }) => {\n * const tools = await mcp.listTools();\n * expect(tools.length).toBeGreaterThan(0);\n * });\n */\nexport const test = base.extend<MCPFixtures>({\n /**\n * Internal fixture state - tracks resolved auth type between fixtures\n */\n _mcpFixtureState: [\n // eslint-disable-next-line no-empty-pattern\n async ({}, use) => {\n // Initialize with 'none', will be updated by mcpClient fixture\n const state: MCPFixtureState = { resolvedAuthType: 'none' };\n await use(state);\n },\n { scope: 'test' },\n ],\n\n /**\n * mcpClient fixture: Creates and connects an MCP client\n *\n * The client configuration is read from the project's `use.mcpConfig`\n * setting in playwright.config.ts\n *\n * Authentication resolution order:\n * 1. Explicit authStatePath → uses PlaywrightOAuthClientProvider\n * 2. Explicit accessToken → uses static Bearer token\n * 3. HTTP transport with no auth → tries CLI-stored tokens (from `mcp-server-tester login`)\n * with automatic token refresh\n */\n mcpClient: async ({ _mcpFixtureState }, use, testInfo) => {\n // Extract mcpConfig from project use settings\n const useConfig = testInfo.project.use as { mcpConfig?: MCPConfig };\n const mcpConfig = useConfig.mcpConfig;\n\n if (!mcpConfig) {\n throw new Error(\n `Missing mcpConfig in project.use for project \"${testInfo.project.name}\". ` +\n `Please add mcpConfig to your project configuration in playwright.config.ts`\n );\n }\n\n // Track resolved auth type\n let resolvedAuthType: AuthType = 'none';\n\n // Narrow to HTTP config once for all auth-related logic (auth is HTTP-only)\n const httpConfig = isHttpConfig(mcpConfig) ? mcpConfig : null;\n\n // Create auth provider if OAuth authStatePath is configured\n let authProvider: OAuthClientProvider | undefined;\n if (httpConfig?.auth?.oauth?.authStatePath) {\n authProvider = new PlaywrightOAuthClientProvider({\n storagePath: httpConfig.auth.oauth.authStatePath,\n redirectUri:\n httpConfig.auth.oauth.redirectUri ??\n 'http://localhost:3000/oauth/callback',\n clientId: httpConfig.auth.oauth.clientId,\n clientSecret: httpConfig.auth.oauth.clientSecret,\n });\n resolvedAuthType = 'oauth';\n }\n\n // Build effective config - may add CLI tokens if no auth is configured\n let effectiveConfig = mcpConfig;\n\n // Check for explicit static API token\n if (httpConfig?.auth?.accessToken) {\n resolvedAuthType = 'api-token';\n }\n\n // If HTTP transport with no explicit auth, try to use CLI-stored tokens\n // This enables the simple flow: `mcp-server-tester login <url>` then run tests\n if (\n httpConfig &&\n !httpConfig.auth?.accessToken &&\n !httpConfig.auth?.oauth?.authStatePath\n ) {\n const cliClient = new CLIOAuthClient({\n mcpServerUrl: httpConfig.serverUrl,\n });\n\n // Try to get a valid token (will refresh if expired)\n const tokenResult = await cliClient.tryGetAccessToken();\n\n if (tokenResult) {\n // Use the CLI token as static auth\n effectiveConfig = {\n ...httpConfig,\n auth: {\n ...httpConfig.auth,\n accessToken: tokenResult.accessToken,\n },\n };\n // CLI tokens come from OAuth flow\n resolvedAuthType = 'oauth';\n }\n }\n\n // Store resolved auth type for mcp fixture\n _mcpFixtureState.resolvedAuthType = resolvedAuthType;\n\n // Create and connect client\n const client = await createMCPClientForConfig(effectiveConfig, {\n clientInfo: {\n name: '@gleanwork/mcp-server-tester',\n version: packageJson.version,\n },\n authProvider,\n });\n\n try {\n // Provide client to test\n await use(client);\n } finally {\n // Cleanup: close the client\n await closeMCPClient(client);\n }\n },\n\n /**\n * mcp fixture: High-level test API built on mcpClient\n *\n * Depends on mcpClient fixture\n * Automatically tracks all MCP operations for the reporter\n */\n mcp: async ({ mcpClient, _mcpFixtureState }, use, testInfo) => {\n const useConfig = testInfo.project.use as { mcpConfig?: MCPConfig };\n const api = createMCPFixture(mcpClient, testInfo, {\n authType: _mcpFixtureState.resolvedAuthType,\n project: testInfo.project.name,\n callTimeoutMs: useConfig.mcpConfig?.callTimeoutMs,\n });\n await use(api);\n },\n});\n\n/**\n * Re-export extended expect with MCP tool matchers\n *\n * @example\n * ```typescript\n * expect(result).toContainToolText('temperature');\n * expect(result).toMatchToolSchema(WeatherSchema);\n * expect(result).not.toBeToolError();\n * ```\n */\nexport { expect };\n","/**\n * Playwright fixtures for MCP OAuth authentication\n *\n * Provides worker-scoped OAuth authentication following Playwright's\n * recommended auth state pattern.\n */\n\nimport { test as base } from '@playwright/test';\nimport type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';\nimport type { MCPAuthConfig, MCPOAuthConfig } from '../config/mcpConfig.js';\nimport {\n PlaywrightOAuthClientProvider,\n type PlaywrightOAuthClientProviderConfig,\n} from '../auth/oauthClientProvider.js';\n\n/**\n * Static token auth provider that wraps a pre-acquired token\n *\n * This is a minimal implementation that provides tokens directly\n * without OAuth flow support.\n */\nclass StaticTokenAuthProvider implements OAuthClientProvider {\n private readonly accessToken: string;\n\n constructor(accessToken: string) {\n this.accessToken = accessToken;\n }\n\n get redirectUrl(): string {\n throw new Error('StaticTokenAuthProvider does not support OAuth redirects');\n }\n\n get clientMetadata() {\n return {\n redirect_uris: [],\n token_endpoint_auth_method: 'none' as const,\n grant_types: [],\n response_types: [],\n client_name: '@gleanwork/mcp-server-tester',\n };\n }\n\n async clientInformation() {\n return undefined;\n }\n\n async tokens() {\n return {\n access_token: this.accessToken,\n token_type: 'Bearer',\n };\n }\n\n async saveTokens(): Promise<void> {\n // Static tokens don't need to be saved\n }\n\n async redirectToAuthorization(): Promise<void> {\n throw new Error('StaticTokenAuthProvider does not support OAuth redirects');\n }\n\n async saveCodeVerifier(): Promise<void> {\n throw new Error('StaticTokenAuthProvider does not support PKCE');\n }\n\n async codeVerifier(): Promise<string> {\n throw new Error('StaticTokenAuthProvider does not support PKCE');\n }\n}\n\n/**\n * Test-scoped auth fixtures interface\n */\nexport interface MCPAuthFixtures {\n /**\n * OAuth client provider for MCP authentication\n */\n mcpAuthProvider: OAuthClientProvider | undefined;\n}\n\n/**\n * Extended Playwright test with MCP auth fixtures\n *\n * Use this when you need OAuth authentication for MCP server testing.\n *\n * @example\n * ```typescript\n * // test.ts\n * import { test } from '@gleanwork/mcp-server-tester/fixtures/mcpAuth';\n *\n * test('authenticated MCP call', async ({ mcpAuthProvider }) => {\n * // mcpAuthProvider can be passed to createMCPClientForConfig\n * });\n * ```\n */\nexport const test = base.extend<MCPAuthFixtures>({\n /**\n * Create auth provider based on environment configuration\n */\n // eslint-disable-next-line no-empty-pattern\n mcpAuthProvider: async ({}, use) => {\n const authConfig = getAuthConfigFromEnv();\n\n if (!authConfig) {\n await use(undefined);\n return;\n }\n\n // Static token mode\n if (authConfig.accessToken) {\n const provider = new StaticTokenAuthProvider(authConfig.accessToken);\n await use(provider);\n return;\n }\n\n // OAuth mode\n if (authConfig.oauth) {\n const provider = createOAuthProvider(authConfig.oauth);\n await use(provider);\n return;\n }\n\n await use(undefined);\n },\n});\n\n/**\n * Creates an OAuth provider from configuration\n */\nfunction createOAuthProvider(\n oauthConfig: MCPOAuthConfig\n): PlaywrightOAuthClientProvider {\n if (!oauthConfig.authStatePath) {\n throw new Error(\n 'OAuth configuration requires authStatePath. ' +\n 'Use performOAuthSetup() in globalSetup to create auth state first.'\n );\n }\n\n const providerConfig: PlaywrightOAuthClientProviderConfig = {\n storagePath: oauthConfig.authStatePath,\n redirectUri:\n oauthConfig.redirectUri ?? 'http://localhost:3000/oauth/callback',\n clientId: oauthConfig.clientId,\n clientSecret: oauthConfig.clientSecret,\n };\n\n return new PlaywrightOAuthClientProvider(providerConfig);\n}\n\n/**\n * Gets auth config from environment variables\n *\n * This is a fallback for fixtures that can't access testInfo.project directly.\n */\nfunction getAuthConfigFromEnv(): MCPAuthConfig | undefined {\n // Check for static token\n const accessToken = process.env.MCP_ACCESS_TOKEN;\n if (accessToken) {\n return { accessToken };\n }\n\n // Check for OAuth config\n const oauthServerUrl = process.env.MCP_OAUTH_SERVER_URL;\n const authStatePath = process.env.MCP_AUTH_STATE_PATH;\n\n if (oauthServerUrl || authStatePath) {\n return {\n oauth: {\n serverUrl: oauthServerUrl ?? '',\n authStatePath: authStatePath,\n clientId: process.env.MCP_OAUTH_CLIENT_ID,\n clientSecret: process.env.MCP_OAUTH_CLIENT_SECRET,\n scopes: process.env.MCP_OAUTH_SCOPES?.split(','),\n resource: process.env.MCP_OAUTH_RESOURCE,\n },\n };\n }\n\n return undefined;\n}\n\n/**\n * Re-export expect for convenience\n */\nexport { expect } from '@playwright/test';\n","import { z } from 'zod';\nimport type { MCPHostConfig } from './mcpHost/mcpHostTypes.js';\nimport type { SnapshotSanitizer } from '../assertions/validators/types.js';\nimport type { BuiltInRubric } from '../judge/judgeTypes.js';\n\n// Re-export sanitizer types from canonical source (validators/types.ts)\n// Note: For JSON datasets, the Zod schema below validates that patterns are strings.\n// The TypeScript types allow RegExp for runtime usage with Playwright matchers.\nexport type {\n BuiltInSanitizer,\n SnapshotSanitizer,\n RegexSanitizer,\n FieldRemovalSanitizer,\n} from '../assertions/validators/types.js';\n\n/**\n * Evaluation mode\n */\nexport type EvalMode = 'direct' | 'mcp_host';\n\n/**\n * A single eval test case\n *\n * For 'direct' mode: toolName and args are required\n * For 'mcp_host' mode: scenario and mcpHostConfig are required\n */\nexport interface EvalCase {\n /**\n * Unique identifier for this test case\n */\n id: string;\n\n /**\n * Human-readable description of what this test case validates\n */\n description?: string;\n\n /**\n * Evaluation mode\n * - 'direct': Direct API calls to MCP tools (default)\n * - 'mcp_host': LLM-driven tool selection via natural language\n *\n * @default 'direct'\n */\n mode?: EvalMode;\n\n /**\n * Name of the MCP tool to call (required for 'direct' mode, optional for 'mcp_host' mode)\n */\n toolName?: string;\n\n /**\n * Arguments to pass to the tool (required for 'direct' mode, optional for 'mcp_host' mode)\n */\n args?: Record<string, unknown>;\n\n /**\n * Natural language scenario for LLM to execute (optional, required for 'mcp_host' mode)\n *\n * @example \"Get the weather for London and tell me if I need an umbrella\"\n */\n scenario?: string;\n\n /**\n * MCP host configuration (optional for 'mcp_host' mode)\n *\n * If not specified, uses default configuration from test environment\n */\n mcpHostConfig?: MCPHostConfig;\n\n /**\n * Additional metadata for this test case\n *\n * For 'mcp_host' mode, can include 'expectedToolCalls' for validation\n */\n metadata?: Record<string, unknown>;\n\n /**\n * Number of times to run this case and compute an assertion pass rate.\n * When > 1, `EvalCaseResult.assertionPassRate` is populated and `pass` is determined\n * by `accuracyThreshold` rather than a single run.\n * @default 1\n */\n iterations?: number;\n\n /**\n * Minimum accuracy (0–1) required to pass when `iterations > 1`.\n * @default 1.0 (all iterations must pass)\n */\n accuracyThreshold?: number;\n\n /**\n * Number of times to invoke the LLM judge per `passesJudge` assertion.\n * Scores are averaged; the mean must meet the threshold to pass.\n * Reduces judge variance caused by non-determinism.\n * Per-assertion `passesJudge.reps` overrides this value.\n * @default 1\n */\n judgeReps?: number;\n\n /**\n * Golden/expected answer for this case.\n * When set, automatically passed as `reference` to the LLM judge\n * (unless passesJudge.reference is explicitly provided).\n * Mirrors EvalV2's `canonical_answer` field.\n */\n canonicalAnswer?: string;\n\n /**\n * Arbitrary string labels for this case.\n * Use for filtering eval runs with `EvalRunnerOptions.filterTags`\n * and for slicing results by category.\n *\n * @example ['tool-finding', 'multi-hop', 'search']\n */\n tags?: string[];\n\n /**\n * Expectations to validate against the tool response\n *\n * Multiple expectations can be combined and will all be validated.\n *\n * @example\n * ```json\n * {\n * \"id\": \"weather-london\",\n * \"toolName\": \"get_weather\",\n * \"args\": { \"city\": \"London\" },\n * \"expect\": {\n * \"containsText\": [\"temperature\", \"conditions\"],\n * \"schema\": \"WeatherResponse\",\n * \"responseSize\": { \"maxBytes\": 10000 },\n * \"isError\": false\n * }\n * }\n * ```\n */\n expect?: EvalExpectBlock;\n}\n\n/**\n * Configuration for a single LLM-as-judge evaluation\n */\nexport interface JudgeExpectConfig {\n /**\n * Name of a registered custom judge executor.\n * When set, the named judge handles evaluation and returns a normalized score.\n * The `threshold` determines pass/fail. `reps` and LLM config fields\n * (provider, model, etc.) are ignored.\n */\n judge?: string;\n /** Built-in rubric name or custom rubric object. Required when no `judge` is specified. */\n rubric?: BuiltInRubric | { text: string };\n /** Reference response to compare against */\n reference?: unknown;\n /** Score threshold for passing (0-1, default: 0.7) */\n threshold?: number;\n /** Number of judge evaluations for this assertion. Overrides EvalCase.judgeReps. */\n reps?: number;\n /** Judge provider. @default 'anthropic' */\n provider?:\n | 'anthropic'\n | 'vertex-anthropic'\n | 'anthropic-agent-sdk'\n | 'openai'\n | 'google';\n /** Model override (e.g., 'claude-opus-4-20250514') */\n model?: string;\n /** Environment variable name for API key */\n apiKeyEnvVar?: string;\n /** Max tokens for judge response */\n maxTokens?: number;\n /** Temperature for judge LLM (0–1) */\n temperature?: number;\n /** Max budget in USD per evaluation */\n maxBudgetUsd?: number;\n /** Fail if response exceeds this size in bytes before judging */\n maxToolOutputSize?: number;\n}\n\n/**\n * Unified expectation block for eval cases\n *\n * Mirrors the Playwright matcher API for consistency.\n */\nexport interface EvalExpectBlock {\n /**\n * Exact response match (toMatchToolResponse)\n */\n response?: unknown;\n\n /**\n * Name of schema to validate against (toMatchToolSchema)\n */\n schema?: string;\n\n /**\n * Text substring(s) that must be present (toContainToolText)\n */\n containsText?: string | string[];\n\n /**\n * Regex pattern(s) that must match (toMatchToolPattern)\n */\n matchesPattern?: string | string[];\n\n /**\n * Snapshot name for comparison (toMatchToolSnapshot)\n */\n snapshot?: string;\n\n /**\n * Snapshot sanitizers to apply\n */\n snapshotSanitizers?: SnapshotSanitizer[];\n\n /**\n * Error expectation (toBeToolError)\n * - true: expects any error\n * - false: expects no error\n * - string: expects error containing this message\n */\n isError?: boolean | string | string[];\n\n /**\n * LLM-as-judge evaluation (toPassToolJudge)\n *\n * Accepts a single judge config or an array for multi-judge evaluation.\n * When an array is provided, all judges must pass (AND semantics).\n */\n passesJudge?: JudgeExpectConfig | JudgeExpectConfig[];\n\n /**\n * Response size validation (toHaveToolResponseSize)\n */\n responseSize?: {\n /** Maximum allowed size in bytes */\n maxBytes?: number;\n /** Minimum required size in bytes */\n minBytes?: number;\n };\n\n /**\n * Asserts which tools the LLM called during a mcp_host simulation.\n * Only meaningful for mcp_host mode — direct mode has no tool call trace.\n */\n toolsTriggered?: {\n /** Expected tool calls */\n calls: Array<{\n /** Tool name */\n name: string;\n /** Expected arguments (partial match — extra keys are allowed) */\n arguments?: Record<string, unknown>;\n /** Whether this call MUST have been made (default: true) */\n required?: boolean;\n }>;\n /**\n * 'strict': calls must appear in the exact order listed\n * 'any': calls can appear in any order (default)\n */\n order?: 'strict' | 'any';\n /** If true, no tool calls outside the `calls` list are allowed */\n exclusive?: boolean;\n };\n\n /**\n * Asserts the number of tool calls made during a mcp_host simulation.\n */\n toolCallCount?: {\n /** Minimum number of tool calls */\n min?: number;\n /** Maximum number of tool calls */\n max?: number;\n /** Exact number of tool calls */\n exact?: number;\n };\n}\n\n/**\n * A complete eval dataset containing multiple test cases\n */\nexport interface EvalDataset {\n /**\n * Dataset name\n */\n name: string;\n\n /**\n * Dataset description\n */\n description?: string;\n\n /**\n * Test cases in this dataset\n */\n cases: Array<EvalCase>;\n\n /**\n * Optional schema definitions referenced by test cases\n */\n schemas?: Record<string, z.ZodSchema>;\n\n /**\n * Additional dataset metadata\n */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Zod schema for MCPHostConfig (simplified for serialization)\n */\nconst MCPHostConfigSchema = z.object({\n hostType: z.enum(['sdk', 'cli', 'browser', 'desktop']).optional(),\n provider: z\n .enum([\n 'openai',\n 'anthropic',\n 'azure',\n 'google',\n 'mistral',\n 'deepseek',\n 'openrouter',\n 'xai',\n 'vertex-anthropic',\n ])\n .optional(),\n apiKeyEnvVar: z.string().optional(),\n model: z.string().optional(),\n maxTokens: z.number().optional(),\n temperature: z.number().optional(),\n maxToolCalls: z.number().optional(),\n cli: z\n .object({\n command: z.string(),\n args: z.array(z.string()),\n outputFormat: z.enum(['stream-json', 'json']).optional(),\n timeout: z.number().optional(),\n })\n .optional(),\n});\n\n/**\n * Zod schema for SnapshotSanitizer\n */\nconst SnapshotSanitizerSchema = z.union([\n // Built-in sanitizers\n z.enum(['timestamp', 'uuid', 'iso-date', 'objectId', 'jwt']),\n // Custom regex sanitizer\n z.object({\n pattern: z.string(),\n replacement: z.string().optional(),\n }),\n // Field removal sanitizer\n z.object({\n remove: z.array(z.string()),\n }),\n]);\n\n/**\n * Zod schema for a single judge configuration\n */\nconst JudgeExpectConfigSchema = z\n .object({\n judge: z.string().min(1).optional(),\n rubric: z\n .union([\n z.enum([\n 'correctness',\n 'completeness',\n 'groundedness',\n 'instruction-following',\n 'conciseness',\n ]),\n z.object({ text: z.string().min(1) }),\n ])\n .optional(),\n reference: z.unknown().optional(),\n threshold: z.number().min(0).max(1).optional(),\n reps: z.number().int().min(1).optional(),\n provider: z\n .enum([\n 'anthropic',\n 'vertex-anthropic',\n 'anthropic-agent-sdk',\n 'openai',\n 'google',\n ])\n .optional(),\n model: z.string().optional(),\n apiKeyEnvVar: z.string().optional(),\n maxTokens: z.number().int().positive().optional(),\n temperature: z.number().min(0).max(1).optional(),\n maxBudgetUsd: z.number().positive().optional(),\n maxToolOutputSize: z.number().int().positive().optional(),\n })\n .refine((data) => data.judge !== undefined || data.rubric !== undefined, {\n message: 'Either \"judge\" or \"rubric\" must be provided in passesJudge',\n });\n\n/**\n * Zod schema for EvalExpectBlock\n */\nconst EvalExpectBlockSchema = z.object({\n response: z.unknown().optional(),\n schema: z.string().optional(),\n containsText: z.union([z.string(), z.array(z.string())]).optional(),\n matchesPattern: z.union([z.string(), z.array(z.string())]).optional(),\n snapshot: z.string().optional(),\n snapshotSanitizers: z.array(SnapshotSanitizerSchema).optional(),\n isError: z.union([z.boolean(), z.string(), z.array(z.string())]).optional(),\n passesJudge: z\n .union([JudgeExpectConfigSchema, z.array(JudgeExpectConfigSchema).min(1)])\n .optional(),\n responseSize: z\n .object({\n maxBytes: z.number().optional(),\n minBytes: z.number().optional(),\n })\n .optional(),\n toolsTriggered: z\n .object({\n calls: z.array(\n z.object({\n name: z.string(),\n arguments: z.record(z.string(), z.unknown()).optional(),\n required: z.boolean().optional(),\n })\n ),\n order: z.enum(['strict', 'any']).optional(),\n exclusive: z.boolean().optional(),\n })\n .optional(),\n toolCallCount: z\n .object({\n min: z.number().int().min(0).optional(),\n max: z.number().int().min(0).optional(),\n exact: z.number().int().min(0).optional(),\n })\n .optional(),\n});\n\n/**\n * Zod schema for EvalCase\n *\n * toolName and args are optional for mcp_host mode (which uses scenario instead)\n */\nexport const EvalCaseSchema = z.object({\n id: z.string().min(1, 'id must not be empty'),\n description: z.string().optional(),\n mode: z.enum(['direct', 'mcp_host']).optional(),\n toolName: z.string().min(1, 'toolName must not be empty').optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n scenario: z.string().optional(),\n mcpHostConfig: MCPHostConfigSchema.optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n iterations: z.number().int().min(1).optional(),\n accuracyThreshold: z.number().min(0).max(1).optional(),\n judgeReps: z.number().int().min(1).optional(),\n canonicalAnswer: z.string().optional(),\n tags: z.array(z.string()).optional(),\n expect: EvalExpectBlockSchema.optional(),\n});\n\n/**\n * Zod schema for EvalDataset (without schemas field, as schemas aren't serializable)\n */\nexport const EvalDatasetSchema = z.object({\n name: z.string().min(1, 'name must not be empty'),\n description: z.string().optional(),\n cases: z.array(EvalCaseSchema).min(1, 'dataset must have at least one case'),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Type for serialized eval dataset (without Zod schemas)\n */\nexport type SerializedEvalDataset = z.infer<typeof EvalDatasetSchema>;\n\n/**\n * Validates an eval case\n *\n * @param evalCase - The eval case to validate\n * @returns The validated eval case\n * @throws {z.ZodError} If validation fails\n */\nexport function validateEvalCase(evalCase: unknown): EvalCase {\n return EvalCaseSchema.parse(evalCase);\n}\n\n/**\n * Validates a serialized eval dataset\n *\n * @param dataset - The dataset to validate\n * @returns The validated dataset\n * @throws {z.ZodError} If validation fails\n */\nexport function validateEvalDataset(dataset: unknown): SerializedEvalDataset {\n return EvalDatasetSchema.parse(dataset);\n}\n","import { readFile } from 'fs/promises';\nimport { type z } from 'zod';\nimport {\n type EvalDataset,\n type SerializedEvalDataset,\n validateEvalDataset,\n} from './datasetTypes.js';\n\n/**\n * Options for loading an eval dataset\n */\nexport interface LoadDatasetOptions {\n /**\n * Optional schema definitions to attach to the dataset\n *\n * Keys should match the expectedSchemaName in eval cases\n */\n schemas?: Record<string, z.ZodSchema>;\n\n /**\n * Whether to validate the loaded dataset\n * @default true\n */\n validate?: boolean;\n}\n\n/**\n * Loads an eval dataset from a JSON file\n *\n * @param filePath - Absolute path to the JSON file\n * @param options - Load options\n * @returns The loaded and validated dataset\n * @throws {Error} If file cannot be read or JSON is invalid\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * const dataset = await loadEvalDataset('./data/my-evals.json', {\n * schemas: {\n * 'weather-response': WeatherResponseSchema,\n * },\n * });\n */\nexport async function loadEvalDataset(\n filePath: string,\n options: LoadDatasetOptions = {}\n): Promise<EvalDataset> {\n const { schemas, validate = true } = options;\n\n try {\n const fileContents = await readFile(filePath, 'utf-8');\n const rawData: unknown = JSON.parse(fileContents);\n\n // Validate if requested\n const serializedDataset: SerializedEvalDataset = validate\n ? validateEvalDataset(rawData)\n : (rawData as SerializedEvalDataset);\n\n // Create full dataset with schemas\n const dataset: EvalDataset = {\n ...serializedDataset,\n schemas: schemas ?? {},\n };\n\n return dataset;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(\n `Failed to parse JSON from ${filePath}: ${error.message}`\n );\n }\n throw error;\n }\n}\n\n/**\n * Loads an eval dataset from a plain object\n *\n * Useful for programmatically creating datasets in tests\n *\n * @param data - The dataset data\n * @param options - Load options\n * @returns The loaded and validated dataset\n * @throws {z.ZodError} If validation fails\n *\n * @example\n * const dataset = loadEvalDatasetFromObject({\n * name: 'my-test-dataset',\n * cases: [\n * {\n * id: 'case-1',\n * toolName: 'get_weather',\n * args: { city: 'London' },\n * },\n * ],\n * });\n */\nexport function loadEvalDatasetFromObject(\n data: unknown,\n options: LoadDatasetOptions = {}\n): EvalDataset {\n const { schemas, validate = true } = options;\n\n // Validate if requested\n const serializedDataset: SerializedEvalDataset = validate\n ? validateEvalDataset(data)\n : (data as SerializedEvalDataset);\n\n // Create full dataset with schemas\n const dataset: EvalDataset = {\n ...serializedDataset,\n schemas: schemas ?? {},\n };\n\n return dataset;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unnecessary-type-assertion, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment */\n/**\n * Vercel AI SDK-based LLM host orchestrator.\n *\n * Replaces the custom agentic loop with generateText + stopWhen (ai v6),\n * giving access to 9 providers and built-in latency decomposition.\n *\n * Requires the `ai` package (v6+) as an optional peer dependency.\n * Additional providers require their respective @ai-sdk/* packages.\n */\nimport type {\n MCPHostConfig,\n MCPHostSimulationResult,\n MCPHostSimulator,\n LLMProvider,\n LLMToolCall,\n} from '../mcpHostTypes.js';\nimport type { MCPFixtureApi } from '../../../mcp/fixtures/mcpFixture.js';\nimport { extractText } from '../../../mcp/response.js';\n\n/**\n * Classifies a raw error from the Vercel AI SDK agentic loop and returns a\n * human-readable message with an actionable hint.\n *\n * The message is always prefixed with \"MCP host simulation failed: \" so that\n * callers see a consistent error surface regardless of which failure path was\n * hit.\n */\nfunction enrichErrorMessage(err: unknown, provider: string): string {\n const raw = err instanceof Error ? err.message : String(err);\n\n // Missing optional peer dependency\n if (\n raw.includes('Cannot find module') ||\n raw.includes('ERR_MODULE_NOT_FOUND')\n ) {\n return (\n `MCP host simulation failed: required package not installed.\\n` +\n `Hint: run \\`getMissingDependencyMessage('${provider}')\\` or check docs/mcp-host.md for install instructions.`\n );\n }\n\n // Authentication / API key problems\n if (\n raw.includes('401') ||\n raw.includes('Unauthorized') ||\n raw.includes('API key') ||\n raw.includes('api_key')\n ) {\n return (\n `MCP host simulation failed: authentication error.\\n` +\n `Hint: check your API key environment variable (e.g. ANTHROPIC_API_KEY, GOOGLE_APPLICATION_CREDENTIALS).`\n );\n }\n\n // Model not found (404 or explicit \"model … not found\" phrasing)\n if (\n raw.includes('404') ||\n raw.includes('Not Found') ||\n (raw.toLowerCase().includes('model') &&\n raw.toLowerCase().includes('not found'))\n ) {\n return (\n `MCP host simulation failed: model not found.\\n` +\n `Hint: check the model name format for your provider. For vertex-anthropic use 'claude-3-5-haiku@20241022' (with @).`\n );\n }\n\n // Network / DNS / connection errors\n if (\n raw.includes('ENOTFOUND') ||\n raw.includes('fetch failed') ||\n raw.includes('ECONNREFUSED')\n ) {\n return (\n `MCP host simulation failed: network error.\\n` +\n `Hint: check network connectivity and whether the provider's API endpoint is reachable from this machine.`\n );\n }\n\n // Rate limiting\n if (\n raw.includes('429') ||\n raw.toLowerCase().includes('rate limit') ||\n raw.includes('Too Many Requests')\n ) {\n return (\n `MCP host simulation failed: rate limited.\\n` +\n `Hint: reduce concurrency, add delays between iterations, or upgrade your API plan.`\n );\n }\n\n // Default: preserve original message with a consistent prefix\n return `MCP host simulation failed: ${raw}`;\n}\n\n// Dynamic import helper bypasses TypeScript module resolution for optional peer deps.\n// Each @ai-sdk/* package is optional — install only the providers you need.\nasync function loadModel(provider: LLMProvider, model: string): Promise<any> {\n switch (provider) {\n case 'openai': {\n const { openai } = await import('@ai-sdk/openai');\n return openai(model);\n }\n case 'anthropic': {\n const { anthropic } = await import('@ai-sdk/anthropic');\n return anthropic(model);\n }\n case 'vertex-anthropic': {\n // Anthropic via Google Vertex AI — uses Application Default Credentials.\n // Required env vars: GOOGLE_VERTEX_PROJECT, GOOGLE_VERTEX_LOCATION\n // Install: npm install @ai-sdk/google-vertex\n // Use this instead of 'anthropic' when api.anthropic.com is not reachable.\n const { createVertexAnthropic } =\n await import('@ai-sdk/google-vertex/anthropic');\n const vertexAnthropic = createVertexAnthropic({\n project: process.env.GOOGLE_VERTEX_PROJECT,\n location: process.env.GOOGLE_VERTEX_LOCATION ?? 'us-east5',\n });\n return (vertexAnthropic as unknown as (m: string) => unknown)(model);\n }\n case 'google': {\n // @ts-ignore - optional: npm install @ai-sdk/google\n const { google } = await import('@ai-sdk/google');\n return (google as any)(model);\n }\n case 'mistral': {\n // @ts-ignore - optional: npm install @ai-sdk/mistral\n const { mistral } = await import('@ai-sdk/mistral');\n return (mistral as any)(model);\n }\n case 'azure': {\n // @ts-ignore - optional: npm install @ai-sdk/azure\n const { azure } = await import('@ai-sdk/azure');\n return (azure as any)(model);\n }\n case 'deepseek': {\n // @ts-ignore - optional: npm install @ai-sdk/deepseek\n const { deepseek } = await import('@ai-sdk/deepseek');\n return (deepseek as any)(model);\n }\n case 'openrouter': {\n // @ts-ignore - optional: npm install @openrouter/ai-sdk-provider\n const { openrouter } = await import('@openrouter/ai-sdk-provider');\n return (openrouter as any)(model);\n }\n case 'xai': {\n // @ts-ignore - optional: npm install @ai-sdk/xai\n const { xai } = await import('@ai-sdk/xai');\n return (xai as any)(model);\n }\n default:\n throw new Error(\n `Unsupported Vercel AI SDK provider: ${String(provider)}`\n );\n }\n}\n\nfunction defaultModel(provider: LLMProvider): string {\n switch (provider) {\n case 'openai':\n return 'gpt-4o';\n case 'anthropic':\n return 'claude-3-5-sonnet-20241022';\n case 'google':\n return 'gemini-1.5-pro';\n case 'mistral':\n return 'mistral-large-latest';\n default:\n return 'default';\n }\n}\n\n/**\n * Creates a Vercel AI SDK-based MCP host simulator.\n *\n * Uses generateText with stopWhen (ai v6) to handle multi-turn tool calling.\n * Produces llmDurationMs and mcpDurationMs for latency decomposition.\n */\nexport function createVercelOrchestrator(): MCPHostSimulator {\n return {\n async simulate(\n mcp: MCPFixtureApi,\n scenario: string,\n config: MCPHostConfig\n ): Promise<MCPHostSimulationResult> {\n try {\n const { generateText, stepCountIs } = await import('ai');\n // jsonSchema from @ai-sdk/provider-utils creates a proper Schema object\n // (with .jsonSchema property) that ai's prepareToolsAndToolChoice can read.\n // Do NOT use jsonSchema from 'ai' — in v6 it produces the wrong shape.\n const { jsonSchema } = await import('@ai-sdk/provider-utils');\n\n if (!config.provider) {\n throw new Error('provider is required for SDK host type');\n }\n\n const modelId = config.model ?? defaultModel(config.provider);\n const model = await loadModel(config.provider, modelId);\n\n // Get available MCP tools and wrap them for Vercel AI SDK\n const mcpTools = await mcp.listTools();\n let mcpDurationMs = 0;\n const allToolCalls: LLMToolCall[] = [];\n\n // Build tool definitions in Vercel AI SDK format.\n // Uses any because the tool() generic requires inferred parameter types\n // which aren't available from MCP's JSON Schema at compile time.\n // Build tool definitions using explicit inputSchema (a Schema object with .jsonSchema).\n // We bypass the tool() helper because ai v6 tool() stores schema as .parameters\n // but prepareToolsAndToolChoice reads .inputSchema — they're inconsistent in v6.\n // Using jsonSchema() from @ai-sdk/provider-utils produces the correct Schema object.\n const tools: Record<string, any> = {};\n for (const mcpTool of mcpTools) {\n const toolName = mcpTool.name;\n // Ensure type:'object' is present — Anthropic requires it, some servers omit it.\n const rawSchema = {\n type: 'object',\n ...(mcpTool.inputSchema as Record<string, unknown>),\n };\n tools[toolName] = {\n description: mcpTool.description ?? '',\n inputSchema: jsonSchema(rawSchema),\n execute: async (args: Record<string, unknown>) => {\n const mcpStart = Date.now();\n const result = await mcp.callTool(toolName, args);\n mcpDurationMs += Date.now() - mcpStart;\n\n allToolCalls.push({ name: toolName, arguments: args });\n return extractText(result);\n },\n };\n }\n\n const maxSteps = config.maxToolCalls ?? 10;\n const llmStart = Date.now();\n\n const result = await (generateText as any)({\n model,\n prompt: scenario,\n tools,\n stopWhen: stepCountIs(maxSteps),\n temperature: config.temperature ?? 0,\n maxTokens: config.maxTokens,\n });\n\n const totalDurationMs = Date.now() - llmStart;\n const llmDurationMs = totalDurationMs - mcpDurationMs;\n\n const conversationHistory = (result.steps ?? []).map((step: any) => ({\n role: (step.toolCalls?.length > 0 ? 'tool' : 'assistant') as\n | 'tool'\n | 'assistant',\n content:\n step.toolCalls?.length > 0\n ? JSON.stringify(step.toolResults)\n : (step.text ?? ''),\n }));\n\n return {\n success: true,\n toolCalls: allToolCalls,\n response: result.text as string,\n scenario,\n llmDurationMs,\n mcpDurationMs,\n conversationHistory,\n };\n } catch (err) {\n return {\n success: false,\n toolCalls: [],\n error: enrichErrorMessage(err, config.provider ?? 'unknown'),\n };\n }\n },\n };\n}\n","import type {\n MCPHostSimulationResult,\n LLMToolCall,\n} from '../../mcpHostTypes.js';\n\n/** Parses NDJSON (stream-json) output from CLI hosts. */\nexport function parseStreamJson(stdout: string): MCPHostSimulationResult {\n const lines = stdout.split('\\n').filter((line) => line.trim().length > 0);\n const toolCalls: LLMToolCall[] = [];\n const textParts: string[] = [];\n const conversationHistory: Array<{\n role: 'user' | 'assistant' | 'tool';\n content: string;\n }> = [];\n\n for (const line of lines) {\n let event: StreamJsonEvent;\n try {\n event = JSON.parse(line) as StreamJsonEvent;\n } catch {\n // Skip non-JSON lines (e.g., debug output)\n continue;\n }\n\n if (event.type === 'assistant' && event.message?.content) {\n for (const block of event.message.content) {\n if (block.type === 'tool_use' && block.name) {\n const rawName = block.name;\n const mcpMatch = /^mcp__[^_]+__(.+)$/.exec(rawName);\n toolCalls.push({\n name: mcpMatch ? mcpMatch[1]! : rawName,\n arguments: block.input ?? {},\n id: block.id,\n });\n }\n\n if (block.type === 'text' && block.text) {\n textParts.push(block.text);\n }\n }\n }\n\n if (event.type === 'user' && event.message?.content) {\n for (const block of event.message.content) {\n if (block.type === 'tool_result') {\n const content =\n typeof block.content === 'string'\n ? block.content\n : JSON.stringify(block.content);\n conversationHistory.push({ role: 'tool', content });\n }\n }\n }\n\n if (event.type === 'result' && typeof event.result === 'string') {\n if (textParts.length === 0) {\n textParts.push(event.result);\n }\n }\n\n if (event.type === 'result' && event.is_error === true) {\n return {\n success: false,\n toolCalls,\n error:\n typeof event.result === 'string'\n ? event.result\n : 'CLI host reported an error',\n };\n }\n }\n\n const response = textParts.join('');\n\n if (response) {\n conversationHistory.push({ role: 'assistant', content: response });\n }\n\n return {\n success: true,\n toolCalls,\n response: response || undefined,\n conversationHistory:\n conversationHistory.length > 0 ? conversationHistory : undefined,\n };\n}\n\n/** Creates a parser for CLIs that output a single JSON object with configurable paths. */\nexport function createJsonParser(paths: {\n toolCalls: string;\n response: string;\n success?: string;\n}): (stdout: string) => MCPHostSimulationResult {\n return (stdout: string): MCPHostSimulationResult => {\n const data = JSON.parse(stdout) as Record<string, unknown>;\n\n const rawToolCalls = getNestedValue(data, paths.toolCalls);\n const toolCalls: LLMToolCall[] = Array.isArray(rawToolCalls)\n ? rawToolCalls.map((tc: Record<string, unknown>) => ({\n name: typeof tc.name === 'string' ? tc.name : '',\n arguments: (tc.arguments ?? tc.args ?? {}) as Record<string, unknown>,\n }))\n : [];\n\n const response = getNestedValue(data, paths.response);\n const success = paths.success\n ? Boolean(getNestedValue(data, paths.success))\n : true;\n\n return {\n success,\n toolCalls,\n response: typeof response === 'string' ? response : undefined,\n };\n };\n}\n\ninterface ContentBlock {\n type: string;\n id?: string;\n name?: string;\n input?: Record<string, unknown>;\n text?: string;\n content?: unknown;\n tool_use_id?: string;\n}\n\ninterface StreamJsonEvent {\n type: string;\n message?: { role?: string; content?: ContentBlock[] };\n result?: string;\n is_error?: boolean;\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((current, key) => {\n if (current !== null && typeof current === 'object') {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n}\n","import { spawn } from 'node:child_process';\nimport type {\n CLIConfig,\n LLMToolCall,\n MCPHostSimulationResult,\n} from '../../mcpHostTypes.js';\nimport { parseStreamJson, createJsonParser } from './parsers.js';\n\nconst DEFAULT_TIMEOUT = 120_000;\nconst MAX_BUFFER = 10 * 1024 * 1024; // 10MB\n\n/**\n * Returns a parser function for the given output format.\n */\nexport function getParser(\n format: CLIConfig['outputFormat']\n): (stdout: string) => MCPHostSimulationResult {\n switch (format ?? 'stream-json') {\n case 'stream-json':\n return parseStreamJson;\n case 'json':\n return createJsonParser({\n toolCalls: 'toolCalls',\n response: 'response',\n success: 'success',\n });\n }\n}\n\n/**\n * Interpolates `{{scenario}}` in each arg string.\n */\nexport function interpolateArgs(args: string[], scenario: string): string[] {\n return args.map((arg) => arg.replace(/\\{\\{scenario\\}\\}/g, scenario));\n}\n\n/**\n * Runs a CLI host: interpolates `{{scenario}}` in args, spawns the process\n * directly (no shell), and parses stdout according to `outputFormat`.\n *\n * Because the process is spawned without a shell, special characters in\n * the scenario (quotes, newlines, `$`, backticks, etc.) are passed through\n * safely as literal argument values.\n */\nexport async function runCLIHost(\n cliConfig: CLIConfig,\n scenario: string\n): Promise<MCPHostSimulationResult> {\n const timeout = cliConfig.timeout ?? DEFAULT_TIMEOUT;\n const args = interpolateArgs(cliConfig.args, scenario);\n\n const startTime = Date.now();\n\n let stdout: string;\n try {\n const result = await spawnProcess(cliConfig.command, args, { timeout });\n stdout = result.stdout;\n } catch (err) {\n const elapsed = Date.now() - startTime;\n const message = err instanceof Error ? err.message : String(err);\n\n if (message.includes('TIMEOUT') || message.includes('timed out')) {\n return {\n success: false,\n toolCalls: [],\n error:\n `CLI host timed out after ${elapsed}ms (limit: ${timeout}ms). ` +\n `Increase timeout via mcpHostConfig.cli.timeout.`,\n };\n }\n\n return {\n success: false,\n toolCalls: [],\n error: `CLI host process failed: ${message}`,\n };\n }\n\n const parse = getParser(cliConfig.outputFormat);\n\n let result: MCPHostSimulationResult;\n try {\n result = parse(stdout);\n } catch (err) {\n return {\n success: false,\n toolCalls: [],\n error:\n `Failed to parse CLI host output: ${err instanceof Error ? err.message : String(err)}` +\n `\\nstdout (first 500 chars): ${stdout.slice(0, 500)}`,\n };\n }\n\n const validationError = validateSimulationResult(result);\n if (validationError) {\n return {\n success: false,\n toolCalls: [],\n error: `CLI host returned invalid result: ${validationError}`,\n };\n }\n\n return result;\n}\n\nexport function validateSimulationResult(result: unknown): string | null {\n if (result === null || typeof result !== 'object') {\n return `Expected object, got ${typeof result}`;\n }\n\n const obj = result as Record<string, unknown>;\n\n if (typeof obj.success !== 'boolean') {\n return `\"success\" must be a boolean, got ${typeof obj.success}`;\n }\n\n if (!Array.isArray(obj.toolCalls)) {\n return `\"toolCalls\" must be an array, got ${typeof obj.toolCalls}`;\n }\n\n for (let i = 0; i < obj.toolCalls.length; i++) {\n const tc = obj.toolCalls[i] as LLMToolCall;\n if (typeof tc.name !== 'string') {\n return `toolCalls[${i}].name must be a string, got ${typeof tc.name}`;\n }\n if (typeof tc.arguments !== 'object' || tc.arguments === null) {\n return `toolCalls[${i}].arguments must be an object, got ${typeof tc.arguments}`;\n }\n }\n\n return null;\n}\n\n/**\n * Spawns a process directly (no shell) and closes stdin immediately.\n *\n * Using spawn without a shell means args are passed as-is to the process,\n * avoiding shell injection. Closing stdin prevents CLI hosts like Claude\n * Code from waiting for input.\n */\nfunction spawnProcess(\n command: string,\n args: string[],\n options: { timeout: number }\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // Close stdin immediately so the CLI doesn't wait for input\n child.stdin.end();\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let totalBytes = 0;\n\n child.stdout.on('data', (chunk: Buffer) => {\n totalBytes += chunk.length;\n if (totalBytes <= MAX_BUFFER) {\n stdoutChunks.push(chunk);\n }\n });\n\n child.stderr.on('data', (chunk: Buffer) => {\n totalBytes += chunk.length;\n if (totalBytes <= MAX_BUFFER) {\n stderrChunks.push(chunk);\n }\n });\n\n const timer = setTimeout(() => {\n child.kill('SIGTERM');\n reject(new Error(`Process timed out after ${options.timeout}ms`));\n }, options.timeout);\n\n child.on('error', (err) => {\n clearTimeout(timer);\n reject(err);\n });\n\n child.on('close', (code) => {\n clearTimeout(timer);\n const stdout = Buffer.concat(stdoutChunks).toString('utf-8');\n const stderr = Buffer.concat(stderrChunks).toString('utf-8');\n\n if (code !== 0) {\n reject(\n new Error(\n `Command failed with exit code ${code ?? 'null'}` +\n (stderr ? `\\nstderr: ${stderr}` : '')\n )\n );\n return;\n }\n\n resolve({ stdout, stderr });\n });\n });\n}\n","/**\n * MCP Host Simulation - Main entry point\n *\n * All providers (openai, anthropic, google, azure, mistral, deepseek,\n * openrouter, xai) run through the Vercel AI SDK orchestrator, which uses\n * generateText + stopWhen for a uniform multi-turn tool-calling loop with\n * built-in latency decomposition.\n *\n * Required packages per provider:\n * openai → npm install ai @ai-sdk/openai\n * anthropic → npm install ai @ai-sdk/anthropic\n * google → npm install ai @ai-sdk/google\n * azure → npm install ai @ai-sdk/azure\n * mistral → npm install ai @ai-sdk/mistral\n * deepseek → npm install ai @ai-sdk/deepseek\n * openrouter → npm install ai @openrouter/ai-sdk-provider\n * xai → npm install ai @ai-sdk/xai\n */\n\nimport type { MCPFixtureApi } from '../../mcp/fixtures/mcpFixture.js';\nimport type {\n MCPHostConfig,\n MCPHostSimulationResult,\n MCPHostSimulator,\n LLMProvider,\n} from './mcpHostTypes.js';\nimport { createVercelOrchestrator } from './adapters/vercel.js';\nimport { runCLIHost } from './adapters/cli/index.js';\n\n// Single orchestrator instance shared across all providers.\n// Each provider is dynamically imported inside the orchestrator on first use.\nconst vercelOrchestrator: MCPHostSimulator = createVercelOrchestrator();\n\nconst allProviders: LLMProvider[] = [\n 'openai',\n 'anthropic',\n 'azure',\n 'google',\n 'mistral',\n 'deepseek',\n 'openrouter',\n 'xai',\n 'vertex-anthropic',\n];\n\nconst simulatorRegistry = new Map<LLMProvider, MCPHostSimulator>(\n allProviders.map((p) => [p, vercelOrchestrator])\n);\n\n/**\n * Simulates an MCP host interacting with an MCP server.\n *\n * The LLM chooses which tools to call based solely on their descriptions and\n * schemas, testing discoverability and parameter clarity at the level a real\n * user (via Claude Desktop, ChatGPT, etc.) would experience.\n *\n * @param mcp - MCP fixture API (used by SDK hosts; ignored by CLI/browser hosts which establish their own connections)\n * @param scenario - Natural language prompt describing what the LLM should do\n * @param config - MCP host configuration (provider, model, temperature, etc.)\n * @returns Simulation result with tool calls, final response, and latency data\n *\n * @example\n * ```typescript\n * // SDK host (default) — uses the framework's existing MCP connection\n * const result = await simulateMCPHost(mcp,\n * \"Find recent documents about MCP testing frameworks\",\n * { provider: 'anthropic', model: 'claude-3-5-sonnet-20241022' }\n * );\n *\n * // CLI host — spawns a CLI process with its own MCP connection\n * const result = await simulateMCPHost(mcp,\n * \"Find recent documents about MCP testing frameworks\",\n * {\n * hostType: 'cli',\n * provider: 'anthropic',\n * cli: {\n * command: 'claude',\n * args: ['-p', '{{scenario}}', '--output-format', 'stream-json', '--verbose'],\n * },\n * }\n * );\n * ```\n */\nexport async function simulateMCPHost(\n mcp: MCPFixtureApi,\n scenario: string,\n config: MCPHostConfig\n): Promise<MCPHostSimulationResult> {\n const hostType = config.hostType ?? 'sdk';\n\n if (hostType === 'cli') {\n if (!config.cli) {\n throw new Error(\n `mcpHostConfig.cli is required when hostType is 'cli'. ` +\n `Provide { command } with a shell command containing {{scenario}}.`\n );\n }\n return runCLIHost(config.cli, scenario);\n }\n\n if (hostType === 'browser' || hostType === 'desktop') {\n throw new Error(\n `Host type '${hostType}' is not yet implemented. ` +\n `Supported host types: 'sdk', 'cli'.`\n );\n }\n\n // Default: SDK host via Vercel AI SDK\n if (!config.provider) {\n throw new Error(\n `mcpHostConfig.provider is required for 'sdk' host type. ` +\n `Supported: ${allProviders.join(', ')}`\n );\n }\n\n const simulator = simulatorRegistry.get(config.provider);\n if (!simulator) {\n throw new Error(\n `Unsupported provider: ${String(config.provider)}. ` +\n `Supported: ${allProviders.join(', ')}`\n );\n }\n return simulator.simulate(mcp, scenario, config);\n}\n\n/**\n * Returns true if the given provider is supported.\n *\n * Note: this does not check whether the required @ai-sdk/* package is\n * installed — that is validated at simulation time with a helpful error.\n */\nexport function isProviderAvailable(provider: LLMProvider): boolean {\n return simulatorRegistry.has(provider);\n}\n\n/**\n * Returns a human-readable installation message for a given provider.\n *\n * @remarks This is a diagnostic utility for checking whether optional\n * @ai-sdk/* packages are installed. Not part of the primary usage path.\n */\nexport function getMissingDependencyMessage(provider: LLMProvider): string {\n const packageMap: Partial<Record<LLMProvider, string>> = {\n openai: 'npm install ai @ai-sdk/openai',\n anthropic: 'npm install ai @ai-sdk/anthropic',\n google: 'npm install ai @ai-sdk/google',\n azure: 'npm install ai @ai-sdk/azure',\n mistral: 'npm install ai @ai-sdk/mistral',\n deepseek: 'npm install ai @ai-sdk/deepseek',\n openrouter: 'npm install ai @openrouter/ai-sdk-provider',\n xai: 'npm install ai @ai-sdk/xai',\n 'vertex-anthropic':\n 'npm install ai @ai-sdk/google-vertex (requires Application Default Credentials — see docs/mcp-host.md)',\n };\n\n const pkg = packageMap[provider];\n return pkg\n ? `${String(provider)} provider requires: ${pkg}`\n : `Unknown provider: ${String(provider)}`;\n}\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { dirname } from 'path';\nimport type { EvalRunnerResult } from './evalRunner.js';\n\n/**\n * Options for saveBaseline\n */\nexport interface SaveBaselineOptions {\n /**\n * When true (default), strips the `response` field from each case result\n * before saving. Keeps baseline files small and git-friendly — the baseline\n * is a pass/fail record and the full response is not needed for comparison.\n *\n * Set to false to preserve the complete response in the saved file.\n *\n * @default true\n */\n omitResponses?: boolean;\n}\n\n/**\n * Saves eval results to a JSON file for use as a baseline in future runs.\n *\n * @param result - The eval run result to save\n * @param filePath - Path to write the JSON file (parent dirs created automatically)\n * @param options - Save options\n */\nexport async function saveBaseline(\n result: EvalRunnerResult,\n filePath: string,\n options: SaveBaselineOptions = {}\n): Promise<void> {\n const { omitResponses = true } = options;\n\n const toSave = omitResponses\n ? {\n ...result,\n caseResults: result.caseResults.map(\n ({ response: _response, ...rest }) => rest\n ),\n }\n : result;\n\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(toSave, null, 2), 'utf8');\n}\n\n/**\n * Loads a previously saved baseline from a JSON file.\n *\n * @param filePath - Path to the JSON file written by saveBaseline\n * @returns The saved EvalRunnerResult\n * @throws If the file cannot be read or parsed\n */\nexport async function loadBaseline(\n filePath: string\n): Promise<EvalRunnerResult> {\n const raw = await readFile(filePath, 'utf8');\n return JSON.parse(raw) as EvalRunnerResult;\n}\n\n/**\n * Builds a map of case ID → pass status from a baseline result.\n * Used internally by runEvalDataset to tag current results with baseline status.\n */\nexport function buildBaselinePassMap(\n baseline: EvalRunnerResult\n): Map<string, boolean> {\n const map = new Map<string, boolean>();\n for (const result of baseline.caseResults) {\n map.set(result.id, result.pass);\n }\n return map;\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface ExecFileResult {\n status: 0 | 1;\n stdout: string;\n stderr: string;\n}\n\n/**\n * Runs execFile without throwing on non-zero exit codes.\n * Always returns a result object rather than throwing.\n */\nexport async function execFileNoThrow(\n file: string,\n args: string[]\n): Promise<ExecFileResult> {\n try {\n const result = await execFileAsync(file, args);\n return {\n status: 0,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n } catch (err: unknown) {\n const execErr = err as { stdout?: string; stderr?: string };\n return {\n status: 1,\n stdout: execErr.stdout ?? '',\n stderr: execErr.stderr ?? '',\n };\n }\n}\n","import type { MCPFixtureApi } from '../mcp/fixtures/mcpFixture.js';\nimport type { EvalDataset, EvalCase, EvalExpectBlock } from './datasetTypes.js';\nimport type { TestInfo, Expect } from '@playwright/test';\nimport type { ZodType } from 'zod';\nimport { simulateMCPHost } from './mcpHost/mcpHostSimulation.js';\nimport type { MCPHostSimulationResult } from './mcpHost/mcpHostTypes.js';\nimport type { EvalExpectationResult } from '../types/index.js';\nimport type {\n EvalCaseResult,\n EvalCaseRequest,\n IterationResult,\n EvalRunMetadata,\n} from '../types/reporter.js';\nimport {\n saveBaseline,\n loadBaseline,\n buildBaselinePassMap,\n} from './baseline.js';\nimport {\n validateResponse,\n validateSchema,\n validateText,\n validatePattern,\n validateError,\n validateSize,\n validateToolCalls,\n validateToolCallCount,\n validateJudge,\n} from '../assertions/validators/index.js';\nimport { execFileNoThrow } from '../utils/execFileNoThrow.js';\nimport { debugEval } from '../debug.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Context passed to the eval runner\n */\nexport interface EvalContext {\n /**\n * MCP fixture API for interacting with the server\n */\n mcp: MCPFixtureApi;\n\n /**\n * Optional Playwright TestInfo for reporter integration\n * When provided, eval results will be attached to the test for the MCP reporter\n */\n testInfo?: TestInfo;\n\n /**\n * Optional Playwright expect function for snapshot testing\n * Required for snapshot expectations to work properly\n */\n expect?: Expect;\n}\n\nexport type { EvalExpectationResult } from '../types/index.js';\n\nexport type {\n EvalCaseRequest,\n EvalCaseResult,\n IterationResult,\n EvalRunMetadata,\n} from '../types/reporter.js';\n\n/**\n * Overall result of running an eval dataset\n */\nexport interface EvalRunnerResult {\n /**\n * Total number of cases\n */\n total: number;\n\n /**\n * Number of passing cases\n */\n passed: number;\n\n /**\n * Number of failing cases\n */\n failed: number;\n\n /**\n * Individual case results\n */\n caseResults: Array<EvalCaseResult>;\n\n /**\n * Overall execution time in milliseconds\n */\n durationMs: number;\n\n /**\n * Difference between current pass rate and baseline pass rate.\n * Positive = improvement, negative = regression.\n * Only present when `baselineResultsFrom` was provided.\n */\n deltaPassRate?: number;\n\n /**\n * Number of cases that regressed: passed in baseline, failed now.\n * Only present when `baselineResultsFrom` was provided.\n */\n regressions?: number;\n\n /**\n * Number of cases that improved: failed in baseline, passed now.\n * Only present when `baselineResultsFrom` was provided.\n */\n improvements?: number;\n\n /**\n * Average tool precision across all mcp_host cases that have a\n * `toolsTriggered` expectation (precision = fraction of called tools\n * that were expected). Only present when at least one such case ran.\n */\n datasetToolPrecision?: number;\n\n /**\n * Average tool recall across all mcp_host cases that have a\n * `toolsTriggered` expectation (recall = fraction of required tools\n * that were actually called). Only present when at least one such case ran.\n */\n datasetToolRecall?: number;\n\n /**\n * Harmonic mean of `datasetToolPrecision` and `datasetToolRecall`.\n * Only present when at least one case contributes precision/recall data.\n */\n datasetToolF1?: number;\n\n /**\n * Experiment tracking metadata captured at run time.\n */\n metadata?: EvalRunMetadata;\n}\n\n/**\n * Options for running eval dataset\n */\nexport interface EvalRunnerOptions {\n /**\n * The dataset to run\n */\n dataset: EvalDataset;\n\n /**\n * Schema registry for schema validation by name\n *\n * Maps schema names to Zod schemas for use with expect.schema\n *\n * @example\n * ```typescript\n * {\n * schemas: {\n * WeatherResponse: z.object({ temperature: z.number() }),\n * ErrorResponse: z.object({ error: z.string() }),\n * }\n * }\n * ```\n */\n schemas?: Record<string, ZodType>;\n\n /**\n * Whether to stop on first failure\n * @default false\n */\n stopOnFailure?: boolean;\n\n /**\n * Optional callback called after each case\n */\n onCaseComplete?: (result: EvalCaseResult) => void | Promise<void>;\n\n /**\n * Maximum number of eval cases to run concurrently.\n * When > 1, cases run in parallel (ignores stopOnFailure ordering).\n * @default 1 (sequential)\n */\n concurrency?: number;\n\n /**\n * Default iteration count for `mcp_host` mode cases that do not specify\n * `iterations` explicitly. Has no effect on `direct` mode cases (which are\n * deterministic and always default to 1 iteration).\n *\n * Set to 10 for standard runs or 20 for release gates. Individual cases can\n * still override this with their own `iterations` field.\n *\n * @default 1 (preserves historical behaviour when not set)\n *\n * @example\n * ```typescript\n * // Run all mcp_host cases 10 times each by default\n * await runEvalDataset({ dataset, defaultLlmIterations: 10 }, { mcp });\n * ```\n */\n defaultLlmIterations?: number;\n\n /**\n * Default number of judge evaluations for cases that do not specify\n * `judgeReps` explicitly. Applies to any case with a `passesJudge`\n * expectation. Per-case `judgeReps` overrides this.\n *\n * @default 1 (single judge run)\n */\n defaultJudgeReps?: number;\n\n /**\n * When set, only eval cases whose `tags` array contains at least one of\n * the specified tags are run. Cases without a `tags` field are excluded.\n * When undefined or empty, all cases run (default behavior).\n */\n filterTags?: string[];\n\n /**\n * If set, saves the run results to this file path after completion.\n * Use with `baselineResultsFrom` on the next run for regression detection.\n *\n * @example '.mcp-test-results/baseline.json'\n */\n saveResultsTo?: string;\n\n /**\n * When true (default), strips the `response` field from each case result\n * before saving the baseline file. Keeps baseline files small and git-friendly —\n * the full tool response is not needed for pass/fail regression detection.\n *\n * Set to false to preserve complete responses in the saved file.\n *\n * @default true\n */\n omitResponsesFromBaseline?: boolean;\n\n /**\n * If set, loads this file as the baseline and computes delta metrics vs the current run.\n * Populates `EvalRunnerResult.deltaPassRate`, `.regressions`, `.improvements`,\n * and tags each `EvalCaseResult.baselinePass`.\n */\n baselineResultsFrom?: string;\n\n /**\n * MCP host model identifier to record in run metadata.\n * Use this to identify which model was used when running mcp_host cases.\n *\n * @example 'claude-opus-4-20250514'\n */\n mcpHostModel?: string;\n\n /**\n * Judge model identifier to record in run metadata.\n * Use this to identify which model was used for judge evaluations.\n *\n * @example 'claude-sonnet-4-20250514'\n */\n judgeModel?: string;\n}\n\n/**\n * Options for running a single eval case\n */\nexport interface EvalCaseOptions {\n /**\n * Dataset name for the result (defaults to 'single-case')\n */\n datasetName?: string;\n\n /**\n * Schema registry for schema validation by name\n */\n schemas?: Record<string, ZodType>;\n}\n\nasync function executeToolCall(\n evalCase: EvalCase,\n mcp: MCPFixtureApi\n): Promise<{ response: unknown; error?: string }> {\n const mode = evalCase.mode || 'direct';\n\n try {\n if (mode === 'mcp_host') {\n // MCP host simulation mode\n if (!evalCase.scenario) {\n throw new Error(\n `Eval case ${evalCase.id}: scenario is required for mcp_host mode`\n );\n }\n\n if (!evalCase.mcpHostConfig) {\n throw new Error(\n `Eval case ${evalCase.id}: mcpHostConfig is required for mcp_host mode`\n );\n }\n\n const simulationResult = await simulateMCPHost(\n mcp,\n evalCase.scenario,\n evalCase.mcpHostConfig\n );\n\n if (!simulationResult.success) {\n throw new Error(simulationResult.error || 'MCP host simulation failed');\n }\n\n return { response: simulationResult };\n } else {\n // Direct mode - call tool directly\n if (!evalCase.toolName) {\n throw new Error(\n `Eval case ${evalCase.id}: toolName is required for direct mode`\n );\n }\n if (!evalCase.args) {\n throw new Error(\n `Eval case ${evalCase.id}: args is required for direct mode`\n );\n }\n\n const result = await mcp.callTool(evalCase.toolName, evalCase.args);\n return { response: result };\n }\n } catch (err) {\n // Note: errors originating from mcp_host simulation are already enriched\n // with actionable context by enrichErrorMessage() in the vercel adapter.\n // Pass the message through unchanged so that hint text reaches the caller.\n return {\n response: undefined,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n/**\n * Determines if a case passed based on error and expectation results\n */\nfunction didCasePass(\n error: string | undefined,\n expectations: EvalCaseResult['expectations']\n): boolean {\n return (\n !error &&\n Object.values(expectations).every(\n (result) => result === undefined || result.pass\n )\n );\n}\n\n/**\n * Configuration for processing expect blocks\n */\ninterface ExpectBlockConfig {\n schemas?: Record<string, ZodType>;\n playwrightExpect?: Expect;\n judgeReps?: number;\n canonicalAnswer?: string;\n}\n\n/**\n * Return type for runExpectBlockValidations, including optional precision/recall metrics\n */\ninterface ExpectBlockResults {\n expectations: EvalCaseResult['expectations'];\n toolPrecision?: number;\n toolRecall?: number;\n}\n\n/**\n * Processes the new unified expect block using validators\n *\n * This function translates the expect block into validation results,\n * calling the appropriate validators for each field.\n */\nasync function runExpectBlockValidations(\n expectBlock: EvalExpectBlock,\n response: unknown,\n config: ExpectBlockConfig\n): Promise<ExpectBlockResults> {\n const results: EvalCaseResult['expectations'] = {};\n let toolPrecision: number | undefined;\n let toolRecall: number | undefined;\n\n // response (toMatchToolResponse)\n if (expectBlock.response !== undefined) {\n const validation = validateResponse(response, expectBlock.response);\n results.exact = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // schema (toMatchToolSchema)\n if (expectBlock.schema !== undefined) {\n const schema = config.schemas?.[expectBlock.schema];\n if (!schema) {\n results.schema = {\n pass: false,\n details: `Schema \"${expectBlock.schema}\" not found in schemas registry`,\n };\n } else {\n const validation = validateSchema(response, schema);\n results.schema = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n }\n\n // containsText (toContainToolText)\n if (expectBlock.containsText !== undefined) {\n const validation = validateText(response, expectBlock.containsText);\n results.textContains = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // matchesPattern (toMatchToolPattern)\n if (expectBlock.matchesPattern !== undefined) {\n const validation = validatePattern(response, expectBlock.matchesPattern);\n results.regex = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // isError (toBeToolError)\n if (expectBlock.isError !== undefined) {\n const validation = validateError(response, expectBlock.isError);\n results.error = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // responseSize (toHaveToolResponseSize)\n if (expectBlock.responseSize !== undefined) {\n const validation = validateSize(response, expectBlock.responseSize);\n results.size = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // toolsTriggered (toHaveToolCalls)\n if (expectBlock.toolsTriggered !== undefined) {\n const validation = validateToolCalls(response, expectBlock.toolsTriggered);\n results.toolsTriggered = {\n pass: validation.pass,\n details: validation.message,\n };\n toolPrecision = validation.metrics?.precision;\n toolRecall = validation.metrics?.recall;\n }\n\n // toolCallCount (toHaveToolCallCount)\n if (expectBlock.toolCallCount !== undefined) {\n const validation = validateToolCallCount(\n response,\n expectBlock.toolCallCount\n );\n results.toolCallCount = {\n pass: validation.pass,\n details: validation.message,\n };\n }\n\n // passesJudge (toPassToolJudge) — single or multi-judge\n if (expectBlock.passesJudge !== undefined) {\n const judgeConfigs = Array.isArray(expectBlock.passesJudge)\n ? expectBlock.passesJudge\n : [expectBlock.passesJudge];\n\n const judgeResultEntries = await Promise.all(\n judgeConfigs.map(async (judgeConfig) => {\n const effectiveReps = judgeConfig.reps ?? config.judgeReps ?? 1;\n const effectiveReference =\n judgeConfig.reference !== undefined\n ? judgeConfig.reference\n : config.canonicalAnswer;\n const validation = await validateJudge(response, {\n ...judgeConfig,\n reference: effectiveReference,\n reps: effectiveReps,\n });\n\n const judgeName =\n judgeConfig.judge ??\n (typeof judgeConfig.rubric === 'string'\n ? judgeConfig.rubric\n : undefined);\n\n return {\n pass: validation.pass,\n details: validation.message,\n score: validation.details?.score as number | undefined,\n reasoning: validation.details?.reasoning as string | undefined,\n judgeName,\n judgeProvider: validation.details?.judgeProvider as\n | string\n | undefined,\n judgeModel: validation.details?.judgeModel as string | undefined,\n } satisfies EvalExpectationResult;\n })\n );\n\n if (judgeResultEntries.length === 1) {\n // Single judge — flat result, same as before\n results.judge = judgeResultEntries[0]!;\n } else {\n // Multi-judge — aggregate with AND semantics\n const allPassed = judgeResultEntries.every((r) => r.pass);\n const passCount = judgeResultEntries.filter((r) => r.pass).length;\n\n results.judge = {\n pass: allPassed,\n details: `${passCount}/${judgeResultEntries.length} judges passed`,\n judgeResults: judgeResultEntries,\n };\n }\n }\n\n // snapshot (toMatchToolSnapshot) - requires Playwright expect with custom matcher\n if (expectBlock.snapshot !== undefined) {\n if (!config.playwrightExpect) {\n results.snapshot = {\n pass: false,\n details: 'Snapshot testing requires expect in context',\n };\n } else {\n try {\n // Use custom toMatchToolSnapshot matcher which:\n // 1. Extracts text from the response\n // 2. Applies sanitizers\n // 3. Uses Playwright's native snapshot testing\n const sanitizers = expectBlock.snapshotSanitizers ?? [];\n // eslint-disable-next-line @typescript-eslint/await-thenable, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n await (config.playwrightExpect(response) as any).toMatchToolSnapshot(\n expectBlock.snapshot,\n sanitizers\n );\n results.snapshot = {\n pass: true,\n details: `Matches snapshot \"${expectBlock.snapshot}\"`,\n };\n } catch (err) {\n results.snapshot = {\n pass: false,\n details: err instanceof Error ? err.message : String(err),\n };\n }\n }\n }\n\n return { expectations: results, toolPrecision, toolRecall };\n}\n\n/**\n * Builds the request metadata from an eval case for inclusion in results.\n */\nfunction buildRequest(evalCase: EvalCase): EvalCaseRequest {\n const request: EvalCaseRequest = {};\n if (evalCase.description) request.description = evalCase.description;\n\n if (evalCase.mode === 'mcp_host') {\n if (evalCase.scenario) request.scenario = evalCase.scenario;\n if (evalCase.mcpHostConfig) {\n request.mcpHostConfig = {\n provider: evalCase.mcpHostConfig.provider,\n ...(evalCase.mcpHostConfig.model !== undefined && {\n model: evalCase.mcpHostConfig.model,\n }),\n };\n }\n } else {\n if (evalCase.args) request.args = evalCase.args;\n }\n\n return request;\n}\n\nfunction isMCPHostSimulationResult(\n value: unknown\n): value is MCPHostSimulationResult {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'success' in value &&\n 'toolCalls' in value &&\n Array.isArray((value as MCPHostSimulationResult).toolCalls)\n );\n}\n\n/**\n * Runs a single iteration of an eval case (the atomic unit of work).\n * Extracted from runEvalCase to support multi-iteration accuracy loops.\n */\nasync function runSingleIteration(\n evalCase: EvalCase,\n context: EvalContext,\n options: EvalCaseOptions\n): Promise<EvalCaseResult> {\n const startTime = Date.now();\n\n // Execute tool call\n const { response, error } = await executeToolCall(evalCase, context.mcp);\n\n // Collect expectation results from expect block\n let expectationResults: EvalCaseResult['expectations'] = {};\n let toolPrecision: number | undefined;\n let toolRecall: number | undefined;\n\n let mcpHostTrace: EvalCaseResult['mcpHostTrace'];\n\n if (!error && evalCase.expect) {\n const {\n expectations,\n toolPrecision: tp,\n toolRecall: tr,\n } = await runExpectBlockValidations(evalCase.expect, response, {\n schemas: options.schemas,\n playwrightExpect: context.expect,\n judgeReps: evalCase.judgeReps,\n canonicalAnswer: evalCase.canonicalAnswer,\n });\n expectationResults = expectations;\n toolPrecision = tp;\n toolRecall = tr;\n\n // Build mcpHostTrace when toolsTriggered expectation is present\n if (\n evalCase.expect.toolsTriggered !== undefined &&\n isMCPHostSimulationResult(response)\n ) {\n const expectedNames = new Set(\n evalCase.expect.toolsTriggered.calls.map((c) => c.name)\n );\n const requiredNames = new Set(\n evalCase.expect.toolsTriggered.calls\n .filter((c) => c.required !== false)\n .map((c) => c.name)\n );\n const calledNames = new Set(response.toolCalls.map((c) => c.name));\n\n mcpHostTrace = {\n calls: response.toolCalls.map((call) => ({\n name: call.name,\n arguments: call.arguments,\n status: expectedNames.has(call.name) ? 'expected' : 'unexpected',\n })),\n missed: Array.from(requiredNames)\n .filter((name) => !calledNames.has(name))\n .map((name) => ({ name })),\n };\n }\n }\n\n // Build result - use test context for authType and project (Playwright is source of truth)\n return {\n id: evalCase.id,\n datasetName: options.datasetName ?? 'single-case',\n toolName:\n evalCase.scenario != null ? 'mcp_host' : (evalCase.toolName ?? 'unknown'),\n source: 'eval',\n pass: didCasePass(error, expectationResults),\n request: buildRequest(evalCase),\n response,\n error,\n expectations: expectationResults,\n authType: context.mcp.authType,\n project: context.mcp.project,\n durationMs: Date.now() - startTime,\n tags: evalCase.tags,\n toolPrecision,\n toolRecall,\n mcpHostTrace,\n };\n}\n\n/**\n * Returns true when the error message appears to be caused by network or\n * infrastructure issues (connection resets, timeouts, rate limits, etc.)\n * rather than an assertion or logic failure.\n *\n * Accepts either an Error object or a plain string error message so it can\n * classify both thrown errors and errors surfaced via result.error.\n */\nfunction isInfrastructureError(err: unknown): boolean {\n let name: string | undefined;\n let msg: string;\n let code: string = '';\n\n if (err instanceof Error) {\n name = err.name;\n msg = err.message.toLowerCase();\n code = ((err as NodeJS.ErrnoException).code ?? '').toLowerCase();\n } else if (typeof err === 'string') {\n msg = err.toLowerCase();\n } else {\n return false;\n }\n\n return (\n name?.toLowerCase() === 'aborterror' ||\n msg.includes('econnreset') ||\n msg.includes('etimedout') ||\n msg.includes('econnrefused') ||\n msg.includes('rate limit') ||\n msg.includes('429') ||\n msg.includes('503') ||\n msg.includes('network') ||\n // Prompt/context overflow — LLM couldn't run, not a tool discoverability failure\n msg.includes('prompt is too long') ||\n msg.includes('context length exceeded') ||\n msg.includes('maximum context length') ||\n msg.includes('context_length_exceeded') ||\n msg.includes('tokens > ') ||\n code.includes('econnreset') ||\n code.includes('etimedout') ||\n code.includes('econnrefused')\n );\n}\n\n/**\n * Runs a single eval case and returns the result.\n * When `evalCase.iterations > 1`, runs the case N times and returns accuracy.\n *\n * @param evalCase - The eval case to run\n * @param context - Context containing mcp, testInfo, expect\n * @param options - Optional configuration (datasetName, schemas)\n * @returns The result of running the eval case\n *\n * @example\n * ```typescript\n * const result = await runEvalCase(\n * evalCase,\n * { mcp, testInfo, expect },\n * { schemas: { WeatherResponse: WeatherSchema } }\n * );\n *\n * expect(result.pass).toBe(true);\n * ```\n */\nexport async function runEvalCase(\n evalCase: EvalCase,\n context: EvalContext,\n options: EvalCaseOptions = {}\n): Promise<EvalCaseResult> {\n const iterations = evalCase.iterations ?? 1;\n\n if (iterations === 1) {\n return runSingleIteration(evalCase, context, options);\n }\n\n // Multi-iteration: run N times and compute accuracy\n const iterationResults: IterationResult[] = [];\n let lastResult: EvalCaseResult | null = null;\n\n for (let i = 0; i < iterations; i++) {\n try {\n const result = await runSingleIteration(evalCase, context, options);\n lastResult = result;\n // Check whether the tool call itself failed due to infrastructure (the\n // error is surfaced as result.error since executeToolCall swallows throws)\n const infraError =\n result.error != null && isInfrastructureError(result.error);\n iterationResults.push({\n pass: result.pass,\n durationMs: result.durationMs,\n error: result.error,\n isInfrastructureError: infraError,\n mcpHostTrace: result.mcpHostTrace,\n });\n } catch (err) {\n // runSingleIteration should not throw, but guard defensively\n const errorMessage = err instanceof Error ? err.message : String(err);\n iterationResults.push({\n pass: false,\n durationMs: 0,\n error: errorMessage,\n isInfrastructureError: isInfrastructureError(err),\n });\n }\n }\n\n const infraErrors = iterationResults.filter((r) => r.isInfrastructureError);\n const assertionResults = iterationResults.filter(\n (r) => !r.isInfrastructureError\n );\n const passCount = assertionResults.filter((r) => r.pass).length;\n const assertionPassRate =\n assertionResults.length > 0 ? passCount / assertionResults.length : 0;\n const infrastructureErrorRate = infraErrors.length / iterations;\n const threshold = evalCase.accuracyThreshold ?? 1.0;\n\n // Fall back to a synthetic result if all iterations threw infrastructure errors\n const baseResult: EvalCaseResult = lastResult ?? {\n id: evalCase.id,\n datasetName: options.datasetName ?? 'single-case',\n toolName:\n evalCase.scenario != null ? 'mcp_host' : (evalCase.toolName ?? 'unknown'),\n source: 'eval',\n pass: false,\n error: iterationResults[0]?.error,\n expectations: {},\n authType: context.mcp.authType,\n project: context.mcp.project,\n durationMs: 0,\n tags: evalCase.tags,\n };\n\n return {\n ...baseResult,\n pass: assertionPassRate >= threshold,\n assertionPassRate,\n assertionPassRateCI: wilsonCI(passCount, assertionResults.length),\n infrastructureErrorRate,\n iterationResults,\n infrastructureErrorCount: infraErrors.length,\n durationMs: iterationResults.reduce((sum, r) => sum + r.durationMs, 0),\n };\n}\n\n/**\n * Computes a 95% Wilson score confidence interval for a proportion.\n *\n * Preferred over naive ±√(p(1-p)/n) because it stays within [0,1] at\n * extreme pass rates and has better coverage at small sample sizes.\n *\n * Returns undefined when n < 2 (not enough data for a meaningful interval).\n */\nfunction wilsonCI(\n k: number,\n n: number\n): { lower: number; upper: number } | undefined {\n if (n < 2) return undefined;\n const z = 1.96; // 95% confidence\n const z2 = z * z;\n const ñ = n + z2;\n const p̃ = (k + z2 / 2) / ñ;\n const margin = z * Math.sqrt((p̃ * (1 - p̃)) / ñ);\n return {\n lower: Math.max(0, p̃ - margin),\n upper: Math.min(1, p̃ + margin),\n };\n}\n\n/**\n * Runs an array of async tasks with bounded concurrency.\n * Preserves result ordering.\n */\nasync function runWithConcurrency<T>(\n tasks: Array<() => Promise<T>>,\n limit: number\n): Promise<T[]> {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const results: T[] = new Array(tasks.length);\n let index = 0;\n\n async function worker() {\n // `index++` is safe here: JavaScript's event loop is single-threaded, so the\n // read-modify-write of `index` completes atomically before any `await` yields\n // to another worker. Each worker captures a unique `i` before awaiting the task.\n while (index < tasks.length) {\n const i = index++;\n results[i] = await tasks[i]!();\n }\n }\n\n const workerCount = Math.min(limit, tasks.length);\n await Promise.all(Array.from({ length: workerCount }, worker));\n return results;\n}\n\n/**\n * Runs an eval dataset against an MCP server\n *\n * This function composes runEvalCase() for each case in the dataset,\n * adding dataset-level features like stopOnFailure and callbacks.\n *\n * @param options - Eval runner options (dataset, schemas)\n * @param context - Eval context (mcp fixture, optional testInfo, optional expect)\n * @returns Eval results\n *\n * @example\n * // Basic usage\n * const result = await runEvalDataset(\n * {\n * dataset,\n * schemas: { WeatherResponse: WeatherSchema },\n * },\n * { mcp }\n * );\n *\n * @example\n * // With MCP reporter integration\n * test('eval dataset', async ({ mcp }, testInfo) => {\n * const result = await runEvalDataset(\n * { dataset },\n * { mcp, testInfo } // testInfo enables MCP reporter\n * );\n * });\n */\n/**\n * Retrieves the current git commit hash using git rev-parse.\n * Returns undefined if git is unavailable or the directory is not a repo.\n */\nasync function getGitHash(): Promise<string | undefined> {\n const result = await execFileNoThrow('git', ['rev-parse', 'HEAD']);\n return result.status === 0 ? result.stdout.trim() : undefined;\n}\n\nexport async function runEvalDataset(\n options: EvalRunnerOptions,\n context: EvalContext\n): Promise<EvalRunnerResult> {\n const {\n dataset,\n schemas,\n stopOnFailure = false,\n concurrency = 1,\n defaultLlmIterations,\n defaultJudgeReps,\n onCaseComplete,\n filterTags,\n saveResultsTo,\n omitResponsesFromBaseline = true,\n baselineResultsFrom,\n mcpHostModel,\n judgeModel,\n } = options;\n\n const startTime = Date.now();\n\n // Merge schemas from dataset and options\n const allSchemas = {\n ...dataset.schemas,\n ...schemas,\n };\n\n // Filter cases by tag if filterTags is set (non-empty array)\n const casesToRun =\n filterTags && filterTags.length > 0\n ? dataset.cases.filter((c) => c.tags?.some((t) => filterTags.includes(t)))\n : dataset.cases;\n\n // Preflight cost warning: estimate the number of LLM judge API calls this run will make\n const estimatedJudgeCalls = casesToRun.reduce((sum, c) => {\n const effectiveIterations =\n c.mode === 'mcp_host'\n ? (c.iterations ?? defaultLlmIterations ?? 1)\n : (c.iterations ?? 1);\n if (c.expect?.passesJudge == null) return sum;\n const judges = Array.isArray(c.expect.passesJudge)\n ? c.expect.passesJudge\n : [c.expect.passesJudge];\n const totalReps = judges.reduce(\n (r, j) => r + (j.reps ?? c.judgeReps ?? defaultJudgeReps ?? 1),\n 0\n );\n return sum + effectiveIterations * totalReps;\n }, 0);\n\n if (estimatedJudgeCalls > 50) {\n debugEval(\n `Warning: This run will make approximately ${estimatedJudgeCalls} LLM judge API calls. This may incur significant costs.`\n );\n }\n\n // Build task factories for all cases\n const tasks = casesToRun.map((evalCase) => async () => {\n // Apply defaultLlmIterations to mcp_host cases that don't specify iterations.\n // Direct mode cases are deterministic — they always stay at 1 iteration.\n const withIterations =\n evalCase.mode === 'mcp_host' &&\n evalCase.iterations === undefined &&\n defaultLlmIterations !== undefined\n ? { ...evalCase, iterations: defaultLlmIterations }\n : evalCase;\n\n // Warn when a mcp_host case opts into multi-iteration accuracy measurement\n // but uses fewer iterations than the guide-recommended minimum.\n // Single-iteration mcp_host runs (the default) are a valid smoke-test pattern\n // and are not warned about — the warning is scoped to cases that have\n // explicitly chosen a multi-iteration count that is too small to be reliable.\n if (evalCase.mode === 'mcp_host') {\n const effectiveIterations = withIterations.iterations ?? 1;\n if (effectiveIterations > 1 && effectiveIterations < 10) {\n console.warn(\n `[mcp-server-tester] Eval case \"${evalCase.id}\": running ${effectiveIterations} iterations in mcp_host mode ` +\n `may not be statistically reliable. Consider using 10+ iterations for accuracy measurements you can trust.`\n );\n }\n }\n\n // Apply defaultJudgeReps to any case without explicit judgeReps\n const effectiveCase =\n withIterations.judgeReps === undefined && defaultJudgeReps !== undefined\n ? { ...withIterations, judgeReps: defaultJudgeReps }\n : withIterations;\n\n const result = await runEvalCase(effectiveCase, context, {\n datasetName: dataset.name,\n schemas: allSchemas,\n });\n\n if (onCaseComplete) {\n await onCaseComplete(result);\n }\n\n return result;\n });\n\n let caseResults: EvalCaseResult[];\n\n if (concurrency === 1 || stopOnFailure) {\n // Sequential path — required when stopOnFailure is set\n caseResults = [];\n for (const task of tasks) {\n const result = await task();\n caseResults.push(result);\n if (stopOnFailure && !result.pass) break;\n }\n } else {\n caseResults = await runWithConcurrency(tasks, concurrency);\n }\n\n const total = caseResults.length;\n const passed = caseResults.filter((r) => r.pass).length;\n\n const [gitHash] = await Promise.all([getGitHash()]);\n\n const metadata: EvalRunMetadata = {\n gitHash,\n timestamp: new Date().toISOString(),\n packageVersion: packageJson.version,\n ...(mcpHostModel !== undefined && { mcpHostModel }),\n ...(judgeModel !== undefined && { judgeModel }),\n };\n\n const result: EvalRunnerResult = {\n total,\n passed,\n failed: total - passed,\n caseResults,\n durationMs: Date.now() - startTime,\n metadata,\n };\n\n // Load baseline and compute delta if requested\n if (baselineResultsFrom) {\n try {\n const baseline = await loadBaseline(baselineResultsFrom);\n const baselinePassRate =\n baseline.total > 0 ? baseline.passed / baseline.total : 0;\n const baselineMap = buildBaselinePassMap(baseline);\n\n const currentCaseIds = result.caseResults.map((cr) => cr.id);\n const unmatchedCount = currentCaseIds.filter(\n (id) => !baselineMap.has(id)\n ).length;\n const unmatchedRatio =\n currentCaseIds.length > 0 ? unmatchedCount / currentCaseIds.length : 0;\n if (unmatchedRatio > 0.2) {\n console.warn(\n `[mcp-server-tester] Baseline comparison: ${unmatchedCount} of ${currentCaseIds.length} cases ` +\n `(${Math.round(unmatchedRatio * 100)}%) have no baseline entry. ` +\n `This may indicate the dataset structure has changed. Results for unmatched cases cannot be compared.`\n );\n }\n\n for (const cr of result.caseResults) {\n const baselinePass = baselineMap.get(cr.id);\n if (baselinePass !== undefined) {\n cr.baselinePass = baselinePass;\n }\n }\n\n result.regressions = result.caseResults.filter(\n (cr) => cr.baselinePass === true && !cr.pass\n ).length;\n result.improvements = result.caseResults.filter(\n (cr) => cr.baselinePass === false && cr.pass\n ).length;\n result.deltaPassRate =\n result.total > 0 ? result.passed / result.total - baselinePassRate : 0;\n } catch (err) {\n console.warn(\n `[mcp-server-tester] Could not load baseline from ${baselineResultsFrom}: ` +\n `${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n // Aggregate tool precision/recall/F1 across cases that have those metrics\n const mcpHostCases = caseResults.filter(\n (r) => r.toolPrecision !== undefined || r.toolRecall !== undefined\n );\n if (mcpHostCases.length > 0) {\n const avgPrec =\n mcpHostCases.reduce((s, r) => s + (r.toolPrecision ?? 0), 0) /\n mcpHostCases.length;\n const avgRecall =\n mcpHostCases.reduce((s, r) => s + (r.toolRecall ?? 0), 0) /\n mcpHostCases.length;\n result.datasetToolPrecision = avgPrec;\n result.datasetToolRecall = avgRecall;\n result.datasetToolF1 =\n avgPrec + avgRecall > 0\n ? (2 * avgPrec * avgRecall) / (avgPrec + avgRecall)\n : 0;\n }\n\n // Save results to file if requested\n if (saveResultsTo) {\n await saveBaseline(result, saveResultsTo, {\n omitResponses: omitResponsesFromBaseline,\n });\n }\n\n // Attach results for MCP reporter if testInfo is provided\n if (context.testInfo) {\n await context.testInfo.attach('mcp-test-results', {\n contentType: 'application/json',\n body: Buffer.from(JSON.stringify({ caseResults })),\n });\n } else if (caseResults.length > 0) {\n console.warn(\n '[mcp-server-tester] runEvalDataset: testInfo not provided — results will not appear in the MCP reporter.\\n' +\n 'To enable reporting, pass testInfo from the Playwright test function:\\n' +\n ' await runEvalDataset({ dataset }, { mcp, testInfo });'\n );\n }\n\n return result;\n}\n","import { runEvalDataset } from './evalRunner.js';\nimport type {\n EvalRunnerOptions,\n EvalContext,\n EvalRunnerResult,\n} from './evalRunner.js';\nimport type { EvalCaseResult } from '../types/reporter.js';\n\n/** Outcome of comparing two servers on a single eval case. */\nexport type ComparisonOutcome = 'A_WINS' | 'B_WINS' | 'TIE' | 'BOTH_FAIL';\n\n/** Result of comparing a single eval case across two servers. */\nexport interface CaseComparisonResult {\n /** Case ID */\n id: string;\n /** Comparison outcome */\n outcome: ComparisonOutcome;\n /** Result from server A */\n serverA: EvalCaseResult;\n /** Result from server B */\n serverB: EvalCaseResult;\n}\n\n/** Aggregated result of running a dataset against two servers. */\nexport interface ServerComparisonResult {\n /** Dataset name */\n dataset: string;\n /** Total cases compared (cases present in both runs) */\n total: number;\n /** Cases where server A passed and server B failed */\n aWins: number;\n /** Cases where server B passed and server A failed */\n bWins: number;\n /** Cases where both passed */\n ties: number;\n /** Cases where both failed */\n bothFail: number;\n /** Cases with a decisive outcome (aWins + bWins + ties, excludes BOTH_FAIL) */\n decidedCases: number;\n /** Fraction of total cases where both servers failed (bothFail / total) */\n failureAlignment: number;\n /** A win rate (aWins / decidedCases, excludes BOTH_FAIL) */\n aWinRate: number;\n /** B win rate (bWins / decidedCases, excludes BOTH_FAIL) */\n bWinRate: number;\n /** Tie rate (ties / decidedCases, excludes BOTH_FAIL) */\n tieRate: number;\n /** Per-case comparison results */\n cases: CaseComparisonResult[];\n /** Full result from server A */\n serverAResult: EvalRunnerResult;\n /** Full result from server B */\n serverBResult: EvalRunnerResult;\n /** Total duration in milliseconds */\n durationMs: number;\n}\n\n/**\n * Options for `runServerComparison`.\n * Same as `EvalRunnerOptions` without baseline-specific fields.\n */\nexport type ServerComparisonOptions = Omit<\n EvalRunnerOptions,\n 'saveResultsTo' | 'baselineResultsFrom'\n>;\n\n/**\n * Runs the same eval dataset against two MCP servers in parallel and\n * returns a detailed per-case comparison of results.\n *\n * Both servers receive identical cases and options. The comparison uses\n * simple pass/fail per case: A_WINS means A passed and B failed, etc.\n *\n * @param options - Eval dataset and runner options (shared between both servers)\n * @param contextA - MCP context for server A (e.g., Glean MCP)\n * @param contextB - MCP context for server B (e.g., native MCP)\n * @returns Comparison result with per-case outcomes and aggregate win rates\n *\n * @example\n * ```typescript\n * const comparison = await runServerComparison(\n * { dataset },\n * { mcp: gleanMcpFixture },\n * { mcp: nativeMcpFixture }\n * );\n * console.log(`Glean MCP wins: ${(comparison.aWinRate * 100).toFixed(1)}%`);\n * console.log(`Native MCP wins: ${(comparison.bWinRate * 100).toFixed(1)}%`);\n * ```\n */\nexport async function runServerComparison(\n options: ServerComparisonOptions,\n contextA: EvalContext,\n contextB: EvalContext\n): Promise<ServerComparisonResult> {\n const startTime = Date.now();\n\n // Run both servers concurrently\n const [resultA, resultB] = await Promise.all([\n runEvalDataset(options, contextA),\n runEvalDataset(options, contextB),\n ]);\n\n // Index results by case ID for O(1) lookup\n const mapA = new Map<string, EvalCaseResult>(\n resultA.caseResults.map((r) => [r.id, r])\n );\n const mapB = new Map<string, EvalCaseResult>(\n resultB.caseResults.map((r) => [r.id, r])\n );\n\n // Compare only cases present in both results\n const sharedIds = [...mapA.keys()].filter((id) => mapB.has(id));\n\n let aWins = 0;\n let bWins = 0;\n let ties = 0;\n let bothFail = 0;\n const cases: CaseComparisonResult[] = [];\n\n for (const id of sharedIds) {\n const a = mapA.get(id)!;\n const b = mapB.get(id)!;\n\n let outcome: ComparisonOutcome;\n if (a.pass && b.pass) {\n outcome = 'TIE';\n ties++;\n } else if (a.pass && !b.pass) {\n outcome = 'A_WINS';\n aWins++;\n } else if (!a.pass && b.pass) {\n outcome = 'B_WINS';\n bWins++;\n } else {\n outcome = 'BOTH_FAIL';\n bothFail++;\n }\n\n cases.push({ id, outcome, serverA: a, serverB: b });\n }\n\n const total = cases.length;\n const decidedCases = aWins + bWins + ties; // BOTH_FAIL excluded from win rate denominator\n\n return {\n dataset: options.dataset.name,\n total,\n aWins,\n bWins,\n ties,\n bothFail,\n decidedCases,\n failureAlignment: total > 0 ? bothFail / total : 0,\n aWinRate: decidedCases > 0 ? aWins / decidedCases : 0,\n bWinRate: decidedCases > 0 ? bWins / decidedCases : 0,\n tieRate: decidedCases > 0 ? ties / decidedCases : 0,\n cases,\n serverAResult: resultA,\n serverBResult: resultB,\n durationMs: Date.now() - startTime,\n };\n}\n","import type { MCPFixtureApi } from '../mcp/fixtures/mcpFixture.js';\nimport type { TestInfo } from '@playwright/test';\nimport type {\n Tool,\n Resource,\n Prompt,\n ServerCapabilities,\n Implementation,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { MCPConformanceCheck } from '../types/reporter.js';\n\nexport type { MCPConformanceCheck };\n\n/**\n * Options for conformance checks\n */\nexport interface MCPConformanceOptions {\n /**\n * List of tools that must be present\n */\n requiredTools?: Array<string>;\n\n /**\n * Whether to validate tool schemas\n * @default true\n */\n validateSchemas?: boolean;\n\n /**\n * Whether to check server info is present\n * @default true\n */\n checkServerInfo?: boolean;\n\n /**\n * Whether to check resources capability (if declared by server)\n * @default true\n */\n checkResources?: boolean;\n\n /**\n * Whether to check prompts capability (if declared by server)\n * @default true\n */\n checkPrompts?: boolean;\n}\n\n/**\n * Raw MCP responses for snapshotting\n */\nexport interface MCPConformanceRaw {\n /**\n * Server info (name, version)\n * null if not available\n */\n serverInfo: Implementation | null;\n\n /**\n * Server capabilities\n * null if not available\n */\n capabilities: ServerCapabilities | null;\n\n /**\n * List of tools from the server\n */\n tools: Tool[];\n\n /**\n * List of resources from the server\n * null if server doesn't declare resources capability\n */\n resources: Resource[] | null;\n\n /**\n * List of prompts from the server\n * null if server doesn't declare prompts capability\n */\n prompts: Prompt[] | null;\n}\n\n/**\n * Result of conformance checks\n */\nexport interface MCPConformanceResult {\n /**\n * Whether all checks passed\n */\n pass: boolean;\n\n /**\n * List of check results\n */\n checks: MCPConformanceCheck[];\n\n /**\n * Raw MCP responses for snapshotting\n *\n * @example\n * ```typescript\n * const result = await runConformanceChecks(mcp);\n * expect(result.raw.tools).toMatchSnapshot();\n * expect(result.raw.capabilities).toMatchSnapshot();\n * ```\n */\n raw: MCPConformanceRaw;\n}\n\n/**\n * Runs MCP protocol conformance checks\n *\n * Validates that the MCP server conforms to expected protocol behavior.\n * Returns both assertion results and raw MCP responses for snapshotting.\n *\n * When testInfo is provided, results are automatically attached for the MCP reporter.\n *\n * @param mcp - MCP fixture API\n * @param options - Conformance check options\n * @param testInfo - Optional Playwright TestInfo for reporter integration\n * @returns Conformance check results with raw responses\n *\n * @example\n * ```typescript\n * // Basic usage\n * const result = await runConformanceChecks(mcp, {\n * requiredTools: ['get_weather', 'search_docs'],\n * validateSchemas: true,\n * });\n *\n * // Check assertions\n * expect(result.pass).toBe(true);\n *\n * // With reporter integration (recommended in Playwright tests)\n * const result = await runConformanceChecks(mcp, {\n * requiredTools: ['search'],\n * }, testInfo);\n *\n * // Snapshot raw responses\n * expect(result.raw.tools).toMatchSnapshot();\n * expect(result.raw.capabilities).toMatchSnapshot();\n * ```\n */\nexport async function runConformanceChecks(\n mcp: MCPFixtureApi,\n options: MCPConformanceOptions = {},\n testInfo?: TestInfo\n): Promise<MCPConformanceResult> {\n const {\n requiredTools = [],\n validateSchemas = true,\n checkServerInfo = true,\n checkResources = true,\n checkPrompts = true,\n } = options;\n\n const checks: MCPConformanceCheck[] = [];\n const raw: MCPConformanceRaw = {\n serverInfo: null,\n capabilities: null,\n tools: [],\n resources: null,\n prompts: null,\n };\n\n // Get server info\n const serverInfo = mcp.getServerInfo();\n if (serverInfo) {\n raw.serverInfo = serverInfo as Implementation;\n }\n\n // Check 1: Server info is present\n if (checkServerInfo) {\n checks.push({\n name: 'server_info_present',\n pass: serverInfo !== null,\n message: serverInfo\n ? `Server info: ${serverInfo.name ?? 'unknown'} v${serverInfo.version ?? 'unknown'}`\n : 'Server info is missing',\n });\n }\n\n // Get capabilities from client\n const capabilities = mcp.client.getServerCapabilities();\n if (capabilities) {\n raw.capabilities = capabilities;\n }\n\n // Check 2: Capabilities are valid\n checks.push({\n name: 'capabilities_valid',\n pass: capabilities !== undefined,\n message: capabilities\n ? `Server capabilities: ${formatCapabilities(capabilities)}`\n : 'Server capabilities not available',\n });\n\n // Check 3: List tools returns valid response\n let tools: Tool[] = [];\n try {\n tools = await mcp.listTools();\n raw.tools = tools;\n checks.push({\n name: 'list_tools_succeeds',\n pass: true,\n message: `listTools returned ${tools.length} tools`,\n });\n } catch (error) {\n checks.push({\n name: 'list_tools_succeeds',\n pass: false,\n message: `listTools failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n const pass = checks.every((check) => check.pass);\n return { pass, checks, raw };\n }\n\n // Check 4: Required tools are present\n if (requiredTools.length > 0) {\n const toolNames = new Set(tools.map((t) => t.name));\n const missingTools = requiredTools.filter((name) => !toolNames.has(name));\n\n checks.push({\n name: 'required_tools_present',\n pass: missingTools.length === 0,\n message:\n missingTools.length === 0\n ? `All ${requiredTools.length} required tools are present`\n : `Missing required tools: ${missingTools.join(', ')}`,\n });\n }\n\n // Check 5: Tool schemas are valid\n if (validateSchemas && tools.length > 0) {\n const invalidTools: Array<string> = [];\n\n for (const tool of tools) {\n // Check that tool has required fields\n if (!tool.name) {\n invalidTools.push(`(unnamed tool): missing name`);\n continue;\n }\n\n if (!tool.inputSchema) {\n invalidTools.push(`${tool.name}: missing inputSchema`);\n continue;\n }\n\n // Check that inputSchema is an object schema\n if (tool.inputSchema.type !== 'object') {\n invalidTools.push(\n `${tool.name}: inputSchema.type must be \"object\", got \"${String(tool.inputSchema.type)}\"`\n );\n }\n }\n\n checks.push({\n name: 'tool_schemas_valid',\n pass: invalidTools.length === 0,\n message:\n invalidTools.length === 0\n ? `All ${tools.length} tools have valid schemas`\n : `Invalid tool schemas:\\n ${invalidTools.join('\\n ')}`,\n });\n }\n\n // Check 6: List resources (only if server declares resources capability)\n if (checkResources && capabilities?.resources) {\n try {\n const resourcesResult = await mcp.client.listResources();\n raw.resources = resourcesResult.resources;\n checks.push({\n name: 'list_resources_succeeds',\n pass: true,\n message: `listResources returned ${resourcesResult.resources.length} resources`,\n });\n } catch (error) {\n checks.push({\n name: 'list_resources_succeeds',\n pass: false,\n message: `listResources failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n // Check 7: List prompts (only if server declares prompts capability)\n if (checkPrompts && capabilities?.prompts) {\n try {\n const promptsResult = await mcp.client.listPrompts();\n raw.prompts = promptsResult.prompts;\n checks.push({\n name: 'list_prompts_succeeds',\n pass: true,\n message: `listPrompts returned ${promptsResult.prompts.length} prompts`,\n });\n } catch (error) {\n checks.push({\n name: 'list_prompts_succeeds',\n pass: false,\n message: `listPrompts failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n // Check 8: Calling invalid tool returns error\n try {\n const result = await mcp.callTool('__nonexistent_tool__', {});\n // MCP SDK may return isError: true instead of throwing\n const hasError = result.isError === true;\n checks.push({\n name: 'invalid_tool_returns_error',\n pass: hasError,\n message: hasError\n ? 'Nonexistent tool correctly returned an error'\n : 'Calling nonexistent tool should have returned an error',\n });\n } catch {\n // Or it may throw - both are acceptable\n checks.push({\n name: 'invalid_tool_returns_error',\n pass: true,\n message: 'Nonexistent tool correctly threw an error',\n });\n }\n\n const pass = checks.every((check) => check.pass);\n\n const result: MCPConformanceResult = { pass, checks, raw };\n\n // Attach results for MCP reporter if testInfo is provided\n if (testInfo) {\n await testInfo.attach('mcp-conformance-checks', {\n contentType: 'application/json',\n body: JSON.stringify(\n {\n operation: 'conformanceChecks',\n pass,\n checks,\n serverInfo: raw.serverInfo,\n capabilities: raw.capabilities,\n toolCount: raw.tools.length,\n authType: mcp.authType,\n project: mcp.project,\n },\n null,\n 2\n ),\n });\n }\n\n return result;\n}\n\n/**\n * Formats server capabilities for display\n */\nfunction formatCapabilities(capabilities: ServerCapabilities): string {\n const parts: string[] = [];\n if (capabilities.tools) parts.push('tools');\n if (capabilities.resources) parts.push('resources');\n if (capabilities.prompts) parts.push('prompts');\n if (capabilities.logging) parts.push('logging');\n if (capabilities.completions) parts.push('completions');\n if (capabilities.experimental) parts.push('experimental');\n return parts.length > 0 ? parts.join(', ') : 'none declared';\n}\n"]}
|