@zimic/interceptor 0.14.0-canary.24 → 0.14.0-canary.25

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.
@@ -16,12 +16,12 @@ var ClientSocket__default = /*#__PURE__*/_interopDefault(ClientSocket);
16
16
  var __defProp = Object.defineProperty;
17
17
  var __name2 = /* @__PURE__ */ chunkWCQVDF3K_js.__name((target, value) => __defProp(target, "name", { value, configurable: true }), "__name");
18
18
 
19
- // ../zimic-utils/dist/chunk-7MZYQWWC.mjs
19
+ // ../zimic-utils/dist/chunk-RIVHLEFF.mjs
20
20
  var URL_PATH_PARAM_REGEX = /\/:([^/]+)/g;
21
21
  function createRegExpFromURL(url) {
22
22
  URL_PATH_PARAM_REGEX.lastIndex = 0;
23
- const urlWithReplacedPathParams = encodeURI(url).replace(/([.()*?+$\\])/g, "\\$1").replace(URL_PATH_PARAM_REGEX, "/(?<$1>[^/]+)").replace(/(\/+)$/, "(?:/+)?");
24
- return new RegExp(`^${urlWithReplacedPathParams}$`);
23
+ const urlWithReplacedPathParams = encodeURI(url).replace(/([.()*?+$\\])/g, "\\$1").replace(URL_PATH_PARAM_REGEX, "/(?<$1>[^/]+)").replace(/^(\/)|(\/)$/g, "");
24
+ return new RegExp(`^(?:/)?${urlWithReplacedPathParams}(?:/)?$`);
25
25
  }
26
26
  chunkWCQVDF3K_js.__name(createRegExpFromURL, "createRegExpFromURL");
27
27
  __name2(createRegExpFromURL, "createRegExpFromURL");
@@ -41,7 +41,7 @@ var excludeURLParams_default = excludeURLParams;
41
41
 
42
42
  // ../zimic-utils/dist/chunk-3O5CS47X.mjs
43
43
  function isDefined(value) {
44
- return value !== undefined && value !== null;
44
+ return value !== void 0 && value !== null;
45
45
  }
46
46
  chunkWCQVDF3K_js.__name(isDefined, "isDefined");
47
47
  __name2(isDefined, "isDefined");
@@ -65,7 +65,7 @@ chunkWCQVDF3K_js.__name(removeArrayElement, "removeArrayElement");
65
65
  function createCachedDynamicImport(importModuleDynamically) {
66
66
  let cachedImportResult;
67
67
  return /* @__PURE__ */ __name2(/* @__PURE__ */ chunkWCQVDF3K_js.__name(async function importModuleDynamicallyWithCache() {
68
- if (cachedImportResult === undefined) {
68
+ if (cachedImportResult === void 0) {
69
69
  cachedImportResult = await importModuleDynamically();
70
70
  }
71
71
  return cachedImportResult;
@@ -77,7 +77,7 @@ var createCachedDynamicImport_default = createCachedDynamicImport;
77
77
 
78
78
  // src/utils/environment.ts
79
79
  function isClientSide() {
80
- return typeof window !== "undefined";
80
+ return typeof window !== "undefined" && typeof document !== "undefined";
81
81
  }
82
82
  chunkWCQVDF3K_js.__name(isClientSide, "isClientSide");
83
83
 
@@ -186,7 +186,7 @@ chunkWCQVDF3K_js.__name(stopHttpServer, "stopHttpServer");
186
186
  function getHttpServerPort(server) {
187
187
  const address = server.address();
188
188
  if (typeof address === "string") {
189
- return undefined;
189
+ return void 0;
190
190
  } else {
191
191
  return address?.port;
192
192
  }
@@ -329,7 +329,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
329
329
  this.stoppingPromise = stoppingResult;
330
330
  await this.stoppingPromise;
331
331
  }
332
- this.stoppingPromise = undefined;
332
+ this.stoppingPromise = void 0;
333
333
  }
334
334
  async logUnhandledRequestIfNecessary(request, strategy) {
335
335
  if (strategy?.log) {
@@ -414,7 +414,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
414
414
  if (!canHaveBody) {
415
415
  return new Response(null, { headers, status });
416
416
  }
417
- if (typeof declaration.body === "string" || declaration.body === undefined || declaration.body instanceof FormData || declaration.body instanceof URLSearchParams || declaration.body instanceof Blob || declaration.body instanceof ArrayBuffer) {
417
+ if (typeof declaration.body === "string" || declaration.body === void 0 || declaration.body instanceof FormData || declaration.body instanceof URLSearchParams || declaration.body instanceof Blob || declaration.body instanceof ArrayBuffer) {
418
418
  return new Response(declaration.body ?? null, { headers, status });
419
419
  }
420
420
  return Response.json(declaration.body, { headers, status });
@@ -441,7 +441,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
441
441
  },
442
442
  get(target, property) {
443
443
  if (_HttpInterceptorWorker.isHiddenRequestProperty(property)) {
444
- return undefined;
444
+ return void 0;
445
445
  }
446
446
  return Reflect.get(target, property, target);
447
447
  }
@@ -495,7 +495,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
495
495
  },
496
496
  get(target, property) {
497
497
  if (_HttpInterceptorWorker.isHiddenResponseProperty(property)) {
498
- return undefined;
498
+ return void 0;
499
499
  }
500
500
  return Reflect.get(target, property, target);
501
501
  }
@@ -1101,7 +1101,7 @@ var WebSocketServer = class extends WebSocketHandler_default {
1101
1101
  this.httpServer = options.httpServer;
1102
1102
  }
1103
1103
  isRunning() {
1104
- return this.webSocketServer !== undefined;
1104
+ return this.webSocketServer !== void 0;
1105
1105
  }
1106
1106
  start() {
1107
1107
  if (this.isRunning()) {
@@ -1129,7 +1129,7 @@ var WebSocketServer = class extends WebSocketHandler_default {
1129
1129
  await super.closeClientSockets();
1130
1130
  await closeServerSocket(this.webSocketServer, { timeout: this.socketTimeout() });
1131
1131
  this.webSocketServer.removeAllListeners();
1132
- this.webSocketServer = undefined;
1132
+ this.webSocketServer = void 0;
1133
1133
  }
1134
1134
  };
1135
1135
  var WebSocketServer_default = WebSocketServer;
@@ -1219,8 +1219,8 @@ var InterceptorServer = class {
1219
1219
  return this._logUnhandledRequests;
1220
1220
  }
1221
1221
  httpURL() {
1222
- if (this._port === undefined) {
1223
- return undefined;
1222
+ if (this._port === void 0) {
1223
+ return void 0;
1224
1224
  }
1225
1225
  return `http://${this._hostname}:${this._port}`;
1226
1226
  }
@@ -1277,7 +1277,7 @@ var InterceptorServer = class {
1277
1277
  resetWorker = /* @__PURE__ */ chunkWCQVDF3K_js.__name((message, socket) => {
1278
1278
  this.removeHttpHandlersBySocket(socket);
1279
1279
  const handlersToResetTo = message.data;
1280
- const isWorkerNoLongerCommitted = handlersToResetTo === undefined;
1280
+ const isWorkerNoLongerCommitted = handlersToResetTo === void 0;
1281
1281
  if (isWorkerNoLongerCommitted) {
1282
1282
  this.webSocketServer().abortSocketMessages([socket]);
1283
1283
  } else {
@@ -1328,14 +1328,14 @@ var InterceptorServer = class {
1328
1328
  const httpServer = this.httpServer();
1329
1329
  await stopHttpServer(httpServer);
1330
1330
  httpServer.removeAllListeners();
1331
- this._httpServer = undefined;
1331
+ this._httpServer = void 0;
1332
1332
  }
1333
1333
  async stopWebSocketServer() {
1334
1334
  const webSocketServer = this.webSocketServer();
1335
1335
  webSocketServer.offEvent("interceptors/workers/use/commit", this.commitWorker);
1336
1336
  webSocketServer.offEvent("interceptors/workers/use/reset", this.resetWorker);
1337
1337
  await webSocketServer.stop();
1338
- this._webSocketServer = undefined;
1338
+ this._webSocketServer = void 0;
1339
1339
  }
1340
1340
  handleHttpRequest = /* @__PURE__ */ chunkWCQVDF3K_js.__name(async (nodeRequest, nodeResponse) => {
1341
1341
  const request = server.normalizeNodeRequest(nodeRequest, await getFetchAPI());
@@ -1494,5 +1494,5 @@ exports.NotStartedInterceptorServerError_default = NotStartedInterceptorServerEr
1494
1494
  exports.createCachedDynamicImport_default = createCachedDynamicImport_default;
1495
1495
  exports.interceptorServer = interceptorServer;
1496
1496
  exports.logWithPrefix = logWithPrefix;
1497
- //# sourceMappingURL=chunk-BJLJWEVE.js.map
1498
- //# sourceMappingURL=chunk-BJLJWEVE.js.map
1497
+ //# sourceMappingURL=chunk-3623PRKE.js.map
1498
+ //# sourceMappingURL=chunk-3623PRKE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../zimic-utils/dist/chunk-PAWJFY3S.mjs","../../zimic-utils/src/url/createRegExpFromURL.ts","../../zimic-utils/src/url/excludeURLParams.ts","../../zimic-utils/src/data/isDefined.ts","../src/utils/arrays.ts","../../zimic-utils/src/import/createCachedDynamicImport.ts","../src/utils/environment.ts","../src/utils/files.ts","../src/utils/console.ts","../src/utils/http.ts","../src/http/requestHandler/types/requests.ts","../src/http/interceptorWorker/constants.ts","../src/http/interceptorWorker/errors/InvalidFormDataError.ts","../src/http/interceptorWorker/errors/InvalidJSONError.ts","../src/http/interceptorWorker/HttpInterceptorWorkerStore.ts","../src/http/interceptorWorker/HttpInterceptorWorker.ts","../src/utils/data.ts","../src/utils/fetch.ts","../src/utils/webSocket.ts","../src/utils/crypto.ts","../src/webSocket/errors/InvalidWebSocketMessage.ts","../src/webSocket/errors/NotStartedWebSocketHandlerError.ts","../src/webSocket/WebSocketHandler.ts","../src/webSocket/WebSocketServer.ts","../src/server/constants.ts","../src/server/errors/NotStartedInterceptorServerError.ts","../src/server/utils/fetch.ts","../src/server/InterceptorServer.ts","../src/server/factory.ts","../src/server/namespace/InterceptorServerNamespace.ts","../src/server/index.ts"],"names":["__name","chalk","HTTP_METHODS_WITH_RESPONSE_BODY","interceptor","HttpHeaders","HttpSearchParams","HttpFormData","ClientSocket","HTTP_METHODS","createServer","normalizeNodeRequest","sendNodeResponse","handler"],"mappings":";;;;;;;;;;;;;;;AAAA,IAAI,YAAY,MAAO,CAAA,cAAA;AACvB,IAAIA,OAAS,mBAAAA,uBAAA,CAAA,CAAC,MAAQ,EAAA,KAAA,KAAU,SAAU,CAAA,MAAA,EAAQ,MAAQ,EAAA,EAAE,KAAO,EAAA,YAAA,EAAc,IAAK,EAAC,CAA1E,EAAA,QAAA,CAAA;;;ACDN,IAAM,oBAAuB,GAAA,aAAA;AAEpC,SAAS,oBAAoB,GAAa,EAAA;AACxC,EAAA,oBAAA,CAAqB,SAAY,GAAA,CAAA;AAEjC,EAAA,MAAM,yBAA4B,GAAA,SAAA,CAAU,GAAG,CAAA,CAC5C,QAAQ,gBAAkB,EAAA,MAAM,CAChC,CAAA,OAAA,CAAQ,oBAAsB,EAAA,eAAe,CAC7C,CAAA,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AAE7B,EAAA,OAAO,IAAI,MAAA,CAAO,CAAU,OAAA,EAAA,yBAAyB,CAAS,OAAA,CAAA,CAAA;AAChE;AATSA,uBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAAAA,OAAAA,CAAA,qBAAA,qBAAA,CAAA;AAWT,IAAO,2BAAQ,GAAA,mBAAA;;;ACbf,SAAS,iBAAiB,GAAU,EAAA;AAClC,EAAA,GAAA,CAAI,IAAO,GAAA,EAAA;AACX,EAAA,GAAA,CAAI,MAAS,GAAA,EAAA;AACb,EAAA,GAAA,CAAI,QAAW,GAAA,EAAA;AACf,EAAA,GAAA,CAAI,QAAW,GAAA,EAAA;AACR,EAAA,OAAA,GAAA;AACT;AANSA,uBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAAAA,OAAAA,CAAA,kBAAA,kBAAA,CAAA;AAQT,IAAO,wBAAQ,GAAA,gBAAA;;;ACRf,SAAS,UAAiB,KAA2C,EAAA;AAC5D,EAAA,OAAA,KAAA,KAAU,UAAa,KAAU,KAAA,IAAA;AAC1C;AAFSA,uBAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAAAA,OAAAA,CAAA,WAAA,WAAA,CAAA;AAIT,IAAO,iBAAQ,GAAA,SAAA;;;ACJR,SAAS,gBAAA,CAAuB,OAAe,KAAe,EAAA;AACnE,EAAA,IAAI,KAAS,IAAA,CAAA,IAAK,KAAQ,GAAA,KAAA,CAAM,MAAQ,EAAA;AACtC,IAAM,KAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA;AAEvB,EAAO,OAAA,KAAA;AACT;AALgBA,uBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAOT,SAAS,kBAAA,CAAyB,OAAe,OAAe,EAAA;AACrE,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AACnC,EAAO,OAAA,gBAAA,CAAiB,OAAO,KAAK,CAAA;AACtC;AAHgBA,uBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;;;ACPhB,SAAS,0BACP,uBAC2B,EAAA;AACvB,EAAA,IAAA,kBAAA;AAEJ,EAAA,uBAAAA,OAAA,iBAAAA,uBAAA,CAAA,eAAsB,gCAAmC,GAAA;AACvD,IAAA,IAAI,uBAAuB,MAAW,EAAA;AACpC,MAAA,kBAAA,GAAqB,MAAM,uBAAwB,EAAA;AAAA;AAE9C,IAAA,OAAA,kBAAA;AAAA,GAAA,EAJT,qCAAO,kCAAA,CAAA;AAMT;AAXSA,uBAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;AAAAA,OAAAA,CAAA,2BAAA,2BAAA,CAAA;AAaT,IAAO,iCAAQ,GAAA;;;ACTR,SAAS,YAAe,GAAA;AAC7B,EAAA,OAAO,OAAO,MAAA,KAAW,WAAe,IAAA,OAAO,QAAa,KAAA,WAAA;AAC9D;AAFgBA,uBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;;;ACFT,IAAM,UAAa,GAAA,iCAAA;AAAA;AAAA;AAAA;AAAA,EAIxB,YAAY,UAAW,CAAA,IAAA,IAAA,CAAS,MAAM,OAAO,QAAQ,CAAG,EAAA;AAC1D,CAAA;;;ACqDA,IAAM,UAAa,GAAA,iCAAA,CAA0B,MAAM,OAAO,MAAM,CAAC,CAAA;AAEjE,eAAsB,gBAAiB,CAAA,KAAA,EAAgB,OAAgC,GAAA,EAAI,EAAA;AACzF,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAO,OAAA,KAAA;AAAA;AAGT,EAAM,MAAA,EAAE,MAAS,GAAA,IAAA,EAAS,GAAA,OAAA;AAE1B,EAAM,MAAA,IAAA,GAAO,MAAM,UAAW,EAAA;AAE9B,EAAO,OAAA,IAAA,CAAK,QAAQ,KAAO,EAAA;AAAA,IACzB,MAAA;AAAA,IACA,OAAS,EAAA,IAAA;AAAA,IACT,KAAO,EAAA,QAAA;AAAA,IACP,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAiB,EAAA,QAAA;AAAA,IACjB,WAAa,EAAA,QAAA;AAAA,IACb,MAAQ,EAAA;AAAA,GACT,CAAA;AACH;AAlBsBA,uBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAoBf,SAAS,aAAc,CAAA,iBAAA,EAA4B,OAAiD,GAAA,EAAI,EAAA;AAC7G,EAAM,MAAA,EAAE,MAAS,GAAA,KAAA,EAAU,GAAA,OAAA;AAE3B,EAAA,MAAM,WAAW,KAAM,CAAA,OAAA,CAAQ,iBAAiB,CAAI,GAAA,iBAAA,GAAoB,CAAC,iBAAiB,CAAA;AAC1F,EAAA,OAAA,CAAQ,MAAM,CAAE,CAAAC,uBAAA,CAAM,KAAK,sBAAsB,CAAA,EAAG,GAAG,QAAQ,CAAA;AACjE;AALgBD,uBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;ACzEhB,IAAM,sBAAA,GAAN,cAAqC,KAAM,CAAA;AAAA,EAT3C;AAS2C,IAAAA,uBAAA,CAAA,IAAA,EAAA,wBAAA,CAAA;AAAA;AAAC,CAAA;AAErC,IAAM,2BAAA,GAAN,cAA0C,sBAAuB,CAAA;AAAA,EAXxE;AAWwE,IAAAA,uBAAA,CAAA,IAAA,EAAA,6BAAA,CAAA;AAAA;AAAA,EACtE,YAAY,cAAwB,EAAA;AAClC,IAAM,KAAA,CAAA,CAAA,kCAAA,EAAqC,cAAc,CAAK,GAAA,CAAA,CAAA;AAC9D,IAAA,IAAA,CAAK,IAAO,GAAA,wBAAA;AAAA;AAEhB,CAAA;AAEO,IAAM,0BAAA,GAAN,cAAyC,sBAAuB,CAAA;AAAA,EAlBvE;AAkBuE,IAAAA,uBAAA,CAAA,IAAA,EAAA,4BAAA,CAAA;AAAA;AAAA,EACrE,YAAY,cAAwB,EAAA;AAClC,IAAM,KAAA,CAAA,CAAA,iCAAA,EAAoC,cAAc,CAAK,GAAA,CAAA,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAO,GAAA,uBAAA;AAAA;AAEhB,CAAA;AAEO,IAAM,wCAAwC,EAAK,GAAA,GAAA;AAE1D,eAAsB,eACpB,CAAA,MAAA,EACA,OAII,GAAA,EACJ,EAAA;AACA,EAAA,MAAM,EAAE,QAAU,EAAA,IAAA,EAAM,OAAS,EAAA,eAAA,GAAkB,uCAA0C,GAAA,OAAA;AAE7F,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,IAAA,SAAS,iBAAiB,KAAgB,EAAA;AACxC,MAAO,MAAA,CAAA,GAAA,CAAI,aAAa,kBAAkB,CAAA;AAC1C,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA;AAFL,IAAAA,uBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAKT,IAAM,MAAA,YAAA,GAAe,WAAW,MAAM;AACpC,MAAM,MAAA,YAAA,GAAe,IAAI,2BAAA,CAA4B,eAAe,CAAA;AACpE,MAAA,gBAAA,CAAiB,YAAY,CAAA;AAAA,OAC5B,eAAe,CAAA;AAElB,IAAA,SAAS,kBAAqB,GAAA;AAC5B,MAAO,MAAA,CAAA,GAAA,CAAI,SAAS,gBAAgB,CAAA;AACpC,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAQ,OAAA,EAAA;AAAA;AAHD,IAAAA,uBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAMT,IAAO,MAAA,CAAA,IAAA,CAAK,SAAS,gBAAgB,CAAA;AACrC,IAAO,MAAA,CAAA,MAAA,CAAO,IAAM,EAAA,QAAA,EAAU,kBAAkB,CAAA;AAAA,GACjD,CAAA;AACH;AA9BsBA,uBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAgCtB,eAAsB,cAAe,CAAA,MAAA,EAAoB,OAAgC,GAAA,EAAI,EAAA;AAC3F,EAAA,MAAM,EAAE,OAAA,EAAS,eAAkB,GAAA,qCAAA,EAA0C,GAAA,OAAA;AAE7E,EAAI,IAAA,CAAC,OAAO,SAAW,EAAA;AACrB,IAAA;AAAA;AAGF,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,IAAM,MAAA,WAAA,GAAc,WAAW,MAAM;AACnC,MAAM,MAAA,YAAA,GAAe,IAAI,0BAAA,CAA2B,eAAe,CAAA;AACnE,MAAA,MAAA,CAAO,YAAY,CAAA;AAAA,OAClB,eAAe,CAAA;AAElB,IAAO,MAAA,CAAA,KAAA,CAAM,CAAC,KAAU,KAAA;AACtB,MAAA,YAAA,CAAa,WAAW,CAAA;AAIxB,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACP,MAAA;AACL,QAAQ,OAAA,EAAA;AAAA;AACV,KACD,CAAA;AAED,IAAA,MAAA,CAAO,mBAAoB,EAAA;AAAA,GAC5B,CAAA;AACH;AA3BsBA,uBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AA6Bf,SAAS,kBAAkB,MAAoB,EAAA;AACpD,EAAM,MAAA,OAAA,GAAU,OAAO,OAAQ,EAAA;AAI/B,EAAI,IAAA,OAAO,YAAY,QAAU,EAAA;AAC/B,IAAO,OAAA,MAAA;AAAA,GACF,MAAA;AACL,IAAA,OAAO,OAAS,EAAA,IAAA;AAAA;AAEpB;AAVgBA,uBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAiBT,SAAS,0BAA0B,MAA0D,EAAA;AAClG,EAAA,MAAM,gBAAsC,GAAAE,oCAAA;AAC5C,EAAO,OAAA,gBAAA,CAAiB,SAAS,MAAM,CAAA;AACzC;AAHgBF,uBAAA,CAAA,yBAAA,EAAA,2BAAA,CAAA;;;ACVT,IAAM,6CAA6C,MAAO,CAAA,MAAA;AAAA,sBAC3D,GAA6E,CAAA;AAAA,IAC/E,UAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD;AACH,CAAA;AAEO,IAAM,8CAA8C,MAAO,CAAA,MAAA;AAAA,EAChE,IAAI,GAAA;AAAA,IACF;AAAA;AAEJ,CAAA;;;AC7GO,IAAM,kCAAA,GAAqC,OAAO,MAAO,CAAA;AAAA,EAC9D,KAAA,EAAO,OAAO,MAAkD,CAAA;AAAA,IAC9D,MAAQ,EAAA,QAAA;AAAA,IACR,GAAK,EAAA;AAAA,GACN,CAAA;AAAA,EACD,MAAA,EAAQ,OAAO,MAAmD,CAAA;AAAA,IAChE,MAAQ,EAAA,QAAA;AAAA,IACR,GAAK,EAAA;AAAA,GACN;AACH,CAAuF,CAAA;;;ACNvF,IAAM,oBAAA,GAAN,cAAmC,WAAY,CAAA;AAAA,EAL/C;AAK+C,IAAAA,uBAAA,CAAA,IAAA,EAAA,sBAAA,CAAA;AAAA;AAAA,EAC7C,YAAY,KAAe,EAAA;AACzB,IAAM,KAAA,CAAA,CAAA,oCAAA,EAAuC,KAAK,CAAE,CAAA,CAAA;AACpD,IAAA,IAAA,CAAK,IAAO,GAAA,sBAAA;AAAA;AAEhB,CAAA;AAEA,IAAO,4BAAQ,GAAA,oBAAA;;;ACPf,IAAM,gBAAA,GAAN,cAA+B,WAAY,CAAA;AAAA,EAL3C;AAK2C,IAAAA,uBAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AAAA,EACzC,YAAY,KAAe,EAAA;AACzB,IAAM,KAAA,CAAA,CAAA,+BAAA,EAAkC,KAAK,CAAE,CAAA,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAO,GAAA,kBAAA;AAAA;AAEhB,CAAA;AAEA,IAAO,wBAAQ,GAAA,gBAAA;;;ACTf,IAAM,0BAAA,GAAN,MAAM,2BAA2B,CAAA;AAAA,EAHjC;AAGiC,IAAAA,uBAAA,CAAA,IAAA,EAAA,4BAAA,CAAA;AAAA;AAAA,EAC/B,OAAe,0BAGX,GAAA;AAAA,IACF,KAAO,EAAA,EAAE,GAAG,kCAAA,CAAmC,KAAM,EAAA;AAAA,IACrD,MAAQ,EAAA,EAAE,GAAG,kCAAA,CAAmC,MAAO;AAAA,GACzD;AAAA,EAEQ,KAAQ,GAAA,2BAAA;AAAA,EAKhB,0BAA0B,eAAsC,EAAA;AAC9D,IAAO,OAAA,IAAA,CAAK,KAAM,CAAA,0BAAA,CAA2B,eAAe,CAAA;AAAA;AAC9D,EAKA,4BAAA,CAA6B,iBAAsC,QAAoC,EAAA;AACrG,IAAA,IAAI,oBAAoB,OAAS,EAAA;AAC/B,MAAK,IAAA,CAAA,KAAA,CAAM,0BAA2B,CAAA,eAAe,CAAI,GAAA,QAAA;AAAA,KACpD,MAAA;AACL,MAAK,IAAA,CAAA,KAAA,CAAM,0BAA2B,CAAA,eAAe,CAAI,GAAA,QAAA;AAAA;AAC3D;AAEJ,CAAA;AAEA,IAAO,kCAAQ,GAAA,0BAAA;;;ACOf,IAAe,qBAAA,GAAf,MAAe,sBAAsB,CAAA;AAAA,EAxCrC;AAwCqC,IAAAA,uBAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AAAA;AAAA,EAG3B,SAA4C,GAAA,IAAA;AAAA,EAC5C,UAAa,GAAA,KAAA;AAAA,EACb,eAAA;AAAA,EACA,eAAA;AAAA,EAEA,KAAA,GAAQ,IAAI,kCAA2B,EAAA;AAAA,EAEvC,sBAAkD,EAAC;AAAA,EAE3D,QAAW,GAAA;AACT,IAAA,OAAO,IAAK,CAAA,SAAA;AAAA;AACd,EAEU,YAAY,QAAmC,EAAA;AACvD,IAAA,IAAA,CAAK,SAAY,GAAA,QAAA;AAAA;AACnB,EAEA,SAAY,GAAA;AACV,IAAA,OAAO,IAAK,CAAA,UAAA;AAAA;AACd,EAEU,aAAa,SAAoB,EAAA;AACzC,IAAA,IAAA,CAAK,UAAa,GAAA,SAAA;AAAA;AACpB,EAIA,MAAgB,YAAY,aAAoC,EAAA;AAC9D,IAAI,IAAA,IAAA,CAAK,WAAa,EAAA;AACpB,MAAA;AAAA;AAGF,IAAA,IAAI,KAAK,eAAiB,EAAA;AACxB,MAAA,OAAO,IAAK,CAAA,eAAA;AAAA;AAGd,IAAI,IAAA;AACF,MAAA,IAAA,CAAK,kBAAkB,aAAc,EAAA;AACrC,MAAA,MAAM,IAAK,CAAA,eAAA;AAEX,MAAA,IAAA,CAAK,eAAkB,GAAA,KAAA,CAAA;AAAA,aAChB,KAAO,EAAA;AAId,MAAI,IAAA,CAAC,cAAgB,EAAA;AACnB,QAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA;AAGrB,MAAA,MAAM,KAAK,IAAK,EAAA;AAChB,MAAM,MAAA,KAAA;AAAA;AACR;AACF,EAIA,MAAgB,WAAW,YAA2C,EAAA;AACpE,IAAI,IAAA,CAAC,IAAK,CAAA,SAAA,EAAa,EAAA;AACrB,MAAA;AAAA;AAEF,IAAA,IAAI,KAAK,eAAiB,EAAA;AACxB,MAAA,OAAO,IAAK,CAAA,eAAA;AAAA;AAGd,IAAA,MAAM,iBAAiB,YAAa,EAAA;AAEpC,IAAA,IAAI,0BAA0B,OAAS,EAAA;AACrC,MAAA,IAAA,CAAK,eAAkB,GAAA,cAAA;AACvB,MAAA,MAAM,IAAK,CAAA,eAAA;AAAA;AAGb,IAAA,IAAA,CAAK,eAAkB,GAAA,MAAA;AAAA;AACzB,EASA,MAAgB,8BACd,CAAA,OAAA,EACA,QACA,EAAA;AACA,IAAA,IAAI,UAAU,GAAK,EAAA;AACjB,MAAA,MAAM,sBAAsB,CAAA,0BAAA,CAA2B,OAAS,EAAA,QAAA,CAAS,MAAM,CAAA;AAC/E,MAAO,OAAA,EAAE,WAAW,IAAK,EAAA;AAAA;AAE3B,IAAO,OAAA,EAAE,WAAW,KAAM,EAAA;AAAA;AAC5B,EAEA,MAAgB,2BAA4B,CAAA,OAAA,EAAkB,eAAsC,EAAA;AAClG,IAAA,MAAM,UAAa,GAAA,MAAM,IAAK,CAAA,qCAAA,CAAsC,SAAS,eAAe,CAAA;AAC5F,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,wCAAA,CAAyC,UAAU,CAAA;AACzE,IAAO,OAAA,QAAA;AAAA;AACT,EAEQ,yCAAyC,mBAA6D,EAAA;AAC5G,IAAI,IAAA,mBAAA,CAAoB,WAAW,CAAG,EAAA;AACpC,MAAO,OAAA,IAAA;AAAA;AAIT,IAAA,OAAO,mBAAoB,CAAA,MAAA;AAAA,MACzB,CAAC,qBAAqB,iBAA6D,MAAA;AAAA,QACjF,QAAQ,mBAAoB,CAAA,MAAA;AAAA,QAC5B,GAAA,EAAK,mBAAoB,CAAA,GAAA,IAAO,iBAAkB,CAAA;AAAA,OACpD;AAAA,KACF;AAAA;AACF,EAEA,MAAc,qCACZ,CAAA,OAAA,EACA,eACiD,EAAA;AACjD,IAAM,MAAA,qBAAA,GAAwB,IAAK,CAAA,wCAAA,CAAyC,eAAe,CAAA;AAE3F,IAAI,IAAA;AACF,MAAM,MAAA,WAAA,GAAc,IAAK,CAAA,+BAAA,CAAgC,OAAO,CAAA;AAEhE,MAAA,IAAI,CAAC,WAAa,EAAA;AAChB,QAAA,OAAO,EAAC;AAAA;AAGV,MAAM,MAAA,YAAA,GAAe,QAAQ,KAAM,EAAA;AAEnC,MAAA,MAAM,CAAC,eAAiB,EAAA,mBAAmB,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QAC/D,IAAA,CAAK,kCAAmC,CAAA,OAAA,EAAS,eAAe,CAAA;AAAA,QAChE,IAAA,CAAK,sCAAuC,CAAA,YAAA,EAAc,WAAW;AAAA,OACtE,CAAA;AAED,MAAA,MAAM,oBAAuB,GAAA,CAAC,mBAAqB,EAAA,eAAA,EAAiB,qBAAqB,CAAA;AACzF,MAAA,MAAM,sBAAsB,MAAM,OAAA,CAAQ,IAAI,oBAAqB,CAAA,MAAA,CAAO,iBAAS,CAAC,CAAA;AACpF,MAAO,OAAA,mBAAA;AAAA,aACA,KAAO,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAEnB,MAAM,MAAA,mBAAA,GAAsB,CAAC,qBAAqB,CAAA;AAClD,MAAO,OAAA,mBAAA;AAAA;AACT;AACF,EAEA,2BAA2B,WAAuC,EAAA;AAChE,IAAK,IAAA,CAAA,mBAAA,CAAoB,KAAK,WAAW,CAAA;AAAA;AAC3C,EAEA,6BAA6B,WAAuC,EAAA;AAClE,IAAmB,kBAAA,CAAA,IAAA,CAAK,qBAAqB,WAAW,CAAA;AAAA;AAC1D,EAEQ,gCAAgC,OAAkB,EAAA;AACxD,IAAA,MAAM,WAAc,GAAA,IAAA,CAAK,mBAAoB,CAAA,QAAA,CAAS,CAACG,YAAgB,KAAA;AACrE,MAAM,MAAA,OAAA,GAAUA,aAAY,OAAQ,EAAA;AACpC,MAAO,OAAA,OAAA,CAAQ,GAAI,CAAA,UAAA,CAAW,OAAO,CAAA;AAAA,KACtC,CAAA;AAED,IAAO,OAAA,WAAA;AAAA;AACT,EAEQ,yCAAyC,eAAsC,EAAA;AACrF,IAAA,OAAO,mCAAmC,eAAe,CAAA;AAAA;AAC3D,EAEA,MAAc,kCAAmC,CAAA,OAAA,EAAkB,eAAsC,EAAA;AACvG,IAAA,MAAM,wBAA2B,GAAA,IAAA,CAAK,KAAM,CAAA,yBAAA,CAA0B,eAAe,CAAA;AAErF,IAAI,IAAA,OAAO,6BAA6B,UAAY,EAAA;AAClD,MAAA,MAAM,aAAgB,GAAA,MAAM,sBAAsB,CAAA,wBAAA,CAAyB,OAAO,CAAA;AAClF,MAAA,OAAO,yBAAyB,aAAa,CAAA;AAAA;AAG/C,IAAO,OAAA,wBAAA;AAAA;AACT,EAEA,MAAc,sCAAuC,CAAA,OAAA,EAAkB,WAAuC,EAAA;AAC5G,IAAM,MAAA,4BAAA,GAA+B,YAAY,kBAAmB,EAAA;AAEpE,IAAI,IAAA,OAAO,iCAAiC,UAAY,EAAA;AACtD,MAAA,MAAM,aAAgB,GAAA,MAAM,sBAAsB,CAAA,wBAAA,CAAyB,OAAO,CAAA;AAClF,MAAA,OAAO,6BAA6B,aAAa,CAAA;AAAA;AAGnD,IAAO,OAAA,4BAAA;AAAA;AACT,EAUA,OAAO,6BACL,CAAA,OAAA,EACA,WACc,EAAA;AACd,IAAA,MAAM,OAAU,GAAA,IAAIC,gBAAY,CAAA,WAAA,CAAY,OAAO,CAAA;AACnD,IAAA,MAAM,SAAS,WAAY,CAAA,MAAA;AAE3B,IAAA,MAAM,WAAc,GAAA,yBAAA,CAA0B,OAAQ,CAAA,MAAoB,KAAK,MAAW,KAAA,GAAA;AAE1F,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA;AAG/C,IAAA,IACE,OAAO,WAAY,CAAA,IAAA,KAAS,YAC5B,WAAY,CAAA,IAAA,KAAS,UACrB,WAAY,CAAA,IAAA,YAAgB,QAC5B,IAAA,WAAA,CAAY,gBAAgB,eAC5B,IAAA,WAAA,CAAY,gBAAgB,IAC5B,IAAA,WAAA,CAAY,gBAAgB,WAC5B,EAAA;AACA,MAAO,OAAA,IAAI,SAAS,WAAY,CAAA,IAAA,IAAQ,MAAM,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA;AAGnE,IAAA,OAAO,SAAS,IAAK,CAAA,WAAA,CAAY,MAAM,EAAE,OAAA,EAAS,QAAQ,CAAA;AAAA;AAC5D,EAEA,aAAa,yBAAyB,OAAkB,EAAA;AACtD,IAAA,OAAO,IAAK,CAAA,eAAA;AAAA,MACV;AAAA,KACF;AAAA;AACF,EAEA,aAAa,eAAA,CACX,kBACA,EAAA,OAAA,GAAiC,EACoB,EAAA;AACrD,IAAM,MAAA,UAAA,GAAa,mBAAmB,KAAM,EAAA;AAC5C,IAAM,MAAA,eAAA,GAAkB,WAAW,KAAM,EAAA;AAGzC,IAAA,MAAM,UAAa,GAAA,MAAM,IAAK,CAAA,YAAA,CAAyB,UAAU,CAAA;AAGjE,IAAA,MAAM,OAAU,GAAA,IAAIA,gBAA2B,CAAA,UAAA,CAAW,OAAO,CAAA;AAEjE,IAAM,MAAA,UAAA,GAAa,QAAQ,QAAW,GAAA,IAAA,CAAK,mBAAyB,OAAQ,CAAA,QAAA,EAAU,UAAU,CAAA,GAAI,EAAC;AAErG,IAAA,MAAM,SAAY,GAAA,IAAI,GAAI,CAAA,UAAA,CAAW,GAAG,CAAA;AAExC,IAAA,MAAM,YAAe,GAAA,IAAIC,qBAAqC,CAAA,SAAA,CAAU,YAAY,CAAA;AAEpF,IAAM,MAAA,aAAA,GAAgB,IAAI,KAAA,CAAM,UAAqE,EAAA;AAAA,MACnG,GAAA,CAAI,QAAQ,QAA4D,EAAA;AACtE,QAAI,IAAA,sBAAA,CAAsB,uBAAwB,CAAA,QAAQ,CAAG,EAAA;AAC3D,UAAO,OAAA,KAAA;AAAA;AAET,QAAO,OAAA,OAAA,CAAQ,GAAI,CAAA,MAAA,EAAQ,QAAQ,CAAA;AAAA,OACrC;AAAA,MAEA,GAAA,CAAI,QAAQ,QAA4D,EAAA;AACtE,QAAI,IAAA,sBAAA,CAAsB,uBAAwB,CAAA,QAAQ,CAAG,EAAA;AAC3D,UAAO,OAAA,MAAA;AAAA;AAET,QAAA,OAAO,OAAQ,CAAA,GAAA,CAAI,MAAQ,EAAA,QAAA,EAAU,MAAM,CAAA;AAAA;AAC7C,KACD,CAAA;AAED,IAAO,MAAA,CAAA,cAAA,CAAe,eAAe,MAAQ,EAAA;AAAA,MAC3C,KAAO,EAAA,UAAA;AAAA,MACP,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,QAAU,EAAA;AAAA,KACX,CAAA;AAED,IAAO,MAAA,CAAA,cAAA,CAAe,eAAe,SAAW,EAAA;AAAA,MAC9C,KAAO,EAAA,OAAA;AAAA,MACP,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,QAAU,EAAA;AAAA,KACX,CAAA;AAED,IAAO,MAAA,CAAA,cAAA,CAAe,eAAe,YAAc,EAAA;AAAA,MACjD,KAAO,EAAA,UAAA;AAAA,MACP,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,QAAU,EAAA;AAAA,KACX,CAAA;AAED,IAAO,MAAA,CAAA,cAAA,CAAe,eAAe,cAAgB,EAAA;AAAA,MACnD,KAAO,EAAA,YAAA;AAAA,MACP,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,QAAU,EAAA;AAAA,KACX,CAAA;AAED,IAAO,MAAA,CAAA,cAAA,CAAe,eAAe,KAAO,EAAA;AAAA,MAC1C,KAAO,EAAA,eAAA;AAAA,MACP,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,QAAU,EAAA;AAAA,KACX,CAAA;AAED,IAAO,OAAA,aAAA;AAAA;AACT,EAEA,OAAe,wBAAwB,QAAkB,EAAA;AACvD,IAAO,OAAA,0CAAA,CAA2C,IAAI,QAAiB,CAAA;AAAA;AACzE,EAEA,aAAa,iBACX,mBAC4D,EAAA;AAC5D,IAAM,MAAA,WAAA,GAAc,oBAAoB,KAAM,EAAA;AAC9C,IAAM,MAAA,gBAAA,GAAmB,YAAY,KAAM,EAAA;AAG3C,IAAA,MAAM,UAAa,GAAA,MAAM,IAAK,CAAA,YAAA,CAAyB,WAAW,CAAA;AAGlE,IAAA,MAAM,OAAU,GAAA,IAAID,gBAA2B,CAAA,WAAA,CAAY,OAAO,CAAA;AAElE,IAAM,MAAA,aAAA,GAAgB,IAAI,KAAA,CAAM,WAA6E,EAAA;AAAA,MAC3G,GAAA,CAAI,QAAQ,QAAmE,EAAA;AAC7E,QAAI,IAAA,sBAAA,CAAsB,wBAAyB,CAAA,QAAQ,CAAG,EAAA;AAC5D,UAAO,OAAA,KAAA;AAAA;AAET,QAAO,OAAA,OAAA,CAAQ,GAAI,CAAA,MAAA,EAAQ,QAAQ,CAAA;AAAA,OACrC;AAAA,MAEA,GAAA,CAAI,QAAQ,QAAmE,EAAA;AAC7E,QAAI,IAAA,sBAAA,CAAsB,wBAAyB,CAAA,QAAQ,CAAG,EAAA;AAC5D,UAAO,OAAA,MAAA;AAAA;AAET,QAAA,OAAO,OAAQ,CAAA,GAAA,CAAI,MAAQ,EAAA,QAAA,EAAU,MAAM,CAAA;AAAA;AAC7C,KACD,CAAA;AAED,IAAO,MAAA,CAAA,cAAA,CAAe,eAAe,MAAQ,EAAA;AAAA,MAC3C,KAAO,EAAA,UAAA;AAAA,MACP,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,QAAU,EAAA;AAAA,KACX,CAAA;AAED,IAAO,MAAA,CAAA,cAAA,CAAe,eAAe,SAAW,EAAA;AAAA,MAC9C,KAAO,EAAA,OAAA;AAAA,MACP,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,QAAU,EAAA;AAAA,KACX,CAAA;AAED,IAAO,MAAA,CAAA,cAAA,CAAe,eAAe,KAAO,EAAA;AAAA,MAC1C,KAAO,EAAA,gBAAA;AAAA,MACP,UAAY,EAAA,IAAA;AAAA,MACZ,YAAc,EAAA,KAAA;AAAA,MACd,QAAU,EAAA;AAAA,KACX,CAAA;AAED,IAAO,OAAA,aAAA;AAAA;AACT,EAEA,OAAe,yBAAyB,QAAkB,EAAA;AACxD,IAAO,OAAA,2CAAA,CAA4C,IAAI,QAAiB,CAAA;AAAA;AAC1E,EAEA,OAAO,kBAAwC,CAAA,eAAA,EAAyB,OAAyC,EAAA;AAC/G,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAQ,GAAI,CAAA,KAAA,CAAM,eAAe,CAAA;AAC/C,IAAA,MAAM,UAAa,GAAA,EAAE,GAAG,KAAA,EAAO,MAAO,EAAA;AACtC,IAAO,OAAA,UAAA;AAAA;AACT,EAEA,aAAa,aAAoC,QAA8B,EAAA;AAC7E,IAAA,MAAM,WAAc,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,cAAc,CAAA;AAEvD,IAAI,IAAA;AACF,MAAA,IAAI,WAAa,EAAA;AACf,QAAI,IAAA,WAAA,CAAY,UAAW,CAAA,kBAAkB,CAAG,EAAA;AAC9C,UAAO,OAAA,MAAM,IAAK,CAAA,kBAAA,CAAyB,QAAQ,CAAA;AAAA;AAErD,QAAI,IAAA,WAAA,CAAY,UAAW,CAAA,qBAAqB,CAAG,EAAA;AACjD,UAAO,OAAA,MAAM,IAAK,CAAA,sBAAA,CAA6B,QAAQ,CAAA;AAAA;AAEzD,QAAI,IAAA,WAAA,CAAY,UAAW,CAAA,mCAAmC,CAAG,EAAA;AAC/D,UAAO,OAAA,MAAM,IAAK,CAAA,0BAAA,CAAiC,QAAQ,CAAA;AAAA;AAE7D,QAAA,IAAI,YAAY,UAAW,CAAA,OAAO,KAAK,WAAY,CAAA,UAAA,CAAW,iBAAiB,CAAG,EAAA;AAChF,UAAO,OAAA,MAAM,IAAK,CAAA,kBAAA,CAAyB,QAAQ,CAAA;AAAA;AAErD,QACE,IAAA,WAAA,CAAY,WAAW,cAAc,CAAA,IACrC,YAAY,UAAW,CAAA,QAAQ,CAC/B,IAAA,WAAA,CAAY,UAAW,CAAA,QAAQ,KAC/B,WAAY,CAAA,UAAA,CAAW,OAAO,CAAA,IAC9B,WAAY,CAAA,UAAA,CAAW,QAAQ,CAC/B,IAAA,WAAA,CAAY,UAAW,CAAA,YAAY,CACnC,EAAA;AACA,UAAO,OAAA,MAAM,IAAK,CAAA,kBAAA,CAAyB,QAAQ,CAAA;AAAA;AACrD;AAGF,MAAM,MAAA,aAAA,GAAgB,SAAS,KAAM,EAAA;AAErC,MAAI,IAAA;AACF,QAAO,OAAA,MAAM,IAAK,CAAA,kBAAA,CAAyB,QAAQ,CAAA;AAAA,OAC7C,CAAA,MAAA;AACN,QAAO,OAAA,MAAM,IAAK,CAAA,kBAAA,CAAyB,aAAa,CAAA;AAAA;AAC1D,aACO,KAAO,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnB,MAAO,OAAA,IAAA;AAAA;AACT;AACF,EAEA,aAAqB,mBAA0C,QAA8B,EAAA;AAC3F,IAAM,MAAA,UAAA,GAAa,MAAM,QAAA,CAAS,IAAK,EAAA;AAEvC,IAAI,IAAA,CAAC,UAAW,CAAA,IAAA,EAAQ,EAAA;AACtB,MAAO,OAAA,IAAA;AAAA;AAGT,IAAI,IAAA;AACF,MAAM,MAAA,UAAA,GAAa,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA;AACxC,MAAO,OAAA,UAAA;AAAA,KACD,CAAA,MAAA;AACN,MAAM,MAAA,IAAI,yBAAiB,UAAU,CAAA;AAAA;AACvC;AACF,EAEA,aAAqB,2BAAkD,QAA8B,EAAA;AACnG,IAAM,MAAA,UAAA,GAAa,MAAM,QAAA,CAAS,IAAK,EAAA;AAEvC,IAAI,IAAA,CAAC,UAAW,CAAA,IAAA,EAAQ,EAAA;AACtB,MAAO,OAAA,IAAA;AAAA;AAGT,IAAM,MAAA,kBAAA,GAAqB,IAAIC,qBAAAA,CAAiB,UAAU,CAAA;AAC1D,IAAO,OAAA,kBAAA;AAAA;AACT,EAEA,aAAqB,uBAA8C,QAA8B,EAAA;AAC/F,IAAM,MAAA,aAAA,GAAgB,SAAS,KAAM,EAAA;AAErC,IAAI,IAAA;AACF,MAAM,MAAA,iBAAA,GAAoB,MAAM,QAAA,CAAS,QAAS,EAAA;AAElD,MAAM,MAAA,cAAA,GAAiB,IAAIC,iBAAa,EAAA;AACxC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,iBAAmB,EAAA;AAC5C,QAAe,cAAA,CAAA,MAAA,CAAO,KAAK,KAAe,CAAA;AAAA;AAG5C,MAAO,OAAA,cAAA;AAAA,KACD,CAAA,MAAA;AACN,MAAM,MAAA,UAAA,GAAa,MAAM,aAAA,CAAc,IAAK,EAAA;AAE5C,MAAI,IAAA,CAAC,UAAW,CAAA,IAAA,EAAQ,EAAA;AACtB,QAAO,OAAA,IAAA;AAAA;AAGT,MAAM,MAAA,IAAI,6BAAqB,UAAU,CAAA;AAAA;AAC3C;AACF,EAEA,aAAqB,mBAA0C,QAA8B,EAAA;AAC3F,IAAM,MAAA,UAAA,GAAa,MAAM,QAAA,CAAS,IAAK,EAAA;AACvC,IAAO,OAAA,UAAA;AAAA;AACT,EAEA,aAAqB,mBAA0C,QAA8B,EAAA;AAC3F,IAAM,MAAA,UAAA,GAAa,MAAM,QAAA,CAAS,IAAK,EAAA;AACvC,IAAA,OAAQ,UAAc,IAAA,IAAA;AAAA;AACxB,EAEA,aAAa,0BAA2B,CAAA,UAAA,EAAqB,MAAyC,EAAA;AACpG,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,UAAU,CAAA;AAErD,IAAA,MAAM,CAAC,gBAAkB,EAAA,qBAAA,EAAuB,aAAa,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,MACjF,gBAAiB,CAAA,OAAA,CAAQ,OAAQ,CAAA,QAAA,EAAU,CAAA;AAAA,MAC3C,gBAAiB,CAAA,OAAA,CAAQ,YAAa,CAAA,QAAA,EAAU,CAAA;AAAA,MAChD,gBAAA,CAAiB,QAAQ,IAAI;AAAA,KAC9B,CAAA;AAED,IAAA,aAAA;AAAA,MACE;AAAA,QACE,CAAG,EAAA,MAAA,KAAW,QAAW,GAAA,UAAA,GAAa,QAAQ,CACzC,iCAAA,EAAA,MAAA,KAAW,QAAWL,GAAAA,uBAAAA,CAAM,OAAO,UAAU,CAAA,GAAIA,uBAAM,CAAA,GAAA,CAAI,UAAU,CAAC,CAAA;;AAAA,CAAA,CAAA;AAAA,QAC3E,CAAG,EAAA,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA,CAAA;AAAA,QAChC,gBAAA;AAAA,QACA,gBAAA;AAAA,QACA,sBAAA;AAAA,QACA,qBAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,EAAE,MAAA,EAAQ,MAAW,KAAA,QAAA,GAAW,SAAS,OAAQ;AAAA,KACnD;AAAA;AAEJ,CAAA;AAEA,IAAO,6BAAQ,GAAA,qBAAA;;;ACvhBR,SAAS,2BAA2B,MAAqB,EAAA;AAC9D,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAM,MAAA,WAAA,GAAc,IAAI,UAAA,CAAW,MAAM,CAAA;AAEzC,IAAA,MAAM,sBAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,QAAQ,WAAa,EAAA;AAC9B,MAAM,MAAA,QAAA,GAAW,MAAO,CAAA,YAAA,CAAa,IAAI,CAAA;AACzC,MAAA,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA;AAEnC,IAAM,MAAA,cAAA,GAAiB,mBAAoB,CAAA,IAAA,CAAK,EAAE,CAAA;AAElD,IAAA,OAAO,KAAK,cAAc,CAAA;AAAA,GACrB,MAAA;AACL,IAAA,OAAO,MAAO,CAAA,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA;AAEhD;AAfgBD,uBAAA,CAAA,0BAAA,EAAA,4BAAA,CAAA;AAiBT,SAAS,2BAA2B,WAAqB,EAAA;AAC9D,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAM,MAAA,cAAA,GAAiB,KAAK,WAAW,CAAA;AACvC,IAAM,MAAA,KAAA,GAAQ,WAAW,IAAK,CAAA,cAAA,EAAgB,CAAC,SAAc,KAAA,SAAA,CAAU,UAAW,CAAA,CAAC,CAAC,CAAA;AACpF,IAAA,OAAO,KAAM,CAAA,MAAA;AAAA,GACR,MAAA;AACL,IAAO,OAAA,MAAA,CAAO,IAAK,CAAA,WAAA,EAAa,QAAQ,CAAA;AAAA;AAE5C;AARgBA,uBAAA,CAAA,0BAAA,EAAA,4BAAA,CAAA;;;ACAhB,eAAsB,iBAAiB,OAAkD,EAAA;AACvF,EAAM,MAAA,YAAA,GAAe,QAAQ,KAAM,EAAA;AACnC,EAAM,MAAA,cAAA,GAAiB,aAAa,IAAO,GAAA,0BAAA,CAA2B,MAAM,YAAa,CAAA,WAAA,EAAa,CAAI,GAAA,IAAA;AAE1G,EAAO,OAAA;AAAA,IACL,KAAK,OAAQ,CAAA,GAAA;AAAA,IACb,QAAQ,OAAQ,CAAA,MAAA;AAAA,IAChB,MAAM,OAAQ,CAAA,IAAA;AAAA,IACd,OAAS,EAAA,MAAA,CAAO,WAAY,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC3C,OAAO,OAAQ,CAAA,KAAA;AAAA,IACf,aAAa,OAAQ,CAAA,WAAA;AAAA,IACrB,WAAW,OAAQ,CAAA,SAAA;AAAA,IACnB,WAAW,OAAQ,CAAA,SAAA;AAAA,IACnB,UAAU,OAAQ,CAAA,QAAA;AAAA,IAClB,UAAU,OAAQ,CAAA,QAAA;AAAA,IAClB,gBAAgB,OAAQ,CAAA,cAAA;AAAA,IACxB,IAAM,EAAA;AAAA,GACR;AACF;AAlBsBA,uBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAyDf,SAAS,oBAAoB,kBAAkD,EAAA;AACpF,EAAA,MAAM,mBAAmB,kBAAmB,CAAA,IAAA,GAAO,0BAA2B,CAAA,kBAAA,CAAmB,IAAI,CAAI,GAAA,IAAA;AAEzG,EAAO,OAAA,IAAI,SAAS,gBAAkB,EAAA;AAAA,IACpC,QAAQ,kBAAmB,CAAA,MAAA;AAAA,IAC3B,YAAY,kBAAmB,CAAA,UAAA;AAAA,IAC/B,OAAS,EAAA,IAAI,OAAQ,CAAA,kBAAA,CAAmB,OAAO;AAAA,GAChD,CAAA;AACH;AARgBA,uBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;;;AC1EhB,IAAM,qBAAA,GAAN,cAAoC,KAAM,CAAA;AAAA,EAF1C;AAE0C,IAAAA,uBAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AAAA;AAAC,CAAA;AAEpC,IAAM,yBAAA,GAAN,cAAwC,qBAAsB,CAAA;AAAA,EAJrE;AAIqE,IAAAA,uBAAA,CAAA,IAAA,EAAA,2BAAA,CAAA;AAAA;AAAA,EACnE,YAAY,cAAwB,EAAA;AAClC,IAAM,KAAA,CAAA,CAAA,gCAAA,EAAmC,cAAc,CAAK,GAAA,CAAA,CAAA;AAC5D,IAAA,IAAA,CAAK,IAAO,GAAA,sBAAA;AAAA;AAEhB,CAAA;AAEO,IAAM,4BAAA,GAAN,cAA2C,qBAAsB,CAAA;AAAA,EAXxE;AAWwE,IAAAA,uBAAA,CAAA,IAAA,EAAA,8BAAA,CAAA;AAAA;AAAA,EACtE,YAAY,cAAwB,EAAA;AAClC,IAAM,KAAA,CAAA,CAAA,mCAAA,EAAsC,cAAc,CAAK,GAAA,CAAA,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAO,GAAA,yBAAA;AAAA;AAEhB,CAAA;AAEO,IAAM,0BAAA,GAAN,cAAyC,qBAAsB,CAAA;AAAA,EAlBtE;AAkBsE,IAAAA,uBAAA,CAAA,IAAA,EAAA,4BAAA,CAAA;AAAA;AAAA,EACpE,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,iCAAiC,CAAA;AACvC,IAAA,IAAA,CAAK,IAAO,GAAA,4BAAA;AAAA;AAEhB,CAAA;AAEO,IAAM,0BAAA,GAAN,cAAyC,qBAAsB,CAAA;AAAA,EAzBtE;AAyBsE,IAAAA,uBAAA,CAAA,IAAA,EAAA,4BAAA,CAAA;AAAA;AAAA,EACpE,YAAY,cAAwB,EAAA;AAClC,IAAM,KAAA,CAAA,CAAA,iCAAA,EAAoC,cAAc,CAAK,GAAA,CAAA,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAO,GAAA,uBAAA;AAAA;AAEhB,CAAA;AAEO,IAAM,uCAAuC,EAAK,GAAA,GAAA;AAClD,IAAM,kCAAA,GAAqC,IAAI,EAAK,GAAA,GAAA;AAE3D,eAAsB,uBACpB,CAAA,MAAA,EACA,OAEI,GAAA,EACJ,EAAA;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,eAAkB,GAAA,oCAAA,EAAyC,GAAA,OAAA;AAE5E,EAAM,MAAA,aAAA,GAAgB,MAAO,CAAA,UAAA,KAAe,MAAO,CAAA,IAAA;AAEnD,EAAA,IAAI,aAAe,EAAA;AACjB,IAAA;AAAA;AAGF,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,IAAA,SAAS,gBAAgB,KAAgB,EAAA;AACvC,MAAO,MAAA,CAAA,mBAAA,CAAoB,QAAQ,iBAAiB,CAAA;AACpD,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA;AAFL,IAAAA,uBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAKT,IAAM,MAAA,WAAA,GAAc,WAAW,MAAM;AACnC,MAAM,MAAA,YAAA,GAAe,IAAI,yBAAA,CAA0B,eAAe,CAAA;AAClE,MAAA,eAAA,CAAgB,YAAY,CAAA;AAAA,OAC3B,eAAe,CAAA;AAElB,IAAA,SAAS,iBAAoB,GAAA;AAC3B,MAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,eAAe,CAAA;AACnD,MAAA,YAAA,CAAa,WAAW,CAAA;AACxB,MAAQ,OAAA,EAAA;AAAA;AAHD,IAAAA,uBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAMT,IAAO,MAAA,CAAA,gBAAA,CAAiB,QAAQ,iBAAiB,CAAA;AACjD,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAAA,GACjD,CAAA;AACH;AAlCsBA,uBAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;AAoCtB,eAAsB,iBAAkB,CAAA,MAAA,EAAsB,OAAgC,GAAA,EAAI,EAAA;AAChG,EAAA,MAAM,EAAE,OAAA,EAAS,eAAkB,GAAA,oCAAA,EAAyC,GAAA,OAAA;AAE5E,EAAM,MAAA,eAAA,GAAkB,MAAO,CAAA,UAAA,KAAe,MAAO,CAAA,MAAA;AACrD,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAA;AAAA;AAGF,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,IAAA,SAAS,iBAAiB,KAAgB,EAAA;AACxC,MAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,kBAAkB,CAAA;AACtD,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA;AAFL,IAAAA,uBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAKT,IAAM,MAAA,YAAA,GAAe,WAAW,MAAM;AACpC,MAAM,MAAA,YAAA,GAAe,IAAI,0BAAA,CAA2B,eAAe,CAAA;AACnE,MAAA,gBAAA,CAAiB,YAAY,CAAA;AAAA,OAC5B,eAAe,CAAA;AAElB,IAAA,SAAS,kBAAqB,GAAA;AAC5B,MAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,gBAAgB,CAAA;AACpD,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAQ,OAAA,EAAA;AAAA;AAHD,IAAAA,uBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAMT,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,gBAAgB,CAAA;AACjD,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,kBAAkB,CAAA;AACnD,IAAA,MAAA,CAAO,KAAM,EAAA;AAAA,GACd,CAAA;AACH;AA7BsBA,uBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AA+BtB,eAAsB,iBAAkB,CAAA,MAAA,EAA2C,OAAgC,GAAA,EAAI,EAAA;AACrH,EAAA,MAAM,EAAE,OAAA,EAAS,eAAkB,GAAA,oCAAA,EAAyC,GAAA,OAAA;AAE5E,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,IAAM,MAAA,YAAA,GAAe,WAAW,MAAM;AACpC,MAAM,MAAA,YAAA,GAAe,IAAI,0BAAA,CAA2B,eAAe,CAAA;AACnE,MAAA,MAAA,CAAO,YAAY,CAAA;AAAA,OAClB,eAAe,CAAA;AAElB,IAAW,KAAA,MAAA,MAAA,IAAU,OAAO,OAAS,EAAA;AACnC,MAAA,MAAA,CAAO,SAAU,EAAA;AAAA;AAGnB,IAAO,MAAA,CAAA,KAAA,CAAM,CAAC,KAAU,KAAA;AACtB,MAAA,YAAA,CAAa,YAAY,CAAA;AAIzB,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACP,MAAA;AACL,QAAQ,OAAA,EAAA;AAAA;AACV,KACD,CAAA;AAAA,GACF,CAAA;AACH;AAzBsBA,uBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;;;AClGf,IAAM,YAAA,GAAe,kCAA4C,YAAY;AAClF,EAAA,MAAM,eAAe,UAAW,CAAA,MAAA;AAGhC,EAAO,OAAA,YAAA,IAAiB,MAAM,OAAO,QAAQ,CAAA;AAC/C,CAAC,CAAA;;;ACTD,IAAM,uBAAA,GAAN,cAAsC,KAAM,CAAA;AAAA,EAA5C;AAA4C,IAAAA,uBAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;AAAA;AAAA,EAC1C,YAAY,OAAkB,EAAA;AAC5B,IAAM,KAAA,CAAA,CAAA,uDAAA,EAA0D,OAAO,CAAE,CAAA,CAAA;AACzE,IAAA,IAAA,CAAK,IAAO,GAAA,yBAAA;AAAA;AAEhB,CAAA;AAEA,IAAO,+BAAQ,GAAA,uBAAA;;;ACPf,IAAM,+BAAA,GAAN,cAA8C,KAAM,CAAA;AAAA,EAApD;AAAoD,IAAAA,uBAAA,CAAA,IAAA,EAAA,iCAAA,CAAA;AAAA;AAAA,EAClD,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,oCAAoC,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAO,GAAA,iCAAA;AAAA;AAEhB,CAAA;AAEA,IAAO,uCAAQ,GAAA,+BAAA;;;ACUf,IAAe,mBAAf,MAAwE;AAAA,EAjBxE;AAiBwE,IAAAA,uBAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AAAA,EAC9D,OAAA,uBAAc,GAAkB,EAAA;AAAA,EAEhC,cAAA;AAAA,EACA,eAAA;AAAA,EAEA,mBAKJ,EAAC;AAAA,EAEG,eAAkB,GAAA;AAAA,IACxB,YAAA,sBAAkB,GAAiD;AAAA,GACrE;AAAA,EAEU,YAAY,OAA8D,EAAA;AAClF,IAAK,IAAA,CAAA,cAAA,GAAiB,QAAQ,aAAiB,IAAA,oCAAA;AAC/C,IAAK,IAAA,CAAA,eAAA,GAAkB,QAAQ,cAAkB,IAAA,kCAAA;AAAA;AACnD,EAIA,aAAgB,GAAA;AACd,IAAA,OAAO,IAAK,CAAA,cAAA;AAAA;AACd,EAEA,cAAiB,GAAA;AACf,IAAA,OAAO,IAAK,CAAA,eAAA;AAAA;AACd,EAEA,MAAgB,eAAe,MAAsB,EAAA;AACnD,IAAA,MAAM,cAAc,uBAAwB,CAAA,MAAA,EAAQ,EAAE,OAAS,EAAA,IAAA,CAAK,gBAAgB,CAAA;AAEpF,IAAM,MAAA,mBAAA,kDAA6B,UAA0C,KAAA;AAC3E,MAAM,MAAA,IAAA,CAAK,mBAAoB,CAAA,MAAA,EAAQ,UAAU,CAAA;AAAA,KADvB,EAAA,qBAAA,CAAA;AAG5B,IAAO,MAAA,CAAA,gBAAA,CAAiB,WAAW,mBAAmB,CAAA;AAEtD,IAAM,MAAA,WAAA;AAIN,IAAA,SAAS,kBAAkB,KAAgC,EAAA;AACzD,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA;AADZ,IAAAA,uBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAGT,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,iBAAiB,CAAA;AAElD,IAAA,MAAM,oCAA0BA,uBAAA,CAAA,MAAA;AAC9B,MAAO,MAAA,CAAA,mBAAA,CAAoB,WAAW,mBAAmB,CAAA;AACzD,MAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,iBAAiB,CAAA;AACrD,MAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,iBAAiB,CAAA;AACrD,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,KAJA,EAAA,mBAAA,CAAA;AAM1B,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,iBAAiB,CAAA;AAElD,IAAK,IAAA,CAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA;AACzB,EAEQ,mBAAA,mBAA6BA,uBAAA,CAAA,OAAA,MAAA,EAAsB,UAA0C,KAAA;AACnG,IAAI,IAAA;AACF,MAAA,MAAM,sBAAyB,GAAA,IAAA,CAAK,kBAAmB,CAAA,UAAA,CAAW,IAAI,CAAA;AACtE,MAAM,MAAA,iBAAA,GAAoB,IAAK,CAAA,YAAA,CAAa,sBAAsB,CAAA;AAClE,MAAM,MAAA,IAAA,CAAK,eAAgB,CAAA,iBAAA,EAAmB,MAAM,CAAA;AAAA,aAC7C,KAAO,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA;AACrB,GAP4B,EAAA,qBAAA,CAAA;AAAA,EAUtB,mBAAmB,IAAyB,EAAA;AAGlD,IAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC5B,MAAO,OAAA,IAAA;AAAA,KACF,MAAA;AACL,MAAM,MAAA,IAAI,gCAAwB,IAAI,CAAA;AAAA;AACxC;AACF,EAEQ,aAAa,kBAA8D,EAAA;AACjF,IAAI,IAAA,aAAA;AAEJ,IAAI,IAAA;AACF,MAAgB,aAAA,GAAA,IAAA,CAAK,MAAM,kBAAkB,CAAA;AAAA,KACvC,CAAA,MAAA;AACN,MAAM,MAAA,IAAI,gCAAwB,kBAAkB,CAAA;AAAA;AAGtD,IAAA,IAAI,CAAC,IAAA,CAAK,cAAe,CAAA,aAAa,CAAG,EAAA;AACvC,MAAM,MAAA,IAAI,gCAAwB,kBAAkB,CAAA;AAAA;AAGtD,IAAI,IAAA,IAAA,CAAK,cAAe,CAAA,aAAa,CAAG,EAAA;AACtC,MAAO,OAAA;AAAA,QACL,IAAI,aAAc,CAAA,EAAA;AAAA,QAClB,SAAS,aAAc,CAAA,OAAA;AAAA,QACvB,WAAW,aAAc,CAAA,SAAA;AAAA,QACzB,MAAM,aAAc,CAAA;AAAA,OACtB;AAAA;AAGF,IAAO,OAAA;AAAA,MACL,IAAI,aAAc,CAAA,EAAA;AAAA,MAClB,SAAS,aAAc,CAAA,OAAA;AAAA,MACvB,MAAM,aAAc,CAAA;AAAA,KACtB;AAAA;AACF,EAEQ,eAAe,OAA+D,EAAA;AACpF,IACE,OAAA,OAAO,YAAY,QACnB,IAAA,OAAA,KAAY,QACZ,IAAQ,IAAA,OAAA,IACR,OAAO,OAAA,CAAQ,EAAO,KAAA,QAAA,IACtB,aAAa,OACb,IAAA,OAAO,QAAQ,OAAY,KAAA,QAAA,KAC1B,EAAE,WAAe,IAAA,OAAA,CAAA,IAAY,OAAO,OAAA,CAAQ,SAAc,KAAA,QAAA,CAAA;AAAA;AAE/D,EAEA,MAAc,eAAgB,CAAA,OAAA,EAA2C,MAAsB,EAAA;AAC7F,IAAI,IAAA,IAAA,CAAK,cAAe,CAAA,OAAO,CAAG,EAAA;AAChC,MAAM,MAAA,IAAA,CAAK,oBAAqB,CAAA,OAAA,EAAS,MAAM,CAAA;AAAA,KAC1C,MAAA;AACL,MAAM,MAAA,IAAA,CAAK,oBAAqB,CAAA,OAAA,EAAS,MAAM,CAAA;AAAA;AACjD;AACF,EAEA,MAAc,oBAAqB,CAAA,OAAA,EAAgD,MAAsB,EAAA;AAIvG,IAAM,MAAA,SAAA,GAAY,KAAK,gBAAiB,CAAA,OAAA,CAAQ,OAAO,CAAG,EAAA,KAAA,wBAAa,GAAI,EAAA;AAE3E,IAAA,MAAM,gBAAmB,GAAA,KAAA,CAAM,IAAK,CAAA,SAAA,EAAW,OAAO,QAAa,KAAA;AACjE,MAAM,MAAA,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,KAC/B,CAAA;AAED,IAAM,MAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAAA;AACpC,EAEA,MAAc,oBACZ,CAAA,OAAA,EACA,MACA,EAAA;AACA,IAAM,MAAA,SAAA,GAAY,KAAK,gBAAiB,CAAA,OAAA,CAAQ,OAAO,CAAG,EAAA,KAAA,wBAAa,GAAI,EAAA;AAE3E,IAAA,MAAM,gBAAmB,GAAA,KAAA,CAAM,IAAK,CAAA,SAAA,EAAW,OAAO,QAAa,KAAA;AACjE,MAAA,MAAM,SAAY,GAAA,MAAM,QAAS,CAAA,OAAA,EAAS,MAAM,CAAA;AAChD,MAAM,MAAA,IAAA,CAAK,MAAM,OAAS,EAAA,SAAA,EAAW,EAAE,OAAS,EAAA,CAAC,MAAM,CAAA,EAAG,CAAA;AAAA,KAC3D,CAAA;AAED,IAAM,MAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAAA;AACpC,EAEA,MAAgB,kBAAA,CAAmB,OAAoC,GAAA,IAAA,CAAK,OAAS,EAAA;AACnF,IAAA,MAAM,eAAkB,GAAA,KAAA,CAAM,IAAK,CAAA,OAAA,EAAS,OAAO,MAAW,KAAA;AAC5D,MAAA,MAAM,kBAAkB,MAAQ,EAAA,EAAE,OAAS,EAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA,KACjE,CAAA;AACD,IAAM,MAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAAA;AACnC,EAEQ,aAAa,MAAsB,EAAA;AACzC,IAAK,IAAA,CAAA,mBAAA,CAAoB,CAAC,MAAM,CAAC,CAAA;AACjC,IAAK,IAAA,CAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA;AAC5B,EAEA,MAAc,kBACZ,CAAA,OAAA,EACA,SACA,EAAA;AACA,IAAM,MAAA,MAAA,GAAS,MAAM,YAAa,EAAA;AAElC,IAAA,MAAM,YAA+D,GAAA;AAAA,MACnE,EAAA,EAAI,OAAO,UAAW,EAAA;AAAA,MACtB,OAAA;AAAA,MACA,IAAM,EAAA;AAAA,KACR;AACA,IAAO,OAAA,YAAA;AAAA;AACT,EAEA,MAAM,IACJ,CAAA,OAAA,EACA,SACA,EAAA,OAAA,GAEI,EACJ,EAAA;AACA,IAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,kBAAA,CAAmB,SAAS,SAAS,CAAA;AAC9D,IAAK,IAAA,CAAA,WAAA,CAAY,KAAO,EAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AACzC,EAEA,MAAM,OACJ,CAAA,OAAA,EACA,WACA,EAAA,OAAA,GAEI,EACJ,EAAA;AACA,IAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,kBAAA,CAAmB,SAAS,WAAW,CAAA;AAClE,IAAK,IAAA,CAAA,WAAA,CAAY,OAAS,EAAA,OAAA,CAAQ,OAAO,CAAA;AAEzC,IAAM,MAAA,QAAA,GAAW,MAAM,IAAK,CAAA,YAAA,CAAa,SAAS,OAAQ,CAAA,EAAA,EAAI,QAAQ,OAAO,CAAA;AAC7E,IAAA,OAAO,QAAS,CAAA,IAAA;AAAA;AAClB,EAEA,MAAM,YACJ,CAAA,OAAA,EACA,SACA,EAAA,OAAA,GAAoC,KAAK,OACzC,EAAA;AACA,IAAA,OAAO,IAAI,OAAA,CAAwD,CAAC,OAAA,EAAS,MAAW,KAAA;AACtF,MAAM,MAAA,YAAA,GAAe,WAAW,MAAM;AACpC,QAAK,IAAA,CAAA,QAAA,CAAS,SAAS,aAAa,CAAA;AACpC,QAAK,IAAA,CAAA,sBAAA,CAAuB,SAAS,aAAa,CAAA;AAElD,QAAA,MAAM,YAAe,GAAA,IAAI,4BAA6B,CAAA,IAAA,CAAK,eAAe,CAAA;AAC1E,QAAA,MAAA,CAAO,YAAY,CAAA;AAAA,OACrB,EAAG,KAAK,eAAe,CAAA;AAEvB,MAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA,EAAS,CAAC,KAAU,KAAA;AACnE,QAAA,YAAA,CAAa,YAAY,CAAA;AAEzB,QAAK,IAAA,CAAA,QAAA,CAAS,SAAS,aAAa,CAAA;AACpC,QAAK,IAAA,CAAA,sBAAA,CAAuB,SAAS,aAAa,CAAA;AAElD,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACb,CAAA;AAED,MAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,EAAS,CAAC,OAAY,KAAA;AACvD,QAAI,IAAA,OAAA,CAAQ,cAAc,SAAW,EAAA;AACnC,UAAA,YAAA,CAAa,YAAY,CAAA;AAEzB,UAAK,IAAA,CAAA,QAAA,CAAS,SAAS,aAAa,CAAA;AACpC,UAAK,IAAA,CAAA,sBAAA,CAAuB,SAAS,aAAa,CAAA;AAElD,UAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AACjB,OACD,CAAA;AAAA,KACF,CAAA;AAAA;AACH,EAEQ,eACN,OACA,EAAA;AACA,IAAA,OAAO,WAAe,IAAA,OAAA;AAAA;AACxB,EAEA,MAAM,KAAA,CACJ,OACA,EAAA,SAAA,EACA,OAGA,EAAA;AACA,IAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,kBAAA,CAAmB,SAAS,SAAS,CAAA;AAG9D,IAAI,IAAA,IAAA,CAAK,WAAa,EAAA;AACpB,MAAK,IAAA,CAAA,WAAA,CAAY,KAAO,EAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AACzC;AACF,EAEA,MAAc,kBACZ,CAAA,OAAA,EACA,SACA,EAAA;AACA,IAAM,MAAA,MAAA,GAAS,MAAM,YAAa,EAAA;AAElC,IAAA,MAAM,YAA+D,GAAA;AAAA,MACnE,EAAA,EAAI,OAAO,UAAW,EAAA;AAAA,MACtB,SAAS,OAAQ,CAAA,OAAA;AAAA,MACjB,WAAW,OAAQ,CAAA,EAAA;AAAA,MACnB,IAAM,EAAA;AAAA,KACR;AACA,IAAO,OAAA,YAAA;AAAA;AACT,EAEQ,WACN,CAAA,OAAA,EACA,OAAoC,GAAA,IAAA,CAAK,OACzC,EAAA;AACA,IAAI,IAAA,CAAC,IAAK,CAAA,SAAA,EAAa,EAAA;AACrB,MAAA,MAAM,IAAI,uCAAgC,EAAA;AAAA;AAG5C,IAAM,MAAA,kBAAA,GAAqB,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAEjD,IAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,MAAA,MAAA,CAAO,KAAK,kBAAkB,CAAA;AAAA;AAChC;AACF,EAEA,OAAA,CAGE,SAAkB,QAA8B,EAAA;AAChD,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,2BAAA,CAAqC,OAAO,CAAA;AACnE,IAAU,SAAA,CAAA,KAAA,CAAM,IAAI,QAAQ,CAAA;AAC5B,IAAO,OAAA,QAAA;AAAA;AACT,EAEQ,4BAA8E,OAAkB,EAAA;AACtG,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,gBAAiB,CAAA,OAAO,CAAK,IAAA;AAAA,MAClD,KAAA,sBAAW,GAAI,EAAA;AAAA,MACf,KAAA,sBAAW,GAAI;AAAA,KACjB;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAiB,CAAA,OAAO,CAAG,EAAA;AACnC,MAAK,IAAA,CAAA,gBAAA,CAAiB,OAAO,CAAI,GAAA,SAAA;AAAA;AAGnC,IAAO,OAAA,SAAA;AAAA;AACT,EAEA,OAAA,CAGE,SAAkB,QAA8B,EAAA;AAChD,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,2BAAA,CAAqC,OAAO,CAAA;AACnE,IAAU,SAAA,CAAA,KAAA,CAAM,IAAI,QAAQ,CAAA;AAC5B,IAAO,OAAA,QAAA;AAAA;AACT,EAEA,QAAA,CACE,SACA,QACA,EAAA;AACA,IAAA,IAAA,CAAK,gBAAiB,CAAA,OAAO,CAAG,EAAA,KAAA,CAAM,OAAO,QAAQ,CAAA;AAAA;AACvD,EAEA,QAAA,CACE,SACA,QACA,EAAA;AACA,IAAA,IAAA,CAAK,gBAAiB,CAAA,OAAO,CAAG,EAAA,KAAA,CAAM,OAAO,QAAQ,CAAA;AAAA;AACvD,EAEA,yBAA4B,GAAA;AAC1B,IAAA,IAAA,CAAK,mBAAmB,EAAC;AAAA;AAC3B,EAEQ,qBAAA,CAAsB,SAAmC,QAAoC,EAAA;AACnG,IAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,MAAA,IAAI,SAAY,GAAA,IAAA,CAAK,eAAgB,CAAA,YAAA,CAAa,IAAI,MAAM,CAAA;AAC5D,MAAA,IAAI,CAAC,SAAW,EAAA;AACd,QAAA,SAAA,uBAAgB,GAAI,EAAA;AACpB,QAAA,IAAA,CAAK,eAAgB,CAAA,YAAA,CAAa,GAAI,CAAA,MAAA,EAAQ,SAAS,CAAA;AAAA;AAEzD,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAAA;AAGxB,IAAO,OAAA,QAAA;AAAA;AACT,EAEQ,sBAAA,CAAuB,SAAmC,QAAoC,EAAA;AACpG,IAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,MAAA,IAAA,CAAK,gBAAgB,YAAa,CAAA,GAAA,CAAI,MAAM,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA;AAChE;AACF,EAEA,mBAAA,CAAoB,OAAoC,GAAA,IAAA,CAAK,OAAS,EAAA;AACpE,IAAM,MAAA,UAAA,GAAa,IAAI,0BAA2B,EAAA;AAElD,IAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,MAAA,MAAM,YAAY,IAAK,CAAA,eAAA,CAAgB,aAAa,GAAI,CAAA,MAAM,KAAK,EAAC;AACpE,MAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAChC,QAAA,QAAA,CAAS,UAAU,CAAA;AAAA;AACrB;AACF;AAEJ,CAAA;AAEA,IAAO,wBAAQ,GAAA,gBAAA;;;AC/Xf,IAAM,EAAE,eAAiB,EAAA,YAAA,EAAiB,GAAAO,6BAAA;AAQ1C,IAAM,eAAA,GAAN,cAAsE,wBAAyB,CAAA;AAAA,EAhB/F;AAgB+F,IAAAP,uBAAA,CAAA,IAAA,EAAA,iBAAA,CAAA;AAAA;AAAA,EACrF,eAAA;AAAA,EACA,UAAA;AAAA,EAER,YAAY,OAAiC,EAAA;AAC3C,IAAM,KAAA,CAAA;AAAA,MACJ,eAAe,OAAQ,CAAA,aAAA;AAAA,MACvB,gBAAgB,OAAQ,CAAA;AAAA,KACzB,CAAA;AAED,IAAA,IAAA,CAAK,aAAa,OAAQ,CAAA,UAAA;AAAA;AAC5B,EAEA,SAAY,GAAA;AACV,IAAA,OAAO,KAAK,eAAoB,KAAA,MAAA;AAAA;AAClC,EAEA,KAAQ,GAAA;AACN,IAAI,IAAA,IAAA,CAAK,WAAa,EAAA;AACpB,MAAA;AAAA;AAGF,IAAA,MAAM,kBAAkB,IAAI,YAAA,CAAa,EAAE,MAAQ,EAAA,IAAA,CAAK,YAAY,CAAA;AAEpE,IAAgB,eAAA,CAAA,EAAA,CAAG,OAAS,EAAA,CAAC,KAAU,KAAA;AACrC,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAAA,KACpB,CAAA;AAED,IAAgB,eAAA,CAAA,EAAA,CAAG,YAAc,EAAA,OAAO,MAAW,KAAA;AACjD,MAAI,IAAA;AACF,QAAM,MAAA,KAAA,CAAM,eAAe,MAAM,CAAA;AAAA,eAC1B,KAAO,EAAA;AACd,QAAgB,eAAA,CAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA;AACrC,KACD,CAAA;AAED,IAAA,IAAA,CAAK,eAAkB,GAAA,eAAA;AAAA;AACzB,EAEA,MAAM,IAAO,GAAA;AACX,IAAA,IAAI,CAAC,IAAK,CAAA,eAAA,IAAmB,CAAC,IAAA,CAAK,WAAa,EAAA;AAC9C,MAAA;AAAA;AAGF,IAAA,KAAA,CAAM,yBAA0B,EAAA;AAChC,IAAA,KAAA,CAAM,mBAAoB,EAAA;AAC1B,IAAA,MAAM,MAAM,kBAAmB,EAAA;AAE/B,IAAM,MAAA,iBAAA,CAAkB,KAAK,eAAiB,EAAA,EAAE,SAAS,IAAK,CAAA,aAAA,IAAiB,CAAA;AAC/E,IAAA,IAAA,CAAK,gBAAgB,kBAAmB,EAAA;AACxC,IAAA,IAAA,CAAK,eAAkB,GAAA,MAAA;AAAA;AAE3B,CAAA;AAEA,IAAO,uBAAQ,GAAA,eAAA;AC9Df,IAAM,mCAAA,GAAsCQ,iBAAa,CAAA,IAAA,CAAK,GAAG,CAAA;AAWpD,IAAA,8BAAA,GAAiC,OAAO,MAAO,CAAA;AAAA,EAC1D,6BAA+B,EAAA,GAAA;AAAA,EAC/B,8BAAgC,EAAA,mCAAA;AAAA,EAChC,8BAAgC,EAAA,GAAA;AAAA,EAChC,+BAAiC,EAAA,GAAA;AAAA,EACjC,wBAA0B,EAAA;AAC5B,CAAC;AAGM,IAAM,6BAAgC,GAAA;AAEtC,IAAM,8BAAiC,GAAA,IAAA;;;AC5B9C,IAAM,gCAAA,GAAN,cAA+C,KAAM,CAAA;AAAA,EAFrD;AAEqD,IAAAR,uBAAA,CAAA,IAAA,EAAA,kCAAA,CAAA;AAAA;AAAA,EACnD,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,wCAAwC,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAO,GAAA,kCAAA;AAAA;AAEhB,CAAA;AAEA,IAAO,wCAAQ,GAAA;;;ACLf,eAAsB,WAAiC,GAAA;AACrD,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,EAAM,MAAM,UAAW,EAAA;AAAA,IACvB,QAAQ,UAAW,CAAA,MAAA;AAAA,IACnB,IAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;AAxBsBA,uBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;;;AC+BtB,IAAM,oBAAN,MAA2D;AAAA,EAnC3D;AAmC2D,IAAAA,uBAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AAAA;AAAA,EACjD,WAAA;AAAA,EACA,gBAAA;AAAA,EAEA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,qBAAA;AAAA,EAEA,iBAEJ,GAAA;AAAA,IACF,KAAK,EAAC;AAAA,IACN,MAAM,EAAC;AAAA,IACP,OAAO,EAAC;AAAA,IACR,KAAK,EAAC;AAAA,IACN,QAAQ,EAAC;AAAA,IACT,MAAM,EAAC;AAAA,IACP,SAAS;AAAC,GACZ;AAAA,EAEQ,kBAAA,uBAAyB,GAAY,EAAA;AAAA,EAE7C,YAAY,OAAmC,EAAA;AAC7C,IAAK,IAAA,CAAA,SAAA,GAAY,QAAQ,QAAY,IAAA,WAAA;AACrC,IAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,IAAA;AACrB,IAAK,IAAA,CAAA,qBAAA,GAAwB,QAAQ,oBAAwB,IAAA,8BAAA;AAAA;AAC/D,EAEA,QAAW,GAAA;AACT,IAAA,OAAO,IAAK,CAAA,SAAA;AAAA;AACd,EAEA,IAAO,GAAA;AACL,IAAA,OAAO,IAAK,CAAA,KAAA;AAAA;AACd,EAEA,oBAAuB,GAAA;AACrB,IAAA,OAAO,IAAK,CAAA,qBAAA;AAAA;AACd,EAEA,OAAU,GAAA;AACR,IAAI,IAAA,IAAA,CAAK,UAAU,MAAW,EAAA;AAC5B,MAAO,OAAA,MAAA;AAAA;AAET,IAAA,OAAO,CAAU,OAAA,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA;AAAA;AAC/C,EAEA,SAAY,GAAA;AACV,IAAO,OAAA,CAAC,CAAC,IAAK,CAAA,WAAA,EAAa,aAAa,CAAC,CAAC,IAAK,CAAA,gBAAA,EAAkB,SAAU,EAAA;AAAA;AAC7E,EAEQ,UAAa,GAAA;AAGnB,IAAI,IAAA,CAAC,KAAK,WAAa,EAAA;AACrB,MAAA,MAAM,IAAI,wCAAiC,EAAA;AAAA;AAE7C,IAAA,OAAO,IAAK,CAAA,WAAA;AAAA;AACd,EAEQ,eAAkB,GAAA;AAGxB,IAAI,IAAA,CAAC,KAAK,gBAAkB,EAAA;AAC1B,MAAA,MAAM,IAAI,wCAAiC,EAAA;AAAA;AAE7C,IAAA,OAAO,IAAK,CAAA,gBAAA;AAAA;AACd,EAEA,MAAM,KAAQ,GAAA;AACZ,IAAI,IAAA,IAAA,CAAK,WAAa,EAAA;AACpB,MAAA;AAAA;AAGF,IAAA,IAAA,CAAK,cAAcS,mBAAa,CAAA;AAAA,MAC9B,SAAW,EAAA,IAAA;AAAA,MACX,oBAAsB,EAAA;AAAA,KACvB,CAAA;AACD,IAAA,MAAM,KAAK,eAAgB,EAAA;AAE3B,IAAK,IAAA,CAAA,gBAAA,GAAmB,IAAI,uBAAgB,CAAA;AAAA,MAC1C,YAAY,IAAK,CAAA;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,oBAAqB,EAAA;AAAA;AAC5B,EAEA,MAAc,eAAkB,GAAA;AAC9B,IAAM,MAAA,UAAA,GAAa,KAAK,UAAW,EAAA;AAEnC,IAAA,MAAM,gBAAgB,UAAY,EAAA;AAAA,MAChC,UAAU,IAAK,CAAA,SAAA;AAAA,MACf,MAAM,IAAK,CAAA;AAAA,KACZ,CAAA;AACD,IAAK,IAAA,CAAA,KAAA,GAAQ,kBAAkB,UAAU,CAAA;AAEzC,IAAW,UAAA,CAAA,EAAA,CAAG,SAAW,EAAA,IAAA,CAAK,iBAAiB,CAAA;AAAA;AACjD,EAEQ,oBAAuB,GAAA;AAC7B,IAAM,MAAA,eAAA,GAAkB,KAAK,eAAgB,EAAA;AAE7C,IAAA,eAAA,CAAgB,KAAM,EAAA;AACtB,IAAgB,eAAA,CAAA,OAAA,CAAQ,iCAAmC,EAAA,IAAA,CAAK,YAAY,CAAA;AAC5E,IAAgB,eAAA,CAAA,OAAA,CAAQ,gCAAkC,EAAA,IAAA,CAAK,WAAW,CAAA;AAAA;AAC5E,EAEQ,YAAA,mBACNT,uBAAA,CAAA,CAAA,OAAA,EACA,MACG,KAAA;AACH,IAAA,MAAM,SAAS,OAAQ,CAAA,IAAA;AACvB,IAAK,IAAA,CAAA,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,8BAA8B,MAAM,CAAA;AACzC,IAAA,OAAO,EAAC;AAAA,GAPa,EAAA,cAAA,CAAA;AAAA,EAUf,WAAA,mBACNA,uBAAA,CAAA,CAAA,OAAA,EACA,MACG,KAAA;AACH,IAAA,IAAA,CAAK,2BAA2B,MAAM,CAAA;AAEtC,IAAA,MAAM,oBAAoB,OAAQ,CAAA,IAAA;AAClC,IAAA,MAAM,4BAA4B,iBAAsB,KAAA,MAAA;AAExD,IAAA,IAAI,yBAA2B,EAAA;AAG7B,MAAA,IAAA,CAAK,eAAgB,EAAA,CAAE,mBAAoB,CAAA,CAAC,MAAM,CAAC,CAAA;AAAA,KAC9C,MAAA;AACL,MAAA,KAAA,MAAW,WAAW,iBAAmB,EAAA;AACvC,QAAK,IAAA,CAAA,mBAAA,CAAoB,SAAS,MAAM,CAAA;AAAA;AAC1C;AAGF,IAAA,IAAA,CAAK,8BAA8B,MAAM,CAAA;AAEzC,IAAA,OAAO,EAAC;AAAA,GArBY,EAAA,aAAA,CAAA;AAAA,EAwBd,oBAAoB,EAAE,EAAA,EAAI,GAAK,EAAA,MAAA,IAA6B,MAAgB,EAAA;AAClF,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AAEnD,IAAA,MAAM,OAAU,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,IAAI,CAAA;AAChC,IAAA,wBAAA,CAAiB,OAAO,CAAA;AAExB,IAAA,aAAA,CAAc,IAAK,CAAA;AAAA,MACjB,EAAA;AAAA,MACA,GAAK,EAAA;AAAA,QACH,MAAM,GAAI,CAAA,IAAA;AAAA,QACV,SAAW,EAAA,2BAAA,CAAoB,OAAQ,CAAA,QAAA,EAAU;AAAA,OACnD;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AACH,EAEQ,8BAA8B,MAAgB,EAAA;AACpD,IAAA,IAAI,IAAK,CAAA,kBAAA,CAAmB,GAAI,CAAA,MAAM,CAAG,EAAA;AACvC,MAAA;AAAA;AAGF,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAA,IAAA,CAAK,2BAA2B,MAAM,CAAA;AACtC,MAAK,IAAA,CAAA,kBAAA,CAAmB,OAAO,MAAM,CAAA;AAAA,KACtC,CAAA;AAED,IAAK,IAAA,CAAA,kBAAA,CAAmB,IAAI,MAAM,CAAA;AAAA;AACpC,EAEQ,2BAA2B,MAAgB,EAAA;AACjD,IAAA,KAAA,MAAW,aAAiB,IAAA,MAAA,CAAO,MAAO,CAAA,IAAA,CAAK,iBAAiB,CAAG,EAAA;AACjE,MAAA,MAAM,cAAc,aAAc,CAAA,SAAA,CAAU,CAAC,YAAiB,KAAA,YAAA,CAAa,WAAW,MAAM,CAAA;AAC5F,MAAA,gBAAA,CAAiB,eAAe,WAAW,CAAA;AAAA;AAC7C;AACF,EAEA,uBAAmBA,uBAAA,CAAA,YAAA;AACjB,IAAI,IAAA,CAAC,IAAK,CAAA,SAAA,EAAa,EAAA;AACrB,MAAA;AAAA;AAGF,IAAA,MAAM,KAAK,mBAAoB,EAAA;AAC/B,IAAA,MAAM,KAAK,cAAe,EAAA;AAAA,GANrB,EAAA,MAAA,CAAA;AAAA,EASP,MAAc,cAAiB,GAAA;AAC7B,IAAM,MAAA,UAAA,GAAa,KAAK,UAAW,EAAA;AAEnC,IAAA,MAAM,eAAe,UAAU,CAAA;AAC/B,IAAA,UAAA,CAAW,kBAAmB,EAAA;AAE9B,IAAA,IAAA,CAAK,WAAc,GAAA,MAAA;AAAA;AACrB,EAEA,MAAc,mBAAsB,GAAA;AAClC,IAAM,MAAA,eAAA,GAAkB,KAAK,eAAgB,EAAA;AAE7C,IAAgB,eAAA,CAAA,QAAA,CAAS,iCAAmC,EAAA,IAAA,CAAK,YAAY,CAAA;AAC7E,IAAgB,eAAA,CAAA,QAAA,CAAS,gCAAkC,EAAA,IAAA,CAAK,WAAW,CAAA;AAC3E,IAAA,MAAM,gBAAgB,IAAK,EAAA;AAE3B,IAAA,IAAA,CAAK,gBAAmB,GAAA,MAAA;AAAA;AAC1B,EAEQ,iBAAA,mBAA2BA,uBAAA,CAAA,OAAA,WAAA,EAA8B,YAAiC,KAAA;AAChG,IAAA,MAAM,OAAU,GAAAU,2BAAA,CAAqB,WAAa,EAAA,MAAM,aAAa,CAAA;AACrE,IAAM,MAAA,iBAAA,GAAoB,MAAM,gBAAA,CAAiB,OAAO,CAAA;AAExD,IAAI,IAAA;AACF,MAAA,MAAM,EAAE,QAAU,EAAA,sBAAA,KAA2B,MAAM,IAAA,CAAK,yBAAyB,iBAAiB,CAAA;AAElG,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,IAAA,CAAK,8BAA+B,CAAA,QAAA,EAAU,CAAC,6BAAA,EAA+B,+BAA+B,CAAC,CAAA;AAC9G,QAAM,MAAAC,uBAAA,CAAiB,QAAU,EAAA,YAAA,EAAc,WAAW,CAAA;AAC1D,QAAA;AAAA;AAGF,MAAM,MAAA,4BAAA,GAA+B,QAAQ,MAAW,KAAA,SAAA;AAExD,MAAA,IAAI,4BAA8B,EAAA;AAChC,QAAA,MAAM,2BAA2B,IAAI,QAAA,CAAS,MAAM,EAAE,MAAA,EAAQ,+BAA+B,CAAA;AAC7F,QAAA,IAAA,CAAK,+BAA+B,wBAAwB,CAAA;AAC5D,QAAM,MAAAA,uBAAA,CAAiB,wBAA0B,EAAA,YAAA,EAAc,WAAW,CAAA;AAAA;AAG5E,MAAM,MAAA,0BAAA,GAA6B,CAAC,4BAAA,IAAgC,CAAC,sBAAA;AAErE,MAAA,IAAI,0BAA4B,EAAA;AAC9B,QAAM,MAAA,IAAA,CAAK,8BAA+B,CAAA,OAAA,EAAS,iBAAiB,CAAA;AAAA;AAGtE,MAAA,YAAA,CAAa,OAAQ,EAAA;AAAA,aACd,KAAO,EAAA;AACd,MAAA,MAAM,sBAAsB,KAAiB,YAAA,0BAAA;AAE7C,MAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnB,QAAM,MAAA,IAAA,CAAK,8BAA+B,CAAA,OAAA,EAAS,iBAAiB,CAAA;AAAA;AAGtE,MAAA,YAAA,CAAa,OAAQ,EAAA;AAAA;AACvB,GArC0B,EAAA,mBAAA,CAAA;AAAA,EAwC5B,MAAc,yBAAyB,OAAgC,EAAA;AACrE,IAAM,MAAA,eAAA,GAAkB,KAAK,eAAgB,EAAA;AAC7C,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,iBAAkB,CAAA,OAAA,CAAQ,MAAoB,CAAA;AAE1E,IAAM,MAAA,UAAA,GAAa,yBAAiB,IAAI,GAAA,CAAI,QAAQ,GAAG,CAAC,EAAE,QAAS,EAAA;AAEnE,IAAA,IAAI,sBAAyB,GAAA,KAAA;AAE7B,IAAA,KAAA,IAAS,QAAQ,cAAe,CAAA,MAAA,GAAS,CAAG,EAAA,KAAA,IAAS,GAAG,KAAS,EAAA,EAAA;AAC/D,MAAM,MAAA,OAAA,GAAU,eAAe,KAAK,CAAA;AAEpC,MAAA,MAAM,iBAAoB,GAAA,OAAA,CAAQ,GAAI,CAAA,SAAA,CAAU,KAAK,UAAU,CAAA;AAC/D,MAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,QAAA;AAAA;AAGF,MAAyB,sBAAA,GAAA,IAAA;AAEzB,MAAA,MAAM,EAAE,QAAA,EAAU,kBAAmB,EAAA,GAAI,MAAM,eAAgB,CAAA,OAAA;AAAA,QAC7D,+BAAA;AAAA,QACA,EAAE,SAAA,EAAW,OAAQ,CAAA,EAAA,EAAI,OAAQ,EAAA;AAAA,QACjC,EAAE,OAAA,EAAS,CAAC,OAAA,CAAQ,MAAM,CAAE;AAAA,OAC9B;AAEA,MAAA,IAAI,kBAAoB,EAAA;AACtB,QAAM,MAAA,QAAA,GAAW,oBAAoB,kBAAkB,CAAA;AACvD,QAAO,OAAA,EAAE,UAAU,sBAAuB,EAAA;AAAA;AAC5C;AAGF,IAAO,OAAA,EAAE,QAAU,EAAA,IAAA,EAAM,sBAAuB,EAAA;AAAA;AAClD,EAEQ,+BACN,QACA,EAAA,YAAA,GAAe,MAAO,CAAA,IAAA,CAAK,8BAA8B,CACzD,EAAA;AACA,IAAA,KAAA,MAAW,OAAO,YAAc,EAAA;AAC9B,MAAA,IAAI,QAAS,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAG,EAAA;AAC7B,QAAA;AAAA;AAGF,MAAM,MAAA,KAAA,GAAQ,+BAA+B,GAAG,CAAA;AAGhD,MAAA,IAAI,KAAO,EAAA;AACT,QAAS,QAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,KAAK,CAAA;AAAA;AACjC;AACF;AACF,EAEA,MAAc,8BAA+B,CAAA,OAAA,EAAsB,iBAA0C,EAAA;AAC3G,IAAM,MAAA,eAAA,GAAkB,KAAK,eAAgB,EAAA;AAE7C,IAAM,MAAA,OAAA,GAAU,IAAK,CAAA,+BAAA,CAAgC,OAAO,CAAA;AAE5D,IAAA,IAAI,OAAS,EAAA;AACX,MAAI,IAAA;AACF,QAAA,MAAM,EAAE,SAAA,EAAW,mCAAoC,EAAA,GAAI,MAAM,eAAgB,CAAA,OAAA;AAAA,UAC/E,kCAAA;AAAA,UACA,EAAE,SAAS,iBAAkB,EAAA;AAAA,UAC7B,EAAE,OAAA,EAAS,CAAC,OAAA,CAAQ,MAAM,CAAE;AAAA,SAC9B;AAEA,QAAA,IAAI,mCAAqC,EAAA;AACvC,UAAA;AAAA;AACF,eACO,KAAO,EAAA;AAId,QAAA,MAAM,sBAAsB,KAAiB,YAAA,0BAAA;AAG7C,QAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,UAAM,MAAA,KAAA;AAAA;AACR;AACF;AAGF,IAAI,IAAA,CAAC,KAAK,qBAAuB,EAAA;AAC/B,MAAA;AAAA;AAGF,IAAM,MAAA,6BAAA,CAAsB,0BAA2B,CAAA,OAAA,EAAS,QAAQ,CAAA;AAAA;AAC1E,EAEQ,gCAAgC,OAAsB,EAAA;AAC5D,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,iBAAkB,CAAA,OAAA,CAAQ,MAAoB,CAAA;AAE1E,IAAA,MAAM,OAAU,GAAA,cAAA,CAAe,QAAS,CAAA,CAACC,QAAY,KAAA;AACnD,MAAA,OAAO,OAAQ,CAAA,GAAA,CAAI,UAAWA,CAAAA,QAAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,KAC/C,CAAA;AAED,IAAO,OAAA,OAAA;AAAA;AAEX,CAAA;AAEA,IAAO,yBAAQ,GAAA,iBAAA;;;AC7WR,SAAS,uBAAA,CAAwB,OAAoC,GAAA,EAA6B,EAAA;AACvG,EAAO,OAAA,IAAI,0BAAkB,OAAO,CAAA;AACtC;AAFgBZ,uBAAA,CAAA,uBAAA,EAAA,yBAAA,CAAA;;;ACJhB,IAAM,6BAAN,MAAiC;AAAA,EARjC;AAQiC,IAAAA,uBAAA,CAAA,IAAA,EAAA,4BAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/B,MAAS,GAAA,uBAAA;AACX,CAAA;AAEA,IAAO,kCAAQ,GAAA,0BAAA;;;ACLR,IAAM,iBAAoB,GAAA,MAAA,CAAO,MAAO,CAAA,IAAI,oCAA4B","file":"chunk-3623PRKE.js","sourcesContent":["var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\nexport { __name };\n//# sourceMappingURL=chunk-PAWJFY3S.mjs.map\n//# sourceMappingURL=chunk-PAWJFY3S.mjs.map","export const URL_PATH_PARAM_REGEX = /\\/:([^/]+)/g;\n\nfunction createRegExpFromURL(url: string) {\n URL_PATH_PARAM_REGEX.lastIndex = 0;\n\n const urlWithReplacedPathParams = encodeURI(url)\n .replace(/([.()*?+$\\\\])/g, '\\\\$1')\n .replace(URL_PATH_PARAM_REGEX, '/(?<$1>[^/]+)')\n .replace(/^(\\/)|(\\/)$/g, '');\n\n return new RegExp(`^(?:/)?${urlWithReplacedPathParams}(?:/)?$`);\n}\n\nexport default createRegExpFromURL;\n","function excludeURLParams(url: URL) {\n url.hash = '';\n url.search = '';\n url.username = '';\n url.password = '';\n return url;\n}\n\nexport default excludeURLParams;\n","function isDefined<Value>(value: Value): value is NonNullable<Value> {\n return value !== undefined && value !== null;\n}\n\nexport default isDefined;\n","export function removeArrayIndex<Item>(array: Item[], index: number) {\n if (index >= 0 && index < array.length) {\n array.splice(index, 1);\n }\n return array;\n}\n\nexport function removeArrayElement<Item>(array: Item[], element: Item) {\n const index = array.indexOf(element);\n return removeArrayIndex(array, index);\n}\n","function createCachedDynamicImport<ImportType>(\n importModuleDynamically: () => Promise<ImportType>,\n): () => Promise<ImportType> {\n let cachedImportResult: ImportType | undefined;\n\n return async function importModuleDynamicallyWithCache() {\n if (cachedImportResult === undefined) {\n cachedImportResult = await importModuleDynamically();\n }\n return cachedImportResult;\n };\n}\n\nexport default createCachedDynamicImport;\n","export function isServerSide() {\n return typeof process !== 'undefined' && typeof process.versions !== 'undefined';\n}\n\nexport function isClientSide() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport const importFile = createCachedDynamicImport(\n /* istanbul ignore next -- @preserve\n * Ignoring as Node.js >=20 provides a global File and the import fallback won't run. */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n async () => globalThis.File ?? (await import('buffer')).File,\n);\n\nexport function isGlobalFileAvailable() {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return globalThis.File !== undefined;\n}\n","import { HttpFormData, HttpHeaders, HttpSearchParams } from '@zimic/http';\nimport createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\nimport chalk from 'chalk';\n\nimport { isClientSide } from './environment';\nimport { isGlobalFileAvailable } from './files';\n\nfunction stringifyJSONToLog(value: unknown): string {\n return JSON.stringify(\n value,\n (_key, value) => {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return stringifyValueToLog(value, {\n fallback: (value) => value as string,\n });\n },\n 2,\n )\n .replace(/\\n\\s*/g, ' ')\n .replace(/\"(File { name: '.*?', type: '.*?', size: \\d*? })\"/g, '$1')\n .replace(/\"(Blob { type: '.*?', size: \\d*? })\"/g, '$1');\n}\n\nexport function stringifyValueToLog(\n value: unknown,\n options: {\n fallback?: (value: unknown) => string;\n includeClassName?: { searchParams?: boolean };\n } = {},\n): string {\n const { fallback = stringifyJSONToLog, includeClassName } = options;\n\n if (value === null || value === undefined || typeof value !== 'object') {\n return String(value);\n }\n\n if (value instanceof HttpHeaders) {\n return stringifyValueToLog(value.toObject());\n }\n\n if (value instanceof HttpHeaders || value instanceof HttpSearchParams) {\n const prefix = (includeClassName?.searchParams ?? false) ? 'URLSearchParams ' : '';\n return `${prefix}${stringifyValueToLog(value.toObject())}`;\n }\n\n if (value instanceof HttpFormData) {\n return `FormData ${stringifyValueToLog(value.toObject())}`;\n }\n\n if (isGlobalFileAvailable() && value instanceof File) {\n return `File { name: '${value.name}', type: '${value.type}', size: ${value.size} }`;\n }\n\n if (value instanceof Blob) {\n return `Blob { type: '${value.type}', size: ${value.size} }`;\n }\n\n return fallback(value);\n}\n\nconst importUtil = createCachedDynamicImport(() => import('util'));\n\nexport async function formatValueToLog(value: unknown, options: { colors?: boolean } = {}) {\n if (isClientSide()) {\n return value;\n }\n\n const { colors = true } = options;\n\n const util = await importUtil();\n\n return util.inspect(value, {\n colors,\n compact: true,\n depth: Infinity,\n maxArrayLength: Infinity,\n maxStringLength: Infinity,\n breakLength: Infinity,\n sorted: true,\n });\n}\n\nexport function logWithPrefix(messageOrMessages: unknown, options: { method?: 'log' | 'warn' | 'error' } = {}) {\n const { method = 'log' } = options;\n\n const messages = Array.isArray(messageOrMessages) ? messageOrMessages : [messageOrMessages];\n console[method](chalk.cyan('[@zimic/interceptor]'), ...messages);\n}\n","import {\n HTTP_METHODS_WITH_REQUEST_BODY,\n HTTP_METHODS_WITH_RESPONSE_BODY,\n HttpMethod,\n HttpMethodWithRequestBody,\n HttpMethodWithResponseBody,\n} from '@zimic/http';\nimport { Server as HttpServer } from 'http';\n\nclass HttpServerTimeoutError extends Error {}\n\nexport class HttpServerStartTimeoutError extends HttpServerTimeoutError {\n constructor(reachedTimeout: number) {\n super(`HTTP server start timed out after ${reachedTimeout}ms.`);\n this.name = 'HttpServerStartTimeout';\n }\n}\n\nexport class HttpServerStopTimeoutError extends HttpServerTimeoutError {\n constructor(reachedTimeout: number) {\n super(`HTTP server stop timed out after ${reachedTimeout}ms.`);\n this.name = 'HttpServerStopTimeout';\n }\n}\n\nexport const DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT = 60 * 1000;\n\nexport async function startHttpServer(\n server: HttpServer,\n options: {\n hostname?: string;\n port?: number;\n timeout?: number;\n } = {},\n) {\n const { hostname, port, timeout: timeoutDuration = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } = options;\n\n await new Promise<void>((resolve, reject) => {\n function handleStartError(error: unknown) {\n server.off('listening', handleStartSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n reject(error);\n }\n\n const startTimeout = setTimeout(() => {\n const timeoutError = new HttpServerStartTimeoutError(timeoutDuration);\n handleStartError(timeoutError);\n }, timeoutDuration);\n\n function handleStartSuccess() {\n server.off('error', handleStartError);\n clearTimeout(startTimeout);\n resolve();\n }\n\n server.once('error', handleStartError);\n server.listen(port, hostname, handleStartSuccess);\n });\n}\n\nexport async function stopHttpServer(server: HttpServer, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } = options;\n\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const stopTimeout = setTimeout(() => {\n const timeoutError = new HttpServerStopTimeoutError(timeoutDuration);\n reject(timeoutError);\n }, timeoutDuration);\n\n server.close((error) => {\n clearTimeout(stopTimeout);\n\n /* istanbul ignore if -- @preserve\n * This is expected not to happen since the servers are not stopped unless they are running. */\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n\n server.closeAllConnections();\n });\n}\n\nexport function getHttpServerPort(server: HttpServer) {\n const address = server.address();\n\n /* istanbul ignore if -- @preserve\n * The address is expected to be an object because the server does not listen on a pipe or Unix domain socket. */\n if (typeof address === 'string') {\n return undefined;\n } else {\n return address?.port;\n }\n}\n\nexport function methodCanHaveRequestBody(method: HttpMethod): method is HttpMethodWithRequestBody {\n const methodsToCompare: readonly string[] = HTTP_METHODS_WITH_REQUEST_BODY;\n return methodsToCompare.includes(method);\n}\n\nexport function methodCanHaveResponseBody(method: HttpMethod): method is HttpMethodWithResponseBody {\n const methodsToCompare: readonly string[] = HTTP_METHODS_WITH_RESPONSE_BODY;\n return methodsToCompare.includes(method);\n}\n","import {\n HttpHeaders,\n HttpHeadersInit,\n HttpMethodSchema,\n HttpRequest,\n HttpRequestBodySchema,\n HttpRequestHeadersSchema,\n HttpRequestSearchParamsSchema,\n HttpResponse,\n HttpResponseBodySchema,\n HttpResponseHeadersSchema,\n HttpResponseSchema,\n HttpSearchParams,\n HttpStatusCode,\n InferPathParams,\n} from '@zimic/http';\nimport { Default, PartialByKey, PossiblePromise, ReplaceBy } from '@zimic/utils/types';\n\nexport type HttpRequestHandlerResponseWithBody<ResponseSchema extends HttpResponseSchema> =\n unknown extends ResponseSchema['body']\n ? { body?: null }\n : undefined extends ResponseSchema['body']\n ? { body?: ReplaceBy<ReplaceBy<ResponseSchema['body'], undefined, null>, ArrayBuffer, Blob> }\n : { body: ReplaceBy<ResponseSchema['body'], ArrayBuffer, Blob> };\n\ntype HttpRequestHandlerResponseHeaders<ResponseSchema extends HttpResponseSchema> = HttpHeadersInit<\n PartialByKey<Default<ResponseSchema['headers']>, 'content-type'>\n>;\n\nexport type HttpRequestHandlerResponseWithHeaders<ResponseSchema extends HttpResponseSchema> =\n undefined extends ResponseSchema['headers']\n ? { headers?: HttpRequestHandlerResponseHeaders<ResponseSchema> }\n : keyof ResponseSchema['headers'] extends 'content-type'\n ? { headers?: HttpRequestHandlerResponseHeaders<ResponseSchema> }\n : { headers: HttpRequestHandlerResponseHeaders<ResponseSchema> };\n\n/** A declaration of an HTTP response for an intercepted request. */\nexport type HttpRequestHandlerResponseDeclaration<\n MethodSchema extends HttpMethodSchema = HttpMethodSchema,\n StatusCode extends HttpStatusCode = HttpStatusCode,\n> = StatusCode extends StatusCode\n ? {\n status: StatusCode;\n } & HttpRequestHandlerResponseWithBody<Default<Default<MethodSchema['response']>[StatusCode]>> &\n HttpRequestHandlerResponseWithHeaders<Default<Default<MethodSchema['response']>[StatusCode]>>\n : never;\n\n/**\n * A factory to create {@link HttpRequestHandlerResponseDeclaration} objects.\n *\n * @param request The intercepted request.\n * @returns The response declaration.\n */\nexport type HttpRequestHandlerResponseDeclarationFactory<\n Path extends string,\n MethodSchema extends HttpMethodSchema,\n StatusCode extends HttpStatusCode = HttpStatusCode,\n> = (\n request: Omit<HttpInterceptorRequest<Path, MethodSchema>, 'response'>,\n) => PossiblePromise<HttpRequestHandlerResponseDeclaration<MethodSchema, StatusCode>>;\n\n/**\n * A strict representation of an intercepted HTTP request. The body, search params and path params are already parsed by\n * default.\n */\nexport interface HttpInterceptorRequest<Path extends string, MethodSchema extends HttpMethodSchema>\n extends Omit<HttpRequest, keyof Body | 'headers' | 'clone'> {\n /** The headers of the request. */\n headers: HttpHeaders<HttpRequestHeadersSchema<MethodSchema>>;\n /** The path parameters of the request. They are parsed from the path string when using dynamic paths. */\n pathParams: InferPathParams<Path>;\n /** The search parameters of the request. */\n searchParams: HttpSearchParams<HttpRequestSearchParamsSchema<MethodSchema>>;\n /** The body of the request. It is already parsed by default. */\n body: ReplaceBy<HttpRequestBodySchema<MethodSchema>, ArrayBuffer, Blob>;\n /** The raw request object. */\n raw: HttpRequest<HttpRequestBodySchema<MethodSchema>>;\n}\n\n/**\n * A strict representation of an intercepted HTTP response. The body, search params and path params are already parsed\n * by default.\n */\nexport interface HttpInterceptorResponse<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode>\n extends Omit<HttpResponse, keyof Body | 'headers' | 'clone'> {\n /** The headers of the response. */\n headers: HttpHeaders<HttpResponseHeadersSchema<MethodSchema, StatusCode>>;\n /** The status code of the response. */\n status: StatusCode;\n /** The body of the response. It is already parsed by default. */\n body: HttpResponseBodySchema<MethodSchema, StatusCode>;\n /** The raw response object. */\n raw: HttpResponse<HttpResponseBodySchema<MethodSchema, StatusCode>, StatusCode>;\n}\n\nexport const HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES = Object.freeze(\n new Set<Exclude<keyof HttpRequest, keyof HttpInterceptorRequest<string, never>>>([\n 'bodyUsed',\n 'arrayBuffer',\n 'blob',\n 'formData',\n 'json',\n 'text',\n 'clone',\n ]),\n);\n\nexport const HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES = Object.freeze(\n new Set<Exclude<keyof HttpResponse, keyof HttpInterceptorResponse<never, never>>>(\n HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES,\n ),\n);\n\n/**\n * A strict representation of an intercepted HTTP request, along with its response. The body, search params and path\n * params are already parsed by default.\n */\nexport interface TrackedHttpInterceptorRequest<\n Path extends string,\n MethodSchema extends HttpMethodSchema,\n StatusCode extends HttpStatusCode = never,\n> extends HttpInterceptorRequest<Path, MethodSchema> {\n /** The response that was returned for the intercepted request. */\n response: StatusCode extends [never] ? never : HttpInterceptorResponse<MethodSchema, StatusCode>;\n}\n","import { HttpInterceptorType, UnhandledRequestStrategy } from '../interceptor/types/options';\n\nexport const DEFAULT_UNHANDLED_REQUEST_STRATEGY = Object.freeze({\n local: Object.freeze<UnhandledRequestStrategy.LocalDeclaration>({\n action: 'reject',\n log: true,\n }),\n remote: Object.freeze<UnhandledRequestStrategy.RemoteDeclaration>({\n action: 'reject',\n log: true,\n }),\n} satisfies Record<HttpInterceptorType, Readonly<UnhandledRequestStrategy.Declaration>>);\n","/**\n * Error thrown when a value is not valid {@link https://developer.mozilla.org/docs/Web/API/FormData FormData}. HTTP\n * interceptors might throw this error when trying to parse the body of a request or response with the header\n * `'content-type': 'multipart/form-data'`, if the content cannot be parsed to form data.\n */\nclass InvalidFormDataError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as form data: ${value}`);\n this.name = 'InvalidFormDataError';\n }\n}\n\nexport default InvalidFormDataError;\n","/**\n * Error thrown when a value is not valid JSON. HTTP interceptors might throw this error when trying to parse the body\n * of a request or response with the header `'content-type': 'application/json'`, if the content cannot be parsed to\n * JSON.\n */\nclass InvalidJSONError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as JSON: ${value}`);\n this.name = 'InvalidJSONError';\n }\n}\n\nexport default InvalidJSONError;\n","import { HttpInterceptorType, UnhandledRequestStrategy } from '../interceptor/types/options';\nimport { DEFAULT_UNHANDLED_REQUEST_STRATEGY } from './constants';\n\nclass HttpInterceptorWorkerStore {\n private static _defaultOnUnhandledRequest: {\n local: UnhandledRequestStrategy.Local;\n remote: UnhandledRequestStrategy.Remote;\n } = {\n local: { ...DEFAULT_UNHANDLED_REQUEST_STRATEGY.local },\n remote: { ...DEFAULT_UNHANDLED_REQUEST_STRATEGY.remote },\n };\n\n private class = HttpInterceptorWorkerStore;\n\n defaultOnUnhandledRequest(interceptorType: 'local'): UnhandledRequestStrategy.Local;\n defaultOnUnhandledRequest(interceptorType: 'remote'): UnhandledRequestStrategy.Remote;\n defaultOnUnhandledRequest(interceptorType: HttpInterceptorType): UnhandledRequestStrategy;\n defaultOnUnhandledRequest(interceptorType: HttpInterceptorType) {\n return this.class._defaultOnUnhandledRequest[interceptorType];\n }\n\n setDefaultOnUnhandledRequest(interceptorType: 'local', strategy: UnhandledRequestStrategy.Local): void;\n setDefaultOnUnhandledRequest(interceptorType: 'remote', strategy: UnhandledRequestStrategy.Remote): void;\n setDefaultOnUnhandledRequest(interceptorType: HttpInterceptorType, strategy: UnhandledRequestStrategy): void;\n setDefaultOnUnhandledRequest(interceptorType: HttpInterceptorType, strategy: UnhandledRequestStrategy) {\n if (interceptorType === 'local') {\n this.class._defaultOnUnhandledRequest[interceptorType] = strategy as UnhandledRequestStrategy.Local;\n } else {\n this.class._defaultOnUnhandledRequest[interceptorType] = strategy as UnhandledRequestStrategy.Remote;\n }\n }\n}\n\nexport default HttpInterceptorWorkerStore;\n","import {\n HttpHeadersInit,\n HttpHeaders,\n HttpBody,\n HttpResponse,\n HttpMethod,\n HttpMethodSchema,\n HttpSchema,\n HttpStatusCode,\n InferPathParams,\n HttpFormData,\n HttpSearchParams,\n} from '@zimic/http';\nimport isDefined from '@zimic/utils/data/isDefined';\nimport { Default, PossiblePromise } from '@zimic/utils/types';\nimport chalk from 'chalk';\n\nimport { removeArrayElement } from '@/utils/arrays';\nimport { formatValueToLog, logWithPrefix } from '@/utils/console';\nimport { isClientSide } from '@/utils/environment';\nimport { methodCanHaveResponseBody } from '@/utils/http';\n\nimport HttpInterceptorClient, { AnyHttpInterceptorClient } from '../interceptor/HttpInterceptorClient';\nimport { HttpInterceptorPlatform, HttpInterceptorType, UnhandledRequestStrategy } from '../interceptor/types/options';\nimport {\n UnhandledHttpInterceptorRequestPath,\n UnhandledHttpInterceptorRequestMethodSchema,\n} from '../interceptor/types/requests';\nimport {\n HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES,\n HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES,\n HttpInterceptorRequest,\n HttpInterceptorResponse,\n} from '../requestHandler/types/requests';\nimport { DEFAULT_UNHANDLED_REQUEST_STRATEGY } from './constants';\nimport InvalidFormDataError from './errors/InvalidFormDataError';\nimport InvalidJSONError from './errors/InvalidJSONError';\nimport HttpInterceptorWorkerStore from './HttpInterceptorWorkerStore';\nimport { HttpResponseFactory } from './types/requests';\n\nabstract class HttpInterceptorWorker {\n abstract readonly type: 'local' | 'remote';\n\n private _platform: HttpInterceptorPlatform | null = null;\n private _isRunning = false;\n private startingPromise?: Promise<void>;\n private stoppingPromise?: Promise<void>;\n\n private store = new HttpInterceptorWorkerStore();\n\n private runningInterceptors: AnyHttpInterceptorClient[] = [];\n\n platform() {\n return this._platform;\n }\n\n protected setPlatform(platform: HttpInterceptorPlatform) {\n this._platform = platform;\n }\n\n isRunning() {\n return this._isRunning;\n }\n\n protected setIsRunning(isRunning: boolean) {\n this._isRunning = isRunning;\n }\n\n abstract start(): Promise<void>;\n\n protected async sharedStart(internalStart: () => Promise<void>) {\n if (this.isRunning()) {\n return;\n }\n\n if (this.startingPromise) {\n return this.startingPromise;\n }\n\n try {\n this.startingPromise = internalStart();\n await this.startingPromise;\n\n this.startingPromise = undefined;\n } catch (error) {\n // In server side (e.g. Node.js), we need to manually log the error because this will be treated as an unhandled\n // promise rejection. If we don't log it, the output won't contain details about the error. In the browser,\n // uncaught promise rejections are automatically logged.\n if (!isClientSide()) {\n console.error(error);\n }\n\n await this.stop();\n throw error;\n }\n }\n\n abstract stop(): Promise<void>;\n\n protected async sharedStop(internalStop: () => PossiblePromise<void>) {\n if (!this.isRunning()) {\n return;\n }\n if (this.stoppingPromise) {\n return this.stoppingPromise;\n }\n\n const stoppingResult = internalStop();\n\n if (stoppingResult instanceof Promise) {\n this.stoppingPromise = stoppingResult;\n await this.stoppingPromise;\n }\n\n this.stoppingPromise = undefined;\n }\n\n abstract use<Schema extends HttpSchema>(\n interceptor: HttpInterceptorClient<Schema>,\n method: HttpMethod,\n url: string,\n createResponse: HttpResponseFactory,\n ): PossiblePromise<void>;\n\n protected async logUnhandledRequestIfNecessary(\n request: Request,\n strategy: UnhandledRequestStrategy.Declaration | null,\n ) {\n if (strategy?.log) {\n await HttpInterceptorWorker.logUnhandledRequestWarning(request, strategy.action);\n return { wasLogged: true };\n }\n return { wasLogged: false };\n }\n\n protected async getUnhandledRequestStrategy(request: Request, interceptorType: HttpInterceptorType) {\n const candidates = await this.getUnhandledRequestStrategyCandidates(request, interceptorType);\n const strategy = this.reduceUnhandledRequestStrategyCandidates(candidates);\n return strategy;\n }\n\n private reduceUnhandledRequestStrategyCandidates(candidateStrategies: UnhandledRequestStrategy.Declaration[]) {\n if (candidateStrategies.length === 0) {\n return null;\n }\n\n // Prefer strategies from first to last, overriding undefined values with the next candidate.\n return candidateStrategies.reduce(\n (accumulatedStrategy, candidateStrategy): UnhandledRequestStrategy.Declaration => ({\n action: accumulatedStrategy.action,\n log: accumulatedStrategy.log ?? candidateStrategy.log,\n }),\n );\n }\n\n private async getUnhandledRequestStrategyCandidates(\n request: Request,\n interceptorType: HttpInterceptorType,\n ): Promise<UnhandledRequestStrategy.Declaration[]> {\n const globalDefaultStrategy = this.getGlobalDefaultUnhandledRequestStrategy(interceptorType);\n\n try {\n const interceptor = this.findInterceptorByRequestBaseURL(request);\n\n if (!interceptor) {\n return [];\n }\n\n const requestClone = request.clone();\n\n const [defaultStrategy, interceptorStrategy] = await Promise.all([\n this.getDefaultUnhandledRequestStrategy(request, interceptorType),\n this.getInterceptorUnhandledRequestStrategy(requestClone, interceptor),\n ]);\n\n const candidatesOrPromises = [interceptorStrategy, defaultStrategy, globalDefaultStrategy];\n const candidateStrategies = await Promise.all(candidatesOrPromises.filter(isDefined));\n return candidateStrategies;\n } catch (error) {\n console.error(error);\n\n const candidateStrategies = [globalDefaultStrategy];\n return candidateStrategies;\n }\n }\n\n registerRunningInterceptor(interceptor: AnyHttpInterceptorClient) {\n this.runningInterceptors.push(interceptor);\n }\n\n unregisterRunningInterceptor(interceptor: AnyHttpInterceptorClient) {\n removeArrayElement(this.runningInterceptors, interceptor);\n }\n\n private findInterceptorByRequestBaseURL(request: Request) {\n const interceptor = this.runningInterceptors.findLast((interceptor) => {\n const baseURL = interceptor.baseURL();\n return request.url.startsWith(baseURL);\n });\n\n return interceptor;\n }\n\n private getGlobalDefaultUnhandledRequestStrategy(interceptorType: HttpInterceptorType) {\n return DEFAULT_UNHANDLED_REQUEST_STRATEGY[interceptorType];\n }\n\n private async getDefaultUnhandledRequestStrategy(request: Request, interceptorType: HttpInterceptorType) {\n const defaultStrategyOrFactory = this.store.defaultOnUnhandledRequest(interceptorType);\n\n if (typeof defaultStrategyOrFactory === 'function') {\n const parsedRequest = await HttpInterceptorWorker.parseRawUnhandledRequest(request);\n return defaultStrategyOrFactory(parsedRequest);\n }\n\n return defaultStrategyOrFactory;\n }\n\n private async getInterceptorUnhandledRequestStrategy(request: Request, interceptor: AnyHttpInterceptorClient) {\n const interceptorStrategyOrFactory = interceptor.onUnhandledRequest();\n\n if (typeof interceptorStrategyOrFactory === 'function') {\n const parsedRequest = await HttpInterceptorWorker.parseRawUnhandledRequest(request);\n return interceptorStrategyOrFactory(parsedRequest);\n }\n\n return interceptorStrategyOrFactory;\n }\n\n abstract clearHandlers(): PossiblePromise<void>;\n\n abstract clearInterceptorHandlers<Schema extends HttpSchema>(\n interceptor: HttpInterceptorClient<Schema>,\n ): PossiblePromise<void>;\n\n abstract interceptorsWithHandlers(): AnyHttpInterceptorClient[];\n\n static createResponseFromDeclaration(\n request: Request,\n declaration: { status: number; headers?: HttpHeadersInit; body?: HttpBody },\n ): HttpResponse {\n const headers = new HttpHeaders(declaration.headers);\n const status = declaration.status;\n\n const canHaveBody = methodCanHaveResponseBody(request.method as HttpMethod) && status !== 204;\n\n if (!canHaveBody) {\n return new Response(null, { headers, status }) as HttpResponse;\n }\n\n if (\n typeof declaration.body === 'string' ||\n declaration.body === undefined ||\n declaration.body instanceof FormData ||\n declaration.body instanceof URLSearchParams ||\n declaration.body instanceof Blob ||\n declaration.body instanceof ArrayBuffer\n ) {\n return new Response(declaration.body ?? null, { headers, status }) as HttpResponse;\n }\n\n return Response.json(declaration.body, { headers, status }) as HttpResponse;\n }\n\n static async parseRawUnhandledRequest(request: Request) {\n return this.parseRawRequest<UnhandledHttpInterceptorRequestPath, UnhandledHttpInterceptorRequestMethodSchema>(\n request,\n );\n }\n\n static async parseRawRequest<Path extends string, MethodSchema extends HttpMethodSchema>(\n originalRawRequest: Request,\n options: { urlRegex?: RegExp } = {},\n ): Promise<HttpInterceptorRequest<Path, MethodSchema>> {\n const rawRequest = originalRawRequest.clone();\n const rawRequestClone = rawRequest.clone();\n\n type BodySchema = Default<Default<MethodSchema['request']>['body']>;\n const parsedBody = await this.parseRawBody<BodySchema>(rawRequest);\n\n type HeadersSchema = Default<Default<MethodSchema['request']>['headers']>;\n const headers = new HttpHeaders<HeadersSchema>(rawRequest.headers);\n\n const pathParams = options.urlRegex ? this.parseRawPathParams<Path>(options.urlRegex, rawRequest) : {};\n\n const parsedURL = new URL(rawRequest.url);\n type SearchParamsSchema = Default<Default<MethodSchema['request']>['searchParams']>;\n const searchParams = new HttpSearchParams<SearchParamsSchema>(parsedURL.searchParams);\n\n const parsedRequest = new Proxy(rawRequest as unknown as HttpInterceptorRequest<Path, MethodSchema>, {\n has(target, property: keyof HttpInterceptorRequest<Path, MethodSchema>) {\n if (HttpInterceptorWorker.isHiddenRequestProperty(property)) {\n return false;\n }\n return Reflect.has(target, property);\n },\n\n get(target, property: keyof HttpInterceptorRequest<Path, MethodSchema>) {\n if (HttpInterceptorWorker.isHiddenRequestProperty(property)) {\n return undefined;\n }\n return Reflect.get(target, property, target) as unknown;\n },\n });\n\n Object.defineProperty(parsedRequest, 'body', {\n value: parsedBody,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'headers', {\n value: headers,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'pathParams', {\n value: pathParams,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'searchParams', {\n value: searchParams,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'raw', {\n value: rawRequestClone,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n return parsedRequest;\n }\n\n private static isHiddenRequestProperty(property: string) {\n return HTTP_INTERCEPTOR_REQUEST_HIDDEN_PROPERTIES.has(property as never);\n }\n\n static async parseRawResponse<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode>(\n originalRawResponse: Response,\n ): Promise<HttpInterceptorResponse<MethodSchema, StatusCode>> {\n const rawResponse = originalRawResponse.clone();\n const rawResponseClone = rawResponse.clone();\n\n type BodySchema = Default<Default<Default<MethodSchema['response']>[StatusCode]>['body']>;\n const parsedBody = await this.parseRawBody<BodySchema>(rawResponse);\n\n type HeadersSchema = Default<Default<Default<MethodSchema['response']>[StatusCode]>['headers']>;\n const headers = new HttpHeaders<HeadersSchema>(rawResponse.headers);\n\n const parsedRequest = new Proxy(rawResponse as unknown as HttpInterceptorResponse<MethodSchema, StatusCode>, {\n has(target, property: keyof HttpInterceptorResponse<MethodSchema, StatusCode>) {\n if (HttpInterceptorWorker.isHiddenResponseProperty(property)) {\n return false;\n }\n return Reflect.has(target, property);\n },\n\n get(target, property: keyof HttpInterceptorResponse<MethodSchema, StatusCode>) {\n if (HttpInterceptorWorker.isHiddenResponseProperty(property)) {\n return undefined;\n }\n return Reflect.get(target, property, target) as unknown;\n },\n });\n\n Object.defineProperty(parsedRequest, 'body', {\n value: parsedBody,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'headers', {\n value: headers,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n Object.defineProperty(parsedRequest, 'raw', {\n value: rawResponseClone,\n enumerable: true,\n configurable: false,\n writable: false,\n });\n\n return parsedRequest;\n }\n\n private static isHiddenResponseProperty(property: string) {\n return HTTP_INTERCEPTOR_RESPONSE_HIDDEN_PROPERTIES.has(property as never);\n }\n\n static parseRawPathParams<Path extends string>(matchedURLRegex: RegExp, request: Request): InferPathParams<Path> {\n const match = request.url.match(matchedURLRegex);\n const pathParams = { ...match?.groups };\n return pathParams as InferPathParams<Path>;\n }\n\n static async parseRawBody<Body extends HttpBody>(resource: Request | Response) {\n const contentType = resource.headers.get('content-type');\n\n try {\n if (contentType) {\n if (contentType.startsWith('application/json')) {\n return await this.parseRawBodyAsJSON<Body>(resource);\n }\n if (contentType.startsWith('multipart/form-data')) {\n return await this.parseRawBodyAsFormData<Body>(resource);\n }\n if (contentType.startsWith('application/x-www-form-urlencoded')) {\n return await this.parseRawBodyAsSearchParams<Body>(resource);\n }\n if (contentType.startsWith('text/') || contentType.startsWith('application/xml')) {\n return await this.parseRawBodyAsText<Body>(resource);\n }\n if (\n contentType.startsWith('application/') ||\n contentType.startsWith('image/') ||\n contentType.startsWith('audio/') ||\n contentType.startsWith('font/') ||\n contentType.startsWith('video/') ||\n contentType.startsWith('multipart/')\n ) {\n return await this.parseRawBodyAsBlob<Body>(resource);\n }\n }\n\n const resourceClone = resource.clone();\n\n try {\n return await this.parseRawBodyAsJSON<Body>(resource);\n } catch {\n return await this.parseRawBodyAsText<Body>(resourceClone);\n }\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n private static async parseRawBodyAsJSON<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n try {\n const bodyAsJSON = JSON.parse(bodyAsText) as Body;\n return bodyAsJSON;\n } catch {\n throw new InvalidJSONError(bodyAsText);\n }\n }\n\n private static async parseRawBodyAsSearchParams<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n const bodyAsSearchParams = new HttpSearchParams(bodyAsText);\n return bodyAsSearchParams as Body;\n }\n\n private static async parseRawBodyAsFormData<Body extends HttpBody>(resource: Request | Response) {\n const resourceClone = resource.clone();\n\n try {\n const bodyAsRawFormData = await resource.formData();\n\n const bodyAsFormData = new HttpFormData();\n for (const [key, value] of bodyAsRawFormData) {\n bodyAsFormData.append(key, value as string);\n }\n\n return bodyAsFormData as Body;\n } catch {\n const bodyAsText = await resourceClone.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n throw new InvalidFormDataError(bodyAsText);\n }\n }\n\n private static async parseRawBodyAsBlob<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsBlob = await resource.blob();\n return bodyAsBlob as Body;\n }\n\n private static async parseRawBodyAsText<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n return (bodyAsText || null) as Body;\n }\n\n static async logUnhandledRequestWarning(rawRequest: Request, action: UnhandledRequestStrategy.Action) {\n const request = await this.parseRawRequest(rawRequest);\n\n const [formattedHeaders, formattedSearchParams, formattedBody] = await Promise.all([\n formatValueToLog(request.headers.toObject()),\n formatValueToLog(request.searchParams.toObject()),\n formatValueToLog(request.body),\n ]);\n\n logWithPrefix(\n [\n `${action === 'bypass' ? 'Warning:' : 'Error:'} Request was not handled and was ` +\n `${action === 'bypass' ? chalk.yellow('bypassed') : chalk.red('rejected')}.\\n\\n `,\n `${request.method} ${request.url}`,\n '\\n Headers:',\n formattedHeaders,\n '\\n Search params:',\n formattedSearchParams,\n '\\n Body:',\n formattedBody,\n '\\n\\nLearn more: https://github.com/zimicjs/zimic/wiki/api‐zimic‐interceptor‐http#unhandled-requests',\n ],\n { method: action === 'bypass' ? 'warn' : 'error' },\n );\n }\n}\n\nexport default HttpInterceptorWorker;\n","import { isClientSide } from './environment';\n\nexport function convertArrayBufferToBase64(buffer: ArrayBuffer) {\n if (isClientSide()) {\n const bufferBytes = new Uint8Array(buffer);\n\n const bufferAsStringArray = [];\n for (const byte of bufferBytes) {\n const byteCode = String.fromCharCode(byte);\n bufferAsStringArray.push(byteCode);\n }\n const bufferAsString = bufferAsStringArray.join('');\n\n return btoa(bufferAsString);\n } else {\n return Buffer.from(buffer).toString('base64');\n }\n}\n\nexport function convertBase64ToArrayBuffer(base64Value: string) {\n if (isClientSide()) {\n const bufferAsString = atob(base64Value);\n const array = Uint8Array.from(bufferAsString, (character) => character.charCodeAt(0));\n return array.buffer;\n } else {\n return Buffer.from(base64Value, 'base64');\n }\n}\n","import { JSONValue } from '@zimic/http';\n\nimport { convertArrayBufferToBase64, convertBase64ToArrayBuffer } from './data';\n\nexport type SerializedHttpRequest = JSONValue<{\n url: string;\n method: string;\n mode: RequestMode;\n headers: Record<string, string>;\n cache: RequestCache;\n credentials: RequestCredentials;\n integrity: string;\n keepalive: boolean;\n redirect: RequestRedirect;\n referrer: string;\n referrerPolicy: ReferrerPolicy;\n body: string | null;\n}>;\n\nexport async function serializeRequest(request: Request): Promise<SerializedHttpRequest> {\n const requestClone = request.clone();\n const serializedBody = requestClone.body ? convertArrayBufferToBase64(await requestClone.arrayBuffer()) : null;\n\n return {\n url: request.url,\n method: request.method,\n mode: request.mode,\n headers: Object.fromEntries(request.headers),\n cache: request.cache,\n credentials: request.credentials,\n integrity: request.integrity,\n keepalive: request.keepalive,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n body: serializedBody,\n };\n}\n\nexport function deserializeRequest(serializedRequest: SerializedHttpRequest): Request {\n const deserializedBody = serializedRequest.body ? convertBase64ToArrayBuffer(serializedRequest.body) : null;\n\n return new Request(serializedRequest.url, {\n method: serializedRequest.method,\n mode: serializedRequest.mode,\n headers: new Headers(serializedRequest.headers),\n cache: serializedRequest.cache,\n credentials: serializedRequest.credentials,\n integrity: serializedRequest.integrity,\n keepalive: serializedRequest.keepalive,\n redirect: serializedRequest.redirect,\n referrer: serializedRequest.referrer,\n referrerPolicy: serializedRequest.referrerPolicy,\n body: deserializedBody,\n });\n}\n\nexport type SerializedResponse = JSONValue<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string | null;\n}>;\n\nexport async function serializeResponse(response: Response): Promise<SerializedResponse> {\n const responseClone = response.clone();\n const serializedBody = responseClone.body ? convertArrayBufferToBase64(await responseClone.arrayBuffer()) : null;\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers),\n body: serializedBody,\n };\n}\n\nexport function deserializeResponse(serializedResponse: SerializedResponse): Response {\n const deserializedBody = serializedResponse.body ? convertBase64ToArrayBuffer(serializedResponse.body) : null;\n\n return new Response(deserializedBody, {\n status: serializedResponse.status,\n statusText: serializedResponse.statusText,\n headers: new Headers(serializedResponse.headers),\n });\n}\n","import ClientSocket, { type WebSocketServer as ServerSocket } from 'isomorphic-ws';\n\nclass WebSocketTimeoutError extends Error {}\n\nexport class WebSocketOpenTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket open timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketOpenTimeout';\n }\n}\n\nexport class WebSocketMessageTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket message timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketMessageTimeout';\n }\n}\n\nexport class WebSocketMessageAbortError extends WebSocketTimeoutError {\n constructor() {\n super('Web socket message was aborted.');\n this.name = 'WebSocketMessageAbortError';\n }\n}\n\nexport class WebSocketCloseTimeoutError extends WebSocketTimeoutError {\n constructor(reachedTimeout: number) {\n super(`Web socket close timed out after ${reachedTimeout}ms.`);\n this.name = 'WebSocketCloseTimeout';\n }\n}\n\nexport const DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT = 60 * 1000;\nexport const DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT = 3 * 60 * 1000;\n\nexport async function waitForOpenClientSocket(\n socket: ClientSocket,\n options: {\n timeout?: number;\n } = {},\n) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT } = options;\n\n const isAlreadyOpen = socket.readyState === socket.OPEN;\n\n if (isAlreadyOpen) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n function handleOpenError(error: unknown) {\n socket.removeEventListener('open', handleOpenSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n reject(error);\n }\n\n const openTimeout = setTimeout(() => {\n const timeoutError = new WebSocketOpenTimeoutError(timeoutDuration);\n handleOpenError(timeoutError);\n }, timeoutDuration);\n\n function handleOpenSuccess() {\n socket.removeEventListener('error', handleOpenError);\n clearTimeout(openTimeout);\n resolve();\n }\n\n socket.addEventListener('open', handleOpenSuccess);\n socket.addEventListener('error', handleOpenError);\n });\n}\n\nexport async function closeClientSocket(socket: ClientSocket, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT } = options;\n\n const isAlreadyClosed = socket.readyState === socket.CLOSED;\n if (isAlreadyClosed) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n function handleCloseError(error: unknown) {\n socket.removeEventListener('close', handleCloseSuccess); // eslint-disable-line @typescript-eslint/no-use-before-define\n reject(error);\n }\n\n const closeTimeout = setTimeout(() => {\n const timeoutError = new WebSocketCloseTimeoutError(timeoutDuration);\n handleCloseError(timeoutError);\n }, timeoutDuration);\n\n function handleCloseSuccess() {\n socket.removeEventListener('error', handleCloseError);\n clearTimeout(closeTimeout);\n resolve();\n }\n\n socket.addEventListener('error', handleCloseError);\n socket.addEventListener('close', handleCloseSuccess);\n socket.close();\n });\n}\n\nexport async function closeServerSocket(socket: InstanceType<typeof ServerSocket>, options: { timeout?: number } = {}) {\n const { timeout: timeoutDuration = DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT } = options;\n\n await new Promise<void>((resolve, reject) => {\n const closeTimeout = setTimeout(() => {\n const timeoutError = new WebSocketCloseTimeoutError(timeoutDuration);\n reject(timeoutError);\n }, timeoutDuration);\n\n for (const client of socket.clients) {\n client.terminate();\n }\n\n socket.close((error) => {\n clearTimeout(closeTimeout);\n\n /* istanbul ignore if -- @preserve\n * This is not expected since the server is not stopped unless it is running. */\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n","import createCachedDynamicImport from '@zimic/utils/import/createCachedDynamicImport';\n\nexport type IsomorphicCrypto = Crypto | typeof import('crypto');\n\nexport const importCrypto = createCachedDynamicImport<IsomorphicCrypto>(async () => {\n const globalCrypto = globalThis.crypto as typeof globalThis.crypto | undefined;\n /* istanbul ignore next -- @preserve\n * Ignoring as Node.js >=20 provides a global crypto and the import fallback won't run. */\n return globalCrypto ?? (await import('crypto'));\n});\n","class InvalidWebSocketMessage extends Error {\n constructor(message: unknown) {\n super(`Web socket message is invalid and could not be parsed: ${message}`);\n this.name = 'InvalidWebSocketMessage';\n }\n}\n\nexport default InvalidWebSocketMessage;\n","class NotStartedWebSocketHandlerError extends Error {\n constructor() {\n super('Web socket handler is not running.');\n this.name = 'NotStartedWebSocketHandlerError';\n }\n}\n\nexport default NotStartedWebSocketHandlerError;\n","import { Collection } from '@zimic/utils/types';\nimport ClientSocket from 'isomorphic-ws';\n\nimport { importCrypto } from '@/utils/crypto';\nimport {\n DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT,\n DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT,\n WebSocketMessageAbortError,\n WebSocketMessageTimeoutError,\n closeClientSocket,\n waitForOpenClientSocket,\n} from '@/utils/webSocket';\n\nimport InvalidWebSocketMessage from './errors/InvalidWebSocketMessage';\nimport NotStartedWebSocketHandlerError from './errors/NotStartedWebSocketHandlerError';\nimport { WebSocket } from './types';\n\nabstract class WebSocketHandler<Schema extends WebSocket.ServiceSchema> {\n private sockets = new Set<ClientSocket>();\n\n private _socketTimeout: number;\n private _messageTimeout: number;\n\n private channelListeners: {\n [Channel in WebSocket.ServiceChannel<Schema>]?: {\n event: Set<WebSocket.EventMessageListener<Schema, Channel>>;\n reply: Set<WebSocket.ReplyMessageListener<Schema, Channel>>;\n };\n } = {};\n\n private socketListeners = {\n messageAbort: new Map<ClientSocket, Set<(error: unknown) => void>>(),\n };\n\n protected constructor(options: { socketTimeout?: number; messageTimeout?: number }) {\n this._socketTimeout = options.socketTimeout ?? DEFAULT_WEB_SOCKET_LIFECYCLE_TIMEOUT;\n this._messageTimeout = options.messageTimeout ?? DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT;\n }\n\n abstract isRunning(): boolean;\n\n socketTimeout() {\n return this._socketTimeout;\n }\n\n messageTimeout() {\n return this._messageTimeout;\n }\n\n protected async registerSocket(socket: ClientSocket) {\n const openPromise = waitForOpenClientSocket(socket, { timeout: this._socketTimeout });\n\n const handleSocketMessage = async (rawMessage: ClientSocket.MessageEvent) => {\n await this.handleSocketMessage(socket, rawMessage);\n };\n socket.addEventListener('message', handleSocketMessage);\n\n await openPromise;\n\n /* istanbul ignore next -- @preserve\n * It is difficult to reliably simulate socket errors in tests. */\n function handleSocketError(error: ClientSocket.ErrorEvent) {\n console.error(error);\n }\n socket.addEventListener('error', handleSocketError);\n\n const handleSocketClose = () => {\n socket.removeEventListener('message', handleSocketMessage);\n socket.removeEventListener('error', handleSocketError);\n socket.removeEventListener('close', handleSocketClose);\n this.removeSocket(socket);\n };\n socket.addEventListener('close', handleSocketClose);\n\n this.sockets.add(socket);\n }\n\n private handleSocketMessage = async (socket: ClientSocket, rawMessage: ClientSocket.MessageEvent) => {\n try {\n const stringifiedMessageData = this.readRawMessageData(rawMessage.data);\n const parsedMessageData = this.parseMessage(stringifiedMessageData);\n await this.notifyListeners(parsedMessageData, socket);\n } catch (error) {\n console.error(error);\n }\n };\n\n private readRawMessageData(data: ClientSocket.Data) {\n /* istanbul ignore else -- @preserve\n * All supported websocket messages should be encoded as strings. */\n if (typeof data === 'string') {\n return data;\n } else {\n throw new InvalidWebSocketMessage(data);\n }\n }\n\n private parseMessage(stringifiedMessage: string): WebSocket.ServiceMessage<Schema> {\n let parsedMessage: unknown;\n\n try {\n parsedMessage = JSON.parse(stringifiedMessage) as unknown;\n } catch {\n throw new InvalidWebSocketMessage(stringifiedMessage);\n }\n\n if (!this.isValidMessage(parsedMessage)) {\n throw new InvalidWebSocketMessage(stringifiedMessage);\n }\n\n if (this.isReplyMessage(parsedMessage)) {\n return {\n id: parsedMessage.id,\n channel: parsedMessage.channel,\n requestId: parsedMessage.requestId,\n data: parsedMessage.data,\n };\n }\n\n return {\n id: parsedMessage.id,\n channel: parsedMessage.channel,\n data: parsedMessage.data,\n };\n }\n\n private isValidMessage(message: unknown): message is WebSocket.ServiceMessage<Schema> {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'id' in message &&\n typeof message.id === 'string' &&\n 'channel' in message &&\n typeof message.channel === 'string' &&\n (!('requestId' in message) || typeof message.requestId === 'string')\n );\n }\n\n private async notifyListeners(message: WebSocket.ServiceMessage<Schema>, socket: ClientSocket) {\n if (this.isReplyMessage(message)) {\n await this.notifyReplyListeners(message, socket);\n } else {\n await this.notifyEventListeners(message, socket);\n }\n }\n\n private async notifyReplyListeners(message: WebSocket.ServiceReplyMessage<Schema>, socket: ClientSocket) {\n /* istanbul ignore next -- @preserve\n * Reply listeners are always present when notified in normal conditions. If they were not present, the request\n * would reach a timeout and not be responded. The empty set serves as a fallback. */\n const listeners = this.channelListeners[message.channel]?.reply ?? new Set();\n\n const listenerPromises = Array.from(listeners, async (listener) => {\n await listener(message, socket);\n });\n\n await Promise.all(listenerPromises);\n }\n\n private async notifyEventListeners(\n message: WebSocket.ServiceMessage<Schema, WebSocket.ServiceChannel<Schema>>,\n socket: ClientSocket,\n ) {\n const listeners = this.channelListeners[message.channel]?.event ?? new Set();\n\n const listenerPromises = Array.from(listeners, async (listener) => {\n const replyData = await listener(message, socket);\n await this.reply(message, replyData, { sockets: [socket] });\n });\n\n await Promise.all(listenerPromises);\n }\n\n protected async closeClientSockets(sockets: Collection<ClientSocket> = this.sockets) {\n const closingPromises = Array.from(sockets, async (socket) => {\n await closeClientSocket(socket, { timeout: this._socketTimeout });\n });\n await Promise.all(closingPromises);\n }\n\n private removeSocket(socket: ClientSocket) {\n this.abortSocketMessages([socket]);\n this.sockets.delete(socket);\n }\n\n private async createEventMessage<Channel extends WebSocket.ServiceChannel<Schema>>(\n channel: Channel,\n eventData: WebSocket.ServiceEventMessage<Schema, Channel>['data'],\n ) {\n const crypto = await importCrypto();\n\n const eventMessage: WebSocket.ServiceEventMessage<Schema, Channel> = {\n id: crypto.randomUUID(),\n channel,\n data: eventData,\n };\n return eventMessage;\n }\n\n async send<Channel extends WebSocket.EventWithNoReplyServiceChannel<Schema>>(\n channel: Channel,\n eventData: WebSocket.ServiceEventMessage<Schema, Channel>['data'],\n options: {\n sockets?: Collection<ClientSocket>;\n } = {},\n ) {\n const event = await this.createEventMessage(channel, eventData);\n this.sendMessage(event, options.sockets);\n }\n\n async request<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n channel: Channel,\n requestData: WebSocket.ServiceEventMessage<Schema, Channel>['data'],\n options: {\n sockets?: Collection<ClientSocket>;\n } = {},\n ) {\n const request = await this.createEventMessage(channel, requestData);\n this.sendMessage(request, options.sockets);\n\n const response = await this.waitForReply(channel, request.id, options.sockets);\n return response.data;\n }\n\n async waitForReply<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n channel: Channel,\n requestId: WebSocket.ServiceEventMessage<Schema, Channel>['id'],\n sockets: Collection<ClientSocket> = this.sockets,\n ) {\n return new Promise<WebSocket.ServiceReplyMessage<Schema, Channel>>((resolve, reject) => {\n const replyTimeout = setTimeout(() => {\n this.offReply(channel, replyListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n this.offAbortSocketMessages(sockets, abortListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n\n const timeoutError = new WebSocketMessageTimeoutError(this._messageTimeout);\n reject(timeoutError);\n }, this._messageTimeout);\n\n const abortListener = this.onAbortSocketMessages(sockets, (error) => {\n clearTimeout(replyTimeout);\n\n this.offReply(channel, replyListener); // eslint-disable-line @typescript-eslint/no-use-before-define\n this.offAbortSocketMessages(sockets, abortListener);\n\n reject(error);\n });\n\n const replyListener = this.onReply(channel, (message) => {\n if (message.requestId === requestId) {\n clearTimeout(replyTimeout);\n\n this.offReply(channel, replyListener);\n this.offAbortSocketMessages(sockets, abortListener);\n\n resolve(message);\n }\n });\n });\n }\n\n private isReplyMessage<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n message: WebSocket.ServiceMessage<Schema, Channel>,\n ) {\n return 'requestId' in message;\n }\n\n async reply<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n request: WebSocket.ServiceEventMessage<Schema, Channel>,\n replyData: WebSocket.ServiceReplyMessage<Schema, Channel>['data'],\n options: {\n sockets: Collection<ClientSocket>;\n },\n ) {\n const reply = await this.createReplyMessage(request, replyData);\n\n // If this handler received a request and was stopped before responding, discard any pending replies.\n if (this.isRunning()) {\n this.sendMessage(reply, options.sockets);\n }\n }\n\n private async createReplyMessage<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n request: WebSocket.ServiceEventMessage<Schema, Channel>,\n replyData: WebSocket.ServiceReplyMessage<Schema, Channel>['data'],\n ) {\n const crypto = await importCrypto();\n\n const replyMessage: WebSocket.ServiceReplyMessage<Schema, Channel> = {\n id: crypto.randomUUID(),\n channel: request.channel,\n requestId: request.id,\n data: replyData,\n };\n return replyMessage;\n }\n\n private sendMessage<Channel extends WebSocket.ServiceChannel<Schema>>(\n message: WebSocket.ServiceMessage<Schema, Channel>,\n sockets: Collection<ClientSocket> = this.sockets,\n ) {\n if (!this.isRunning()) {\n throw new NotStartedWebSocketHandlerError();\n }\n\n const stringifiedMessage = JSON.stringify(message);\n\n for (const socket of sockets) {\n socket.send(stringifiedMessage);\n }\n }\n\n onEvent<\n Channel extends WebSocket.ServiceChannel<Schema>,\n Listener extends WebSocket.EventMessageListener<Schema, Channel>,\n >(channel: Channel, listener: Listener): Listener {\n const listeners = this.getOrCreateChannelListeners<Channel>(channel);\n listeners.event.add(listener);\n return listener;\n }\n\n private getOrCreateChannelListeners<Channel extends WebSocket.ServiceChannel<Schema>>(channel: Channel) {\n const listeners = this.channelListeners[channel] ?? {\n event: new Set(),\n reply: new Set(),\n };\n\n if (!this.channelListeners[channel]) {\n this.channelListeners[channel] = listeners;\n }\n\n return listeners;\n }\n\n onReply<\n Channel extends WebSocket.EventWithReplyServiceChannel<Schema>,\n Listener extends WebSocket.ReplyMessageListener<Schema, Channel>,\n >(channel: Channel, listener: Listener): Listener {\n const listeners = this.getOrCreateChannelListeners<Channel>(channel);\n listeners.reply.add(listener);\n return listener;\n }\n\n offEvent<Channel extends WebSocket.ServiceChannel<Schema>>(\n channel: Channel,\n listener: WebSocket.EventMessageListener<Schema, Channel>,\n ) {\n this.channelListeners[channel]?.event.delete(listener);\n }\n\n offReply<Channel extends WebSocket.EventWithReplyServiceChannel<Schema>>(\n channel: Channel,\n listener: WebSocket.ReplyMessageListener<Schema, Channel>,\n ) {\n this.channelListeners[channel]?.reply.delete(listener);\n }\n\n removeAllChannelListeners() {\n this.channelListeners = {};\n }\n\n private onAbortSocketMessages(sockets: Collection<ClientSocket>, listener: (error: unknown) => void) {\n for (const socket of sockets) {\n let listeners = this.socketListeners.messageAbort.get(socket);\n if (!listeners) {\n listeners = new Set();\n this.socketListeners.messageAbort.set(socket, listeners);\n }\n listeners.add(listener);\n }\n\n return listener;\n }\n\n private offAbortSocketMessages(sockets: Collection<ClientSocket>, listener: (error: unknown) => void) {\n for (const socket of sockets) {\n this.socketListeners.messageAbort.get(socket)?.delete(listener);\n }\n }\n\n abortSocketMessages(sockets: Collection<ClientSocket> = this.sockets) {\n const abortError = new WebSocketMessageAbortError();\n\n for (const socket of sockets) {\n const listeners = this.socketListeners.messageAbort.get(socket) ?? [];\n for (const listener of listeners) {\n listener(abortError);\n }\n }\n }\n}\n\nexport default WebSocketHandler;\n","import { Server as HttpServer } from 'http';\nimport ClientSocket from 'isomorphic-ws';\n\nimport { closeServerSocket } from '@/utils/webSocket';\n\nimport { WebSocket } from './types';\nimport WebSocketHandler from './WebSocketHandler';\n\nconst { WebSocketServer: ServerSocket } = ClientSocket;\n\ninterface WebSocketServerOptions {\n httpServer: HttpServer;\n socketTimeout?: number;\n messageTimeout?: number;\n}\n\nclass WebSocketServer<Schema extends WebSocket.ServiceSchema> extends WebSocketHandler<Schema> {\n private webSocketServer?: InstanceType<typeof ServerSocket>;\n private httpServer: HttpServer;\n\n constructor(options: WebSocketServerOptions) {\n super({\n socketTimeout: options.socketTimeout,\n messageTimeout: options.messageTimeout,\n });\n\n this.httpServer = options.httpServer;\n }\n\n isRunning() {\n return this.webSocketServer !== undefined;\n }\n\n start() {\n if (this.isRunning()) {\n return;\n }\n\n const webSocketServer = new ServerSocket({ server: this.httpServer });\n\n webSocketServer.on('error', (error) => {\n console.error(error);\n });\n\n webSocketServer.on('connection', async (socket) => {\n try {\n await super.registerSocket(socket);\n } catch (error) {\n webSocketServer.emit('error', error);\n }\n });\n\n this.webSocketServer = webSocketServer;\n }\n\n async stop() {\n if (!this.webSocketServer || !this.isRunning()) {\n return;\n }\n\n super.removeAllChannelListeners();\n super.abortSocketMessages();\n await super.closeClientSockets();\n\n await closeServerSocket(this.webSocketServer, { timeout: this.socketTimeout() });\n this.webSocketServer.removeAllListeners();\n this.webSocketServer = undefined;\n }\n}\n\nexport default WebSocketServer;\n","import { HTTP_METHODS, HttpSchema } from '@zimic/http';\n\nimport { DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT } from '@/utils/http';\nimport { DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT } from '@/utils/webSocket';\n\nexport const DEFAULT_SERVER_LIFE_CYCLE_TIMEOUT = DEFAULT_HTTP_SERVER_LIFECYCLE_TIMEOUT;\nexport const DEFAULT_SERVER_RPC_TIMEOUT = DEFAULT_WEB_SOCKET_MESSAGE_TIMEOUT;\n\nconst ALLOWED_ACCESS_CONTROL_HTTP_METHODS = HTTP_METHODS.join(',');\n\nexport type AccessControlHeaders = HttpSchema.Headers<{\n 'access-control-allow-origin': string;\n 'access-control-allow-methods': string;\n 'access-control-allow-headers': string;\n 'access-control-expose-headers': string;\n 'access-control-max-age'?: string;\n}>;\n\n/** The default access control headers for the server. */\nexport const DEFAULT_ACCESS_CONTROL_HEADERS = Object.freeze({\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': ALLOWED_ACCESS_CONTROL_HTTP_METHODS,\n 'access-control-allow-headers': '*',\n 'access-control-expose-headers': '*',\n 'access-control-max-age': process.env.SERVER_ACCESS_CONTROL_MAX_AGE,\n}) satisfies AccessControlHeaders;\n\n/** The default status code for the preflight request. */\nexport const DEFAULT_PREFLIGHT_STATUS_CODE = 204;\n\nexport const DEFAULT_LOG_UNHANDLED_REQUESTS = true;\n","/* istanbul ignore next -- @preserve */\n/** An error thrown when the interceptor server is not running. */\nclass NotStartedInterceptorServerError extends Error {\n constructor() {\n super('The interceptor server is not running.');\n this.name = 'NotStartedInterceptorServerError';\n }\n}\n\nexport default NotStartedInterceptorServerError;\n","import { FetchAPI } from '@whatwg-node/server';\n\nimport { importFile } from '@/utils/files';\n\nexport async function getFetchAPI(): Promise<FetchAPI> {\n return {\n fetch,\n Request,\n Response,\n Headers,\n FormData,\n ReadableStream,\n WritableStream,\n TransformStream,\n CompressionStream,\n DecompressionStream,\n TextDecoderStream,\n TextEncoderStream,\n Blob,\n File: await importFile(),\n crypto: globalThis.crypto,\n btoa,\n TextEncoder,\n TextDecoder,\n URLPattern,\n URL,\n URLSearchParams,\n };\n}\n","import { normalizeNodeRequest, sendNodeResponse } from '@whatwg-node/server';\nimport { HttpRequest, HttpMethod } from '@zimic/http';\nimport createRegExpFromURL from '@zimic/utils/url/createRegExpFromURL';\nimport excludeURLParams from '@zimic/utils/url/excludeURLParams';\nimport { createServer, Server as HttpServer, IncomingMessage, ServerResponse } from 'http';\nimport type { WebSocket as Socket } from 'isomorphic-ws';\n\nimport HttpInterceptorWorker from '@/http/interceptorWorker/HttpInterceptorWorker';\nimport { removeArrayIndex } from '@/utils/arrays';\nimport { deserializeResponse, SerializedHttpRequest, serializeRequest } from '@/utils/fetch';\nimport { getHttpServerPort, startHttpServer, stopHttpServer } from '@/utils/http';\nimport { WebSocketMessageAbortError } from '@/utils/webSocket';\nimport { WebSocket } from '@/webSocket/types';\nimport WebSocketServer from '@/webSocket/WebSocketServer';\n\nimport {\n DEFAULT_ACCESS_CONTROL_HEADERS,\n DEFAULT_PREFLIGHT_STATUS_CODE,\n DEFAULT_LOG_UNHANDLED_REQUESTS,\n} from './constants';\nimport NotStartedInterceptorServerError from './errors/NotStartedInterceptorServerError';\nimport { InterceptorServerOptions } from './types/options';\nimport { InterceptorServer as PublicInterceptorServer } from './types/public';\nimport { HttpHandlerCommit, InterceptorServerWebSocketSchema } from './types/schema';\nimport { getFetchAPI } from './utils/fetch';\n\ninterface HttpHandler {\n id: string;\n url: {\n base: string;\n fullRegex: RegExp;\n };\n socket: Socket;\n}\n\nclass InterceptorServer implements PublicInterceptorServer {\n private _httpServer?: HttpServer;\n private _webSocketServer?: WebSocketServer<InterceptorServerWebSocketSchema>;\n\n private _hostname: string;\n private _port?: number;\n private _logUnhandledRequests: boolean;\n\n private httpHandlerGroups: {\n [Method in HttpMethod]: HttpHandler[];\n } = {\n GET: [],\n POST: [],\n PATCH: [],\n PUT: [],\n DELETE: [],\n HEAD: [],\n OPTIONS: [],\n };\n\n private knownWorkerSockets = new Set<Socket>();\n\n constructor(options: InterceptorServerOptions) {\n this._hostname = options.hostname ?? 'localhost';\n this._port = options.port;\n this._logUnhandledRequests = options.logUnhandledRequests ?? DEFAULT_LOG_UNHANDLED_REQUESTS;\n }\n\n hostname() {\n return this._hostname;\n }\n\n port() {\n return this._port;\n }\n\n logUnhandledRequests() {\n return this._logUnhandledRequests;\n }\n\n httpURL() {\n if (this._port === undefined) {\n return undefined;\n }\n return `http://${this._hostname}:${this._port}`;\n }\n\n isRunning() {\n return !!this._httpServer?.listening && !!this._webSocketServer?.isRunning();\n }\n\n private httpServer() {\n /* istanbul ignore if -- @preserve\n * The HTTP server is initialized before using this method in normal conditions. */\n if (!this._httpServer) {\n throw new NotStartedInterceptorServerError();\n }\n return this._httpServer;\n }\n\n private webSocketServer() {\n /* istanbul ignore if -- @preserve\n * The web socket server is initialized before using this method in normal conditions. */\n if (!this._webSocketServer) {\n throw new NotStartedInterceptorServerError();\n }\n return this._webSocketServer;\n }\n\n async start() {\n if (this.isRunning()) {\n return;\n }\n\n this._httpServer = createServer({\n keepAlive: true,\n joinDuplicateHeaders: true,\n });\n await this.startHttpServer();\n\n this._webSocketServer = new WebSocketServer({\n httpServer: this._httpServer,\n });\n this.startWebSocketServer();\n }\n\n private async startHttpServer() {\n const httpServer = this.httpServer();\n\n await startHttpServer(httpServer, {\n hostname: this._hostname,\n port: this._port,\n });\n this._port = getHttpServerPort(httpServer);\n\n httpServer.on('request', this.handleHttpRequest);\n }\n\n private startWebSocketServer() {\n const webSocketServer = this.webSocketServer();\n\n webSocketServer.start();\n webSocketServer.onEvent('interceptors/workers/use/commit', this.commitWorker);\n webSocketServer.onEvent('interceptors/workers/use/reset', this.resetWorker);\n }\n\n private commitWorker = (\n message: WebSocket.ServiceEventMessage<InterceptorServerWebSocketSchema, 'interceptors/workers/use/commit'>,\n socket: Socket,\n ) => {\n const commit = message.data;\n this.registerHttpHandler(commit, socket);\n this.registerWorkerSocketIfUnknown(socket);\n return {};\n };\n\n private resetWorker = (\n message: WebSocket.ServiceEventMessage<InterceptorServerWebSocketSchema, 'interceptors/workers/use/reset'>,\n socket: Socket,\n ) => {\n this.removeHttpHandlersBySocket(socket);\n\n const handlersToResetTo = message.data;\n const isWorkerNoLongerCommitted = handlersToResetTo === undefined;\n\n if (isWorkerNoLongerCommitted) {\n // When a worker is no longer committed, we should abort all requests that were using it.\n // This ensures that we only wait for responses from committed worker sockets.\n this.webSocketServer().abortSocketMessages([socket]);\n } else {\n for (const handler of handlersToResetTo) {\n this.registerHttpHandler(handler, socket);\n }\n }\n\n this.registerWorkerSocketIfUnknown(socket);\n\n return {};\n };\n\n private registerHttpHandler({ id, url, method }: HttpHandlerCommit, socket: Socket) {\n const handlerGroups = this.httpHandlerGroups[method];\n\n const fullURL = new URL(url.full);\n excludeURLParams(fullURL);\n\n handlerGroups.push({\n id,\n url: {\n base: url.base,\n fullRegex: createRegExpFromURL(fullURL.toString()),\n },\n socket,\n });\n }\n\n private registerWorkerSocketIfUnknown(socket: Socket) {\n if (this.knownWorkerSockets.has(socket)) {\n return;\n }\n\n socket.addEventListener('close', () => {\n this.removeHttpHandlersBySocket(socket);\n this.knownWorkerSockets.delete(socket);\n });\n\n this.knownWorkerSockets.add(socket);\n }\n\n private removeHttpHandlersBySocket(socket: Socket) {\n for (const handlerGroups of Object.values(this.httpHandlerGroups)) {\n const socketIndex = handlerGroups.findIndex((handlerGroup) => handlerGroup.socket === socket);\n removeArrayIndex(handlerGroups, socketIndex);\n }\n }\n\n stop = async () => {\n if (!this.isRunning()) {\n return;\n }\n\n await this.stopWebSocketServer();\n await this.stopHttpServer();\n };\n\n private async stopHttpServer() {\n const httpServer = this.httpServer();\n\n await stopHttpServer(httpServer);\n httpServer.removeAllListeners();\n\n this._httpServer = undefined;\n }\n\n private async stopWebSocketServer() {\n const webSocketServer = this.webSocketServer();\n\n webSocketServer.offEvent('interceptors/workers/use/commit', this.commitWorker);\n webSocketServer.offEvent('interceptors/workers/use/reset', this.resetWorker);\n await webSocketServer.stop();\n\n this._webSocketServer = undefined;\n }\n\n private handleHttpRequest = async (nodeRequest: IncomingMessage, nodeResponse: ServerResponse) => {\n const request = normalizeNodeRequest(nodeRequest, await getFetchAPI());\n const serializedRequest = await serializeRequest(request);\n\n try {\n const { response, matchedSomeInterceptor } = await this.createResponseForRequest(serializedRequest);\n\n if (response) {\n this.setDefaultAccessControlHeaders(response, ['access-control-allow-origin', 'access-control-expose-headers']);\n await sendNodeResponse(response, nodeResponse, nodeRequest);\n return;\n }\n\n const isUnhandledPreflightResponse = request.method === 'OPTIONS';\n\n if (isUnhandledPreflightResponse) {\n const defaultPreflightResponse = new Response(null, { status: DEFAULT_PREFLIGHT_STATUS_CODE });\n this.setDefaultAccessControlHeaders(defaultPreflightResponse);\n await sendNodeResponse(defaultPreflightResponse, nodeResponse, nodeRequest);\n }\n\n const shouldWarnUnhandledRequest = !isUnhandledPreflightResponse && !matchedSomeInterceptor;\n\n if (shouldWarnUnhandledRequest) {\n await this.logUnhandledRequestIfNecessary(request, serializedRequest);\n }\n\n nodeResponse.destroy();\n } catch (error) {\n const isMessageAbortError = error instanceof WebSocketMessageAbortError;\n\n if (!isMessageAbortError) {\n console.error(error);\n await this.logUnhandledRequestIfNecessary(request, serializedRequest);\n }\n\n nodeResponse.destroy();\n }\n };\n\n private async createResponseForRequest(request: SerializedHttpRequest) {\n const webSocketServer = this.webSocketServer();\n const methodHandlers = this.httpHandlerGroups[request.method as HttpMethod];\n\n const requestURL = excludeURLParams(new URL(request.url)).toString();\n\n let matchedSomeInterceptor = false;\n\n for (let index = methodHandlers.length - 1; index >= 0; index--) {\n const handler = methodHandlers[index];\n\n const matchesHandlerURL = handler.url.fullRegex.test(requestURL);\n if (!matchesHandlerURL) {\n continue;\n }\n\n matchedSomeInterceptor = true;\n\n const { response: serializedResponse } = await webSocketServer.request(\n 'interceptors/responses/create',\n { handlerId: handler.id, request },\n { sockets: [handler.socket] },\n );\n\n if (serializedResponse) {\n const response = deserializeResponse(serializedResponse);\n return { response, matchedSomeInterceptor };\n }\n }\n\n return { response: null, matchedSomeInterceptor };\n }\n\n private setDefaultAccessControlHeaders(\n response: Response,\n headersToSet = Object.keys(DEFAULT_ACCESS_CONTROL_HEADERS),\n ) {\n for (const key of headersToSet) {\n if (response.headers.has(key)) {\n continue;\n }\n\n const value = DEFAULT_ACCESS_CONTROL_HEADERS[key];\n /* istanbul ignore else -- @preserve\n * This is always true during tests because we force max-age=0 to disable CORS caching. */\n if (value) {\n response.headers.set(key, value);\n }\n }\n }\n\n private async logUnhandledRequestIfNecessary(request: HttpRequest, serializedRequest: SerializedHttpRequest) {\n const webSocketServer = this.webSocketServer();\n\n const handler = this.findHttpHandlerByRequestBaseURL(request);\n\n if (handler) {\n try {\n const { wasLogged: wasRequestLoggedByRemoteInterceptor } = await webSocketServer.request(\n 'interceptors/responses/unhandled',\n { request: serializedRequest },\n { sockets: [handler.socket] },\n );\n\n if (wasRequestLoggedByRemoteInterceptor) {\n return;\n }\n } catch (error) {\n /* istanbul ignore next -- @preserve\n * This try..catch is for the case when the remote interceptor web socket client is closed before responding.\n * Since simulating this scenario is difficult, we are ignoring this branch fow now. */\n const isMessageAbortError = error instanceof WebSocketMessageAbortError;\n\n /* istanbul ignore next -- @preserve */\n if (!isMessageAbortError) {\n throw error;\n }\n }\n }\n\n if (!this._logUnhandledRequests) {\n return;\n }\n\n await HttpInterceptorWorker.logUnhandledRequestWarning(request, 'reject');\n }\n\n private findHttpHandlerByRequestBaseURL(request: HttpRequest) {\n const methodHandlers = this.httpHandlerGroups[request.method as HttpMethod];\n\n const handler = methodHandlers.findLast((handler) => {\n return request.url.startsWith(handler.url.base);\n });\n\n return handler;\n }\n}\n\nexport default InterceptorServer;\n","import InterceptorServer from './InterceptorServer';\nimport { InterceptorServerOptions } from './types/options';\nimport { InterceptorServer as PublicInterceptorServer } from './types/public';\n\n/**\n * Creates an {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server interceptor server}.\n *\n * @param options The options to create the server.\n * @returns The created server.\n * @see {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server-programmatic-usage `zimic-interceptor server` programmatic usage}\n * @see {@link https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors Remote HTTP Interceptors} .\n */\nexport function createInterceptorServer(options: InterceptorServerOptions = {}): PublicInterceptorServer {\n return new InterceptorServer(options);\n}\n","import { createInterceptorServer } from '../factory';\n\n/**\n * A namespace of interceptor server resources for handling HTTP requests.\n *\n * @see {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server-programmatic-usage `zimic-interceptor server` programmatic usage}\n * @see {@link https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors Remote HTTP Interceptors} .\n */\nclass InterceptorServerNamespace {\n /**\n * Creates an {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server interceptor server}.\n *\n * @param options The options to create the server.\n * @returns The created server.\n * @see {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server-programmatic-usage `zimic-interceptor server` programmatic usage}\n * @see {@link https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors Remote HTTP Interceptors} .\n */\n create = createInterceptorServer;\n}\n\nexport default InterceptorServerNamespace;\n","import InterceptorServerNamespace from './namespace/InterceptorServerNamespace';\n\nexport { default as NotStartedInterceptorServerError } from './errors/NotStartedInterceptorServerError';\n\nexport type { InterceptorServerOptions } from './types/options';\nexport type { InterceptorServer } from './types/public';\n\nexport { DEFAULT_ACCESS_CONTROL_HEADERS, DEFAULT_PREFLIGHT_STATUS_CODE } from './constants';\n\n/**\n * A namespace of interceptor server resources for handling HTTP requests.\n *\n * @see {@link https://github.com/zimicjs/zimic/wiki/cli‐zimic‐server#zimic-server `zimic-interceptor server` API reference}\n * @see {@link https://github.com/zimicjs/zimic/wiki/getting‐started#remote-http-interceptors Remote HTTP Interceptors} .\n */\nexport const interceptorServer = Object.freeze(new InterceptorServerNamespace());\n\nexport type { InterceptorServerNamespace };\n"]}
@@ -9,12 +9,12 @@ import ClientSocket from 'isomorphic-ws';
9
9
  var __defProp = Object.defineProperty;
10
10
  var __name2 = /* @__PURE__ */ __name((target, value) => __defProp(target, "name", { value, configurable: true }), "__name");
11
11
 
12
- // ../zimic-utils/dist/chunk-7MZYQWWC.mjs
12
+ // ../zimic-utils/dist/chunk-RIVHLEFF.mjs
13
13
  var URL_PATH_PARAM_REGEX = /\/:([^/]+)/g;
14
14
  function createRegExpFromURL(url) {
15
15
  URL_PATH_PARAM_REGEX.lastIndex = 0;
16
- const urlWithReplacedPathParams = encodeURI(url).replace(/([.()*?+$\\])/g, "\\$1").replace(URL_PATH_PARAM_REGEX, "/(?<$1>[^/]+)").replace(/(\/+)$/, "(?:/+)?");
17
- return new RegExp(`^${urlWithReplacedPathParams}$`);
16
+ const urlWithReplacedPathParams = encodeURI(url).replace(/([.()*?+$\\])/g, "\\$1").replace(URL_PATH_PARAM_REGEX, "/(?<$1>[^/]+)").replace(/^(\/)|(\/)$/g, "");
17
+ return new RegExp(`^(?:/)?${urlWithReplacedPathParams}(?:/)?$`);
18
18
  }
19
19
  __name(createRegExpFromURL, "createRegExpFromURL");
20
20
  __name2(createRegExpFromURL, "createRegExpFromURL");
@@ -34,7 +34,7 @@ var excludeURLParams_default = excludeURLParams;
34
34
 
35
35
  // ../zimic-utils/dist/chunk-3O5CS47X.mjs
36
36
  function isDefined(value) {
37
- return value !== undefined && value !== null;
37
+ return value !== void 0 && value !== null;
38
38
  }
39
39
  __name(isDefined, "isDefined");
40
40
  __name2(isDefined, "isDefined");
@@ -58,7 +58,7 @@ __name(removeArrayElement, "removeArrayElement");
58
58
  function createCachedDynamicImport(importModuleDynamically) {
59
59
  let cachedImportResult;
60
60
  return /* @__PURE__ */ __name2(/* @__PURE__ */ __name(async function importModuleDynamicallyWithCache() {
61
- if (cachedImportResult === undefined) {
61
+ if (cachedImportResult === void 0) {
62
62
  cachedImportResult = await importModuleDynamically();
63
63
  }
64
64
  return cachedImportResult;
@@ -70,7 +70,7 @@ var createCachedDynamicImport_default = createCachedDynamicImport;
70
70
 
71
71
  // src/utils/environment.ts
72
72
  function isClientSide() {
73
- return typeof window !== "undefined";
73
+ return typeof window !== "undefined" && typeof document !== "undefined";
74
74
  }
75
75
  __name(isClientSide, "isClientSide");
76
76
 
@@ -179,7 +179,7 @@ __name(stopHttpServer, "stopHttpServer");
179
179
  function getHttpServerPort(server) {
180
180
  const address = server.address();
181
181
  if (typeof address === "string") {
182
- return undefined;
182
+ return void 0;
183
183
  } else {
184
184
  return address?.port;
185
185
  }
@@ -322,7 +322,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
322
322
  this.stoppingPromise = stoppingResult;
323
323
  await this.stoppingPromise;
324
324
  }
325
- this.stoppingPromise = undefined;
325
+ this.stoppingPromise = void 0;
326
326
  }
327
327
  async logUnhandledRequestIfNecessary(request, strategy) {
328
328
  if (strategy?.log) {
@@ -407,7 +407,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
407
407
  if (!canHaveBody) {
408
408
  return new Response(null, { headers, status });
409
409
  }
410
- if (typeof declaration.body === "string" || declaration.body === undefined || declaration.body instanceof FormData || declaration.body instanceof URLSearchParams || declaration.body instanceof Blob || declaration.body instanceof ArrayBuffer) {
410
+ if (typeof declaration.body === "string" || declaration.body === void 0 || declaration.body instanceof FormData || declaration.body instanceof URLSearchParams || declaration.body instanceof Blob || declaration.body instanceof ArrayBuffer) {
411
411
  return new Response(declaration.body ?? null, { headers, status });
412
412
  }
413
413
  return Response.json(declaration.body, { headers, status });
@@ -434,7 +434,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
434
434
  },
435
435
  get(target, property) {
436
436
  if (_HttpInterceptorWorker.isHiddenRequestProperty(property)) {
437
- return undefined;
437
+ return void 0;
438
438
  }
439
439
  return Reflect.get(target, property, target);
440
440
  }
@@ -488,7 +488,7 @@ var HttpInterceptorWorker = class _HttpInterceptorWorker {
488
488
  },
489
489
  get(target, property) {
490
490
  if (_HttpInterceptorWorker.isHiddenResponseProperty(property)) {
491
- return undefined;
491
+ return void 0;
492
492
  }
493
493
  return Reflect.get(target, property, target);
494
494
  }
@@ -1094,7 +1094,7 @@ var WebSocketServer = class extends WebSocketHandler_default {
1094
1094
  this.httpServer = options.httpServer;
1095
1095
  }
1096
1096
  isRunning() {
1097
- return this.webSocketServer !== undefined;
1097
+ return this.webSocketServer !== void 0;
1098
1098
  }
1099
1099
  start() {
1100
1100
  if (this.isRunning()) {
@@ -1122,7 +1122,7 @@ var WebSocketServer = class extends WebSocketHandler_default {
1122
1122
  await super.closeClientSockets();
1123
1123
  await closeServerSocket(this.webSocketServer, { timeout: this.socketTimeout() });
1124
1124
  this.webSocketServer.removeAllListeners();
1125
- this.webSocketServer = undefined;
1125
+ this.webSocketServer = void 0;
1126
1126
  }
1127
1127
  };
1128
1128
  var WebSocketServer_default = WebSocketServer;
@@ -1212,8 +1212,8 @@ var InterceptorServer = class {
1212
1212
  return this._logUnhandledRequests;
1213
1213
  }
1214
1214
  httpURL() {
1215
- if (this._port === undefined) {
1216
- return undefined;
1215
+ if (this._port === void 0) {
1216
+ return void 0;
1217
1217
  }
1218
1218
  return `http://${this._hostname}:${this._port}`;
1219
1219
  }
@@ -1270,7 +1270,7 @@ var InterceptorServer = class {
1270
1270
  resetWorker = /* @__PURE__ */ __name((message, socket) => {
1271
1271
  this.removeHttpHandlersBySocket(socket);
1272
1272
  const handlersToResetTo = message.data;
1273
- const isWorkerNoLongerCommitted = handlersToResetTo === undefined;
1273
+ const isWorkerNoLongerCommitted = handlersToResetTo === void 0;
1274
1274
  if (isWorkerNoLongerCommitted) {
1275
1275
  this.webSocketServer().abortSocketMessages([socket]);
1276
1276
  } else {
@@ -1321,14 +1321,14 @@ var InterceptorServer = class {
1321
1321
  const httpServer = this.httpServer();
1322
1322
  await stopHttpServer(httpServer);
1323
1323
  httpServer.removeAllListeners();
1324
- this._httpServer = undefined;
1324
+ this._httpServer = void 0;
1325
1325
  }
1326
1326
  async stopWebSocketServer() {
1327
1327
  const webSocketServer = this.webSocketServer();
1328
1328
  webSocketServer.offEvent("interceptors/workers/use/commit", this.commitWorker);
1329
1329
  webSocketServer.offEvent("interceptors/workers/use/reset", this.resetWorker);
1330
1330
  await webSocketServer.stop();
1331
- this._webSocketServer = undefined;
1331
+ this._webSocketServer = void 0;
1332
1332
  }
1333
1333
  handleHttpRequest = /* @__PURE__ */ __name(async (nodeRequest, nodeResponse) => {
1334
1334
  const request = normalizeNodeRequest(nodeRequest, await getFetchAPI());
@@ -1482,5 +1482,5 @@ var interceptorServer = Object.freeze(new InterceptorServerNamespace_default());
1482
1482
  * Since simulating this scenario is difficult, we are ignoring this branch fow now. */
1483
1483
 
1484
1484
  export { DEFAULT_ACCESS_CONTROL_HEADERS, DEFAULT_PREFLIGHT_STATUS_CODE, NotStartedInterceptorServerError_default, createCachedDynamicImport_default, interceptorServer, logWithPrefix };
1485
- //# sourceMappingURL=chunk-QSY6YMZ7.mjs.map
1486
- //# sourceMappingURL=chunk-QSY6YMZ7.mjs.map
1485
+ //# sourceMappingURL=chunk-FEGMEAEO.mjs.map
1486
+ //# sourceMappingURL=chunk-FEGMEAEO.mjs.map