{"version":3,"sources":["../src/opentelemetry/atomicCounter.ts","../src/opentelemetry/spanManager.ts","../src/trace/catcher.ts","../src/opentelemetry/prometheus.ts","../src/utils/timeout.ts","../src/handler/base.ts","../src/handler/respond.ts","../src/handler/http.ts","../src/handler/grpc.ts","../src/handler/ws.ts","../src/handler/factory.ts","../src/trace/wrap.ts","../src/opentelemetry/logger.ts","../src/opentelemetry/exporter.ts","../src/opentelemetry/resource.ts","../src/opentelemetry/sdk.ts","../src/opentelemetry/topology.ts","../src/utils/utils.ts","../src/utils/contextInit.ts","../src/trace/trace.ts"],"names":["AtomicCounter","value","increment","decrement","get","reset","set","val","SpanManager","activeSpans","Map","span","contextSpans","WeakMap","propagator","options","cleanupInterval","startTime","isDestroyed","stats","spansCreated","spansEnded","spansTimedOut","memoryEvictions","errors","W3CTraceContextPropagator","Date","now","spanTimeout","samplingRate","maxActiveSpans","spanAttributes","undefined","opentelemetryConf","setInterval","performPeriodicCleanup","Math","min","process","once","destroy","expiredSpans","traceId","entry","age","createdAt","push","forceEndSpan","checkMemoryPressure","logger","debug","size","memoryUsage","round","heapUsed","error","maxSpans","evictCount","ceil","evictOldestSpans","memUsage","warn","count","sortedEntries","Array","from","entries","sort","a","b","slice","length","reason","clearTimeout","timer","addEvent","end","delete","createSpan","tracer","ctx","serviceName","has","shouldSample","random","startSpan","attributes","requestId","setupSpanTimeout","injectContext","setBasicAttributes","getSpan","spanContext","setTimeout","carrier","context","with","trace","setSpan","active","inject","defaultTextMapSetter","Object","forEach","key","safeAttributes","method","path","setAttributes","customAttrs","setSpanAttributes","addSpanEvent","name","endSpan","getStats","activeSpansCount","uptime","clearInterval","info","catcher","err","ext","message","sanitizedMessage","status","getErrorInfo","code","stack","spanManager","isException","setCode","setStatus","setMessage","setStack","handler","ins","IOCContainer","getInsByClass","globalErrorHandler","Helper","isFunction","Exception","Error","response","_explicitStatus","toString","replace","e","PathNormalizationCache","cache","maxSize","totalHits","totalAccesses","accessCount","REORG_THRESHOLD","lastAccess","reorganize","normalized","existing","evictLRU","oldestKey","oldestAccess","Infinity","clear","index","hitRate","utilizationRate","MetricsBatchProcessor","batchQueue","batchSize","flushInterval","flushTimer","isProcessing","collector","startFlushTimer","addMetric","type","labels","timestamp","flush","batch","splice","metric","requestCounter","add","errorCounter","responseTimeHistogram","record","connectionCounter","MetricsCollector","pathCache","batchProcessor","memoryMonitorTimer","ID_PATTERN","meterProvider","meter","getMeter","initializeMetrics","setupMemoryMonitoring","createCounter","description","unit","createHistogram","advice","explicitBucketBoundaries","collectRequestMetrics","duration","protocol","detectProtocol","createLabelsOptimized","isErrorStatus","errorLabels","error_type","getErrorType","collectProtocolSpecificMetricsOptimized","toUpperCase","_cachedProtocol","websocket","req","headers","upgrade","rpc","includes","defineProperty","writable","enumerable","baseLabels","normalizePathOptimized","originalPath","getWebSocketCompression","getGrpcService","getGrpcCompression","cached","queryIndex","indexOf","cleanPath","substring","match","uuid","objectid","numeric","readyState","service","monitorInterval","cacheStats","cacheSize","cacheHitRate","extensions","acceptEncoding","call","metadata","recordCustomMetric","console","log","pathCacheStats","MetricsCollectorManager","instance","lock","locked","getInstance","setCollector","acquireLock","releaseLock","getCollector","Promise","resolve","initPrometheusExporter","app","isProduction","metricsConf","metricsEndpoint","env","NODE_ENV","exporter","PrometheusExporter","endpoint","port","metricsPort","MeterProvider","readers","manager","cleanup","currentCollector","getMetricsCollector","TimeoutController","timerId","isCleared","createTimeout","ms","signal","reject","_","addEventListener","cleared","BaseHandler","commonPreHandle","encoding","setSecurityHeaders","startTraceSpan","commonPostHandle","msg","logRequest","endTraceSpan","collectMetrics","handleError","handleWithTimeout","next","timeout","terminated","timeoutCtrl","race","checkAndSetStatus","body","SemanticAttributes","HTTP_URL","originalUrl","HTTP_METHOD","HTTP_STATUS_CODE","url","Logger","ProtocolType","StatusEmpty","safeJSONStringify","seen","WeakSet","jsonString","JSON","stringify","toISOString","RegExp","success","data","errorMsg","String","safeEnd","res","callbackCalled","endResult","setImmediate","handleStreamResponse","stream","errorHandled","source","destroyed","headersSent","statusCode","setHeader","endErr","writableEnded","handleFinish","Warn","pipe","compressMiddleware","threshold","filter","contentType","test","br","params","zlib","constants","BROTLI_PARAM_QUALITY","compress","gzip","Z_SYNC_FLUSH","respond","Number","isInteger","_explicitNullBody","remove","textBody","httpVersionMajor","Buffer","byteLength","currentBody","isBuffer","Readable","jsonResult","errMsg","errorResponse","details","jsonData","HttpHandler","handle","endTraceSpanOnly","collectMetricsOnly","GrpcHandler","compression","sendMetadata","Stream","compressStream","createGzip","level","createBrotliCompress","compressErr","streamErr","pipeErr","callback","callbackErr","fallbackErr","StatusCodeConvert","emit","WsHandler","wsExtensions","useCompression","isTrueEmpty","sendOptions","inspect","depth","breakLength","compact","send","listenerCount","wsErr","sendErr","HandlerFactory","handlers","register","HTTP","GRPC","WS","getHandler","asyncLocalStorage","AsyncLocalStorage","eventMethods","emitterResourceMap","createAsyncResource","Symbol","resource","AsyncResource","emitDestroy","prototype","wrapEmitter","emitter","asyncResource","wrappedHandlers","wrapEmitterMethod","original","wrappedHandler","args","runInAsyncScope","wrapper","wrapped","DefaultLogger","Info","Debug","verbose","RetryOTLPTraceExporter","OTLPTraceExporter","maxRetries","retryDelay","failureThreshold","resetTimeout","failureCount","lastFailureTime","circuitState","config","export","spans","resultCallback","ExportResultCode","FAILED","lastError","attempt","result","resetCircuit","tripCircuit","createResourceAttributes","OTEL_SERVICE_NAME","resourceFromAttributes","assign","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","OTEL_SERVICE_VERSION","version","SEMRESATTRS_DEPLOYMENT_ENVIRONMENT","OTEL_ENV","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_LANGUAGE","ATTR_TELEMETRY_SDK_VERSION","OTEL_SDK_VERSION","pid","otlpResourceAttributes","isLoggerSet","initSDK","OTEL_EXPORTER_OTLP_ENDPOINT","traceExporter","timeoutMillis","batchOptions","maxQueueSize","batchMaxQueueSize","maxExportBatchSize","batchMaxExportSize","scheduledDelayMillis","batchDelayMillis","exportTimeoutMillis","batchExportTimeout","logLevel","getLevel","diagLogLevel","values","DiagLogLevel","find","INFO","diag","setLogger","prometheusExporter","sdkConfig","spanProcessors","BatchSpanProcessor","instrumentations","getNodeAutoInstrumentations","enabled","NodeSDK","startTracer","sdk","shutdownHandler","shutdown","off","start","setGlobalTracerProvider","BasicTracerProvider","on","MAX_ENTRIES","MAX_SERVICE_NAME_LENGTH","WARNING_THRESHOLD","TopologyAnalyzer","serviceMap","recordServiceDependency","target","dependencies","Set","getServiceDependencies","node","getFullTopology","visualizeTopology","graph","dep","getRequestId","request","getMetaData","requestIdName","requestIdHeaderName","headerValue","toLowerCase","query","isArray","join","getTraceId","idFactory","randomUUID","safeDefine","property","setter","hasOwnProperty","define","initializeRequestProperties","startTimeInitialized","requestIdInitialized","defaultRetryCondition","transientCodes","defaultOptions","enableTrace","asyncHooks","defaultAttributes","reportInterval","enableTopology","resourceAttributes","retryConf","interval","Trace","metricsProvider","AppEvent","appStart","getTracer","appStop","staticExt","appDebug","getClass","requestProtocol","targetServer","server","serverProtocol","otelTracer","topology","create","run","handleRequest","performance","respWarper","shouldRetry","conditions","reporter","SpanStatusCode","ERROR","OK","setMetaData"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,IAAMA,gBAAN,MAAMA;EAZb;;;EAaUC,KAAAA,GAAQ,CAAA;;;;EAKhBC,SAAAA,GAAoB;AAClB,IAAA,OAAO,EAAE,IAAA,CAAKD,KAAAA;AAChB,EAAA;;;;EAKAE,SAAAA,GAAoB;AAClB,IAAA,OAAO,EAAE,IAAA,CAAKF,KAAAA;AAChB,EAAA;;;;EAKAG,GAAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAKH,KAAAA;AACd,EAAA;;;;EAKAI,KAAAA,GAAc;AACZ,IAAA,IAAA,CAAKJ,KAAAA,GAAQ,CAAA;AACf,EAAA;;;;AAKAK,EAAAA,GAAAA,CAAIC,GAAAA,EAAmB;AACrB,IAAA,IAAA,CAAKN,KAAAA,GAAQM,GAAAA;AACf,EAAA;AACF,CAAA;;;ACJO,IAAMC,cAAN,MAAMA;EA7Cb;;;AA8CmBC,EAAAA,WAAAA,uBAAkBC,GAAAA,EAAAA;AAC3BC,EAAAA,IAAAA;;AAESC,EAAAA,YAAAA,uBAAmBC,OAAAA,EAAAA;AACnBC,EAAAA,UAAAA;AACAC,EAAAA,OAAAA;AACAC,EAAAA,eAAAA;AACAC,EAAAA,SAAAA;EACTC,WAAAA,GAAc,KAAA;;EAGLC,KAAAA,GAAQ;AACvBC,IAAAA,YAAAA,EAAc,IAAIpB,aAAAA,EAAAA;AAClBqB,IAAAA,UAAAA,EAAY,IAAIrB,aAAAA,EAAAA;AAChBsB,IAAAA,aAAAA,EAAe,IAAItB,aAAAA,EAAAA;AACnBuB,IAAAA,eAAAA,EAAiB,IAAIvB,aAAAA,EAAAA;AACrBwB,IAAAA,MAAAA,EAAQ,IAAIxB,aAAAA;AACd,GAAA;AAEA,EAAA,WAAA,CAAYe,OAAAA,EAAuB;AACjC,IAAA,IAAA,CAAKD,UAAAA,GAAa,IAAIW,yBAAAA,EAAAA;AACtB,IAAA,IAAA,CAAKR,SAAAA,GAAYS,KAAKC,GAAAA,EAAG;AACzB,IAAA,IAAA,CAAKZ,OAAAA,GAAU;MACba,WAAAA,EAAa,GAAA;MACbC,YAAAA,EAAc,CAAA;MACdC,cAAAA,EAAgB,GAAA;MAChBC,cAAAA,EAAgBC,MAAAA;AAChB,MAAA,GAAGjB,OAAAA,CAAQkB;AACb,KAAA;AAGA,IAAA,IAAA,CAAKjB,eAAAA,GAAkBkB,YAAY,MAAA;AACjC,MAAA,IAAA,CAAKC,sBAAAA,EAAsB;AAC7B,IAAA,CAAA,EAAGC,KAAKC,GAAAA,CAAI,IAAA,CAAKtB,QAAQa,WAAAA,IAAe,GAAA,EAAO,GAAA,CAAA,CAAA;AAG/CU,IAAAA,OAAAA,CAAQC,IAAAA,CAAK,SAAA,EAAW,MAAM,IAAA,CAAKC,SAAO,CAAA;AAC1CF,IAAAA,OAAAA,CAAQC,IAAAA,CAAK,QAAA,EAAU,MAAM,IAAA,CAAKC,SAAO,CAAA;AAC3C,EAAA;;;;EAKQL,sBAAAA,GAA+B;AACrC,IAAA,IAAI,KAAKjB,WAAAA,EAAa;AAEtB,IAAA,IAAI;AACF,MAAA,MAAMS,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,MAAA,MAAMc,eAAyB,EAAA;AAG/B,MAAA,KAAA,MAAW,CAACC,OAAAA,EAASC,KAAAA,CAAAA,IAAU,KAAKlC,WAAAA,EAAa;AAC/C,QAAA,MAAMmC,GAAAA,GAAMjB,MAAMgB,KAAAA,CAAME,SAAAA;AACxB,QAAA,IAAID,GAAAA,IAAO,IAAA,CAAK7B,OAAAA,CAAQa,WAAAA,IAAe,GAAA,CAAA,EAAQ;AAC7Ca,UAAAA,YAAAA,CAAaK,KAAKJ,OAAAA,CAAAA;AACpB,QAAA;AACF,MAAA;AAGA,MAAA,KAAA,MAAWA,WAAWD,YAAAA,EAAc;AAClC,QAAA,IAAA,CAAKM,YAAAA,CAAaL,SAAS,SAAA,CAAA;AAC7B,MAAA;AAGA,MAAA,IAAA,CAAKM,mBAAAA,EAAmB;AAGxB,MAAA,IAAI,OAAOC,aAAAA,CAAOC,KAAAA,KAAU,cAAc,IAAA,CAAKzC,WAAAA,CAAY0C,OAAO,CAAA,EAAG;AACnEF,QAAAA,aAAAA,CAAOC,MAAM,oBAAA,EAAsB;AACjCzC,UAAAA,WAAAA,EAAa,KAAKA,WAAAA,CAAY0C,IAAAA;UAC9B/B,YAAAA,EAAc,IAAA,CAAKD,KAAAA,CAAMC,YAAAA,CAAahB,GAAAA,EAAG;UACzCiB,UAAAA,EAAY,IAAA,CAAKF,KAAAA,CAAME,UAAAA,CAAWjB,GAAAA,EAAG;UACrCkB,aAAAA,EAAe,IAAA,CAAKH,KAAAA,CAAMG,aAAAA,CAAclB,GAAAA,EAAG;UAC3CmB,eAAAA,EAAiB,IAAA,CAAKJ,KAAAA,CAAMI,eAAAA,CAAgBnB,GAAAA,EAAG;UAC/CoB,MAAAA,EAAQ,IAAA,CAAKL,KAAAA,CAAMK,MAAAA,CAAOpB,GAAAA,EAAG;UAC7BgD,WAAAA,EAAahB,IAAAA,CAAKiB,MAAMf,OAAAA,CAAQc,WAAAA,GAAcE,QAAAA,GAAW,IAAA,GAAO,IAAA,CAAA,GAAQ;SAC1E,CAAA;AACF,MAAA;AACF,IAAA,CAAA,CAAA,OAASC,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,kCAAkCA,KAAAA,CAAAA;AACjD,IAAA;AACF,EAAA;;;;EAKQP,mBAAAA,GAA4B;AAClC,IAAA,MAAMQ,QAAAA,GAAW,IAAA,CAAKzC,OAAAA,CAAQe,cAAAA,IAAkB,GAAA;AAEhD,IAAA,IAAI,IAAA,CAAKrB,WAAAA,CAAY0C,IAAAA,IAAQK,QAAAA,EAAU;AACrC,MAAA,MAAMC,UAAAA,GAAarB,IAAAA,CAAKsB,IAAAA,CAAKF,QAAAA,GAAW,GAAA,CAAA;AACxC,MAAA,IAAA,CAAKG,iBAAiBF,UAAAA,CAAAA;AACxB,IAAA;AAGA,IAAA,MAAMG,QAAAA,GAAWtB,QAAQc,WAAAA,EAAW;AACpC,IAAA,IAAIQ,QAAAA,CAASN,QAAAA,GAAW,GAAA,GAAM,IAAA,GAAO,IAAA,EAAM;AACzCL,MAAAA,aAAAA,CAAOY,KAAK,gEAAA,CAAA;AACZ,MAAA,IAAA,CAAKF,iBAAiBvB,IAAAA,CAAKsB,IAAAA,CAAK,KAAKjD,WAAAA,CAAY0C,IAAAA,GAAO,GAAA,CAAA,CAAA;AAC1D,IAAA;AACF,EAAA;;;;AAKQQ,EAAAA,gBAAAA,CAAiBG,KAAAA,EAAqB;AAC5C,IAAA,MAAMC,aAAAA,GAAgBC,KAAAA,CAAMC,IAAAA,CAAK,IAAA,CAAKxD,WAAAA,CAAYyD,SAAO,CAAA,CACtDC,IAAAA,CAAK,CAAC,GAAGC,CAAAA,CAAAA,EAAI,GAAGC,CAAAA,CAAAA,KAAOD,CAAAA,CAAEvB,SAAAA,GAAYwB,CAAAA,CAAExB,SAAS,CAAA,CAChDyB,KAAAA,CAAM,CAAA,EAAGR,KAAAA,CAAAA;AAEZ,IAAA,KAAA,MAAW,CAACpB,OAAAA,CAAAA,IAAYqB,aAAAA,EAAe;AACrC,MAAA,IAAA,CAAKhB,YAAAA,CAAaL,SAAS,iBAAA,CAAA;AAC3B,MAAA,IAAA,CAAKvB,KAAAA,CAAMI,gBAAgBrB,SAAAA,EAAS;AACtC,IAAA;AAEA,IAAA,IAAI6D,aAAAA,CAAcQ,SAAS,CAAA,EAAG;AAC5BtB,MAAAA,aAAAA,CAAOY,IAAAA,CAAK,CAAA,QAAA,EAAWE,aAAAA,CAAcQ,MAAM,CAAA,oCAAA,CAAsC,CAAA;AACnF,IAAA;AACF,EAAA;;;;AAKQxB,EAAAA,YAAAA,CAAaL,SAAiB8B,MAAAA,EAAsB;AAC1D,IAAA,MAAM7B,KAAAA,GAAQ,IAAA,CAAKlC,WAAAA,CAAYL,GAAAA,CAAIsC,OAAAA,CAAAA;AACnC,IAAA,IAAI,CAACC,KAAAA,EAAO;AAEZ,IAAA,IAAI;AACF8B,MAAAA,YAAAA,CAAa9B,MAAM+B,KAAK,CAAA;AACxB/B,MAAAA,KAAAA,CAAMhC,IAAAA,CAAKgE,SAAS,iBAAA,EAAmB;AAAEH,QAAAA;OAAO,CAAA;AAChD7B,MAAAA,KAAAA,CAAMhC,KAAKiE,GAAAA,EAAG;AACd,MAAA,IAAA,CAAKnE,WAAAA,CAAYoE,OAAOnC,OAAAA,CAAAA;AAExB,MAAA,IAAI8B,WAAW,SAAA,EAAW;AACxB,QAAA,IAAA,CAAKrD,KAAAA,CAAMG,cAAcpB,SAAAA,EAAS;AACpC,MAAA;AAEA+C,MAAAA,aAAAA,CAAOC,KAAAA,CAAM,CAAA,kBAAA,EAAqBR,OAAAA,CAAAA,UAAAA,EAAoB8B,MAAAA,CAAAA,CAAQ,CAAA;AAChE,IAAA,CAAA,CAAA,OAASjB,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,CAAA,wBAAA,EAA2Bb,OAAAA,CAAAA,CAAAA,CAAAA,EAAYa,KAAAA,CAAAA;AACtD,IAAA;AACF,EAAA;;;;EAKAuB,UAAAA,CAAWC,MAAAA,EAAgBC,KAAoBC,WAAAA,EAAuC;AACpF,IAAA,IAAI,KAAK/D,WAAAA,EAAa;AACpB+B,MAAAA,aAAAA,CAAOY,KAAK,8CAAA,CAAA;AACZ,MAAA,OAAO7B,MAAAA;AACT,IAAA;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA,CAAKpB,YAAAA,CAAasE,GAAAA,CAAIF,GAAAA,CAAAA,EAAM;AAC9B/B,QAAAA,aAAAA,CAAOY,KAAK,sCAAA,CAAA;AACZ,QAAA,OAAO,IAAA,CAAKjD,YAAAA,CAAaR,GAAAA,CAAI4E,GAAAA,CAAAA;AAC/B,MAAA;AAGA,MAAA,MAAMG,eAAe/C,IAAAA,CAAKgD,MAAAA,EAAM,IAAM,IAAA,CAAKrE,QAAQc,YAAAA,IAAgB,CAAA,CAAA;AACnE,MAAA,IAAI,CAACsD,YAAAA,EAAc;AACjB,QAAA,OAAOnD,KAAAA,CAAAA;AACT,MAAA;AAGA,MAAA,IAAI,CAAC+C,QAAQM,SAAAA,EAAW;AACtBpC,QAAAA,aAAAA,CAAOM,MAAM,uCAAA,CAAA;AACb,QAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B,QAAA,OAAO8B,KAAAA,CAAAA;AACT,MAAA;AAGA,MAAA,MAAMrB,IAAAA,GAAOoE,MAAAA,CAAOM,SAAAA,CAAUJ,WAAAA,EAAa;QACzCK,UAAAA,EAAY;UACV,cAAA,EAAgBL,WAAAA;AAChB,UAAA,YAAA,EAAcD,IAAIO,SAAAA,IAAa;AACjC;OACF,CAAA;AAGA,MAAA,IAAA,CAAK3E,YAAAA,CAAaN,GAAAA,CAAI0E,GAAAA,EAAKrE,IAAAA,CAAAA;AAE3B,MAAA,IAAA,CAAKA,IAAAA,GAAOA,IAAAA;AAEZ,MAAA,IAAA,CAAKQ,KAAAA,CAAMC,aAAalB,SAAAA,EAAS;AAGjC,MAAA,IAAA,CAAKsF,gBAAAA,CAAiBR,KAAKrE,IAAAA,CAAAA;AAC3B,MAAA,IAAA,CAAK8E,aAAAA,CAAcT,KAAKrE,IAAAA,CAAAA;AACxB,MAAA,IAAA,CAAK+E,kBAAAA,CAAmBV,KAAKrE,IAAAA,CAAAA;AAE7B,MAAA,OAAOA,IAAAA;AACT,IAAA,CAAA,CAAA,OAAS4C,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,wBAAwBA,KAAAA,CAAAA;AACrC,MAAA,OAAOvB,MAAAA;AACT,IAAA;AACF,EAAA;;;;;AAMA2D,EAAAA,OAAAA,CAAQX,GAAAA,EAAuC;AAC7C,IAAA,IAAIA,GAAAA,EAAK;AACP,MAAA,OAAO,IAAA,CAAKpE,YAAAA,CAAaR,GAAAA,CAAI4E,GAAAA,CAAAA;AAC/B,IAAA;AAEA,IAAA,OAAO,IAAA,CAAKrE,IAAAA;AACd,EAAA;;;;;;AAOA6E,EAAAA,gBAAAA,CAAiBR,KAAoBrE,IAAAA,EAAkB;AACrD,IAAA,IAAI,CAAC,IAAA,CAAKI,OAAAA,CAAQa,eAAe,CAACjB,IAAAA,IAAQ,KAAKO,WAAAA,EAAa;AAE5D,IAAA,MAAMwB,OAAAA,GAAU/B,IAAAA,CAAKiF,WAAAA,EAAW,CAAGlD,OAAAA;AAGnC,IAAA,IAAI,IAAA,CAAKjC,WAAAA,CAAYyE,GAAAA,CAAIxC,OAAAA,CAAAA,EAAU;AACjCO,MAAAA,aAAAA,CAAOY,IAAAA,CAAK,CAAA,KAAA,EAAQnB,OAAAA,CAAAA,+BAAAA,CAAwC,CAAA;AAC5D,MAAA;AACF,IAAA;AAEA,IAAA,IAAIgC,KAAAA,GAA+B,IAAA;AAEnC,IAAA,IAAI;AACFA,MAAAA,KAAAA,GAAQmB,WAAW,MAAA;AACjB,QAAA,IAAA,CAAK9C,YAAAA,CAAaL,SAAS,SAAA,CAAA;MAC7B,CAAA,EAAG,IAAA,CAAK3B,QAAQa,WAAW,CAAA;AAG3B,MAAA,IAAA,CAAKnB,WAAAA,CAAYH,IAAIoC,OAAAA,EAAS;AAC5B/B,QAAAA,IAAAA;AACA+D,QAAAA,KAAAA;AACA7B,QAAAA,SAAAA,EAAWnB,KAAKC,GAAAA,EAAG;AACnB4D,QAAAA,SAAAA,EAAWP,GAAAA,CAAIO;OACjB,CAAA;AAGA,MAAA,IAAA,CAAKvC,mBAAAA,EAAmB;AAE1B,IAAA,CAAA,CAAA,OAASO,KAAAA,EAAO;AACd,MAAA,IAAImB,KAAAA,EAAO;AACTD,QAAAA,YAAAA,CAAaC,KAAAA,CAAAA;AACf,MAAA;AAEA,MAAA,IAAA,CAAKjE,WAAAA,CAAYoE,OAAOnC,OAAAA,CAAAA;AACxB,MAAA,IAAA,CAAKvB,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,iCAAiCA,KAAAA,CAAAA;AAC9C,MAAA,MAAMA,KAAAA;AACR,IAAA;AACF,EAAA;;;;;;AAOAkC,EAAAA,aAAAA,CAAcT,KAAoBrE,IAAAA,EAAkB;AAClD,IAAA,IAAI,CAACA,IAAAA,IAAQ,IAAA,CAAKO,WAAAA,EAAa;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM4E,UAAqC,EAAC;AAC5CC,MAAAA,OAAAA,CAAQC,IAAAA,CAAKC,MAAMC,OAAAA,CAAQH,OAAAA,CAAQI,QAAM,EAAIxF,IAAAA,GAAO,MAAA;AAClD,QAAA,IAAA,CAAKG,WAAWsF,MAAAA,CAAOL,OAAAA,CAAQI,MAAAA,EAAM,EAAIL,SAASO,oBAAAA,CAAAA;AAClDC,QAAAA,MAAAA,CAAOpC,OAAAA,CAAQ4B,OAAAA,CAAAA,CAASS,OAAAA,CAAQ,CAAC,CAACC,GAAAA,EAAKvG,KAAAA,CAAAA,KAAM;AAC3C,UAAA,IAAI+E,GAAAA,CAAI1E,GAAAA,IAAO,OAAO0E,GAAAA,CAAI1E,QAAQ,UAAA,EAAY;AAC5C0E,YAAAA,GAAAA,CAAI1E,GAAAA,CAAIkG,KAAKvG,KAAAA,CAAAA;AACf,UAAA;QACF,CAAA,CAAA;MACF,CAAA,CAAA;AACF,IAAA,CAAA,CAAA,OAASsD,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,4BAA4BA,KAAAA,CAAAA;AAC3C,IAAA;AACF,EAAA;;;;;;AAOAmC,EAAAA,kBAAAA,CAAmBV,KAAoBrE,IAAAA,EAAkB;AACvD,IAAA,IAAI,CAACA,IAAAA,IAAQ,IAAA,CAAKO,WAAAA,EAAa;AAE/B,IAAA,IAAI;AAEF,MAAA,MAAMuF,iBAAiC,EAAC;AAExC,MAAA,IAAIzB,IAAIO,SAAAA,EAAW;AACjBkB,QAAAA,cAAAA,CAAe,iBAAA,IAAqBzB,GAAAA,CAAIO,SAAAA;AAC1C,MAAA;AACA,MAAA,IAAIP,IAAI0B,MAAAA,EAAQ;AACdD,QAAAA,cAAAA,CAAe,aAAA,IAAiBzB,GAAAA,CAAI0B,MAAAA;AACtC,MAAA;AACA,MAAA,IAAI1B,IAAI2B,IAAAA,EAAM;AACZF,QAAAA,cAAAA,CAAe,YAAA,IAAgBzB,GAAAA,CAAI2B,IAAAA;AACrC,MAAA;AAEAhG,MAAAA,IAAAA,CAAKiG,cAAcH,cAAAA,CAAAA;AAGnB,MAAA,IAAI,KAAK1F,OAAAA,CAAQgB,cAAAA,IAAkB,OAAO,IAAA,CAAKhB,OAAAA,CAAQgB,mBAAmB,UAAA,EAAY;AACpF,QAAA,IAAI;AACF,UAAA,MAAM8E,WAAAA,GAAc,IAAA,CAAK9F,OAAAA,CAAQgB,cAAAA,CAAeiD,GAAAA,CAAAA;AAChD,UAAA,IAAI6B,WAAAA,IAAe,OAAOA,WAAAA,KAAgB,QAAA,EAAU;AAClDlG,YAAAA,IAAAA,CAAKiG,cAAcC,WAAAA,CAAAA;AACrB,UAAA;AACF,QAAA,CAAA,CAAA,OAAStD,KAAAA,EAAO;AACdN,UAAAA,aAAAA,CAAOM,KAAAA,CAAM,0CAA0CA,KAAAA,CAAAA;AACzD,QAAA;AACF,MAAA;AACF,IAAA,CAAA,CAAA,OAASA,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,mCAAmCA,KAAAA,CAAAA;AAClD,IAAA;AACF,EAAA;;;;;;AAOAuD,EAAAA,iBAAAA,CAAkB9B,KAAoBM,UAAAA,EAAkC;AACtE,IAAA,MAAM3E,IAAAA,GAAO,IAAA,CAAKC,YAAAA,CAAaR,GAAAA,CAAI4E,GAAAA,CAAAA;AACnC,IAAA,IAAI,CAACrE,IAAAA,IAAQ,IAAA,CAAKO,WAAAA,EAAa,OAAO,IAAA;AAEtC,IAAA,IAAI;AACFP,MAAAA,IAAAA,CAAKiG,cAActB,UAAAA,CAAAA;AACrB,IAAA,CAAA,CAAA,OAAS/B,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,kCAAkCA,KAAAA,CAAAA;AACjD,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;;;;;;;EAQAwD,YAAAA,CAAa/B,GAAAA,EAAoBgC,MAAc1B,UAAAA,EAAmC;AAChF,IAAA,MAAM3E,IAAAA,GAAO,IAAA,CAAKC,YAAAA,CAAaR,GAAAA,CAAI4E,GAAAA,CAAAA;AACnC,IAAA,IAAI,CAACrE,IAAAA,IAAQ,IAAA,CAAKO,WAAAA,EAAa;AAE/B,IAAA,IAAI;AACFP,MAAAA,IAAAA,CAAKgE,QAAAA,CAASqC,MAAM1B,UAAAA,CAAAA;AACtB,IAAA,CAAA,CAAA,OAAS/B,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,4BAA4BA,KAAAA,CAAAA;AAC3C,IAAA;AACF,EAAA;;;;;AAMA0D,EAAAA,OAAAA,CAAQjC,GAAAA,EAA0B;AAChC,IAAA,MAAMrE,IAAAA,GAAO,IAAA,CAAKC,YAAAA,CAAaR,GAAAA,CAAI4E,GAAAA,CAAAA;AACnC,IAAA,IAAI,CAACrE,IAAAA,IAAQ,IAAA,CAAKO,WAAAA,EAAa;AAE/B,IAAA,MAAMwB,OAAAA,GAAU/B,IAAAA,CAAKiF,WAAAA,EAAW,CAAGlD,OAAAA;AAEnC,IAAA,IAAI;AAEF,MAAA,MAAMC,KAAAA,GAAQ,IAAA,CAAKlC,WAAAA,CAAYL,GAAAA,CAAIsC,OAAAA,CAAAA;AACnC,MAAA,IAAIC,KAAAA,EAAO;AACT8B,QAAAA,YAAAA,CAAa9B,MAAM+B,KAAK,CAAA;AACxB,QAAA,IAAA,CAAKjE,WAAAA,CAAYoE,OAAOnC,OAAAA,CAAAA;AAC1B,MAAA;AAGA/B,MAAAA,IAAAA,CAAKiE,GAAAA,EAAG;AACR,MAAA,IAAA,CAAKzD,KAAAA,CAAME,WAAWnB,SAAAA,EAAS;AAG/B,MAAA,IAAA,CAAKU,YAAAA,CAAaiE,OAAOG,GAAAA,CAAAA;AAGzB,MAAA,IAAI,IAAA,CAAKrE,SAASA,IAAAA,EAAM;AACtB,QAAA,IAAA,CAAKA,IAAAA,GAAOqB,KAAAA,CAAAA;AACd,MAAA;AAEF,IAAA,CAAA,CAAA,OAASuB,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKpC,KAAAA,CAAMK,OAAOtB,SAAAA,EAAS;AAC3B+C,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,8BAA8BA,KAAAA,CAAAA;AAC7C,IAAA;AACF,EAAA;;;;EAKA2D,QAAAA,GAAW;AACT,IAAA,OAAO;MACL9F,YAAAA,EAAc,IAAA,CAAKD,KAAAA,CAAMC,YAAAA,CAAahB,GAAAA,EAAG;MACzCiB,UAAAA,EAAY,IAAA,CAAKF,KAAAA,CAAME,UAAAA,CAAWjB,GAAAA,EAAG;MACrCkB,aAAAA,EAAe,IAAA,CAAKH,KAAAA,CAAMG,aAAAA,CAAclB,GAAAA,EAAG;MAC3CmB,eAAAA,EAAiB,IAAA,CAAKJ,KAAAA,CAAMI,eAAAA,CAAgBnB,GAAAA,EAAG;MAC/CoB,MAAAA,EAAQ,IAAA,CAAKL,KAAAA,CAAMK,MAAAA,CAAOpB,GAAAA,EAAG;AAC7B+G,MAAAA,gBAAAA,EAAkB,KAAK1G,WAAAA,CAAY0C,IAAAA;MACnCiE,MAAAA,EAAQ1F,IAAAA,CAAKC,GAAAA,EAAG,GAAK,IAAA,CAAKV,SAAAA;AAC1BC,MAAAA,WAAAA,EAAa,IAAA,CAAKA,WAAAA;AAClBkC,MAAAA,WAAAA,EAAad,QAAQc,WAAAA;AACvB,KAAA;AACF,EAAA;;;;EAKAZ,OAAAA,GAAgB;AACd,IAAA,IAAI,KAAKtB,WAAAA,EAAa;AAEtB,IAAA,IAAA,CAAKA,WAAAA,GAAc,IAAA;AAEnB,IAAA,IAAI;AAEF,MAAA,IAAI,KAAKF,eAAAA,EAAiB;AACxBqG,QAAAA,aAAAA,CAAc,KAAKrG,eAAe,CAAA;AACpC,MAAA;AAGA,MAAA,KAAA,MAAW,CAAC0B,OAAAA,CAAAA,IAAY,IAAA,CAAKjC,WAAAA,EAAa;AACxC,QAAA,IAAA,CAAKsC,YAAAA,CAAaL,SAAS,mBAAA,CAAA;AAC7B,MAAA;AAGA,MAAA,IAAI,KAAK/B,IAAAA,EAAM;AACb,QAAA,IAAA,CAAKA,KAAKiE,GAAAA,EAAG;AACb,QAAA,IAAA,CAAKjE,IAAAA,GAAOqB,KAAAA,CAAAA;AACd,MAAA;AAEAiB,MAAAA,aAAAA,CAAOqE,IAAAA,CAAK,oCAAA,EAAsC,IAAA,CAAKJ,QAAAA,EAAQ,CAAA;AACjE,IAAA,CAAA,CAAA,OAAS3D,KAAAA,EAAO;AACdN,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,yCAAyCA,KAAAA,CAAAA;AACxD,IAAA;AACF,EAAA;AACF,CAAA;AC1cO,SAASgE,OAAAA,CACdvC,GAAAA,EACAwC,GAAAA,EACAC,GAAAA,EAAsB;AAEtB,EAAA,MAAM,EAAEC,OAAAA,EAASC,gBAAAA,EAAkBC,QAAM,GAAKC,YAAAA,CAAa7C,KAAKwC,GAAAA,CAAAA;AAChE,EAAA,MAAMM,IAAAA,GAAWN,IAAKM,IAAAA,IAAQ,CAAA;AAC9B,EAAA,MAAMC,QAAQP,GAAAA,CAAIO,KAAAA;AAClB,EAAA,MAAMpH,IAAAA,GAAO8G,GAAAA,CAAIO,WAAAA,EAAarC,OAAAA,EAAAA;AAG9B,EAAA,IAAIsC,WAAAA,CAAYT,GAAAA,CAAAA,EAAM;AACpB,IAAA,OAAmBA,IAAKU,OAAAA,CAAQJ,IAAAA,CAAAA,CAAMK,SAAAA,CAAUP,MAAAA,CAAAA,CAC9CQ,UAAAA,CAAWT,gBAAAA,CAAAA,CAAkBzB,QAAQvF,IAAAA,CAAAA,CAAM0H,SAASN,KAAAA,CAAAA,CAAOO,QAAQtD,GAAAA,CAAAA;AACvE,EAAA;AAEA,EAAA,MAAMuD,GAAAA,GAAiBC,YAAAA,CAAaC,aAAAA,CAAchB,GAAAA,CAAIiB,kBAAAA,EACpD;AAACf,IAAAA,gBAAAA;AAAkBG,IAAAA,IAAAA;AAAMF,IAAAA,MAAAA;AAAQG,IAAAA,KAAAA;AAAOpH,IAAAA;AAAK,GAAA,CAAA;AAC/C,EAAA,IAAIgI,MAAAA,CAAOC,UAAAA,CAAWL,GAAAA,EAAKD,OAAAA,CAAAA,EAAU;AACnC,IAAA,OAAOC,GAAAA,CAAID,QAAQtD,GAAAA,CAAAA;AACrB,EAAA;AAGA,EAAA,OAAO,IAAI6D,UAAUlB,gBAAAA,EAAkBG,IAAAA,EAAMF,QAAQG,KAAAA,EAAOpH,IAAAA,CAAAA,CAAM2H,OAAAA,CAAQtD,GAAAA,CAAAA;AAC5E;AAxBgBuC,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAgDhB,SAASM,YAAAA,CAAkC7C,KACzCwC,GAAAA,EAA0B;AAE1B,EAAA,IAAII,MAAAA,GAAS,GAAA;AACb,EAAA,IAAI,QAAA,IAAYJ,GAAAA,IAAO,OAAOA,GAAAA,CAAII,WAAW,QAAA,EAAU;AACrDA,IAAAA,MAAAA,GAASJ,GAAAA,CAAII,MAAAA;AACf,EAAA,CAAA,MAAA,IAAWJ,eAAesB,KAAAA,EAAO;AAC/BlB,IAAAA,MAAAA,GAAS,GAAA;AACX,EAAA,CAAA,MAAA,IAAW5C,IAAI4C,MAAAA,KAAW,GAAA,IAAO,CAAE5C,GAAAA,CAAI+D,SAAiBC,eAAAA,EAAiB;AACvEpB,IAAAA,MAAAA,GAAS,GAAA;EACX,CAAA,MAAO;AACLA,IAAAA,MAAAA,GAAS5C,IAAI4C,MAAAA,IAAU,GAAA;AACzB,EAAA;AAGA,EAAA,IAAIF,OAAAA,GAAU,EAAA;AACd,EAAA,IAAI;AACFA,IAAAA,OAAAA,GAAAA,CAAWF,GAAAA,EAAKE,OAAAA,IAAW1C,GAAAA,EAAK0C,OAAAA,IAAW,IAAIuB,QAAAA,EAAQ;AAEvDvB,IAAAA,OAAAA,GAAUA,OAAAA,CAAQwB,OAAAA,CAAQ,IAAA,EAAM,KAAA,CAAA;AAClC,EAAA,CAAA,CAAA,OAASC,CAAAA,EAAG;AACVzB,IAAAA,OAAAA,GAAU,EAAA;AACZ,EAAA;AAEA,EAAA,OAAO;AAAEE,IAAAA,MAAAA;AAAQF,IAAAA;AAAQ,GAAA;AAC3B;AAzBSG,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;ACxCT,IAAMuB,sBAAAA,GAAN,MAAMA,uBAAAA,CAAAA;EAxCN;;;AAyCUC,EAAAA,KAAAA,uBAAY3I,GAAAA,EAAAA;AACH4I,EAAAA,OAAAA;EACTC,SAAAA,GAAY,CAAA;EACZC,aAAAA,GAAgB,CAAA;EAChBC,WAAAA,GAAc,CAAA;EACLC,eAAAA,GAAkB,GAAA;AAEnC,EAAA,WAAA,CAAYJ,UAAU,GAAA,EAAO;AAC3B,IAAA,IAAA,CAAKA,OAAAA,GAAUA,OAAAA;AACjB,EAAA;;;;;;AAOAlJ,EAAAA,GAAAA,CAAIuG,IAAAA,EAAkC;AACpC,IAAA,IAAA,CAAK6C,aAAAA,EAAAA;AACL,IAAA,IAAA,CAAKC,WAAAA,EAAAA;AAEL,IAAA,MAAM9G,KAAAA,GAAQ,IAAA,CAAK0G,KAAAA,CAAMjJ,GAAAA,CAAIuG,IAAAA,CAAAA;AAC7B,IAAA,IAAIhE,KAAAA,EAAO;AACT,MAAA,IAAA,CAAK4G,SAAAA,EAAAA;AAGL5G,MAAAA,KAAAA,CAAMgH,aAAa,IAAA,CAAKF,WAAAA;AAGxB,MAAA,IAAI,IAAA,CAAKA,WAAAA,IAAe,IAAA,CAAKC,eAAAA,EAAiB;AAC5C,QAAA,IAAA,CAAKE,UAAAA,EAAU;AACjB,MAAA;AAEA,MAAA,OAAOjH,KAAAA,CAAM1C,KAAAA;AACf,IAAA;AACA,IAAA,OAAO+B,MAAAA;AACT,EAAA;;;;AAKA1B,EAAAA,GAAAA,CAAIqG,MAAckD,UAAAA,EAA0B;AAC1C,IAAA,MAAMC,QAAAA,GAAW,IAAA,CAAKT,KAAAA,CAAMjJ,GAAAA,CAAIuG,IAAAA,CAAAA;AAEhC,IAAA,IAAImD,QAAAA,EAAU;AAEZA,MAAAA,QAAAA,CAAS7J,KAAAA,GAAQ4J,UAAAA;AACjBC,MAAAA,QAAAA,CAASH,aAAa,IAAA,CAAKF,WAAAA;AAC3B,MAAA;AACF,IAAA;AAGA,IAAA,IAAI,IAAA,CAAKJ,KAAAA,CAAMlG,IAAAA,IAAQ,IAAA,CAAKmG,OAAAA,EAAS;AACnC,MAAA,IAAA,CAAKS,QAAAA,EAAQ;AACf,IAAA;AAGA,IAAA,IAAA,CAAKV,KAAAA,CAAM/I,IAAIqG,IAAAA,EAAM;MACnB1G,KAAAA,EAAO4J,UAAAA;AACPF,MAAAA,UAAAA,EAAY,IAAA,CAAKF;KACnB,CAAA;AACF,EAAA;;;;EAKQM,QAAAA,GAAiB;AACvB,IAAA,IAAIC,SAAAA,GAA2B,IAAA;AAC/B,IAAA,IAAIC,YAAAA,GAAeC,QAAAA;AAGnB,IAAA,KAAA,MAAW,CAAC1D,GAAAA,EAAK7D,KAAAA,CAAAA,IAAU,KAAK0G,KAAAA,EAAO;AACrC,MAAA,IAAI1G,KAAAA,CAAMgH,aAAaM,YAAAA,EAAc;AACnCA,QAAAA,YAAAA,GAAetH,KAAAA,CAAMgH,UAAAA;AACrBK,QAAAA,SAAAA,GAAYxD,GAAAA;AACd,MAAA;AACF,IAAA;AAEA,IAAA,IAAIwD,SAAAA,EAAW;AACb,MAAA,IAAA,CAAKX,KAAAA,CAAMxE,OAAOmF,SAAAA,CAAAA;AACpB,IAAA;AACF,EAAA;;;;EAKQJ,UAAAA,GAAmB;AACzB,IAAA,IAAA,CAAKH,WAAAA,GAAc,CAAA;AAGnB,IAAA,MAAMvF,UAAUF,KAAAA,CAAMC,IAAAA,CAAK,KAAKoF,KAAAA,CAAMnF,OAAAA,EAAO,CAAA,CAC1CC,IAAAA,CAAK,CAACC,CAAAA,EAAGC,CAAAA,KAAMD,EAAE,CAAA,CAAA,CAAGuF,aAAatF,CAAAA,CAAE,CAAA,EAAGsF,UAAU,CAAA;AAEnD,IAAA,IAAA,CAAKN,MAAMc,KAAAA,EAAK;AAEhBjG,IAAAA,OAAAA,CAAQqC,QAAQ,CAAC,CAACC,GAAAA,EAAK7D,KAAAA,GAAQyH,KAAAA,KAAAA;AAC7BzH,MAAAA,KAAAA,CAAMgH,UAAAA,GAAaS,KAAAA;AACnB,MAAA,IAAA,CAAKf,KAAAA,CAAM/I,GAAAA,CAAIkG,GAAAA,EAAK7D,KAAAA,CAAAA;IACtB,CAAA,CAAA;AACF,EAAA;EAEAwH,KAAAA,GAAc;AACZ,IAAA,IAAA,CAAKd,MAAMc,KAAAA,EAAK;AAChB,IAAA,IAAA,CAAKZ,SAAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAKC,aAAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAKC,WAAAA,GAAc,CAAA;AACrB,EAAA;EAEAvC,QAAAA,GAAW;AACT,IAAA,OAAO;AACL/D,MAAAA,IAAAA,EAAM,KAAKkG,KAAAA,CAAMlG,IAAAA;AACjBmG,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;AACde,MAAAA,OAAAA,EAAS,KAAKb,aAAAA,GAAgB,CAAA,GAAI,IAAA,CAAKD,SAAAA,GAAY,KAAKC,aAAAA,GAAgB,CAAA;AACxED,MAAAA,SAAAA,EAAW,IAAA,CAAKA,SAAAA;AAChBC,MAAAA,aAAAA,EAAe,IAAA,CAAKA,aAAAA;MACpBc,eAAAA,EAAiB,IAAA,CAAKjB,KAAAA,CAAMlG,IAAAA,GAAO,IAAA,CAAKmG;AAC1C,KAAA;AACF,EAAA;AACF,CAAA;AAKA,IAAMiB,qBAAAA,GAAN,MAAMA,sBAAAA,CAAAA;EAnKN;;;;AAoKUC,EAAAA,UAAAA,GAKH,EAAA;AACYC,EAAAA,SAAAA;AACAC,EAAAA,aAAAA;EACTC,UAAAA,GAAoC,IAAA;EACpCC,YAAAA,GAAe,KAAA;AAEvB,EAAA,WAAA,CACUC,SAAAA,EACRJ,SAAAA,GAAY,GAAA,EACZC,aAAAA,GAAgB,GAAA,EAChB;SAHQG,SAAAA,GAAAA,SAAAA;AAIR,IAAA,IAAA,CAAKJ,SAAAA,GAAYA,SAAAA;AACjB,IAAA,IAAA,CAAKC,aAAAA,GAAgBA,aAAAA;AACrB,IAAA,IAAA,CAAKI,eAAAA,EAAe;AACtB,EAAA;EAEAC,SAAAA,CAAUC,IAAAA,EAA4DC,QAAgChL,KAAAA,EAAe;AACnH,IAAA,IAAA,CAAKuK,WAAW1H,IAAAA,CAAK;AACnBkI,MAAAA,IAAAA;MACAC,MAAAA,EAAQ;QAAE,GAAGA;AAAO,OAAA;AACpBhL,MAAAA,KAAAA;AACAiL,MAAAA,SAAAA,EAAWxJ,KAAKC,GAAAA;KAClB,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK6I,UAAAA,CAAWjG,MAAAA,IAAU,IAAA,CAAKkG,SAAAA,EAAW;AAC5C,MAAA,IAAA,CAAKU,KAAAA,EAAK;AACZ,IAAA;AACF,EAAA;EAEQL,eAAAA,GAAkB;AACxB,IAAA,IAAI,KAAKH,UAAAA,EAAY;AACnBtD,MAAAA,aAAAA,CAAc,KAAKsD,UAAU,CAAA;AAC/B,IAAA;AACA,IAAA,IAAA,CAAKA,UAAAA,GAAazI,YAAY,MAAA;AAC5B,MAAA,IAAI,IAAA,CAAKsI,UAAAA,CAAWjG,MAAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK4G,KAAAA,EAAK;AACZ,MAAA;AACF,IAAA,CAAA,EAAG,KAAKT,aAAa,CAAA;AACvB,EAAA;AAEA,EAAA,MAAcS,KAAAA,GAAQ;AACpB,IAAA,IAAI,IAAA,CAAKP,YAAAA,IAAgB,IAAA,CAAKJ,UAAAA,CAAWjG,WAAW,CAAA,EAAG;AACrD,MAAA;AACF,IAAA;AAEA,IAAA,IAAA,CAAKqG,YAAAA,GAAe,IAAA;AACpB,IAAA,MAAMQ,QAAQ,IAAA,CAAKZ,UAAAA,CAAWa,MAAAA,CAAO,CAAA,EAAG,KAAKZ,SAAS,CAAA;AAEtD,IAAA,IAAI;AACF,MAAA,KAAA,MAAWa,UAAUF,KAAAA,EAAO;AAC1B,QAAA,QAAQE,OAAON,IAAAA;UACb,KAAK,SAAA;AACH,YAAA,IAAA,CAAKH,UAAUU,cAAAA,CAAeC,GAAAA,CAAIF,MAAAA,CAAOrL,KAAAA,EAAOqL,OAAOL,MAAM,CAAA;AAC7D,YAAA;UACF,KAAK,OAAA;AACH,YAAA,IAAA,CAAKJ,UAAUY,YAAAA,CAAaD,GAAAA,CAAIF,MAAAA,CAAOrL,KAAAA,EAAOqL,OAAOL,MAAM,CAAA;AAC3D,YAAA;UACF,KAAK,eAAA;AACF,YAAA,IAAA,CAAKJ,UAAUa,qBAAAA,CAA8BC,MAAAA,CAAOL,MAAAA,CAAOrL,KAAAA,EAAOqL,OAAOL,MAAM,CAAA;AAChF,YAAA;UACF,KAAK,YAAA;AACH,YAAA,IAAA,CAAKJ,UAAUe,iBAAAA,CAAkBJ,GAAAA,CAAIF,MAAAA,CAAOrL,KAAAA,EAAOqL,OAAOL,MAAM,CAAA;AAChE,YAAA;AACJ;AACF,MAAA;AACF,IAAA,CAAA,CAAA,OAAS1H,KAAAA,EAAO;AACdN,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,gCAAA,EAAkCA,KAAAA,CAAAA;IACjD,CAAA,SAAA;AACE,MAAA,IAAA,CAAKqH,YAAAA,GAAe,KAAA;AACtB,IAAA;AACF,EAAA;EAEApI,OAAAA,GAAU;AACR,IAAA,IAAI,KAAKmI,UAAAA,EAAY;AACnBtD,MAAAA,aAAAA,CAAc,KAAKsD,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAKA,UAAAA,GAAa,IAAA;AACpB,IAAA;AACA,IAAA,IAAA,CAAKQ,KAAAA,EAAK;AACZ,EAAA;AACF,CAAA;AAKO,IAAMU,gBAAAA,GAAN,MAAMA,iBAAAA,CAAAA;EA7Pb;;;AA8PSN,EAAAA,cAAAA;AACAE,EAAAA,YAAAA;AACAC,EAAAA,qBAAAA;AACAE,EAAAA,iBAAAA;AAEU3G,EAAAA,WAAAA;AACA6G,EAAAA,SAAAA;AACAC,EAAAA,cAAAA;AACA9K,EAAAA,SAAAA;EACT+K,kBAAAA,GAA4C,IAAA;;AAGpD,EAAA,OAAwBC,UAAAA,GAAa,6FAAA;AAErC,EAAA,WAAA,CAAYC,eAA8BjH,WAAAA,EAAqB;AAC7D,IAAA,IAAA,CAAKA,WAAAA,GAAcA,WAAAA;AACnB,IAAA,IAAA,CAAKhE,SAAAA,GAAYS,KAAKC,GAAAA,EAAG;AACzB,IAAA,IAAA,CAAKmK,SAAAA,GAAY,IAAI1C,sBAAAA,EAAAA;AAErB,IAAA,MAAM+C,KAAAA,GAAQD,aAAAA,CAAcE,QAAAA,CAASnH,WAAAA,CAAAA;AACrC,IAAA,IAAA,CAAKoH,kBAAkBF,KAAAA,CAAAA;AAEvB,IAAA,IAAA,CAAKJ,cAAAA,GAAiB,IAAIxB,qBAAAA,CAAsB,IAAI,CAAA;AAGpD,IAAA,IAAA,CAAK+B,qBAAAA,EAAqB;AAC5B,EAAA;AAEQD,EAAAA,iBAAAA,CAAkBF,KAAAA,EAAY;AAEpC,IAAA,IAAA,CAAKZ,cAAAA,GAAiBY,KAAAA,CAAMI,aAAAA,CAAc,gBAAA,EAAkB;MAC1DC,WAAAA,EAAa,qCAAA;MACbC,IAAAA,EAAM;KACR,CAAA;AAGA,IAAA,IAAA,CAAKhB,YAAAA,GAAeU,KAAAA,CAAMI,aAAAA,CAAc,cAAA,EAAgB;MACtDC,WAAAA,EAAa,mCAAA;MACbC,IAAAA,EAAM;KACR,CAAA;AAGA,IAAA,IAAA,CAAKf,qBAAAA,GAAwBS,KAAAA,CAAMO,eAAAA,CAAgB,uBAAA,EAAyB;MAC1EF,WAAAA,EAAa,+CAAA;MACbC,IAAAA,EAAM,GAAA;MACNE,MAAAA,EAAQ;QAAEC,wBAAAA,EAA0B;AAAC,UAAA,GAAA;AAAK,UAAA,GAAA;AAAK,UAAA,CAAA;AAAG,UAAA,GAAA;AAAK,UAAA,CAAA;AAAG,UAAA;;AAAI;KAChE,CAAA;AAGA,IAAA,IAAA,CAAKhB,iBAAAA,GAAoBO,KAAAA,CAAMI,aAAAA,CAAc,6BAAA,EAA+B;MAC1EC,WAAAA,EAAa,6BAAA;MACbC,IAAAA,EAAM;KACR,CAAA;AAEAxJ,IAAAA,aAAAA,CAAOqE,IAAAA,CAAK,CAAA,yDAAA,EAA4D,IAAA,CAAKrC,WAAW,CAAA,CAAE,CAAA;AAC5F,EAAA;;;;AAKA4H,EAAAA,qBAAAA,CAAsB7H,KAAoB8H,QAAAA,EAAkB;AAC1D,IAAA,IAAI;AACF,MAAA,MAAMC,QAAAA,GAAW,IAAA,CAAKC,cAAAA,CAAehI,GAAAA,CAAAA;AACrC,MAAA,MAAMiG,MAAAA,GAAS,IAAA,CAAKgC,qBAAAA,CAAsBjI,GAAAA,EAAK+H,QAAAA,CAAAA;AAG/C,MAAA,IAAA,CAAKhB,cAAAA,CAAehB,SAAAA,CAAU,SAAA,EAAWE,MAAAA,EAAQ,CAAA,CAAA;AACjD,MAAA,IAAA,CAAKc,cAAAA,CAAehB,SAAAA,CAAU,eAAA,EAAiBE,MAAAA,EAAQ6B,WAAW,GAAA,CAAA;AAGlE,MAAA,IAAI,IAAA,CAAKI,aAAAA,CAAclI,GAAAA,CAAI4C,MAAAA,EAAQmF,QAAAA,CAAAA,EAAW;AAC5C,QAAA,MAAMI,WAAAA,GAAc;UAClB,GAAGlC,MAAAA;AACHmC,UAAAA,UAAAA,EAAY,IAAA,CAAKC,YAAAA,CAAarI,GAAAA,CAAI4C,MAAAA,EAAQmF,QAAAA;AAC5C,SAAA;AACA,QAAA,IAAA,CAAKhB,cAAAA,CAAehB,SAAAA,CAAU,OAAA,EAASoC,WAAAA,EAAa,CAAA,CAAA;AACtD,MAAA;AAGA,MAAA,IAAA,CAAKG,uCAAAA,CAAwCtI,KAAK+H,QAAAA,CAAAA;AAElD,MAAA,IAAI,OAAO9J,aAAAA,CAAOC,KAAAA,KAAU,UAAA,EAAY;AACtCD,QAAAA,cAAOC,KAAAA,CAAM,CAAA,sBAAA,EAAyB6J,QAAAA,CAASQ,WAAAA,EAAW,CAAA,CAAA,EAAMvI,GAAAA,CAAI0B,MAAM,CAAA,CAAA,EAAI1B,IAAI2B,IAAI,CAAA,EAAA,EAAKmG,QAAAA,CAAAA,YAAAA,EAAuB9H,GAAAA,CAAI4C,MAAM,CAAA,CAAE,CAAA;AAChI,MAAA;AACF,IAAA,CAAA,CAAA,OAASrE,KAAAA,EAAO;AAEdN,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,2CAAA,EAA6CA,KAAAA,CAAAA;AAC5D,IAAA;AACF,EAAA;;;;AAKQyJ,EAAAA,cAAAA,CAAehI,GAAAA,EAAkC;AAEvD,IAAA,IAAIA,IAAIwI,eAAAA,EAAiB;AACvB,MAAA,OAAOxI,GAAAA,CAAIwI,eAAAA;AACb,IAAA;AAEA,IAAA,IAAIT,QAAAA;AAGJ,IAAA,IAAI/H,IAAIyI,SAAAA,IAAazI,GAAAA,CAAI0I,GAAAA,EAAKC,OAAAA,EAASC,YAAY,WAAA,EAAa;AAC9Db,MAAAA,QAAAA,GAAAA,WAAAA;IACF,CAAA,MAAA,IAES/H,GAAAA,CAAI6I,OAAO7I,GAAAA,CAAI0I,GAAAA,EAAKC,UAAU,cAAA,CAAA,EAAiBG,QAAAA,CAAS,kBAAA,CAAA,EAAqB;AACpFf,MAAAA,QAAAA,GAAAA,MAAAA;IACF,CAAA,MAEK;AACHA,MAAAA,QAAAA,GAAAA,MAAAA;AACF,IAAA;AAGAzG,IAAAA,MAAAA,CAAOyH,cAAAA,CAAe/I,KAAK,iBAAA,EAAmB;MAC5C/E,KAAAA,EAAO8M,QAAAA;MACPiB,QAAAA,EAAU,KAAA;MACVC,UAAAA,EAAY;KACd,CAAA;AAEA,IAAA,OAAOlB,QAAAA;AACT,EAAA;;;;AAKQE,EAAAA,qBAAAA,CAAsBjI,KAAoB+H,QAAAA,EAAgD;AAChG,IAAA,MAAMmB,UAAAA,GAAqC;AACzCxH,MAAAA,MAAAA,EAAQ1B,IAAI0B,MAAAA,IAAU,SAAA;MACtBkB,MAAAA,EAAAA,CAAS5C,GAAAA,CAAI4C,MAAAA,IAAU,GAAA,EAAKqB,QAAAA,EAAQ;AACpCtC,MAAAA,IAAAA,EAAM,KAAKwH,sBAAAA,CAAuBnJ,GAAAA,CAAI2B,IAAAA,IAAQ3B,GAAAA,CAAIoJ,gBAAgB,GAAA,CAAA;AAClErB,MAAAA;AACF,KAAA;AAGA,IAAA,QAAQA,QAAAA;MACN,KAAA,WAAA;AACEmB,QAAAA,UAAAA,CAAW,aAAA,CAAA,GAAiB,IAAA,CAAKG,uBAAAA,CAAwBrJ,GAAAA,CAAAA;AACzD,QAAA;MAEF,KAAA,MAAA;AACEkJ,QAAAA,UAAAA,CAAW,cAAA,CAAA,GAAkB,IAAA,CAAKI,cAAAA,CAAetJ,GAAAA,CAAAA;AACjDkJ,QAAAA,UAAAA,CAAW,aAAA,CAAA,GAAiB,IAAA,CAAKK,kBAAAA,CAAmBvJ,GAAAA,CAAAA;AACpD,QAAA;AACJ;AAEA,IAAA,OAAOkJ,UAAAA;AACT,EAAA;;;;AAKQC,EAAAA,sBAAAA,CAAuBxH,IAAAA,EAAsB;AACnD,IAAA,IAAI,CAACA,MAAM,OAAO,GAAA;AAGlB,IAAA,MAAM6H,MAAAA,GAAS,IAAA,CAAK1C,SAAAA,CAAU1L,GAAAA,CAAIuG,IAAAA,CAAAA;AAClC,IAAA,IAAI6H,WAAWxM,MAAAA,EAAW;AACxB,MAAA,OAAOwM,MAAAA;AACT,IAAA;AAGA,IAAA,MAAMC,UAAAA,GAAa9H,IAAAA,CAAK+H,OAAAA,CAAQ,GAAA,CAAA;AAChC,IAAA,MAAMC,YAAYF,UAAAA,KAAe,EAAA,GAAK9H,OAAOA,IAAAA,CAAKiI,SAAAA,CAAU,GAAGH,UAAAA,CAAAA;AAG/D,IAAA,MAAM5E,UAAAA,GAAa8E,UAAUzF,OAAAA,CAC3B2C,iBAAAA,CAAiBI,YACjB,CAAC4C,KAAAA,EAAOC,IAAAA,EAAMC,QAAAA,EAAUC,OAAAA,KAAAA;AACtB,MAAA,IAAIF,MAAM,OAAO,QAAA;AACjB,MAAA,IAAIC,UAAU,OAAO,YAAA;AACrB,MAAA,IAAIC,SAAS,OAAO,MAAA;AACpB,MAAA,OAAOH,KAAAA;IACT,CAAA,CAAA;AAIF,IAAA,IAAA,CAAK/C,SAAAA,CAAUxL,GAAAA,CAAIqG,IAAAA,EAAMkD,UAAAA,CAAAA;AAEzB,IAAA,OAAOA,UAAAA;AACT,EAAA;;;;AAKQyD,EAAAA,uCAAAA,CAAwCtI,KAAoB+H,QAAAA,EAAwB;AAC1F,IAAA,QAAQA,QAAAA;MACN,KAAA,WAAA;AAEE,QAAA,IAAI/H,GAAAA,CAAIyI,SAAAA,EAAWwB,UAAAA,KAAe,CAAA,EAAG;AACnC,UAAA,IAAA,CAAKlD,cAAAA,CAAehB,UAAU,YAAA,EAAc;AAC1CgC,YAAAA,QAAAA;AACAmC,YAAAA,OAAAA,EAAS,IAAA,CAAKjK;AAChB,WAAA,EAAG,CAAA,CAAA;AACL,QAAA;AACA,QAAA;AACJ;AACF,EAAA;;;;EAKQqH,qBAAAA,GAAwB;AAC9B,IAAA,MAAM6C,eAAAA,GAAkB,GAAA;AAExB,IAAA,IAAA,CAAKnD,kBAAAA,GAAqB9J,YAAY,MAAA;AACpC,MAAA,IAAI;AACF,QAAA,MAAM0B,QAAAA,GAAWtB,QAAQc,WAAAA,EAAW;AACpC,QAAA,MAAMgM,UAAAA,GAAa,IAAA,CAAKtD,SAAAA,CAAU5E,QAAAA,EAAQ;AAG1C,QAAA,IAAI,OAAOjE,aAAAA,CAAOC,KAAAA,KAAU,UAAA,EAAY;AACtCD,UAAAA,aAAAA,CAAOC,MAAM,iCAAA,EAAmC;AAC9CI,YAAAA,QAAAA,EAAUlB,KAAKiB,KAAAA,CAAMO,QAAAA,CAASN,QAAAA,GAAW,IAAA,GAAO,IAAA,CAAA,GAAQ,IAAA;AACxD+L,YAAAA,SAAAA,EAAWD,UAAAA,CAAWjM,IAAAA;AACtBmM,YAAAA,YAAAA,EAAclN,IAAAA,CAAKiB,KAAAA,CAAM+L,UAAAA,CAAW/E,OAAAA,GAAU,GAAA,CAAA,GAAO;WACvD,CAAA;AACF,QAAA;AAGA,QAAA,IAAIzG,QAAAA,CAASN,QAAAA,GAAW,GAAA,GAAM,IAAA,GAAO,IAAA,EAAM;AACzC,UAAA,IAAA,CAAKwI,UAAU3B,KAAAA,EAAK;AACpBlH,UAAAA,aAAAA,CAAOY,KAAK,8DAAA,CAAA;AACd,QAAA;AACF,MAAA,CAAA,CAAA,OAASN,KAAAA,EAAO;AACdN,QAAAA,aAAAA,CAAOM,KAAAA,CAAM,0BAAA,EAA4BA,KAAAA,CAAAA;AAC3C,MAAA;AACF,IAAA,CAAA,EAAG4L,eAAAA,CAAAA;AACL,EAAA;;;;AAKQjC,EAAAA,aAAAA,CAActF,QAAgBmF,QAAAA,EAAiC;AACrE,IAAA,IAAIA,aAAAA,MAAAA,EAAgC;AAClC,MAAA,OAAOnF,MAAAA,KAAW,CAAA;AACpB,IAAA;AACA,IAAA,OAAOA,MAAAA,IAAU,GAAA;AACnB,EAAA;;;;AAKQyG,EAAAA,uBAAAA,CAAwBrJ,GAAAA,EAA4B;AAC1D,IAAA,MAAMuK,UAAAA,GAAavK,GAAAA,CAAI0I,GAAAA,EAAKC,OAAAA,GAAU,0BAAA,CAAA,IAA+B,EAAA;AACrE,IAAA,OAAO4B,UAAAA,CAAWzB,QAAAA,CAAS,oBAAA,CAAA,GAAwB,SAAA,GAAY,MAAA;AACjE,EAAA;;;;AAKQQ,EAAAA,cAAAA,CAAetJ,GAAAA,EAA4B;AACjD,IAAA,MAAM2B,IAAAA,GAAO3B,GAAAA,CAAI2B,IAAAA,IAAQ3B,GAAAA,CAAIoJ,YAAAA,IAAgB,EAAA;AAC7C,IAAA,MAAMS,KAAAA,GAAQlI,IAAAA,CAAKkI,KAAAA,CAAM,sBAAA,CAAA;AACzB,IAAA,OAAOA,KAAAA,GAAQA,KAAAA,CAAM,CAAA,CAAA,GAAK,SAAA;AAC5B,EAAA;;;;AAKQN,EAAAA,kBAAAA,CAAmBvJ,GAAAA,EAA4B;AACrD,IAAA,MAAMwK,cAAAA,GAAiBxK,IAAI6I,GAAAA,EAAK4B,IAAAA,EAAMC,UAAUtP,GAAAA,CAAI,iBAAA,CAAA,GAAqB,CAAA,CAAA,IAAM,EAAA;AAC/E,IAAA,IAAIoP,cAAAA,CAAe1B,QAAAA,CAAS,IAAA,CAAA,EAAO,OAAO,QAAA;AAC1C,IAAA,IAAI0B,cAAAA,CAAe1B,QAAAA,CAAS,MAAA,CAAA,EAAS,OAAO,MAAA;AAC5C,IAAA,OAAO,MAAA;AACT,EAAA;;;;AAKQT,EAAAA,YAAAA,CAAazF,QAAgBmF,QAAAA,EAAgC;AACnE,IAAA,IAAIA,aAAAA,MAAAA,EAAgC;AAClC,MAAA,IAAInF,MAAAA,KAAW,GAAG,OAAO,IAAA;AACzB,MAAA,IAAIA,MAAAA,IAAU,CAAA,IAAKA,MAAAA,IAAU,EAAA,EAAI,OAAO,YAAA;AACxC,MAAA,OAAO,eAAA;AACT,IAAA;AAEA,IAAA,IAAIA,MAAAA,IAAU,GAAA,IAAOA,MAAAA,GAAS,GAAA,EAAK,OAAO,cAAA;AAC1C,IAAA,IAAIA,MAAAA,IAAU,KAAK,OAAO,cAAA;AAC1B,IAAA,OAAO,eAAA;AACT,EAAA;;;;AAKA+H,EAAAA,kBAAAA,CAAmB3I,IAAAA,EAAc/G,KAAAA,EAAegL,MAAAA,GAAiC,EAAC,EAAG;AACnF,IAAA,IAAI;AACF2E,MAAAA,OAAAA,CAAQC,IAAI,CAAA,wBAAA,EAA2B7I,IAAAA,CAAAA,GAAAA,EAAU/G,KAAAA,IAASgL,MAAAA,CAAAA;AAC1DhI,MAAAA,cAAOC,KAAAA,CAAM,CAAA,wBAAA,EAA2B8D,IAAAA,CAAAA,GAAAA,EAAU/G,KAAAA,IAASgL,MAAAA,CAAAA;AAC7D,IAAA,CAAA,CAAA,OAAS1H,KAAAA,EAAO;AACdN,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,CAAA,+BAAA,EAAkCyD,IAAAA,KAASzD,KAAAA,CAAAA;AAC1D,IAAA;AACF,EAAA;;;;EAKA2D,QAAAA,GAAW;AACT,IAAA,OAAO;AACLjC,MAAAA,WAAAA,EAAa,IAAA,CAAKA,WAAAA;MAClBmC,MAAAA,EAAQ1F,IAAAA,CAAKC,GAAAA,EAAG,GAAK,IAAA,CAAKV,SAAAA;MAC1B6O,cAAAA,EAAgB,IAAA,CAAKhE,UAAU5E,QAAAA,EAAQ;AACvC9D,MAAAA,WAAAA,EAAad,QAAQc,WAAAA;AACvB,KAAA;AACF,EAAA;;;;EAKAZ,OAAAA,GAAU;AACR,IAAA,IAAI;AACF,MAAA,IAAA,CAAKuJ,eAAevJ,OAAAA,EAAO;AAC3B,MAAA,IAAA,CAAKsJ,UAAU3B,KAAAA,EAAK;AAGpB,MAAA,IAAI,KAAK6B,kBAAAA,EAAoB;AAC3B3E,QAAAA,aAAAA,CAAc,KAAK2E,kBAAkB,CAAA;AACrC,QAAA,IAAA,CAAKA,kBAAAA,GAAqB,IAAA;AAC5B,MAAA;AAEA/I,MAAAA,aAAAA,CAAOqE,IAAAA,CAAK,CAAA,sBAAA,EAAyB,IAAA,CAAKrC,WAAW,CAAA,UAAA,CAAY,CAAA;AACnE,IAAA,CAAA,CAAA,OAAS1B,KAAAA,EAAO;AACdN,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,6CAAA,EAA+CA,KAAAA,CAAAA;AAC9D,IAAA;AACF,EAAA;AACF,CAAA;AAKA,IAAMwM,uBAAAA,GAAN,MAAMA,wBAAAA,CAAAA;EAzkBN;;;AA0kBE,EAAA,OAAeC,QAAAA,GAA2C,IAAA;EAClDnF,SAAAA,GAAqC,IAAA;EAC5BoF,IAAAA,GAAO;IAAEC,MAAAA,EAAQ;AAAM,GAAA;EAExC,WAAA,GAAsB;AAAC,EAAA;AAEvB,EAAA,OAAOC,WAAAA,GAAuC;AAC5C,IAAA,IAAI,CAACJ,yBAAwBC,QAAAA,EAAU;AACrCD,MAAAA,wBAAAA,CAAwBC,QAAAA,GAAW,IAAID,wBAAAA,EAAAA;AACzC,IAAA;AACA,IAAA,OAAOA,wBAAAA,CAAwBC,QAAAA;AACjC,EAAA;AAEA,EAAA,MAAMI,aAAavF,SAAAA,EAA4C;AAC7D,IAAA,MAAM,KAAKwF,WAAAA,EAAW;AACtB,IAAA,IAAI;AACF,MAAA,IAAI,KAAKxF,SAAAA,EAAW;AAClB,QAAA,IAAA,CAAKA,UAAUrI,OAAAA,EAAO;AACxB,MAAA;AACA,MAAA,IAAA,CAAKqI,SAAAA,GAAYA,SAAAA;IACnB,CAAA,SAAA;AACE,MAAA,IAAA,CAAKyF,WAAAA,EAAW;AAClB,IAAA;AACF,EAAA;EAEAC,YAAAA,GAAwC;AACtC,IAAA,OAAO,IAAA,CAAK1F,SAAAA;AACd,EAAA;AAEA,EAAA,MAAcwF,WAAAA,GAA6B;AACzC,IAAA,OAAO,IAAA,CAAKJ,KAAKC,MAAAA,EAAQ;AACvB,MAAA,MAAM,IAAIM,OAAAA,CAAQC,CAAAA,YAAW5K,UAAAA,CAAW4K,OAAAA,EAAS,CAAA,CAAA,CAAA;AACnD,IAAA;AACA,IAAA,IAAA,CAAKR,KAAKC,MAAAA,GAAS,IAAA;AACrB,EAAA;EAEQI,WAAAA,GAAoB;AAC1B,IAAA,IAAA,CAAKL,KAAKC,MAAAA,GAAS,KAAA;AACrB,EAAA;AACF,CAAA;AAKO,SAASQ,sBAAAA,CAAuBC,KAAa5P,OAAAA,EAAqB;AACvE,EAAA,MAAM6P,eAAe7P,OAAAA,CAAQ8P,WAAAA,EAAaC,eAAAA,IACrCxO,OAAAA,CAAQyO,IAAIC,QAAAA,KAAa,YAAA;AAE9B,EAAA,IAAI,CAACJ,YAAAA,IAAgB,CAAC7P,OAAAA,CAAQ8P,aAAaC,eAAAA,EAAiB;AAC1D7N,IAAAA,aAAAA,CAAOqE,KAAK,iFAAA,CAAA;AACZ,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,IAAI;AACF,IAAA,MAAM2J,QAAAA,GAAW,IAAIC,kBAAAA,CAAmB;AACtCC,MAAAA,QAAAA,EAAUpQ,QAAQ8P,WAAAA,CAAYC,eAAAA;MAC9BM,IAAAA,EAAMrQ,OAAAA,CAAQ8P,YAAYQ,WAAAA,IAAe;KAC3C,CAAA;AAEA,IAAA,MAAMnF,aAAAA,GAAgB,IAAIoF,aAAAA,CAAc;MACtCC,OAAAA,EAAS;AAACN,QAAAA;;KACZ,CAAA;AAGA,IAAA,MAAMO,OAAAA,GAAUzB,wBAAwBI,WAAAA,EAAW;AACnD,IAAA,MAAMtF,YAAY,IAAIgB,gBAAAA,CAAiBK,aAAAA,EAAeyE,GAAAA,CAAI3J,QAAQ,YAAA,CAAA;AAClEwK,IAAAA,OAAAA,CAAQpB,aAAavF,SAAAA,CAAAA;AAGrB,IAAA,MAAM4G,0BAAU,MAAA,CAAA,MAAA;AACd,MAAA,MAAMC,gBAAAA,GAAmBF,QAAQjB,YAAAA,EAAY;AAC7C,MAAA,IAAImB,gBAAAA,EAAkB;AACpBA,QAAAA,gBAAAA,CAAiBlP,OAAAA,EAAO;AAC1B,MAAA;IACF,CAAA,EALgB,SAAA,CAAA;AAOhBF,IAAAA,OAAAA,CAAQC,IAAAA,CAAK,WAAWkP,OAAAA,CAAAA;AACxBnP,IAAAA,OAAAA,CAAQC,IAAAA,CAAK,UAAUkP,OAAAA,CAAAA;AAEvBxO,IAAAA,aAAAA,CAAOqE,IAAAA,CAAK,CAAA,gDAAA,EAAmDvG,OAAAA,CAAQ8P,WAAAA,CAAYQ,WAAAA,IAAe,IAAA,CAAA,YAAA,EAAmBtQ,OAAAA,CAAQ8P,WAAAA,CAAYC,eAAe,CAAA,CAAE,CAAA;AAE1J,IAAA,OAAO5E,aAAAA;AACT,EAAA,CAAA,CAAA,OAAS3I,KAAAA,EAAO;AACdN,IAAAA,aAAAA,CAAOM,KAAAA,CAAM,2CAAA,EAA6CA,KAAAA,CAAAA;AAC1D,IAAA,OAAO,IAAA;AACT,EAAA;AACF;AA1CgBmN,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;AA+CT,SAASiB,mBAAAA,GAAAA;AACd,EAAA,OAAO5B,uBAAAA,CAAwBI,WAAAA,EAAW,CAAGI,YAAAA,EAAY;AAC3D;AAFgBoB,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAOT,SAAS9E,qBAAAA,CAAsB7H,KAAoB8H,QAAAA,EAAgB;AACxE,EAAA,MAAMjC,YAAY8G,mBAAAA,EAAAA;AAClB,EAAA,IAAI9G,SAAAA,EAAW;AACbA,IAAAA,SAAAA,CAAUgC,qBAAAA,CAAsB7H,KAAK8H,QAAAA,CAAAA;AACvC,EAAA;AACF;AALgBD,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;;;ACjqBT,IAAM+E,oBAAN,MAAMA;EAXb;;;EAYUC,OAAAA,GAAiC,IAAA;EACjCC,SAAAA,GAAY,KAAA;;;;;;;AAQpBC,EAAAA,aAAAA,CAAcC,IAAYC,MAAAA,EAAsC;AAC9D,IAAA,IAAI,KAAKH,SAAAA,EAAW;AAClB,MAAA,OAAOtB,OAAAA,CAAQ0B,MAAAA,CAAO,IAAIpJ,KAAAA,CAAM,mCAAA,CAAA,CAAA;AAClC,IAAA;AAEA,IAAA,OAAO,IAAI0H,OAAAA,CAAQ,CAAC2B,CAAAA,EAAGD,MAAAA,KAAAA;AACrB,MAAA,IAAA,CAAKL,OAAAA,GAAUhM,WAAW,MAAA;AACxB,QAAA,IAAI,CAAC,KAAKiM,SAAAA,EAAW;AACnBI,UAAAA,MAAAA,CAAO,IAAIpJ,KAAAA,CAAM,mBAAA,CAAA,CAAA;AACnB,QAAA;AACF,MAAA,CAAA,EAAGkJ,EAAAA,CAAAA;AAGHC,MAAAA,MAAAA,EAAQG,gBAAAA,CAAiB,SAAS,MAAA;AAChC,QAAA,IAAA,CAAKjI,KAAAA,EAAK;AACV+H,QAAAA,MAAAA,CAAO,IAAIpJ,KAAAA,CAAM,iBAAA,CAAA,CAAA;MACnB,CAAA,EAAG;QAAEvG,IAAAA,EAAM;OAAK,CAAA;IAClB,CAAA,CAAA;AACF,EAAA;;;;EAKA4H,KAAAA,GAAc;AACZ,IAAA,IAAI,IAAA,CAAK0H,YAAY,IAAA,EAAM;AACzBpN,MAAAA,YAAAA,CAAa,KAAKoN,OAAO,CAAA;AACzB,MAAA,IAAA,CAAKA,OAAAA,GAAU,IAAA;AACjB,IAAA;AACA,IAAA,IAAA,CAAKC,SAAAA,GAAY,IAAA;AACnB,EAAA;;;;AAKA,EAAA,IAAIO,OAAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAKP,SAAAA;AACd,EAAA;AACF,CAAA;AClCO,IAAeQ,cAAf,MAAeA;EAxBtB;;;AA2BYC,EAAAA,eAAAA,CAAgBvN,KAAoByC,GAAAA,EAAuB;AAEnEzC,IAAAA,GAAAA,CAAIwN,WAAW/K,GAAAA,EAAK+K,QAAAA;AACpB,IAAA,IAAA,CAAKC,mBAAmBzN,GAAAA,CAAAA;AACxB,IAAA,IAAA,CAAK0N,cAAAA,CAAe1N,KAAKyC,GAAAA,CAAAA;AAC3B,EAAA;EAEUkL,gBAAAA,CAAiB3N,GAAAA,EAAoByC,KAAuBmL,GAAAA,EAAc;AAClF,IAAA,IAAA,CAAKC,UAAAA,CAAW7N,GAAAA,EAAKyC,GAAAA,EAAKmL,GAAAA,CAAAA;AAC1B,IAAA,IAAA,CAAKE,YAAAA,CAAa9N,GAAAA,EAAKyC,GAAAA,EAAKmL,GAAAA,CAAAA;AAC5B,IAAA,IAAA,CAAKG,cAAAA,CAAe/N,KAAKyC,GAAAA,CAAAA;AAC3B,EAAA;EAEUuL,WAAAA,CAAYxL,GAAAA,EAAYxC,KAAoByC,GAAAA,EAAuB;AAC3E,IAAA,OAAOF,OAAAA,CAAQvC,GAAAA,EAAKwC,GAAAA,EAAKC,GAAAA,CAAAA;AAC3B,EAAA;;;;;;;;AASA,EAAA,MAAgBwL,iBAAAA,CACdjO,GAAAA,EACAkO,IAAAA,EACAzL,GAAAA,EACA0L,OAAAA,EACe;AACf,IAAA,IAAI1L,IAAI2L,UAAAA,EAAY;AAClB,MAAA;AACF,IAAA;AAEA,IAAA,MAAMC,WAAAA,GAAc,IAAIzB,iBAAAA,EAAAA;AACxB,IAAA,IAAI;AACF,MAAA,MAAMpB,QAAQ8C,IAAAA,CAAK;QAACJ,IAAAA,EAAAA;AAAQG,QAAAA,WAAAA,CAAYtB,cAAcoB,OAAAA;AAAS,OAAA,CAAA;IACjE,CAAA,SAAA;AACEE,MAAAA,WAAAA,CAAYlJ,KAAAA,EAAK;AACnB,IAAA;AACF,EAAA;;;;;;AAOUoJ,EAAAA,iBAAAA,CAAkBvO,GAAAA,EAA0B;AACpD,IAAA,IAAIA,GAAAA,CAAIwO,IAAAA,KAASxR,MAAAA,IAAagD,GAAAA,CAAI4C,WAAW,GAAA,EAAK;AAChD5C,MAAAA,GAAAA,CAAI4C,MAAAA,GAAS,GAAA;AACf,IAAA;AACA,IAAA,IAAI5C,GAAAA,CAAI4C,UAAU,GAAA,EAAK;AACrB,MAAA,MAAM,IAAIiB,SAAAA,CAAU7D,GAAAA,CAAI0C,OAAAA,EAAS,CAAA,EAAG1C,IAAI4C,MAAM,CAAA;AAChD,IAAA;AACF,EAAA;AAEQ6K,EAAAA,kBAAAA,CAAmBzN,GAAAA,EAAoB;AAC7CA,IAAAA,GAAAA,CAAI1E,GAAAA,CAAI,0BAA0B,SAAA,CAAA;AAClC0E,IAAAA,GAAAA,CAAI1E,GAAAA,CAAI,mBAAmB,MAAA,CAAA;AAC3B0E,IAAAA,GAAAA,CAAI1E,GAAAA,CAAI,oBAAoB,eAAA,CAAA;AAC9B,EAAA;AAEQoS,EAAAA,cAAAA,CAAe1N,KAAoByC,GAAAA,EAAuB;AAChE,IAAA,IAAIA,IAAIO,WAAAA,EAAa;AAEnBP,MAAAA,GAAAA,CAAIO,WAAAA,CAAYlB,kBAAkB9B,GAAAA,EAAK;QACrC,CAACyO,kBAAAA,CAAmBC,QAAQ,GAAG1O,GAAAA,CAAI2O,WAAAA;QACnC,CAACF,kBAAAA,CAAmBG,WAAW,GAAG5O,GAAAA,CAAI0B;OACxC,CAAA;AACF,IAAA;AACF,EAAA;EAEQoM,YAAAA,CAAa9N,GAAAA,EAAoByC,KAAuBmL,GAAAA,EAAc;AAC5E,IAAA,IAAInL,IAAIO,WAAAA,EAAa;AAEnBP,MAAAA,GAAAA,CAAIO,WAAAA,CAAYlB,kBAAkB9B,GAAAA,EAAK;QACrC,CAACyO,kBAAAA,CAAmBI,gBAAgB,GAAG7O,GAAAA,CAAI4C,MAAAA;QAC3C,CAAC6L,kBAAAA,CAAmBG,WAAW,GAAG5O,GAAAA,CAAI0B,MAAAA;QACtC,CAAC+M,kBAAAA,CAAmBC,QAAQ,GAAG1O,GAAAA,CAAI8O;OACrC,CAAA;AACArM,MAAAA,GAAAA,CAAIO,WAAAA,CAAYjB,YAAAA,CAAa/B,GAAAA,EAAK,SAAA,EAAW;QAAE,SAAA,EAAW4N;OAAI,CAAA;AAC9DnL,MAAAA,GAAAA,CAAIO,WAAAA,CAAYf,QAAQjC,GAAAA,CAAAA;AAC1B,IAAA;AACF,EAAA;;;;;;AAOQ+N,EAAAA,cAAAA,CAAe/N,KAAoByC,GAAAA,EAAwB;AACjE,IAAA,IAAIzC,IAAI/D,SAAAA,EAAW;AACjB,MAAA,MAAM6L,QAAAA,GAAWpL,IAAAA,CAAKC,GAAAA,EAAG,GAAKqD,GAAAA,CAAI/D,SAAAA;AAClC4L,MAAAA,qBAAAA,CAAsB7H,KAAK8H,QAAAA,CAAAA;AAC7B,IAAA;AACF,EAAA;EAEQ+F,UAAAA,CAAW7N,GAAAA,EAAoByC,KAAuBmL,GAAAA,EAAa;AACzEmB,IAAAA,aAAAA,CAAQ/O,IAAI4C,MAAAA,IAAU,GAAA,GAAM,OAAA,GAAU,MAAA,EAASgL,GAAAA,CAAAA;AACjD,EAAA;AACF,CAAA;AAKO,IAAKoB,YAAAA,6BAAAA,aAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,aAAAA;;ACjHZ,IAAMC,WAAAA,GAAc;AAAC,EAAA,GAAA;AAAK,EAAA,GAAA;AAAK,EAAA;;AAS/B,SAASC,iBAAAA,CACPV,IAAAA,EACAtQ,KAAAA,GAAiB,KAAA,EAAK;AAEtB,EAAA,MAAMiR,IAAAA,uBAAWC,OAAAA,EAAAA;AAEjB,EAAA,IAAI;AACF,IAAA,MAAMC,aAAaC,IAAAA,CAAKC,SAAAA,CAAUf,IAAAA,EAAM,CAAChN,KAAKvG,KAAAA,KAAAA;AAE5C,MAAA,IAAIA,UAAU+B,KAAAA,CAAAA,EAAW;AACvB,QAAA,OAAO,IAAA;AACT,MAAA;AAGA,MAAA,IAAI,OAAO/B,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAOA,KAAAA,CAAMgJ,UAAQ,GAAK,GAAA;AAC5B,MAAA;AAGA,MAAA,IAAI,OAAOhJ,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAOA,MAAMgJ,QAAAA,EAAQ;AACvB,MAAA;AAGA,MAAA,IAAI,OAAOhJ,UAAU,UAAA,EAAY;AAC/B,QAAA,OAAO,CAAA,WAAA,EAAcA,KAAAA,CAAM+G,IAAAA,IAAQ,WAAA,CAAA,CAAA,CAAA;AACrC,MAAA;AAGA,MAAA,IAAI/G,iBAAiB6I,KAAAA,EAAO;AAC1B,QAAA,OAAO;AACL9B,UAAAA,IAAAA,EAAM/G,KAAAA,CAAM+G,IAAAA;AACZU,UAAAA,OAAAA,EAASzH,KAAAA,CAAMyH,OAAAA;UACfK,KAAAA,EAAO7E,KAAAA,GAAQjD,MAAM8H,KAAAA,GAAQ/F,KAAAA,CAAAA;AAC7B8F,UAAAA,IAAAA,EAAO7H,KAAAA,CAAc6H;AACvB,SAAA;AACF,MAAA;AAGA,MAAA,IAAI7H,iBAAiByB,IAAAA,EAAM;AACzB,QAAA,OAAOzB,MAAMuU,WAAAA,EAAW;AAC1B,MAAA;AAGA,MAAA,IAAIvU,iBAAiBwU,MAAAA,EAAQ;AAC3B,QAAA,OAAOxU,MAAMgJ,QAAAA,EAAQ;AACvB,MAAA;AAGA,MAAA,IAAI,OAAOhJ,KAAAA,KAAU,QAAA,IAAYA,KAAAA,KAAU,IAAA,EAAM;AAE/C,QAAA,IAAIkU,IAAAA,CAAKjP,GAAAA,CAAIjF,KAAAA,CAAAA,EAAQ;AACnB,UAAA,OAAO,sBAAA;AACT,QAAA;AAEAkU,QAAAA,IAAAA,CAAK3I,IAAIvL,KAAAA,CAAAA;AACX,MAAA;AAEA,MAAA,OAAOA,KAAAA;IACT,CAAA,CAAA;AAEA,IAAA,OAAO;MAAEyU,OAAAA,EAAS,IAAA;MAAMC,IAAAA,EAAMN;AAAW,KAAA;AAC3C,EAAA,CAAA,CAAA,OAAS9Q,KAAAA,EAAO;AACd,IAAA,MAAMqR,WAAWrR,KAAAA,YAAiBuF,KAAAA,GAAQvF,KAAAA,CAAMmE,OAAAA,GAAUmN,OAAOtR,KAAAA,CAAAA;AACjEwQ,IAAAA,aAAAA,CAAOjL,KAAAA,CAAM,4BAAA,EAA8BvF,KAAAA,CAAAA;AAE3C,IAAA,OAAO;MACLmR,OAAAA,EAAS,KAAA;MACTnR,KAAAA,EAAOqR;AACT,KAAA;AACF,EAAA;AACF;AAvESV,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AA8ET,eAAeY,OAAAA,CAAQC,KAAUJ,IAAAA,EAAsB;AACrD,EAAA,OAAO,IAAInE,OAAAA,CAAQ,CAACC,OAAAA,EAASyB,MAAAA,KAAAA;AAC3B,IAAA,IAAI;AAEF,MAAA,IAAI8C,cAAAA,GAAiB,KAAA;AACrB,MAAA,MAAMC,SAAAA,GAAYF,GAAAA,CAAInQ,GAAAA,CAAI+P,IAAAA,EAAM,CAACnN,GAAAA,KAAAA;AAC/BwN,QAAAA,cAAAA,GAAiB,IAAA;AACjB,QAAA,IAAIxN,GAAAA,EAAK;AACPuM,UAAAA,aAAAA,CAAOjL,KAAAA,CAAM,mBAAA,EAAqBtB,GAAAA,CAAAA;AAClC0K,UAAAA,MAAAA,CAAO1K,GAAAA,CAAAA;QACT,CAAA,MAAO;AACLiJ,UAAAA,OAAAA,EAAAA;AACF,QAAA;MACF,CAAA,CAAA;AAGAyE,MAAAA,YAAAA,CAAa,MAAA;AACX,QAAA,IAAI,CAACF,cAAAA,EAAgB;AACnBvE,UAAAA,OAAAA,EAAAA;AACF,QAAA;MACF,CAAA,CAAA;AACF,IAAA,CAAA,CAAA,OAASjJ,GAAAA,EAAK;AACZuM,MAAAA,aAAAA,CAAOjL,KAAAA,CAAM,4BAAA,EAA8BtB,GAAAA,CAAAA;AAC3C0K,MAAAA,MAAAA,CAAO1K,GAAAA,CAAAA;AACT,IAAA;EACF,CAAA,CAAA;AACF;AA1BesN,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAkCf,eAAeK,oBAAAA,CACbC,MAAAA,EACAL,GAAAA,EACA/P,GAAAA,EAAkB;AAElB,EAAA,OAAO,IAAIwL,OAAAA,CAAQ,CAACC,OAAAA,EAASyB,MAAAA,KAAAA;AAC3B,IAAA,IAAImD,YAAAA,GAAe,KAAA;AAEnB,IAAA,MAAMrC,WAAAA,mBAAc,MAAA,CAAA,CAACxL,GAAAA,EAAY8N,MAAAA,KAAAA;AAC/B,MAAA,IAAID,YAAAA,EAAc;AAClBA,MAAAA,YAAAA,GAAe,IAAA;AAEftB,MAAAA,aAAAA,CAAOjL,KAAAA,CAAM,CAAA,kBAAA,EAAqBwM,MAAAA,KAAW9N,GAAAA,CAAAA;AAE7C,MAAA,IAAI,CAAC4N,OAAOG,SAAAA,EAAW;AACrBH,QAAAA,MAAAA,CAAO5S,OAAAA,EAAO;AAChB,MAAA;AAEA,MAAA,IAAI,CAACuS,IAAIS,WAAAA,EAAa;AACpB,QAAA,IAAI;AACFT,UAAAA,GAAAA,CAAIU,UAAAA,GAAa,GAAA;AACjBV,UAAAA,GAAAA,CAAIW,SAAAA,CAAU,gBAAgB,YAAA,CAAA;AAC9BX,UAAAA,GAAAA,CAAInQ,IAAI,iDAAA,CAAA;AACV,QAAA,CAAA,CAAA,OAAS+Q,MAAAA,EAAQ;AACf5B,UAAAA,aAAAA,CAAOjL,KAAAA,CAAM,gCAAA,EAAkC6M,MAAAA,CAAAA;AACjD,QAAA;MACF,CAAA,MAAA,IAAW,CAACZ,IAAIa,aAAAA,EAAe;AAC7B,QAAA,IAAI;AACFb,UAAAA,GAAAA,CAAInQ,GAAAA,EAAG;AACT,QAAA,CAAA,CAAA,OAAS+Q,MAAAA,EAAQ;AACf5B,UAAAA,aAAAA,CAAOjL,KAAAA,CAAM,yBAAA,EAA2B6M,MAAAA,CAAAA;AAC1C,QAAA;AACF,MAAA;AAEAzD,MAAAA,MAAAA,CAAO1K,GAAAA,CAAAA;IACT,CAAA,EA3BoB,aAAA,CAAA;AA6BpB,IAAA,MAAMqO,+BAAe,MAAA,CAAA,MAAA;AACnB,MAAA,IAAIR,YAAAA,EAAc;AAClBA,MAAAA,YAAAA,GAAe,IAAA;AACf5E,MAAAA,OAAAA,EAAAA;IACF,CAAA,EAJqB,cAAA,CAAA;AAMrB2E,IAAAA,MAAAA,CAAO7S,KAAK,OAAA,EAAS,CAACiF,QAAewL,WAAAA,CAAYxL,GAAAA,EAAK,QAAA,CAAA,CAAA;AACtDuN,IAAAA,GAAAA,CAAIxS,KAAK,OAAA,EAAS,CAACiF,QAAewL,WAAAA,CAAYxL,GAAAA,EAAK,UAAA,CAAA,CAAA;AACnDuN,IAAAA,GAAAA,CAAIxS,IAAAA,CAAK,SAAS,MAAA;AAChB,MAAA,IAAI,CAAC6S,OAAOG,SAAAA,EAAW;AACrBxB,QAAAA,aAAAA,CAAO+B,KAAK,wCAAA,CAAA;AACZV,QAAAA,MAAAA,CAAO5S,OAAAA,EAAO;AAChB,MAAA;IACF,CAAA,CAAA;AAEA,IAAA,IAAI;AACF4S,MAAAA,MAAAA,CAAOW,KAAKhB,GAAAA,CAAAA;AACZA,MAAAA,GAAAA,CAAIxS,IAAAA,CAAK,UAAUsT,YAAAA,CAAAA;AACrB,IAAA,CAAA,CAAA,OAASrO,GAAAA,EAAK;AACZwL,MAAAA,WAAAA,CAAYxL,KAAc,MAAA,CAAA;AAC5B,IAAA;EACF,CAAA,CAAA;AACF;AA3De2N,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AA6ER,SAASa,mBAAmBhR,GAAAA,EAAkB;AACnD,EAAA,MAAMwK,cAAAA,GAAiBxK,GAAAA,CAAI5E,GAAAA,CAAI,iBAAA,CAAA,IAAsB,EAAA;AACrD,EAAA,MAAMW,OAAAA,GAA2B;IAC/BkV,SAAAA,EAAW,IAAA;AACXC,IAAAA,MAAAA,CAAOC,WAAAA,EAAmB;AACxB,MAAA,OAAO,CAAC,WAAA,CAAYC,IAAAA,CAAKD,WAAAA,CAAAA;AAC3B,IAAA;AACF,GAAA;AAEA,EAAA,IAAI3G,cAAAA,CAAe1B,QAAAA,CAAS,IAAA,CAAA,EAAO;AACjC/M,IAAAA,OAAAA,CAAQsV,EAAAA,GAAK;MACXC,MAAAA,EAAQ;QACN,CAACC,cAAAA,CAAKC,SAAAA,CAAUC,oBAAoB,GAAG;AACzC;AACF,KAAA;AACA,IAAA,OAAOC,SAAS3V,OAAAA,CAAAA;EAClB,CAAA,MAAA,IAAWyO,cAAAA,CAAe1B,QAAAA,CAAS,MAAA,CAAA,EAAS;AAC1C/M,IAAAA,OAAAA,CAAQ4V,IAAAA,GAAO;AACbxL,MAAAA,KAAAA,EAAOoL,eAAKC,SAAAA,CAAUI;AACxB,KAAA;AACA7V,IAAAA,OAAAA,CAAQsV,EAAAA,GAAK,KAAA;AACb,IAAA,OAAOK,SAAS3V,OAAAA,CAAAA;AAClB,EAAA;AAEA,EAAA,OAAO,CAACiE,IAAAA,EAAUkO,IAAAA,KAAcA,IAAAA,EAAAA;AAElC;AA1BgB8C,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAsChB,eAAsBa,OAAAA,CAAQ7R,KAAoByC,GAAAA,EAAsB;AAEtE,EAAA,IAAI,KAAA,KAAUzC,IAAI6R,OAAAA,EAAS;AAC3B,EAAA,IAAI,CAAC7R,IAAIgJ,QAAAA,EAAU;AAEnB,EAAA,MAAM+G,MAAM/P,GAAAA,CAAI+P,GAAAA;AAChB,EAAA,MAAMvB,OAAOxO,GAAAA,CAAIwO,IAAAA;AACjB,EAAA,MAAM1L,OAAO9C,GAAAA,CAAI4C,MAAAA;AAGjB,EAAA,IAAIqM,WAAAA,CAAYnG,QAAAA,CAAShG,IAAAA,CAAAA,EAAO;AAC9B9C,IAAAA,GAAAA,CAAIwO,IAAAA,GAAO,IAAA;AACX,IAAA,OAAOsB,QAAQC,GAAAA,CAAAA;AACjB,EAAA;AAGA,EAAA,IAAI,MAAA,KAAW/P,IAAI0B,MAAAA,EAAQ;AACzB,IAAA,IAAI,CAACqO,IAAIS,WAAAA,IAAe,CAAOxQ,IAAI+D,QAAAA,CAAU7D,GAAAA,CAAI,gBAAA,CAAA,EAAmB;AAClE,MAAA,MAAM,EAAEX,MAAAA,EAAM,GAAKS,GAAAA,CAAI+D,QAAAA;AACvB,MAAA,IAAI+N,MAAAA,CAAOC,SAAAA,CAAUxS,MAAAA,CAAAA,MAAaA,MAAAA,GAASA,MAAAA;AAC7C,IAAA;AACA,IAAA,OAAOuQ,QAAQC,GAAAA,CAAAA;AACjB,EAAA;AAGA,EAAA,IAAI,QAAQvB,IAAAA,EAAM;AAChB,IAAA,IAAUxO,GAAAA,CAAI+D,SAAUiO,iBAAAA,EAAmB;AACzChS,MAAAA,GAAAA,CAAI+D,QAAAA,CAASkO,OAAO,cAAA,CAAA;AACpBjS,MAAAA,GAAAA,CAAI+D,QAAAA,CAASkO,OAAO,mBAAA,CAAA;AACpB,MAAA,OAAOnC,QAAQC,GAAAA,CAAAA;AACjB,IAAA;AAEA,IAAA,MAAMmC,QAAAA,GAAWlS,GAAAA,CAAI0I,GAAAA,CAAIyJ,gBAAAA,IAAoB,CAAA,GACzCtC,MAAAA,CAAO/M,IAAAA,CAAAA,GACN9C,GAAAA,CAAI0C,OAAAA,IAAWmN,MAAAA,CAAO/M,IAAAA,CAAAA;AAE3B,IAAA,IAAI,CAACiN,IAAIS,WAAAA,EAAa;AACpBxQ,MAAAA,GAAAA,CAAIgG,IAAAA,GAAO,MAAA;AACXhG,MAAAA,GAAAA,CAAIT,MAAAA,GAAS6S,MAAAA,CAAOC,UAAAA,CAAWH,QAAAA,CAAAA;AACjC,IAAA;AACA,IAAA,OAAOpC,OAAAA,CAAQC,KAAKmC,QAAAA,CAAAA;AACtB,EAAA;AAGA,EAAA,IAAIpP,SAAS,GAAA,EAAK;AAChB9C,IAAAA,GAAAA,CAAI4C,MAAAA,GAAS,GAAA;AACf,EAAA;AAGA,EAAA,IAAI;AACF,IAAA,MAAMoO,kBAAAA,CAAmBhR,GAAAA,CAAAA,CAAKA,GAAAA,EAAK,YAAA;AAEjC,MAAA,MAAMsS,cAActS,GAAAA,CAAIwO,IAAAA;AAGxB,MAAA,IAAI4D,MAAAA,CAAOG,QAAAA,CAASD,WAAAA,CAAAA,EAAc;AAChC,QAAA,MAAMxC,OAAAA,CAAQC,KAAKuC,WAAAA,CAAAA;AACnB,QAAA;AACF,MAAA;AAGA,MAAA,IAAI,OAAOA,gBAAgB,QAAA,EAAU;AACnC,QAAA,MAAMxC,OAAAA,CAAQC,KAAKuC,WAAAA,CAAAA;AACnB,QAAA;AACF,MAAA;AAGA,MAAA,IAAIA,uBAAuBE,QAAAA,EAAU;AACnC,QAAA,MAAMrC,oBAAAA,CAAqBmC,WAAAA,EAAavC,GAAAA,EAAK/P,GAAAA,CAAAA;AAC7C,QAAA;AACF,MAAA;AAGA,MAAA,MAAMyS,UAAAA,GAAavD,iBAAAA,CAAkBoD,WAAAA,EAAa7P,GAAAA,EAAKvE,KAAAA,CAAAA;AAEvD,MAAA,IAAI,CAACuU,WAAW/C,OAAAA,EAAS;AAEvB,QAAA,MAAMgD,SAAUD,UAAAA,CAAiDlU,KAAAA;AACjEwQ,QAAAA,aAAAA,CAAOjL,KAAAA,CAAM,CAAA,2BAAA,EAA8B4O,MAAAA,CAAAA,CAAQ,CAAA;AAEnD,QAAA,IAAI,CAAC3C,IAAIS,WAAAA,EAAa;AACpBxQ,UAAAA,GAAAA,CAAI4C,MAAAA,GAAS,GAAA;AACb5C,UAAAA,GAAAA,CAAIgG,IAAAA,GAAO,MAAA;AACb,QAAA;AAEA,QAAA,MAAM2M,aAAAA,GAAgBrD,KAAKC,SAAAA,CAAU;UACnChR,KAAAA,EAAO,uBAAA;UACPmE,OAAAA,EAAS,mCAAA;UACTkQ,OAAAA,EAASnQ,GAAAA,EAAKvE,QAAQwU,MAAAA,GAAS1V,KAAAA;SACjC,CAAA;AAEA,QAAA,MAAM8S,OAAAA,CAAQC,KAAK4C,aAAAA,CAAAA;AACnB,QAAA;AACF,MAAA;AAGA,MAAA,MAAME,WAAYJ,UAAAA,CAA+C9C,IAAAA;AACjE,MAAA,IAAI,CAACI,IAAIS,WAAAA,EAAa;AACpBxQ,QAAAA,GAAAA,CAAIgG,IAAAA,GAAO,MAAA;AACXhG,QAAAA,GAAAA,CAAIT,MAAAA,GAAS6S,MAAAA,CAAOC,UAAAA,CAAWQ,QAAAA,CAAAA;AACjC,MAAA;AACA,MAAA,MAAM/C,OAAAA,CAAQC,KAAK8C,QAAAA,CAAAA;IACrB,CAAA,CAAA;AACF,EAAA,CAAA,CAAA,OAAStU,KAAAA,EAAO;AAEdwQ,IAAAA,aAAAA,CAAOjL,KAAAA,CAAM,2BAAA,EAA6BvF,KAAAA,CAAAA;AAG1C,IAAA,IAAI,CAACwR,IAAIS,WAAAA,EAAa;AACpB,MAAA,IAAI;AACFT,QAAAA,GAAAA,CAAIU,UAAAA,GAAa,GAAA;AACjBV,QAAAA,GAAAA,CAAIW,SAAAA,CAAU,gBAAgB,YAAA,CAAA;AAC9BX,QAAAA,GAAAA,CAAInQ,IAAI,uBAAA,CAAA;AACV,MAAA,CAAA,CAAA,OAAS+Q,MAAAA,EAAQ;AACf5B,QAAAA,aAAAA,CAAOjL,KAAAA,CAAM,gCAAA,EAAkC6M,MAAAA,CAAAA;AACjD,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAtHsBkB,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AC1Nf,IAAMiB,WAAAA,GAAN,MAAMA,YAAAA,SAAoBxF,WAAAA,CAAAA;EArCjC;;;EAsCE,OAAetC,QAAAA;EAEf,WAAA,GAAsB;AACpB,IAAA,KAAA,EAAK;AACP,EAAA;AAEA,EAAA,OAAcG,WAAAA,GAA2B;AACvC,IAAA,IAAI,CAAC2H,aAAY9H,QAAAA,EAAU;AACzB8H,MAAAA,YAAAA,CAAY9H,QAAAA,GAAW,IAAI8H,YAAAA,EAAAA;AAC7B,IAAA;AACA,IAAA,OAAOA,YAAAA,CAAY9H,QAAAA;AACrB,EAAA;EAEA,MAAM+H,MAAAA,CAAO/S,GAAAA,EAAoBkO,IAAAA,EAAgBzL,GAAAA,EAAsC;AACrF,IAAA,MAAM0L,OAAAA,GAAU1L,IAAI0L,OAAAA,IAAW,GAAA;AAC/B,IAAA,IAAI5P,KAAAA,GAAa,IAAA;AAEjB,IAAA,IAAA,CAAKgP,eAAAA,CAAgBvN,KAAKyC,GAAAA,CAAAA;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAKwL,iBAAAA,CAAkBjO,GAAAA,EAAKkO,IAAAA,EAAMzL,KAAK0L,OAAAA,CAAAA;AAG7C,MAAA,IAAA,CAAKI,kBAAkBvO,GAAAA,CAAAA;AAEvB,MAAA,OAAO6R,OAAAA,CAAQ7R,KAAKyC,GAAAA,CAAAA;AACtB,IAAA,CAAA,CAAA,OAASD,GAAAA,EAAU;AACjBjE,MAAAA,KAAAA,GAAQiE,GAAAA;AACR,MAAA,OAAO,IAAA,CAAKwL,WAAAA,CAAYxL,GAAAA,EAAKxC,GAAAA,EAAKyC,GAAAA,CAAAA;IACpC,CAAA,SAAA;AAGE,MAAA,IAAI,CAAClE,KAAAA,IAASyB,GAAAA,CAAI4C,MAAAA,GAAS,GAAA,EAAK;AAC9B,QAAA,MAAMjG,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,QAAA,MAAMiR,GAAAA,GAAM,cAAc5N,GAAAA,CAAI0B,MAAM,eAAe1B,GAAAA,CAAI4C,MAAM,CAAA,eAAA,EAAkB5C,GAAAA,CAAI/D,SAAS,CAAA,cAAA,EAAkBU,MAAMqD,GAAAA,CAAI/D,SAAAA,IAAc,CAAA,CAAA,eAAA,EAAmB+D,GAAAA,CAAIO,SAAS,gBAAgB5D,GAAAA,CAAAA,UAAAA,EAAgBqD,GAAAA,CAAIoJ,YAAAA,IAAgB,GAAA,CAAA,EAAA,CAAA;AAC1N,QAAA,IAAA,CAAKuE,gBAAAA,CAAiB3N,GAAAA,EAAKyC,GAAAA,EAAKmL,GAAAA,CAAAA;MAClC,CAAA,MAAO;AAEL,QAAA,IAAA,CAAKoF,gBAAAA,CAAiBhT,KAAKyC,GAAAA,CAAAA;AAC3B,QAAA,IAAA,CAAKwQ,kBAAAA,CAAmBjT,KAAKyC,GAAAA,CAAAA;AAC/B,MAAA;AACF,IAAA;AACF,EAAA;;;;AAKQuQ,EAAAA,gBAAAA,CAAiBhT,KAAoByC,GAAAA,EAAuB;AAClE,IAAA,IAAIA,IAAIO,WAAAA,EAAa;AACnB,MAAA,MAAMrG,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,MAAA,MAAMiR,GAAAA,GAAM,cAAc5N,GAAAA,CAAI0B,MAAM,eAAe1B,GAAAA,CAAI4C,MAAM,CAAA,eAAA,EAAkB5C,GAAAA,CAAI/D,SAAS,CAAA,cAAA,EAAkBU,MAAMqD,GAAAA,CAAI/D,SAAAA,IAAc,CAAA,CAAA,eAAA,EAAmB+D,GAAAA,CAAIO,SAAS,gBAAgB5D,GAAAA,CAAAA,UAAAA,EAAgBqD,GAAAA,CAAIoJ,YAAAA,IAAgB,GAAA,CAAA,EAAA,CAAA;AAG1N3G,MAAAA,GAAAA,CAAIO,WAAAA,CAAYlB,kBAAkB9B,GAAAA,EAAK;QACrC,CAACyO,kBAAAA,CAAmBI,gBAAgB,GAAG7O,GAAAA,CAAI4C,MAAAA;QAC3C,CAAC6L,kBAAAA,CAAmBG,WAAW,GAAG5O,GAAAA,CAAI0B,MAAAA;QACtC,CAAC+M,kBAAAA,CAAmBC,QAAQ,GAAG1O,GAAAA,CAAI8O;OACrC,CAAA;AACArM,MAAAA,GAAAA,CAAIO,WAAAA,CAAYjB,YAAAA,CAAa/B,GAAAA,EAAK,SAAA,EAAW;QAAE,SAAA,EAAW4N;OAAI,CAAA;AAC9DnL,MAAAA,GAAAA,CAAIO,WAAAA,CAAYf,QAAQjC,GAAAA,CAAAA;AAC1B,IAAA;AACF,EAAA;;;;AAKQiT,EAAAA,kBAAAA,CAAmBjT,KAAoByC,GAAAA,EAAuB;AACpE,IAAA,IAAIzC,IAAI/D,SAAAA,EAAW;AACjB,MAAA,MAAM6L,QAAAA,GAAWpL,IAAAA,CAAKC,GAAAA,EAAG,GAAKqD,GAAAA,CAAI/D,SAAAA;AAClC4L,MAAAA,qBAAAA,CAAsB7H,KAAK8H,QAAAA,CAAAA;AAC7B,IAAA;AACF,EAAA;AACF,CAAA;AC7EO,IAAMoL,WAAAA,GAAN,MAAMA,YAAAA,SAAoB5F,WAAAA,CAAAA;EAlCjC;;;EAmCE,OAAetC,QAAAA;EAEf,WAAA,GAAsB;AACpB,IAAA,KAAA,EAAK;AACP,EAAA;AAEA,EAAA,OAAcG,WAAAA,GAA2B;AACvC,IAAA,IAAI,CAAC+H,aAAYlI,QAAAA,EAAU;AACzBkI,MAAAA,YAAAA,CAAYlI,QAAAA,GAAW,IAAIkI,YAAAA,EAAAA;AAC7B,IAAA;AACA,IAAA,OAAOA,YAAAA,CAAYlI,QAAAA;AACrB,EAAA;EAEA,MAAM+H,MAAAA,CAAO/S,GAAAA,EAAoBkO,IAAAA,EAAgBzL,GAAAA,EAAsC;AACrF,IAAA,MAAM0L,OAAAA,GAAU1L,IAAI0L,OAAAA,IAAW,GAAA;AAC/B,IAAA,MAAM3D,cAAAA,GAAiBxK,IAAI6I,GAAAA,CAAI4B,IAAAA,CAAKC,SAAStP,GAAAA,CAAI,iBAAA,CAAA,CAAmB,CAAA,CAAA,IAAM,EAAA;AAC1E,IAAA,MAAM+X,WAAAA,GAAc3I,cAAAA,CAAe1B,QAAAA,CAAS,IAAA,CAAA,GAAQ,WAClC0B,cAAAA,CAAe1B,QAAAA,CAAS,MAAA,CAAA,GAAU,MAAA,GAAS,MAAA;AAC7D,IAAA,IAAIvK,KAAAA,GAAa,IAAA;AAEjByB,IAAAA,GAAAA,EAAK6I,KAAK4B,IAAAA,EAAM2I,YAAAA,CAAapT,GAAAA,CAAI6I,GAAAA,CAAI4B,KAAKC,QAAQ,CAAA;AAElD,IAAA,IAAA,CAAK6C,eAAAA,CAAgBvN,KAAKyC,GAAAA,CAAAA;AAGKzC,IAAAA,CAAAA,KAAK6I,GAAAA,EAAK4B,IAAAA,EAAMlN,IAAAA,CAAK,OAAA,EAAS,CAACiF,GAAAA,KAAAA;AAC5DjE,MAAAA,KAAAA,GAAQiE,GAAAA;AACR,MAAA,IAAA,CAAKwL,WAAAA,CAAYxL,GAAAA,EAAKxC,GAAAA,EAAKyC,GAAAA,CAAAA;IAC7B,CAAA,CAAA;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAKwL,iBAAAA,CAAkBjO,GAAAA,EAAKkO,IAAAA,EAAMzL,KAAK0L,OAAAA,CAAAA;AAG7C,MAAA,IAAA,CAAKI,kBAAkBvO,GAAAA,CAAAA;AAGvB,MAAA,IAAImT,WAAAA,KAAgB,MAAA,IAAUnT,GAAAA,CAAIwO,IAAAA,YAAgB6E,MAAAA,EAAQ;AACxD,QAAA,IAAI;AACF,UAAA,MAAMC,cAAAA,GAAiBH,WAAAA,KAAgB,MAAA,GAChCI,KAAAA,CAAAA,UAAAA,CAAW;YAAEC,KAAAA,EAAO;AAAE,WAAA,IAAUC,KAAAA,CAAAA,oBAAAA,CAAqB;YACxDnC,MAAAA,EAAQ;cACN,CAAME,KAAAA,CAAAA,SAAAA,CAAUC,oBAAoB,GAAG;AACzC;WACF,CAAA;AAGF6B,UAAAA,cAAAA,CAAe/V,IAAAA,CAAK,OAAA,EAAS,CAACmW,WAAAA,KAAAA;AAC5B3E,YAAAA,aAAAA,CAAOjL,KAAAA,CAAM,gCAAA,EAAkC4P,WAAAA,CAAAA;AAE/C1T,YAAAA,GAAAA,CAAIwO,OAAOxO,GAAAA,CAAIwO,IAAAA;UACjB,CAAA,CAAA;AAGCxO,UAAAA,GAAAA,CAAIwO,IAAAA,CAAgBjR,IAAAA,CAAK,OAAA,EAAS,CAACoW,SAAAA,KAAAA;AAClC5E,YAAAA,aAAAA,CAAOjL,KAAAA,CAAM,2BAAA,EAA6B6P,SAAAA,CAAAA;AAC1CL,YAAAA,cAAAA,CAAe9V,OAAAA,EAAO;UACxB,CAAA,CAAA;AAEAwC,UAAAA,GAAAA,CAAIwO,IAAAA,GAAQxO,GAAAA,CAAIwO,IAAAA,CAAgBuC,IAAAA,CAAKuC,cAAAA,CAAAA;AACvC,QAAA,CAAA,CAAA,OAASM,OAAAA,EAAS;AAChB7E,UAAAA,aAAAA,CAAOjL,KAAAA,CAAM,yBAAA,EAA2B8P,OAAAA,CAAAA;AAE1C,QAAA;AACF,MAAA;AAGA,MAAA,IAAI;AACF5T,QAAAA,GAAAA,CAAI6I,GAAAA,CAAIgL,QAAAA,CAAS,IAAA,EAAM7T,GAAAA,CAAIwO,IAAI,CAAA;AACjC,MAAA,CAAA,CAAA,OAASsF,WAAAA,EAAa;AACpB/E,QAAAA,aAAAA,CAAOjL,KAAAA,CAAM,sBAAA,EAAwBgQ,WAAAA,CAAAA;AAErC,QAAA,IAAI;AACF9T,UAAAA,GAAAA,CAAI6I,GAAAA,CAAIgL,QAAAA,CAASC,WAAAA,EAAa,IAAA,CAAA;AAChC,QAAA,CAAA,CAAA,OAASC,WAAAA,EAAa;AACpBhF,UAAAA,aAAAA,CAAOjL,KAAAA,CAAM,+BAAA,EAAiCiQ,WAAAA,CAAAA;AAChD,QAAA;AACF,MAAA;AAEA,MAAA,OAAO,IAAA;AACT,IAAA,CAAA,CAAA,OAASvR,GAAAA,EAAU;AACjBjE,MAAAA,KAAAA,GAAQiE,GAAAA;AACR,MAAA,OAAO,IAAA,CAAKwL,WAAAA,CAAYxL,GAAAA,EAAKxC,GAAAA,EAAKyC,GAAAA,CAAAA;IACpC,CAAA,SAAA;AAGE,MAAA,IAAI,CAAClE,KAAAA,IAASyB,GAAAA,CAAI4C,MAAAA,GAAS,GAAA,EAAK;AAC9B,QAAA,MAAMjG,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,QAAA,MAAMiG,MAAAA,GAASoR,iBAAAA,CAAkBhU,GAAAA,CAAI4C,MAAM,CAAA;AAC3C,QAAA,MAAMgL,GAAAA,GAAM,cAAc5N,GAAAA,CAAI0B,MAAM,eAAekB,MAAAA,CAAAA,eAAAA,EAAwB5C,IAAI/D,SAAS,CAAA,cAAA,EAAkBU,MAAMqD,GAAAA,CAAI/D,SAAAA,IAAc,CAAA,CAAA,eAAA,EAAmB+D,GAAAA,CAAIO,SAAS,CAAA,aAAA,EAAgB5D,GAAAA,CAAAA,UAAAA,EAAgBqD,GAAAA,CAAIoJ,YAAY,CAAA,EAAA,CAAA;AAClN,QAAA,IAAA,CAAKuE,gBAAAA,CAAiB3N,GAAAA,EAAKyC,GAAAA,EAAKmL,GAAAA,CAAAA;MAClC,CAAA,MAAO;AAEL,QAAA,IAAA,CAAKoF,gBAAAA,CAAiBhT,KAAKyC,GAAAA,CAAAA;AAC3B,QAAA,IAAA,CAAKwQ,kBAAAA,CAAmBjT,KAAKyC,GAAAA,CAAAA;AAC/B,MAAA;AAGAzC,MAAAA,GAAAA,CAAI+P,GAAAA,CAAIkE,KAAK,QAAA,CAAA;AACf,IAAA;AACF,EAAA;;;;AAKQjB,EAAAA,gBAAAA,CAAiBhT,KAAoByC,GAAAA,EAAuB;AAClE,IAAA,IAAIA,IAAIO,WAAAA,EAAa;AACnB,MAAA,MAAMrG,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,MAAA,MAAMiG,MAAAA,GAASoR,iBAAAA,CAAkBhU,GAAAA,CAAI4C,MAAM,CAAA;AAC3C,MAAA,MAAMgL,GAAAA,GAAM,cAAc5N,GAAAA,CAAI0B,MAAM,eAAekB,MAAAA,CAAAA,eAAAA,EAAwB5C,IAAI/D,SAAS,CAAA,cAAA,EAAkBU,MAAMqD,GAAAA,CAAI/D,SAAAA,IAAc,CAAA,CAAA,eAAA,EAAmB+D,GAAAA,CAAIO,SAAS,CAAA,aAAA,EAAgB5D,GAAAA,CAAAA,UAAAA,EAAgBqD,GAAAA,CAAIoJ,YAAY,CAAA,EAAA,CAAA;AAGlN3G,MAAAA,GAAAA,CAAIO,WAAAA,CAAYlB,kBAAkB9B,GAAAA,EAAK;QACrC,CAACyO,kBAAAA,CAAmBI,gBAAgB,GAAG7O,GAAAA,CAAI4C,MAAAA;QAC3C,CAAC6L,kBAAAA,CAAmBG,WAAW,GAAG5O,GAAAA,CAAI0B,MAAAA;QACtC,CAAC+M,kBAAAA,CAAmBC,QAAQ,GAAG1O,GAAAA,CAAI8O;OACrC,CAAA;AACArM,MAAAA,GAAAA,CAAIO,WAAAA,CAAYjB,YAAAA,CAAa/B,GAAAA,EAAK,SAAA,EAAW;QAAE,SAAA,EAAW4N;OAAI,CAAA;AAC9DnL,MAAAA,GAAAA,CAAIO,WAAAA,CAAYf,QAAQjC,GAAAA,CAAAA;AAC1B,IAAA;AACF,EAAA;;;;AAKQiT,EAAAA,kBAAAA,CAAmBjT,KAAoByC,GAAAA,EAAuB;AACpE,IAAA,IAAIzC,IAAI/D,SAAAA,EAAW;AACjB,MAAA,MAAM6L,QAAAA,GAAWpL,IAAAA,CAAKC,GAAAA,EAAG,GAAKqD,GAAAA,CAAI/D,SAAAA;AAClC4L,MAAAA,qBAAAA,CAAsB7H,KAAK8H,QAAAA,CAAAA;AAC7B,IAAA;AACF,EAAA;AACF,CAAA;AChIO,IAAMoM,SAAAA,GAAN,MAAMA,UAAAA,SAAkB5G,WAAAA,CAAAA;EAvC/B;;;EAwCE,OAAetC,QAAAA;EAEf,WAAA,GAAsB;AACpB,IAAA,KAAA,EAAK;AACP,EAAA;AAEA,EAAA,OAAcG,WAAAA,GAAyB;AACrC,IAAA,IAAI,CAAC+I,WAAUlJ,QAAAA,EAAU;AACvBkJ,MAAAA,UAAAA,CAAUlJ,QAAAA,GAAW,IAAIkJ,UAAAA,EAAAA;AAC3B,IAAA;AACA,IAAA,OAAOA,UAAAA,CAAUlJ,QAAAA;AACnB,EAAA;EAEA,MAAM+H,MAAAA,CAAO/S,GAAAA,EAAoBkO,IAAAA,EAAgBzL,GAAAA,EAAsC;AACrF,IAAA,MAAM0L,OAAAA,GAAU1L,KAAK0L,OAAAA,IAAW,GAAA;AAChC,IAAA,MAAMgG,YAAAA,GAAenU,GAAAA,CAAI0I,GAAAA,CAAIC,OAAAA,CAAQ,0BAAA,CAAA,IAA+B,EAAA;AACpE,IAAA,MAAMyL,cAAAA,GAAiBD,YAAAA,CAAarL,QAAAA,CAAS,oBAAA,CAAA;AAE7C,IAAA,IAAA,CAAKyE,eAAAA,CAAgBvN,KAAKyC,GAAAA,CAAAA;AAE1BzC,IAAAA,GAAAA,EAAK+P,GAAAA,EAAKxS,IAAAA,CAAK,QAAA,EAAU,MAAA;AACvB,MAAA,MAAMZ,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,MAAA,MAAMiR,GAAAA,GAAM,cAAc5N,GAAAA,CAAI0B,MAAM,eAAe1B,GAAAA,CAAI4C,MAAM,CAAA,eAAA,EAAkB5C,GAAAA,CAAI/D,SAAS,CAAA,cAAA,EAAkBU,MAAMqD,GAAAA,CAAI/D,SAAAA,IAAc,CAAA,CAAA,eAAA,EAAmB+D,GAAAA,CAAIO,SAAS,gBAAgB5D,GAAAA,CAAAA,UAAAA,EAAgBqD,GAAAA,CAAIoJ,YAAAA,IAAgB,GAAA,CAAA,EAAA,CAAA;AAC1N,MAAA,IAAA,CAAKuE,gBAAAA,CAAiB3N,GAAAA,EAAKyC,GAAAA,EAAKmL,GAAAA,CAAAA;IAClC,CAAA,CAAA;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,CAAKK,iBAAAA,CAAkBjO,GAAAA,EAAKkO,IAAAA,EAAMzL,KAAK0L,OAAAA,CAAAA;AAG7C,MAAA,IAAA,CAAKI,kBAAkBvO,GAAAA,CAAAA;AAGvB,MAAA,IAAIA,GAAAA,EAAKyI,WAAWwB,UAAAA,KAAe,CAAA,IAAK,CAACtG,MAAAA,CAAO0Q,WAAAA,CAAYrU,GAAAA,CAAIwO,IAAI,CAAA,EAAG;AACrE,QAAA,IAAI;AACF,UAAA,MAAM8F,cAAcF,cAAAA,GAAiB;YAAE1C,QAAAA,EAAU;AAAK,WAAA,GAAI,EAAC;AAE3D,UAAA,MAAMhP,OAAAA,GAAU6R,OAAAA,CAAQvU,GAAAA,CAAIwO,IAAAA,EAAM;YAChCgG,KAAAA,EAAO,EAAA;YACPC,WAAAA,EAAavP,QAAAA;YACbwP,OAAAA,EAAS;WACX,CAAA;AAIA1U,UAAAA,GAAAA,CAAIyI,SAAAA,CAAUkM,IAAAA,CAAKjS,OAAAA,EAAS4R,WAAAA,CAAAA;AAG5B,UAAA,IAAI,CAACtU,IAAIyI,SAAAA,CAAUmM,aAAAA,IAAiB5U,IAAIyI,SAAAA,CAAUmM,aAAAA,CAAc,OAAA,CAAA,KAAa,CAAA,EAAG;AAC9E5U,YAAAA,GAAAA,CAAIyI,SAAAA,CAAUlL,IAAAA,CAAK,OAAA,EAAS,CAACsX,KAAAA,KAAAA;AAC3B9F,cAAAA,aAAAA,CAAOjL,KAAAA,CAAM,kBAAA,EAAoB+Q,KAAAA,CAAAA;YACnC,CAAA,CAAA;AACF,UAAA;AACF,QAAA,CAAA,CAAA,OAASC,OAAAA,EAAS;AAChB/F,UAAAA,aAAAA,CAAOjL,KAAAA,CAAM,uBAAA,EAAyBgR,OAAAA,CAAAA;AAExC,QAAA;AACF,MAAA;AACA,MAAA,OAAO,IAAA;AACT,IAAA,CAAA,CAAA,OAAStS,GAAAA,EAAU;AACjB,MAAA,OAAO,IAAA,CAAKwL,WAAAA,CAAYxL,GAAAA,EAAKxC,GAAAA,EAAKyC,GAAAA,CAAAA;IACpC,CAAA,SAAA;AACEzC,MAAAA,GAAAA,CAAI+P,GAAAA,CAAIkE,KAAK,QAAA,CAAA;AACf,IAAA;AACF,EAAA;AACF,CAAA;ACpFO,IAAMc,iBAAN,MAAMA;EAtBb;;;EAuBE,OAAeC,QAAAA,uBAAetZ,GAAAA,EAAAA;EAK9B;AACE,IAAA,IAAA,CAAKuZ,QAAAA,CAASjG,YAAAA,CAAakG,IAAAA,EAAMpC,WAAAA,CAAY3H,aAAW,CAAA;AACxD,IAAA,IAAA,CAAK8J,QAAAA,CAASjG,YAAAA,CAAamG,IAAAA,EAAMjC,WAAAA,CAAY/H,aAAW,CAAA;AACxD,IAAA,IAAA,CAAK8J,QAAAA,CAASjG,YAAAA,CAAaoG,EAAAA,EAAIlB,SAAAA,CAAU/I,aAAW,CAAA;AACtD;;;;;;EAOA,OAAO8J,QAAAA,CAASjP,MAAoB1C,OAAAA,EAAkB;AACpD,IAAA,IAAA,CAAK0R,QAAAA,CAAS1Z,GAAAA,CAAI0K,IAAAA,EAAM1C,OAAAA,CAAAA;AAC1B,EAAA;;;;;;AAOA,EAAA,OAAO+R,WAAWrP,IAAAA,EAA6B;AAC7C,IAAA,MAAM1C,OAAAA,GAAU,IAAA,CAAK0R,QAAAA,CAAS5Z,GAAAA,CAAI4K,IAAAA,CAAAA;AAClC,IAAA,IAAI,CAAC1C,OAAAA,EAAS;AACZrF,MAAAA,aAAAA,CAAOY,IAAAA,CAAK,CAAA,qBAAA,EAAwBmH,IAAAA,CAAAA,gCAAAA,CAAsC,CAAA;AAC1E,MAAA,OAAO,IAAA,CAAKgP,QAAAA,CAAS5Z,GAAAA,CAAI4T,YAAAA,CAAakG,IAAI,CAAA;AAC5C,IAAA;AACA,IAAA,OAAO5R,OAAAA;AACT,EAAA;AACF,CAAA;AChCO,IAAMgS,iBAAAA,GAAoB,IAAIC,iBAAAA,EAAAA;AAGrC,IAAMC,YAAAA,GAAe;EACnBhP,GAAAA,EAAK;AAAC,IAAA,IAAA;AAAM,IAAA;;EACZyL,MAAAA,EAAQ;AAAC,IAAA,KAAA;AAAO,IAAA;;AAClB,CAAA;AAGA,IAAMwD,kBAAAA,uBAAyB5Z,OAAAA,EAAAA;AAKxB,SAAS6Z,oBAAoBlU,GAAAA,GAAAA,iBAAMmU,MAAAA,CAAO,eAAA,CAAA,EAAiB1R,UAAQ,EAAE;AAE1E,EAAA,MAAM2R,QAAAA,GAAW,IAAIC,aAAAA,CAAcrU,GAAAA,CAAAA;AAGnCoU,EAAAA,QAAAA,CAASE,cAAc,MAAA;AACrBD,IAAAA,aAAAA,CAAcE,SAAAA,CAAUD,WAAAA,CAAYrL,IAAAA,CAAKmL,QAAAA,CAAAA;AACzC,IAAA,OAAOA,QAAAA;AACT,EAAA,CAAA;AAEA,EAAA,OAAOA,QAAAA;AACT;AAXgBF,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAqBT,SAASM,WAAAA,CAAYC,SAAuBC,aAAAA,EAA4B;AAE7E,EAAA,IAAIT,kBAAAA,CAAmBvV,GAAAA,CAAI+V,OAAAA,CAAAA,EAAU;AACnC,IAAA;AACF,EAAA;AAGA,EAAA,MAAME,eAAAA,uBAAsBta,OAAAA,EAAAA;AAC5B4Z,EAAAA,kBAAAA,CAAmBna,IAAI2a,OAAAA,EAAS;IAAEL,QAAAA,EAAUM,aAAAA;AAAeC,IAAAA;GAAgB,CAAA;AAG3E,EAAA,KAAA,MAAWzU,MAAAA,IAAU8T,aAAahP,GAAAA,EAAK;AACrC4P,IAAAA,iBAAAA,CAAkBH,SAASvU,MAAAA,EAAQ,CAAC2U,QAAAA,KAClC,SAA8BrU,MAAcsB,OAAAA,EAAiC;AAE3E,MAAA,IAAIgT,cAAAA,GAAiBH,eAAAA,CAAgB/a,GAAAA,CAAIkI,OAAAA,CAAAA;AAEzC,MAAA,IAAI,CAACgT,cAAAA,EAAgB;AACnBA,QAAAA,cAAAA,8BAAqBC,IAAAA,KAAAA;AACnBL,UAAAA,aAAAA,CAAcM,eAAAA,CAAgBlT,OAAAA,EAAS2S,OAAAA,EAAAA,GAAYM,IAAAA,CAAAA;QACrD,CAAA,EAFiB,gBAAA,CAAA;AAGjBJ,QAAAA,eAAAA,CAAgB7a,GAAAA,CAAIgI,SAASgT,cAAAA,CAAAA;AAC/B,MAAA;AAEA,MAAA,OAAOD,QAAAA,CAAS5L,IAAAA,CAAK,IAAA,EAAMzI,IAAAA,EAAMsU,cAAAA,CAAAA;IACnC,CAAA,CAAA;AAEJ,EAAA;AAGA,EAAA,KAAA,MAAW5U,MAAAA,IAAU8T,aAAavD,MAAAA,EAAQ;AACxCmE,IAAAA,iBAAAA,CAAkBH,SAASvU,MAAAA,EAAQ,CAAC2U,QAAAA,KAClC,SAA8BrU,MAAcsB,OAAAA,EAAiC;AAC3E,MAAA,MAAMgT,cAAAA,GAAiBH,eAAAA,CAAgB/a,GAAAA,CAAIkI,OAAAA,CAAAA;AAE3C,MAAA,IAAIgT,cAAAA,EAAgB;AAClBH,QAAAA,eAAAA,CAAgBtW,OAAOyD,OAAAA,CAAAA;AACvB,QAAA,OAAO+S,QAAAA,CAAS5L,IAAAA,CAAK,IAAA,EAAMzI,IAAAA,EAAMsU,cAAAA,CAAAA;AACnC,MAAA;AAEA,MAAA,OAAOD,QAAAA,CAAS5L,IAAAA,CAAK,IAAA,EAAMzI,IAAAA,EAAMsB,OAAAA,CAAAA;IACnC,CAAA,CAAA;AAEJ,EAAA;AACF;AA5CgB0S,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAsDT,SAASI,iBAAAA,CAAkBH,OAAAA,EAAuBvU,MAAAA,EAAgB+U,OAAAA,EAAiB;AACxF,EAAA,IAAI,EAAE/U,UAAUuU,OAAAA,CAAAA,EAAU;AACxB,IAAA;AACF,EAAA;AAEA,EAAA,MAAMI,QAAAA,GAAYJ,QAAgBvU,MAAAA,CAAAA;AAClC,EAAA,IAAI,OAAO2U,aAAa,UAAA,EAAY;AAClC,IAAA;AACF,EAAA;AAEA,EAAA,MAAMK,OAAAA,GAAUD,OAAAA,CAAQJ,QAAAA,EAAU3U,MAAAA,CAAAA;AACjCuU,EAAAA,OAAAA,CAAgBvU,MAAAA,CAAAA,GAAUgV,OAAAA;AAC3B,EAAA,OAAOA,OAAAA;AACT;AAbgBN,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AC9FT,IAAMrH,UAAN,MAAMA;EAnBb;;;;AAqBExQ,EAAAA,KAAAA,CAAAA,GAASgY,IAAAA,EAAa;AACpBI,IAAAA,aAAAA,CAAc7S,MAAMyS,IAAAA,CAAAA;AACtB,EAAA;;;;;AAKA1X,EAAAA,IAAAA,CAAAA,GAAQ0X,IAAAA,EAAa;AACnBI,IAAAA,aAAAA,CAAc7F,KAAKyF,IAAAA,CAAAA;AACrB,EAAA;;;;;;AAMAjU,EAAAA,IAAAA,CAAAA,GAAQiU,IAAAA,EAAa;AACnBI,IAAAA,aAAAA,CAAcC,KAAKL,IAAAA,CAAAA;AACrB,EAAA;;;;;;;AAOArY,EAAAA,KAAAA,CAAAA,GAASqY,IAAAA,EAAa;AACpBI,IAAAA,aAAAA,CAAcE,MAAMN,IAAAA,CAAAA;AACtB,EAAA;;;;;;;;AAQAO,EAAAA,OAAAA,CAAAA,GAAWP,IAAAA,EAAa;AACtBI,IAAAA,aAAAA,CAAcE,MAAMN,IAAAA,CAAAA;AACtB,EAAA;AACF,CAAA;AC5BO,IAAMQ,sBAAAA,GAAN,cAAqCC,iBAAAA,CAAAA;EA9B5C;;;AA+BmBC,EAAAA,UAAAA;AACAC,EAAAA,UAAAA;AACAC,EAAAA,gBAAAA;AACAC,EAAAA,YAAAA;EAETC,YAAAA,GAAe,CAAA;EACfC,eAAAA,GAAkB,CAAA;EAClBC,YAAAA,GAAgD,QAAA;AAExD,EAAA,WAAA,CAAYC,MAAAA,EAAa;AACvB,IAAA,KAAA,CAAMA,MAAAA,CAAAA;AACN,IAAA,IAAA,CAAKP,UAAAA,GAAaO,OAAOP,UAAAA,IAAc,CAAA;AACvC,IAAA,IAAA,CAAKC,UAAAA,GAAaM,OAAON,UAAAA,IAAc,GAAA;AACvC,IAAA,IAAA,CAAKC,gBAAAA,GAAmBK,OAAOL,gBAAAA,IAAoB,CAAA;AACnD,IAAA,IAAA,CAAKC,YAAAA,GAAeI,OAAOJ,YAAAA,IAAgB,GAAA;AAC7C,EAAA;EAEA,MAAMK,MAAAA,CAAOC,OAAYC,cAAAA,EAAgD;AAEvE,IAAA,IAAI,IAAA,CAAKJ,iBAAiB,MAAA,EAAQ;AAChC,MAAA,MAAM5a,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,MAAA,IAAIA,GAAAA,GAAM,IAAA,CAAK2a,eAAAA,GAAkB,IAAA,CAAKF,YAAAA,EAAc;AAClD,QAAA,IAAA,CAAKG,YAAAA,GAAe,WAAA;MACtB,CAAA,MAAO;AACLI,QAAAA,cAAAA,CAAe;AACb7U,UAAAA,IAAAA,EAAM8U,gBAAAA,CAAiBC,MAAAA;UACvBtZ,KAAAA,EAAO,IAAIuF,MAAM,2CAAA;SACnB,CAAA;AACA,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,IAAIgU,SAAAA;AACJ,IAAA,KAAA,IAASC,OAAAA,GAAU,CAAA,EAAGA,OAAAA,IAAW,IAAA,CAAKd,YAAYc,OAAAA,EAAAA,EAAW;AAC3D,MAAA,IAAI;AACF,QAAA,MAAMC,MAAAA,GAAS,MAAM,KAAA,CAAMP,MAAAA,CAAOC,OAAOC,cAAAA,CAAAA;AAGzC,QAAA,IAAI,IAAA,CAAKJ,iBAAiB,WAAA,EAAa;AACrC,UAAA,IAAA,CAAKU,YAAAA,EAAY;AACnB,QAAA;AACA,QAAA,OAAOD,MAAAA;AACT,MAAA,CAAA,CAAA,OAASzZ,KAAAA,EAAO;AACduZ,QAAAA,SAAAA,GAAYvZ,KAAAA;AAGZ,QAAA,IAAA,CAAK8Y,YAAAA,EAAAA;AACL,QAAA,IAAI,IAAA,CAAKA,YAAAA,IAAgB,IAAA,CAAKF,gBAAAA,EAAkB;AAC9C,UAAA,IAAA,CAAKe,WAAAA,EAAW;AAClB,QAAA;AAEA,QAAA,IAAIH,OAAAA,GAAU,KAAKd,UAAAA,EAAY;AAC7B,UAAA,MAAM,IAAIzL,QAAQC,CAAAA,OAAAA,KAAW5K,WAAW4K,OAAAA,EAAS,IAAA,CAAKyL,UAAAA,GAAaa,OAAAA,CAAAA,CAAAA;AACrE,QAAA;AACF,MAAA;AACF,IAAA;AAEAJ,IAAAA,cAAAA,CAAe;AAAC7U,MAAAA,IAAAA,EAAM8U,gBAAAA,CAAiBC,MAAAA;MAAQtZ,KAAAA,EAAOuZ;KAAS,CAAA;AACjE,EAAA;EAEQI,WAAAA,GAAc;AACpB,IAAA,IAAA,CAAKX,YAAAA,GAAe,MAAA;AACpB,IAAA,IAAA,CAAKD,eAAAA,GAAkB5a,KAAKC,GAAAA,EAAG;AAC/B,IAAA,IAAA,CAAK0a,YAAAA,GAAe,CAAA;AACpBtI,IAAAA,aAAAA,CAAO+B,KAAK,wDAAA,CAAA;AACd,EAAA;EAEQmH,YAAAA,GAAe;AACrB,IAAA,IAAA,CAAKV,YAAAA,GAAe,QAAA;AACpB,IAAA,IAAA,CAAKF,YAAAA,GAAe,CAAA;AACpBtI,IAAAA,aAAAA,CAAO6H,KAAK,yCAAA,CAAA;AACd,EAAA;AACF,CAAA;AC3EO,SAASuB,wBAAAA,CAAyBxM,KAAa5P,OAAAA,EAAY;AAChE,EAAA,MAAMkE,WAAAA,GAAc3C,OAAAA,CAAQyO,GAAAA,CAAIqM,iBAAAA,IAAqBzM,GAAAA,CAAI3J,IAAAA;AACzD,EAAA,IAAI,CAAC/B,WAAAA,EAAa;AAChB,IAAA,MAAM,IAAI6D,MAAM,0BAAA,CAAA;AAClB,EAAA;AAEA,EAAA,OAAOuU,sBAAAA,CAAuB/W,OAAOgX,MAAAA,CACnC;AACE,IAAA,CAACC,iBAAAA,GAAoBtY,WAAAA;AACrB,IAAA,CAACuY,oBAAAA,GAAuBlb,OAAAA,CAAQyO,GAAAA,CAAI0M,oBAAAA,IAAwB9M,IAAI+M,OAAAA,IAAW,OAAA;AAC3E,IAAA,CAACC,kCAAAA,GAAqCrb,OAAAA,CAAQyO,GAAAA,CAAI6M,QAAAA,IAAYjN,IAAII,GAAAA,IAAO,aAAA;AACzE,IAAA,CAAC8M,uBAAAA,GAA0B,eAAA;AAC3B,IAAA,CAACC,2BAAAA,GAA8B,QAAA;AAC/B,IAAA,CAACC,0BAAAA,GAA6Bzb,OAAAA,CAAQyO,GAAAA,CAAIiN,gBAAAA,IAAoB,OAAA;AAC9D,IAAA,aAAA,EAAe1b,OAAAA,CAAQ2b;AACzB,GAAA,EACAld,OAAAA,CAAQmd,sBAAAA,IAA0B,EAAC,CAAA,CAAA;AAEvC;AAlBgBf,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;;;ACLhB,IAAIgB,WAAAA,GAAc,KAAA;AAmBX,SAASC,OAAAA,CAAQzN,KAAa5P,OAAAA,EAAqB;AACxD,EAAA,MAAMoQ,QAAAA,GAAWpQ,OAAAA,CAAQkB,iBAAAA,EAAmBkP,QAAAA,IAC1C7O,QAAQyO,GAAAA,CAAIsN,2BAAAA;AACd,EAAA,IAAI,CAAClN,QAAAA,EAAU;AACb,IAAA,MAAM,IAAIrI,MAAM,2BAAA,CAAA;AAClB,EAAA;AAEA,EAAA,MAAMwV,aAAAA,GAAgB,IAAIvC,sBAAAA,CAAuB;IAC/CjI,GAAAA,EAAK3C,QAAAA;IACLxD,OAAAA,EAAS5M,OAAAA,CAAQkB,iBAAAA,EAAmB0L,OAAAA,IAAW,EAAC;IAChD4Q,aAAAA,EAAexd,OAAAA,CAAQkB,mBAAmBkR,OAAAA,IAAW,GAAA;IACrD8I,UAAAA,EAAY,CAAA;IACZC,UAAAA,EAAY;GACd,CAAA;AAEA,EAAA,MAAMsC,YAAAA,GAAe;AACnBC,IAAAA,YAAAA,EAAc1d,QAAQkB,iBAAAA,EAAmByc,iBAAAA;AACzCC,IAAAA,kBAAAA,EAAoB5d,QAAQkB,iBAAAA,EAAmB2c,kBAAAA;AAC/CC,IAAAA,oBAAAA,EAAsB9d,QAAQkB,iBAAAA,EAAmB6c,gBAAAA;AACjDC,IAAAA,mBAAAA,EAAqBhe,QAAQkB,iBAAAA,EAAmB+c;AAClD,GAAA;AAGA,EAAA,IAAI,CAACb,WAAAA,EAAa;AAChB,IAAA,MAAMc,QAAAA,GAAWhc,cAAOic,QAAAA,EAAQ;AAChC,IAAA,MAAMC,YAAAA,GAAe7Y,MAAAA,CAAO8Y,MAAAA,CAAOC,YAAAA,EAAcC,IAAAA,CAC/C,CAAC9G,KAAAA,KAAUA,KAAAA,CAAMvP,UAAQ,KAAOgW,QAAAA,CAAShW,QAAAA,EAAQ,KAC9CoW,YAAAA,CAAaE,IAAAA;AAElBC,IAAAA,IAAAA,CAAKC,SAAAA,CAAU,IAAI1L,OAAAA,EAAAA,EAAUoL,YAAAA,CAAAA;AAC7BhB,IAAAA,WAAAA,GAAc,IAAA;AAChB,EAAA;AAGA,EAAA,MAAMuB,kBAAAA,GAAqBhP,sBAAAA,CAAuBC,GAAAA,EAAK5P,OAAAA,CAAAA;AAEvD,EAAA,MAAM4e,SAAAA,GAAiB;IACrB/E,QAAAA,EAAUuC,wBAAAA,CAAyBxM,KAAK5P,OAAAA,CAAAA;AACxCud,IAAAA,aAAAA;IACAsB,cAAAA,EAAgB;MAAC,IAAIC,kBAAAA,CAAmBvB,eAAeE,YAAAA;;IACvDsB,gBAAAA,EAAkB/e,OAAAA,CAAQkB,mBAAmB6d,gBAAAA,IAAoB;MAC/DC,2BAAAA,CAA4B;QAC1B,qCAAA,EAAuC;UACrCC,OAAAA,EAAS;AACX,SAAA;QACA,oCAAA,EAAsC;UACpCA,OAAAA,EAAS;AACX;OACF;;AAEJ,GAAA;AAGA,EAAA,IAAIN,kBAAAA,EAAoB;AACtBC,IAAAA,SAAAA,CAAUpO,OAAAA,GAAU;AAACmO,MAAAA;;AACvB,EAAA;AAEA,EAAA,OAAO,IAAIO,QAAQN,SAAAA,CAAAA;AACrB;AA1DgBvB,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAyEhB,eAAsB8B,WAAAA,CAAYC,GAAAA,EAAcxP,GAAAA,EAAa5P,OAAAA,EAAqB;AAChF,EAAA,MAAMqf,kCAAkB,MAAA,CAAA,YAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAMD,IAAIE,QAAAA,EAAQ;AAClBpd,MAAAA,aAAAA,CAAOqE,KAAK,0CAAA,CAAA;AACd,IAAA,CAAA,CAAA,OAAS/D,KAAAA,EAAO;AACdN,MAAAA,aAAAA,CAAOM,KAAAA,CAAM,uCAAA,EAAyCA,KAAAA,CAAAA;IACxD,CAAA,SAAA;AACEoN,MAAAA,GAAAA,CAAI2P,GAAAA,CAAI,WAAWF,eAAAA,CAAAA;AACrB,IAAA;EACF,CAAA,EATwB,iBAAA,CAAA;AAWxB,EAAA,IAAI;AACF,IAAA,MAAMD,IAAII,KAAAA,EAAK;AACftd,IAAAA,aAAAA,CAAOqE,KAAK,wCAAA,CAAA;AACd,EAAA,CAAA,CAAA,OAASE,GAAAA,EAAK;AACZvE,IAAAA,aAAAA,CAAOM,KAAAA,CAAM,CAAA,yCAAA,EAA4CiE,GAAAA,CAAIE,OAAO,CAAA,CAAA,EAAI;AACtEK,MAAAA,KAAAA,EAAOP,GAAAA,CAAIO,KAAAA;AACXD,MAAAA,IAAAA,EAAMN,GAAAA,CAAIM,IAAAA;MACV0U,MAAAA,EAAQ;AACNrL,QAAAA,QAAAA,EAAUpQ,QAAQkB,iBAAAA,EAAmBkP,QAAAA;AACrClM,QAAAA,WAAAA,EAAa0L,GAAAA,CAAI3J;AACnB;KACF,CAAA;AACAf,IAAAA,KAAAA,CAAMua,uBAAAA,CAAwB,IAAIC,mBAAAA,EAAAA,CAAAA;AAClC,IAAA;EACF,CAAA,SAAA;AACE9P,IAAAA,GAAAA,CAAI+P,EAAAA,CAAG,WAAWN,eAAAA,CAAAA;AACpB,EAAA;AACF;AA7BsBF,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;ACtFtB,IAAMS,WAAAA,GAAc,GAAA;AACpB,IAAMC,uBAAAA,GAA0B,GAAA;AAChC,IAAMC,iBAAAA,GAAoB,GAAA;AAEnB,IAAMC,gBAAAA,GAAN,MAAMA,iBAAAA,CAAAA;EAjCb;;;EAkCE,OAAe9Q,QAAAA;AACP+Q,EAAAA,UAAAA;EAER,WAAA,GAAsB;AACpB,IAAA,IAAA,CAAKA,UAAAA,uBAAiBrgB,GAAAA,EAAAA;AACxB,EAAA;AAEA,EAAA,OAAcyP,WAAAA,GAAgC;AAC5C,IAAA,IAAI,CAAC2Q,kBAAiB9Q,QAAAA,EAAU;AAC9B8Q,MAAAA,iBAAAA,CAAiB9Q,QAAAA,GAAW,IAAI8Q,iBAAAA,EAAAA;AAClC,IAAA;AACA,IAAA,OAAOA,iBAAAA,CAAiB9Q,QAAAA;AAC1B,EAAA;AAEOgR,EAAAA,uBAAAA,CAAwB1L,QAAgB2L,MAAAA,EAAgB;AAC7D,IAAA,IAAI3L,MAAAA,CAAO/Q,SAASqc,uBAAAA,EAAyB;AAC3C3d,MAAAA,cAAOY,IAAAA,CAAK,CAAA,cAAA,EAAiByR,MAAAA,CAAAA,sBAAAA,EAA+BsL,uBAAAA,CAAAA,cAAAA,CAAuC,CAAA;AACnGtL,MAAAA,MAAAA,GAASA,MAAAA,CAAO1G,SAAAA,CAAU,CAAA,EAAGgS,uBAAAA,CAAAA;AAC/B,IAAA;AACA,IAAA,IAAIK,MAAAA,IAAUA,MAAAA,CAAO1c,MAAAA,GAASqc,uBAAAA,EAAyB;AACrD3d,MAAAA,cAAOY,IAAAA,CAAK,CAAA,cAAA,EAAiBod,MAAAA,CAAAA,sBAAAA,EAA+BL,uBAAAA,CAAAA,cAAAA,CAAuC,CAAA;AACnGK,MAAAA,MAAAA,GAASA,MAAAA,CAAOrS,SAAAA,CAAU,CAAA,EAAGgS,uBAAAA,CAAAA;AAC/B,IAAA;AAEA,IAAA,IAAI,IAAA,CAAKG,WAAW5d,IAAAA,IAAQwd,WAAAA,IAAe,CAAC,IAAA,CAAKI,UAAAA,CAAW7b,GAAAA,CAAIoQ,MAAAA,CAAAA,EAAS;AACvErS,MAAAA,aAAAA,CAAOY,KAAK,CAAA,iCAAA,EAAoC8c,WAAAA,mCAA8CrL,MAAAA,CAAAA,IAAAA,EAAa2L,MAAAA,CAAAA,CAAQ,CAAA;AACnH,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,IAAA,CAAKF,UAAAA,CAAW5d,IAAAA,IAAQwd,WAAAA,GAAcE,iBAAAA,EAAmB;AAC3D5d,MAAAA,aAAAA,CAAOY,KAAK,CAAA,uCAAA,EAA0C,IAAA,CAAKkd,WAAW5d,IAAI,CAAA,CAAA,EAAIwd,WAAAA,CAAAA,SAAAA,CAAsB,CAAA;AACtG,IAAA;AAEA,IAAA,IAAI,CAAC,IAAA,CAAKI,UAAAA,CAAW7b,GAAAA,CAAIoQ,MAAAA,CAAAA,EAAS;AAChC,MAAA,IAAA,CAAKyL,UAAAA,CAAWzgB,IAAIgV,MAAAA,EAAQ;QAC1BtO,IAAAA,EAAMsO,MAAAA;AACN4L,QAAAA,YAAAA,sBAAkBC,GAAAA;OACpB,CAAA;AACF,IAAA;AAEA,IAAA,IAAIF,MAAAA,IAAU,CAAC,IAAA,CAAKF,UAAAA,CAAW3gB,GAAAA,CAAIkV,MAAAA,CAAAA,CAAS4L,YAAAA,CAAahc,GAAAA,CAAI+b,MAAAA,CAAAA,EAAS;AACpE,MAAA,IAAA,CAAKF,WAAW3gB,GAAAA,CAAIkV,MAAAA,CAAAA,CAAS4L,YAAAA,CAAa1V,IAAIyV,MAAAA,CAAAA;AAC9Che,MAAAA,cAAOC,KAAAA,CAAM,CAAA,6BAAA,EAAgCoS,MAAAA,CAAAA,IAAAA,EAAa2L,MAAAA,CAAAA,CAAQ,CAAA;AACpE,IAAA;AACF,EAAA;AAEOG,EAAAA,sBAAAA,CAAuBnc,WAAAA,EAA+B;AAC3D,IAAA,MAAMoc,IAAAA,GAAO,IAAA,CAAKN,UAAAA,CAAW3gB,GAAAA,CAAI6E,WAAAA,CAAAA;AACjC,IAAA,OAAOoc,OAAOrd,KAAAA,CAAMC,IAAAA,CAAKod,IAAAA,CAAKH,YAAY,IAAI,EAAA;AAChD,EAAA;EAEOI,eAAAA,GAA4C;AACjD,IAAA,MAAMtE,SAAmC,EAAC;AAC1C,IAAA,IAAA,CAAK+D,UAAAA,CAAWxa,OAAAA,CAAQ,CAAC8a,IAAAA,EAAMra,IAAAA,KAAAA;AAC7BgW,MAAAA,MAAAA,CAAOhW,IAAAA,CAAAA,GAAQhD,KAAAA,CAAMC,IAAAA,CAAKod,KAAKH,YAAY,CAAA;IAC7C,CAAA,CAAA;AACA,IAAA,OAAOlE,MAAAA;AACT,EAAA;EAEOuE,iBAAAA,GAA4B;AACjC,IAAA,IAAIC,KAAAA,GAAQ,eAAA;AACZ,IAAA,IAAA,CAAKT,UAAAA,CAAWxa,OAAAA,CAAQ,CAAC8a,IAAAA,KAAAA;AACvBA,MAAAA,IAAAA,CAAKH,YAAAA,CAAa3a,OAAAA,CAAQ,CAACkb,GAAAA,KAAAA;AACzBD,QAAAA,KAAAA,IAAS,CAAA,GAAA,EAAMH,IAAAA,CAAKra,IAAI,CAAA,MAAA,EAASya,GAAAA,CAAAA;;MACnC,CAAA,CAAA;IACF,CAAA,CAAA;AACAD,IAAAA,KAAAA,IAAS,GAAA;AACT,IAAA,OAAOA,KAAAA;AACT,EAAA;AACF,CAAA;AC7EO,SAASE,YAAAA,CAAa1c,KAAoBjE,OAAAA,EAAqB;AACpE,EAAA,IAAIwE,SAAAA,GAAY,EAAA;AAChB,EAAA,QAAQP,IAAI+H,QAAAA;IACV,KAAK,MAAA;AACH,MAAA,MAAM4U,UAAe3c,GAAAA,EAAK4c,WAAAA,CAAY,OAAA,CAAA,CAAS,CAAA,KAAM,EAAC;AACtDrc,MAAAA,SAAAA,GAAYP,GAAAA,EAAK4c,YAAoB7gB,OAAAA,CAAQ8gB,aAAa,KACxDF,OAAAA,CAAgB5gB,OAAAA,CAAQ8gB,aAAa,CAAA,IAAK,EAAA;AAC5C,MAAA;AACF,IAAA;AACE,MAAA,IAAI9gB,QAAQ+gB,mBAAAA,EAAqB;AAC/B,QAAA,MAAMC,WAAAA,GAAc/c,GAAAA,CAAI2I,OAAAA,GAAU5M,OAAAA,CAAQ+gB,mBAAAA,CAAoBE,WAAAA,EAAW,CAAA,IACvEhd,GAAAA,CAAIid,KAAAA,GAAQlhB,OAAAA,CAAQ8gB,aAAa,CAAA,IAAK,EAAA;AACxCtc,QAAAA,SAAAA,GAAYoD,OAAOuZ,OAAAA,CAAQH,WAAAA,IAAeA,WAAAA,CAAYI,IAAAA,CAAK,GAAA,CAAA,GAAOJ,WAAAA;AACpE,MAAA;AACJ;AACA,EAAA,OAAOxc,SAAAA,IAAa6c,WAAWrhB,OAAAA,CAAAA;AACjC;AAhBgB2gB,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAuBT,SAASU,WAAWrhB,OAAAA,EAAsB;AAC/C,EAAA,OAAO4H,MAAAA,CAAOC,WAAW7H,OAAAA,EAASshB,SAAAA,IAAathB,OAAAA,CAAQshB,SAAAA,KAAcC,UAAAA,EAAAA;AACvE;AAFgBF,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AC1BT,SAASG,UAAAA,CACdvd,GAAAA,EACAwd,QAAAA,EACAviB,KAAAA,EACAwiB,SAAS,KAAA,EAAK;AAGd,EAAA,IAAInc,OAAOyU,SAAAA,CAAU2H,cAAAA,CAAejT,IAAAA,CAAKzK,GAAAA,EAAKwd,QAAAA,CAAAA,EAAW;AACvD,IAAA,OAAO,KAAA;AACT,EAAA;AAGA7Z,EAAAA,MAAAA,CAAOga,MAAAA,CAAO3d,GAAAA,EAAKwd,QAAAA,EAAUviB,OAAOwiB,MAAAA,CAAAA;AACpC,EAAA,OAAO,IAAA;AACT;AAdgBF,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAwBT,SAASK,2BAAAA,CACd5d,KACAO,SAAAA,EAAiB;AAKjB,EAAA,MAAMsd,uBAAuBN,UAAAA,CAAWvd,GAAAA,EAAK,WAAA,EAAatD,IAAAA,CAAKC,KAAG,CAAA;AAClE,EAAA,MAAMmhB,oBAAAA,GAAuBP,UAAAA,CAAWvd,GAAAA,EAAK,WAAA,EAAaO,SAAAA,CAAAA;AAE1D,EAAA,OAAO;AACLsd,IAAAA,oBAAAA;AACAC,IAAAA;AACF,GAAA;AACF;AAdgBF,MAAAA,CAAAA,2BAAAA,EAAAA,6BAAAA,CAAAA;;;AClBhB,IAAMG,qBAAAA,2BAAyBxf,KAAAA,KAAAA;AAC7B,EAAA,MAAMyf,cAAAA,GAAiB;AAAC,IAAA,YAAA;AAAc,IAAA,cAAA;AAAgB,IAAA,WAAA;AAAa,IAAA;;AACnE,EAAA,MAAMlb,OAAQvE,KAAAA,CAAcuE,IAAAA;AAC5B,EAAA,OAAOkb,cAAAA,CAAelV,SAAShG,IAAAA,CAAAA,IAC5BvE,MAAMmE,OAAAA,IAAW,oCAAA,CAAqC0O,IAAAA,CAAK7S,KAAAA,CAAMmE,OAAO,CAAA;AAC7E,CAAA,EAL8B,uBAAA,CAAA;AAU9B,IAAMub,cAAAA,GAAiB;;EAErB9P,OAAAA,EAAS,GAAA;;EAET2O,mBAAAA,EAAqB,cAAA;;EAErBD,aAAAA,EAAe,WAAA;;EAEfQ,SAAAA,EAAWD,UAAAA;;EAEX5P,QAAAA,EAAU,OAAA;;EAEV0Q,WAAAA,EAAa,KAAA;;EAEbC,UAAAA,EAAY,KAAA;;;;EAIZtS,WAAAA,EAAa;;;;;;;;;;;;;AAaXuS,IAAAA,iBAAAA,EAAmB,EAAC;;;;IAIpBtS,eAAAA,EAAiB,UAAA;;;;IAIjBuS,cAAAA,EAAgB,GAAA;;;;IAIhBhS,WAAAA,EAAa;AACf,GAAA;;;;EAKApP,iBAAAA,EAAmB;;;;IAIjBkP,QAAAA,EAAU,iCAAA;;;;;IAKVmS,cAAAA,EAAgB,KAAA;;;;AAIhB3V,IAAAA,OAAAA,EAAS,EAAC;;;;AAIV4V,IAAAA,kBAAAA,EAAoB,EAAC;;;;AAIrBzD,IAAAA,gBAAAA,EAAkB,EAAA;;;;IAIlB3M,OAAAA,EAAS,GAAA;;;;IAITvR,WAAAA,EAAa,GAAA;;;;IAIbE,cAAAA,EAAgB,GAAA;;;;;;;;IAShBD,YAAAA,EAAc,CAAA;;;;IAId6c,iBAAAA,EAAmB,IAAA;;;;IAInBE,kBAAAA,EAAoB,GAAA;;;;IAIpBE,gBAAAA,EAAkB,GAAA;;;;IAIlBE,kBAAAA,EAAoB;AACtB,GAAA;;;;EAIAwE,SAAAA,EAAW;;;;IAITxD,OAAAA,EAAS,KAAA;;;;IAITlc,KAAAA,EAAO,CAAA;;;;IAIP2f,QAAAA,EAAU;AAKZ;AACF,CAAA;AAoBO,SAASC,KAAAA,CAAM3iB,SAAuB4P,GAAAA,EAAW;AACtD5P,EAAAA,OAAAA,GAAU;IAAE,GAAGkiB,cAAAA;IAAgB,GAAGliB;AAAQ,GAAA;AAK1C,EAAA,IAAIiH,WAAAA;AACJ,EAAA,IAAImY,GAAAA;AACJ,EAAA,IAAIwD,eAAAA;AAGJ,EAAA,IAAI5iB,OAAAA,CAAQmiB,WAAAA,IAAeniB,OAAAA,CAAQ8P,WAAAA,EAAaC,eAAAA,EAAiB;AAC/D,IAAA,IAAI;AACF6S,MAAAA,eAAAA,GAAkBjT,sBAAAA,CAAuBC,KAAK5P,OAAAA,CAAAA;AAC9C,MAAA,IAAI4iB,eAAAA,EAAiB;AACnB5P,QAAAA,aAAAA,CAAO8H,MAAM,wCAAA,CAAA;AACf,MAAA;AACF,IAAA,CAAA,CAAA,OAAStY,KAAAA,EAAO;AACdwQ,MAAAA,aAAAA,CAAOjL,KAAAA,CAAM,0CAAA,EAA4CvF,KAAAA,CAAAA;AAC3D,IAAA;AACF,EAAA;AAGA,EAAA,IAAIxC,QAAQmiB,WAAAA,EAAa;AACvB,IAAA,IAAI;AACFlb,MAAAA,WAAAA,GAAc,IAAIxH,YAAYO,OAAAA,CAAAA;AAC9B4H,MAAAA,MAAAA,CAAOga,MAAAA,CAAOhS,GAAAA,EAAK,aAAA,EAAe3I,WAAAA,CAAAA;AAClC+L,MAAAA,aAAAA,CAAO8H,MAAM,kCAAA,CAAA;AACf,IAAA,CAAA,CAAA,OAAStY,KAAAA,EAAO;AACdwQ,MAAAA,aAAAA,CAAOjL,KAAAA,CAAM,2CAAA,EAA6CvF,KAAAA,CAAAA;AAC5D,IAAA;AACF,EAAA;AAGA,EAAA,IAAIxC,QAAQmiB,WAAAA,EAAa;AACvB,IAAA,IAAI;AACF/C,MAAAA,GAAAA,GAAM/B,OAAAA,CAAQzN,KAAK5P,OAAAA,CAAAA;AACnB4H,MAAAA,MAAAA,CAAOga,MAAAA,CAAOhS,GAAAA,EAAK,SAAA,EAAWwP,GAAAA,CAAAA;AAC9BpM,MAAAA,aAAAA,CAAO8H,MAAM,uCAAA,CAAA;AAGblL,MAAAA,GAAAA,CAAIpO,IAAAA,CAAKqhB,QAAAA,CAASC,QAAAA,EAAU,YAAA;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM3D,WAAAA,CAAYC,GAAAA,EAAKxP,GAAAA,EAAK5P,OAAAA,CAAAA;AAC5B,UAAA,MAAMgE,MAAAA,GAASob,IAAI2D,SAAAA,EAAS;AAC5Bnb,UAAAA,MAAAA,CAAOga,MAAAA,CAAOhS,GAAAA,EAAK,YAAA,EAAc5L,MAAAA,CAAAA;AACjCgP,UAAAA,aAAAA,CAAO8H,MAAM,wBAAA,CAAA;AACf,QAAA,CAAA,CAAA,OAAStY,KAAAA,EAAO;AACdwQ,UAAAA,aAAAA,CAAOjL,KAAAA,CAAM,iCAAA,EAAmCvF,KAAAA,CAAAA;AAClD,QAAA;MACF,CAAA,CAAA;AACF,IAAA,CAAA,CAAA,OAASA,KAAAA,EAAO;AACdwQ,MAAAA,aAAAA,CAAOjL,KAAAA,CAAM,iDAAA,EAAmDvF,KAAAA,CAAAA;AAClE,IAAA;AACF,EAAA;AAGAoN,EAAAA,GAAAA,CAAIpO,IAAAA,CAAKqhB,QAAAA,CAASG,OAAAA,EAAS,YAAA;AACzBhQ,IAAAA,aAAAA,CAAO8H,MAAM,iDAAA,CAAA;AAEb,IAAA,IAAI;AAEF,MAAA,IAAI7T,WAAAA,EAAa;AACfA,QAAAA,WAAAA,CAAYxF,OAAAA,EAAO;AACnBuR,QAAAA,aAAAA,CAAO8H,MAAM,gCAAA,CAAA;AACf,MAAA;AAGA,MAAA,IAAIsE,GAAAA,EAAK;AACP,QAAA,MAAMA,IAAIE,QAAAA,EAAQ;AAClBtM,QAAAA,aAAAA,CAAO8H,MAAM,oCAAA,CAAA;AACf,MAAA;AAGA,MAAA,IAAI8H,eAAAA,EAAiB;AAEnB5P,QAAAA,aAAAA,CAAO8H,MAAM,mCAAA,CAAA;AACf,MAAA;AAEA9H,MAAAA,aAAAA,CAAO8H,MAAM,mDAAA,CAAA;AACf,IAAA,CAAA,CAAA,OAAStY,KAAAA,EAAO;AACdwQ,MAAAA,aAAAA,CAAOjL,KAAAA,CAAM,sCAAA,EAAwCvF,KAAAA,CAAAA;AACvD,IAAA;EACF,CAAA,CAAA;AAGA,EAAA,MAAMygB,SAAAA,GAAY;AAChB9gB,IAAAA,KAAAA,EAAOyN,GAAAA,CAAIsT,QAAAA;AACX9Q,IAAAA,OAAAA,EAASpS,OAAAA,CAAQoS,OAAAA;AACjBX,IAAAA,QAAAA,EAAUzR,OAAAA,CAAQyR,QAAAA;AAClB,IAAA,IAAI9J,kBAAAA,GAAqB;AACvB,MAAA,MAAMJ,OAAAA,GAAUE,YAAAA,CAAa0b,QAAAA,CAAS,kBAAA,EAAoB,WAAA,CAAA;AAC1D5d,MAAAA,MAAAA,CAAOyH,cAAAA,CAAe,MAAM,oBAAA,EAAsB;QAAE9N,KAAAA,EAAOqI;OAAQ,CAAA;AACnE,MAAA,OAAOA,OAAAA;AACT,IAAA;AACF,GAAA;AAEA,EAAA,OAAO,OAAOtD,KAAoBkO,IAAAA,KAAAA;AAIhC,IAAA,MAAMiR,eAAAA,GAAAA,CAAmBnf,GAAAA,EAAK+H,QAAAA,IAAY,MAAA,EAAQiV,WAAAA,EAAW;AAC7D,IAAA,IAAIoC,YAAAA;AAEJ,IAAA,IAAIpgB,KAAAA,CAAMke,OAAAA,CAAQvR,GAAAA,CAAI0T,MAAM,CAAA,EAAG;AAE7BD,MAAAA,YAAAA,GAAezT,GAAAA,CAAI0T,MAAAA,CAAO/E,IAAAA,CAAK,CAAC+E,MAAAA,KAAAA;AAC9B,QAAA,MAAMC,cAAAA,GAAiBD,MAAAA,EAAQtX,QAAAA,EAAUiV,WAAAA,EAAAA;AAEzC,QAAA,IAAImC,eAAAA,KAAoB,OAAA,IAAWA,eAAAA,KAAoB,OAAA,IAAWA,oBAAoB,OAAA,EAAS;AAC7F,UAAA,OAAOG,mBAAmB,MAAA,IAAUA,cAAAA,KAAmB,OAAA,IAChDA,cAAAA,KAAmB,WAAWA,cAAAA,KAAmB,OAAA;AAC1D,QAAA;AACA,QAAA,IAAIH,oBAAoB,KAAA,EAAO;AAC7B,UAAA,OAAOG,cAAAA,KAAmB,QAAQA,cAAAA,KAAmB,KAAA;AACvD,QAAA;AACA,QAAA,OAAOA,cAAAA,KAAmBH,eAAAA;MAC5B,CAAA,CAAA;IACF,CAAA,MAAO;AACLC,MAAAA,YAAAA,GAAezT,GAAAA,CAAI0T,MAAAA;AACrB,IAAA;AAEA,IAAA,IAAID,YAAAA,EAAcxc,WAAW,GAAA,EAAK;AAChC5C,MAAAA,GAAAA,CAAI4C,MAAAA,GAAS,GAAA;AACb5C,MAAAA,GAAAA,CAAI1E,GAAAA,CAAI,cAAc,OAAA,CAAA;AACtB0E,MAAAA,GAAAA,CAAIwO,IAAAA,GAAO,2CAAA;AACX,MAAA;AACF,IAAA;AAGA,IAAA,MAAMjO,SAAAA,GAAYmc,YAAAA,CAAa1c,GAAAA,EAAKjE,OAAAA,CAAAA;AACpC6hB,IAAAA,2BAAAA,CAA4B5d,KAAKO,SAAAA,CAAAA;AAIjC,IAAA,IAAIxE,OAAAA,CAAQmiB,eAAelb,WAAAA,EAAa;AACtC,MAAA,MAAMjD,SAAU4L,GAAAA,CAAY4T,UAAAA;AAC5B,MAAA,IAAIxf,MAAAA,EAAQ;AACV,QAAA,MAAME,WAAAA,GAAc0L,IAAI3J,IAAAA,IAAQ,sBAAA;AAChCgB,QAAAA,WAAAA,CAAYlD,UAAAA,CAAWC,MAAAA,EAAQC,GAAAA,EAAKC,WAAAA,CAAAA;AAEtC,MAAA;AACF,IAAA;AAGA,IAAA,IAAIlE,OAAAA,CAAQkB,iBAAAA,EAAmBqhB,cAAAA,IAAkBviB,OAAAA,CAAQmiB,WAAAA,EAAa;AACpE,MAAA,MAAMsB,QAAAA,GAAW1D,iBAAiB3Q,WAAAA,EAAW;AAC7C,MAAA,MAAMlL,cAAcjB,KAAAA,CAAMke,OAAAA,CAAQld,GAAAA,CAAI2I,OAAAA,CAAQ,SAAA,CAAU,CAAA,GACpD3I,GAAAA,CAAI2I,OAAAA,CAAQ,SAAA,CAAA,CAAW,CAAA,IACvB3I,GAAAA,CAAI2I,OAAAA,CAAQ,SAAA,CAAA,IAAc,SAAA;AAC9B6W,MAAAA,QAAAA,CAASxD,uBAAAA,CAAwBrQ,GAAAA,CAAI3J,IAAAA,EAAM/B,WAAAA,CAAAA;AAC7C,IAAA;AAGA,IAAA,MAAMwC,GAAAA,GAAMnB,MAAAA,CAAOme,MAAAA,CAAOT,SAAAA,CAAAA;AAC1Bvc,IAAAA,GAAAA,CAAIlC,SAAAA,GAAYA,SAAAA;AAChBkC,IAAAA,GAAAA,CAAI2L,UAAAA,GAAa,KAAA;AACjB3L,IAAAA,GAAAA,CAAIO,WAAAA,GAAcA,WAAAA;AAGlB,IAAA,IAAIjH,OAAAA,CAAQoiB,UAAAA,KAAene,GAAAA,CAAI0I,GAAAA,IAAO1I,IAAI+P,GAAAA,CAAAA,EAAM;AAC9C,MAAA,MAAMmG,gBAAgBR,mBAAAA,EAAAA;AACtB,MAAA,OAAOJ,iBAAAA,CAAkBoK,GAAAA,CAAInf,SAAAA,EAAW,MAAA;AACtC,QAAA,IAAIP,GAAAA,CAAI0I,GAAAA,EAAKsN,WAAAA,CAAYhW,GAAAA,CAAI0I,KAAKwN,aAAAA,CAAAA;AAClC,QAAA,IAAIlW,GAAAA,CAAI+P,GAAAA,EAAKiG,WAAAA,CAAYhW,GAAAA,CAAI+P,KAAKmG,aAAAA,CAAAA;AAClC,QAAA,OAAOyJ,aAAAA,CAAc3f,GAAAA,EAAKkO,IAAAA,EAAMnS,OAAAA,EAAS0G,GAAAA,CAAAA;MAC3C,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,OAAOkd,aAAAA,CAAc3f,GAAAA,EAAKkO,IAAAA,EAAMnS,OAAAA,EAAS0G,GAAAA,CAAAA;AAC3C,EAAA,CAAA;AACF;AA3KgBic,MAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA;AA6LhB,eAAeiB,aAAAA,CACb3f,GAAAA,EACAkO,IAAAA,EACAnS,OAAAA,EACA0G,GAAAA,EAAqB;AAErB,EAAA,MAAMxG,SAAAA,GAAY2jB,YAAYjjB,GAAAA,EAAG;AACjC,EAAA,IAAIqb,MAAAA;AACJ,EAAA,MAAMwG,SAAAA,GAAYziB,QAAQyiB,SAAAA,IAAa;IAAExD,OAAAA,EAAS;AAAM,GAAA;AAExD,EAAA,IAAI;AACF,IAAA,IAAIwD,UAAUxD,OAAAA,EAAS;AACrB,MAAA,MAAM/D,UAAAA,GAAauH,UAAU1f,KAAAA,IAAS,CAAA;AACtC,MAAA,MAAM2f,QAAAA,GAAWD,UAAUC,QAAAA,IAAY,GAAA;AAEvC,MAAA,KAAA,IAAS1G,OAAAA,GAAU,CAAA,EAAGA,OAAAA,IAAWd,UAAAA,EAAYc,OAAAA,EAAAA,EAAW;AACtD,QAAA,IAAI;AACFC,UAAAA,MAAAA,GAAS,MAAM6H,UAAAA,CAAW7f,GAAAA,EAAKkO,IAAAA,EAAMnS,SAAS0G,GAAAA,CAAAA;AAC9C,UAAA;AACF,QAAA,CAAA,CAAA,OAASlE,KAAAA,EAAO;AAEd,UAAA,MAAMuhB,WAAAA,GAActB,UAAUuB,UAAAA,GAC1BvB,SAAAA,CAAUuB,WAAWxhB,KAAAA,CAAAA,GACrBwf,sBAAsBxf,KAAAA,CAAAA;AAE1B,UAAA,IAAI,CAACuhB,WAAAA,IAAe/H,OAAAA,KAAYd,UAAAA,EAAY;AAC1C,YAAA,MAAM1Y,KAAAA;AACR,UAAA;AAGA,UAAA,IAAIkgB,WAAW,CAAA,EAAG;AAChB,YAAA,MAAM,IAAIjT,OAAAA,CAAQC,CAAAA,YAAW5K,UAAAA,CAAW4K,OAAAA,EAASgT,QAAAA,CAAAA,CAAAA;AACnD,UAAA;AACF,QAAA;AACF,MAAA;IACF,CAAA,MAAO;AACLzG,MAAAA,MAAAA,GAAS,MAAM6H,UAAAA,CAAW7f,GAAAA,EAAKkO,IAAAA,EAAMnS,SAAS0G,GAAAA,CAAAA;AAChD,IAAA;EACF,CAAA,SAAA;AAEE,IAAA,MAAMqF,QAAAA,GAAW8X,WAAAA,CAAYjjB,GAAAA,EAAG,GAAKV,SAAAA;AAGrC4L,IAAAA,qBAAAA,CAAsB7H,KAAK8H,QAAAA,CAAAA;AAG3B,IAAA,MAAM+D,WAAAA,GAAc9P,OAAAA,CAAQ8P,WAAAA,IAAe,EAAC;AAC5C,IAAA,IAAIA,YAAYmU,QAAAA,EAAU;AACxB,MAAA,IAAI;AACFnU,QAAAA,WAAAA,CAAYmU,QAAAA,CAAS;AACnBlY,UAAAA,QAAAA;AACAlF,UAAAA,MAAAA,EAAQ5C,IAAI4C,MAAAA,IAAU,GAAA;AACtBjB,UAAAA,IAAAA,EAAM3B,GAAAA,CAAI2B,IAAAA;UACVrB,UAAAA,EAAY;YACV,GAAIuL,WAAAA,CAAYuS,qBAAqB,EAAC;AACtC7d,YAAAA,SAAAA,EAAWP,GAAAA,CAAIO,SAAAA;AACfmB,YAAAA,MAAAA,EAAQ1B,GAAAA,CAAI0B,MAAAA;AACZqG,YAAAA,QAAAA,EAAU/H,GAAAA,CAAI+H;AAChB;SACF,CAAA;AACF,MAAA,CAAA,CAAA,OAASxJ,KAAAA,EAAO;AAEdwQ,QAAAA,aAAAA,CAAO+B,IAAAA,CAAK,yBAAA,EAA2BvS,KAAAA,CAAAA;AACzC,MAAA;AACF,IAAA;AAGA,IAAA,IAAIkE,IAAIO,WAAAA,EAAa;AACnB,MAAA,MAAMrH,IAAAA,GAAO8G,GAAAA,CAAIO,WAAAA,CAAYrC,OAAAA,CAAQX,GAAAA,CAAAA;AACrC,MAAA,IAAIrE,IAAAA,EAAM;AACR,QAAA,IAAI;AACFA,UAAAA,IAAAA,CAAKwH,SAAAA,CAAU;AAAEL,YAAAA,IAAAA,EAAM9C,GAAAA,CAAI4C,MAAAA,IAAU,GAAA,GAAMqd,cAAAA,CAAeC,QAAQD,cAAAA,CAAeE;WAAG,CAAA;AACpF1d,UAAAA,GAAAA,CAAIO,WAAAA,CAAYf,QAAQjC,GAAAA,CAAAA;AAC1B,QAAA,CAAA,CAAA,OAASzB,KAAAA,EAAO;AACdwQ,UAAAA,aAAAA,CAAO+B,IAAAA,CAAK,oBAAA,EAAsBvS,KAAAA,CAAAA;AACpC,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA,OAAOyZ,MAAAA;AACT;AAjFe2H,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AA6Ff,eAAeE,UAAAA,CACb7f,GAAAA,EACAkO,IAAAA,EACAnS,OAAAA,EACA0G,GAAAA,EAAqB;AAErB,EAAA,IAAI1G,OAAAA,CAAQ8gB,aAAAA,IAAiB7c,GAAAA,CAAIogB,WAAAA,EAAa;AAC5CpgB,IAAAA,GAAAA,CAAIogB,WAAAA,CAAYrkB,OAAAA,CAAQ8gB,aAAAA,EAAe7c,GAAAA,CAAIO,SAAS,CAAA;AACtD,EAAA;AAEA,EAAA,MAAMwH,QAAAA,GAAAA,CAAY/H,GAAAA,EAAK+H,QAAAA,IAAY,MAAA,EAAQiV,WAAAA,EAAW;AACtD,EAAA,IAAIjV,QAAAA,KAAa,MAAA,IAAUA,QAAAA,KAAa,IAAA,IAAQA,aAAa,KAAA,EAAO;AAClE/H,IAAAA,GAAAA,CAAI6R,OAAAA,GAAU,KAAA;AAChB,EAAA;AAEA,EAAA,IAAI9V,QAAQ+gB,mBAAAA,EAAqB;AAC/B9c,IAAAA,GAAAA,CAAI1E,GAAAA,CAAIS,OAAAA,CAAQ+gB,mBAAAA,EAAqB9c,GAAAA,CAAIO,SAAS,CAAA;AACpD,EAAA;AAEA,EAAA,IAAIP,GAAAA,CAAI6I,GAAAA,EAAK4B,IAAAA,EAAMC,QAAAA,IAAY3O,QAAQ8gB,aAAAA,EAAe;AACpD7c,IAAAA,GAAAA,CAAI6I,IAAI4B,IAAAA,CAAKC,QAAAA,CAASpP,IAAIS,OAAAA,CAAQ8gB,aAAAA,EAAe7c,IAAIO,SAAS,CAAA;AAChE,EAAA;AAEA,EAAA,MAAM+C,OAAAA,GAAUyR,cAAAA,CAAeM,UAAAA,CAAWtN,QAAAA,CAAAA;AAC1C,EAAA,OAAOzE,OAAAA,CAAQyP,MAAAA,CAAO/S,GAAAA,EAAKkO,IAAAA,EAAMzL,GAAAA,CAAAA;AACnC;AAzBeod,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA","file":"index.mjs","sourcesContent":["/**\n * @ author: richen\n * @ copyright: Copyright (c) - <richenlin(at)gmail.com>\n * @ license: BSD (3-Clause)\n * @ version: 2025-01-15 10:00:00\n */\n\n/**\n * 原子计数器 - 确保线程安全的计数操作\n * 注意: JavaScript 是单线程的，原子性由事件循环保证\n * 用于 SpanManager 的并发安全统计\n */\nexport class AtomicCounter {\n  private value = 0;\n  \n  /**\n   * 递增计数器并返回新值\n   */\n  increment(): number {\n    return ++this.value;\n  }\n  \n  /**\n   * 递减计数器并返回新值\n   */\n  decrement(): number {\n    return --this.value;\n  }\n  \n  /**\n   * 获取当前值\n   */\n  get(): number {\n    return this.value;\n  }\n  \n  /**\n   * 重置计数器为0\n   */\n  reset(): void {\n    this.value = 0;\n  }\n  \n  /**\n   * 设置计数器为指定值\n   */\n  set(val: number): void {\n    this.value = val;\n  }\n}\n","/*\n * @Description: Enhanced SpanManager with improved concurrency safety and performance\n * @Usage: \n * @Author: richen\n * @Date: 2020-11-20 17:37:32\n * @LastEditors: Please set LastEditors\n * @LastEditTime: 2023-11-10 22:18:40\n * @License: BSD (3-Clause)\n * @Copyright (c) - <richenlin(at)gmail.com>\n */\nimport { Span, context, trace, Tracer, SpanAttributes } from '@opentelemetry/api';\nimport { defaultTextMapSetter } from '@opentelemetry/api';\nimport { W3CTraceContextPropagator } from \"@opentelemetry/core\";\nimport { KoattyContext } from \"koatty_core\";\nimport { DefaultLogger as logger } from \"koatty_logger\";\nimport { TraceOptions } from \"../trace/itrace\";\nimport { AtomicCounter } from './atomicCounter';\n\n/**\n * Interface for active span tracking\n */\ninterface ActiveSpanEntry {\n  span: Span;\n  timer: NodeJS.Timeout;\n  createdAt: number;\n  requestId?: string;\n}\n\n/**\n * Enhanced SpanManager class for managing OpenTelemetry spans in a Koatty application.\n * Provides improved concurrency safety, memory management, and performance optimization.\n * \n * Features:\n * - Thread-safe span management with atomic operations\n * - Automatic span timeout management with configurable cleanup\n * - Memory limit control with LRU eviction strategy\n * - Sampling rate configuration with performance optimization\n * - W3C trace context propagation\n * - Custom span attributes support with validation\n * - Comprehensive error handling and recovery\n * - Memory usage monitoring and alerting\n * \n * @class SpanManager\n * @exports\n */\nexport class SpanManager {\n  private readonly activeSpans = new Map<string, ActiveSpanEntry>();\n  private span: Span | undefined;\n  // ✅ 添加 WeakMap 用于存储 ctx -> span 映射\n  private readonly contextSpans = new WeakMap<KoattyContext, Span>();\n  private readonly propagator: W3CTraceContextPropagator;\n  private readonly options: NonNullable<TraceOptions['opentelemetryConf']>;\n  private readonly cleanupInterval: NodeJS.Timeout;\n  private readonly startTime: number;\n  private isDestroyed = false;\n\n  // ✅ 替换统计计数器为 AtomicCounter\n  private readonly stats = {\n    spansCreated: new AtomicCounter(),\n    spansEnded: new AtomicCounter(),\n    spansTimedOut: new AtomicCounter(),\n    memoryEvictions: new AtomicCounter(),\n    errors: new AtomicCounter()\n  };\n\n  constructor(options: TraceOptions) {\n    this.propagator = new W3CTraceContextPropagator();\n    this.startTime = Date.now();\n    this.options = {\n      spanTimeout: 30000,\n      samplingRate: 1.0,\n      maxActiveSpans: 1000,\n      spanAttributes: undefined,\n      ...options.opentelemetryConf\n    };\n\n    // Setup periodic cleanup to prevent memory leaks\n    this.cleanupInterval = setInterval(() => {\n      this.performPeriodicCleanup();\n    }, Math.min(this.options.spanTimeout || 30000, 60000)); // Cleanup every minute or span timeout, whichever is smaller\n\n    // Setup graceful shutdown\n    process.once('SIGTERM', () => this.destroy());\n    process.once('SIGINT', () => this.destroy());\n  }\n\n  /**\n   * Perform periodic cleanup of expired spans and memory monitoring\n   */\n  private performPeriodicCleanup(): void {\n    if (this.isDestroyed) return;\n\n    try {\n      const now = Date.now();\n      const expiredSpans: string[] = [];\n      \n      // Find expired spans\n      for (const [traceId, entry] of this.activeSpans) {\n        const age = now - entry.createdAt;\n        if (age > (this.options.spanTimeout || 30000)) {\n          expiredSpans.push(traceId);\n        }\n      }\n\n      // Clean up expired spans\n      for (const traceId of expiredSpans) {\n        this.forceEndSpan(traceId, 'timeout');\n      }\n\n      // Memory pressure check\n      this.checkMemoryPressure();\n\n      // Log stats periodically\n      if (typeof logger.debug === 'function' && this.activeSpans.size > 0) {\n        logger.debug('SpanManager stats:', {\n          activeSpans: this.activeSpans.size,\n          spansCreated: this.stats.spansCreated.get(),\n          spansEnded: this.stats.spansEnded.get(),\n          spansTimedOut: this.stats.spansTimedOut.get(),\n          memoryEvictions: this.stats.memoryEvictions.get(),\n          errors: this.stats.errors.get(),\n          memoryUsage: Math.round(process.memoryUsage().heapUsed / 1024 / 1024) + 'MB'\n        });\n      }\n    } catch (error) {\n      this.stats.errors.increment();\n      logger.error('Error during periodic cleanup:', error);\n    }\n  }\n\n  /**\n   * Check memory pressure and perform eviction if necessary\n   */\n  private checkMemoryPressure(): void {\n    const maxSpans = this.options.maxActiveSpans || 1000;\n    \n    if (this.activeSpans.size >= maxSpans) {\n      const evictCount = Math.ceil(maxSpans * 0.1); // Evict 10% of max capacity\n      this.evictOldestSpans(evictCount);\n    }\n\n    // Check system memory pressure\n    const memUsage = process.memoryUsage();\n    if (memUsage.heapUsed > 500 * 1024 * 1024) { // 500MB threshold\n      logger.warn('High memory usage detected, performing aggressive span cleanup');\n      this.evictOldestSpans(Math.ceil(this.activeSpans.size * 0.2)); // Evict 20%\n    }\n  }\n\n  /**\n   * Evict oldest spans to free memory\n   */\n  private evictOldestSpans(count: number): void {\n    const sortedEntries = Array.from(this.activeSpans.entries())\n      .sort(([, a], [, b]) => a.createdAt - b.createdAt)\n      .slice(0, count);\n\n    for (const [traceId] of sortedEntries) {\n      this.forceEndSpan(traceId, 'memory_pressure');\n      this.stats.memoryEvictions.increment();\n    }\n\n    if (sortedEntries.length > 0) {\n      logger.warn(`Evicted ${sortedEntries.length} oldest spans due to memory pressure`);\n    }\n  }\n\n  /**\n   * Force end a span with proper cleanup\n   */\n  private forceEndSpan(traceId: string, reason: string): void {\n    const entry = this.activeSpans.get(traceId);\n    if (!entry) return;\n\n    try {\n      clearTimeout(entry.timer);\n      entry.span.addEvent('span_forced_end', { reason });\n      entry.span.end();\n      this.activeSpans.delete(traceId);\n      \n      if (reason === 'timeout') {\n        this.stats.spansTimedOut.increment();\n      }\n      \n      logger.debug(`Span force-ended: ${traceId}, reason: ${reason}`);\n    } catch (error) {\n      this.stats.errors.increment();\n      logger.error(`Error force-ending span ${traceId}:`, error);\n    }\n  }\n\n  /**\n   * Create a new span with enhanced safety and performance\n   */\n  createSpan(tracer: Tracer, ctx: KoattyContext, serviceName: string): Span | undefined {\n    if (this.isDestroyed) {\n      logger.warn('SpanManager is destroyed, cannot create span');\n      return undefined;\n    }\n\n    try {\n      // ✅ 检查是否已存在 span (幂等性)\n      if (this.contextSpans.has(ctx)) {\n        logger.warn('Span already exists for this context');\n        return this.contextSpans.get(ctx);\n      }\n\n      // Apply sampling\n      const shouldSample = Math.random() < (this.options.samplingRate || 1.0);\n      if (!shouldSample) {\n        return undefined;\n      }\n\n      // Validate tracer\n      if (!tracer?.startSpan) {\n        logger.error('Invalid tracer provided to createSpan');\n        this.stats.errors.increment();\n        return undefined;\n      }\n\n      // Create span\n      const span = tracer.startSpan(serviceName, {\n        attributes: {\n          'service.name': serviceName,\n          'request.id': ctx.requestId || 'unknown'\n        }\n      });\n\n      // ✅ 存储到 WeakMap\n      this.contextSpans.set(ctx, span);\n      // 保持向后兼容，同时设置 this.span\n      this.span = span;\n      \n      this.stats.spansCreated.increment();\n      \n      // ✅ 传递 span 参数\n      this.setupSpanTimeout(ctx, span);\n      this.injectContext(ctx, span);\n      this.setBasicAttributes(ctx, span);\n\n      return span;\n    } catch (error) {\n      this.stats.errors.increment();\n      logger.error('Error creating span:', error);\n      return undefined;\n    }\n  }\n\n  /**\n   * Get current span safely\n   * @param ctx - KoattyContext to get span for (optional for backward compatibility)\n   */\n  getSpan(ctx?: KoattyContext): Span | undefined {\n    if (ctx) {\n      return this.contextSpans.get(ctx);\n    }\n    // 向后兼容：如果没有传 ctx，返回 this.span\n    return this.span;\n  }\n\n  /**\n   * Setup span timeout with enhanced error handling\n   * @param ctx - KoattyContext\n   * @param span - Span instance\n   */\n  setupSpanTimeout(ctx: KoattyContext, span: Span): void {\n    if (!this.options.spanTimeout || !span || this.isDestroyed) return;\n\n    const traceId = span.spanContext().traceId;\n    \n    // Check if span already exists (avoid duplicates)\n    if (this.activeSpans.has(traceId)) {\n      logger.warn(`Span ${traceId} already exists in active spans`);\n      return;\n    }\n\n    let timer: NodeJS.Timeout | null = null;\n    \n    try {\n      timer = setTimeout(() => {\n        this.forceEndSpan(traceId, 'timeout');\n      }, this.options.spanTimeout);\n\n      // Add to active spans with atomic operation\n      this.activeSpans.set(traceId, { \n        span,\n        timer,\n        createdAt: Date.now(),\n        requestId: ctx.requestId\n      });\n\n      // Check memory limits after adding (this ensures we check the current size)\n      this.checkMemoryPressure();\n\n    } catch (error) {\n      if (timer) {\n        clearTimeout(timer);\n      }\n      // Remove from activeSpans if it was added\n      this.activeSpans.delete(traceId);\n      this.stats.errors.increment();\n      logger.error('Failed to setup span timeout:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Inject context with error handling\n   * @param ctx - KoattyContext\n   * @param span - Span instance\n   */\n  injectContext(ctx: KoattyContext, span: Span): void {\n    if (!span || this.isDestroyed) return;\n    \n    try {\n      const carrier: { [key: string]: string } = {};\n      context.with(trace.setSpan(context.active(), span), () => {\n        this.propagator.inject(context.active(), carrier, defaultTextMapSetter);\n        Object.entries(carrier).forEach(([key, value]) => {\n          if (ctx.set && typeof ctx.set === 'function') {\n            ctx.set(key, value);\n          }\n        });\n      });\n    } catch (error) {\n      this.stats.errors.increment();\n      logger.error('Error injecting context:', error);\n    }\n  }\n\n  /**\n   * Set basic attributes with validation\n   * @param ctx - KoattyContext\n   * @param span - Span instance\n   */\n  setBasicAttributes(ctx: KoattyContext, span: Span): void {\n    if (!span || this.isDestroyed) return;\n    \n    try {\n      // Set safe attributes\n      const safeAttributes: SpanAttributes = {};\n      \n      if (ctx.requestId) {\n        safeAttributes[\"http.request_id\"] = ctx.requestId;\n      }\n      if (ctx.method) {\n        safeAttributes[\"http.method\"] = ctx.method;\n      }\n      if (ctx.path) {\n        safeAttributes[\"http.route\"] = ctx.path;\n      }\n\n      span.setAttributes(safeAttributes);\n\n      // Apply custom attributes if provided\n      if (this.options.spanAttributes && typeof this.options.spanAttributes === 'function') {\n        try {\n          const customAttrs = this.options.spanAttributes(ctx);\n          if (customAttrs && typeof customAttrs === 'object') {\n            span.setAttributes(customAttrs);\n          }\n        } catch (error) {\n          logger.error('Error applying custom span attributes:', error);\n        }\n      }\n    } catch (error) {\n      this.stats.errors.increment();\n      logger.error('Error setting basic attributes:', error);\n    }\n  }\n\n  /**\n   * Set span attributes safely\n   * @param ctx - KoattyContext\n   * @param attributes - SpanAttributes to set\n   */\n  setSpanAttributes(ctx: KoattyContext, attributes: SpanAttributes): this {\n    const span = this.contextSpans.get(ctx);\n    if (!span || this.isDestroyed) return this;\n    \n    try {\n      span.setAttributes(attributes);\n    } catch (error) {\n      this.stats.errors.increment();\n      logger.error('Error setting span attributes:', error);\n    }\n    return this;\n  }\n\n  /**\n   * Add span event safely\n   * @param ctx - KoattyContext\n   * @param name - Event name\n   * @param attributes - Optional event attributes\n   */\n  addSpanEvent(ctx: KoattyContext, name: string, attributes?: SpanAttributes): void {\n    const span = this.contextSpans.get(ctx);\n    if (!span || this.isDestroyed) return;\n    \n    try {\n      span.addEvent(name, attributes);\n    } catch (error) {\n      this.stats.errors.increment();\n      logger.error('Error adding span event:', error);\n    }\n  }\n\n  /**\n   * End span with proper cleanup\n   * @param ctx - KoattyContext\n   */\n  endSpan(ctx: KoattyContext): void {\n    const span = this.contextSpans.get(ctx);\n    if (!span || this.isDestroyed) return;\n    \n    const traceId = span.spanContext().traceId;\n    \n    try {\n      // Clean up from active spans\n      const entry = this.activeSpans.get(traceId);\n      if (entry) {\n        clearTimeout(entry.timer);\n        this.activeSpans.delete(traceId);\n      }\n\n      // End the span\n      span.end();\n      this.stats.spansEnded.increment();\n      \n      // Clear from WeakMap (context will be GC'd automatically)\n      this.contextSpans.delete(ctx);\n      \n      // Clear current span reference if it matches\n      if (this.span === span) {\n        this.span = undefined;\n      }\n      \n    } catch (error) {\n      this.stats.errors.increment();\n      logger.error(\"SpanManager.endSpan error:\", error);\n    }\n  }\n\n  /**\n   * Get manager statistics\n   */\n  getStats() {\n    return {\n      spansCreated: this.stats.spansCreated.get(),\n      spansEnded: this.stats.spansEnded.get(),\n      spansTimedOut: this.stats.spansTimedOut.get(),\n      memoryEvictions: this.stats.memoryEvictions.get(),\n      errors: this.stats.errors.get(),\n      activeSpansCount: this.activeSpans.size,\n      uptime: Date.now() - this.startTime,\n      isDestroyed: this.isDestroyed,\n      memoryUsage: process.memoryUsage()\n    };\n  }\n\n  /**\n   * Graceful shutdown with cleanup\n   */\n  destroy(): void {\n    if (this.isDestroyed) return;\n    \n    this.isDestroyed = true;\n    \n    try {\n      // Clear cleanup interval\n      if (this.cleanupInterval) {\n        clearInterval(this.cleanupInterval);\n      }\n\n      // End all active spans\n      for (const [traceId] of this.activeSpans) {\n        this.forceEndSpan(traceId, 'manager_destroyed');\n      }\n\n      // End current span\n      if (this.span) {\n        this.span.end();\n        this.span = undefined;\n      }\n\n      logger.info('SpanManager destroyed successfully', this.getStats());\n    } catch (error) {\n      logger.error('Error during SpanManager destruction:', error);\n    }\n  }\n}\n\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2024-11-11 11:36:07\n * @LastEditTime: 2025-03-31 17:51:22\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { IOCContainer } from \"koatty_container\";\nimport { KoattyContext } from \"koatty_core\";\nimport { Exception, isException } from \"koatty_exception\";\nimport { Helper } from \"koatty_lib\";\nimport { Span } from \"@opentelemetry/api\";\nimport { extensionOptions } from \"./itrace\";\nimport { SpanManager } from '../opentelemetry/spanManager';\n\n/**\n * Global error catcher for handling exceptions in Koatty framework.\n * \n * @param ctx - Koatty context object\n * @param err - Error or Exception object to be handled\n * @param ext - Optional extension options\n * @returns Result of error handling through Exception handler\n * \n * @description\n * This function processes errors by:\n * 1. Handling existing Exception objects with spans\n * 2. Using custom global error handlers if provided\n * 3. Falling back to default Exception handling\n */\nexport function catcher<T extends Exception>(\n  ctx: KoattyContext,\n  err: Error | Exception | T,\n  ext?: extensionOptions\n) {\n  const { message: sanitizedMessage, status } = getErrorInfo(ctx, err);\n  const code = (<T>err).code || 1;\n  const stack = err.stack;\n  const span = ext.spanManager?.getSpan();\n\n  // 如果是异常对象，直接返回\n  if (isException(err)) {\n    return (<Exception>err).setCode(code).setStatus(status).\n      setMessage(sanitizedMessage).setSpan(span).setStack(stack).handler(ctx);\n  }\n  // 执行自定义全局异常处理\n  const ins: Exception = IOCContainer.getInsByClass(ext.globalErrorHandler,\n    [sanitizedMessage, code, status, stack, span])\n  if (Helper.isFunction(ins?.handler)) {\n    return ins.handler(ctx);\n  }\n\n  // 使用默认异常处理\n  return new Exception(sanitizedMessage, code, status, stack, span).handler(ctx);\n}\n\n/**\n * Get error information including status code and sanitized message\n * @param ctx KoattyContext - The Koatty context object\n * @param err Error | Exception - The error object\n * @returns {Object} - Object containing:\n *   - status: {number} HTTP status code\n *   - message: {string} Sanitized error message\n * @description\n * This function provides comprehensive error information by:\n * 1. Determining appropriate HTTP status code based on:\n *    - Explicit status from error object\n *    - Context status\n *    - Default 500 for unhandled errors\n * 2. Extracting and sanitizing error message by:\n *    - Using error.message if available\n *    - Falling back to context.message\n *    - Escaping double quotes to prevent JSON injection\n * 3. Handling various error types:\n *    - Built-in Error objects\n *    - Custom Exception objects\n *    - Context-specific errors\n */\nfunction getErrorInfo<T extends Exception>(ctx: KoattyContext,\n  err: Error | Exception | T) {\n  // Status code determination\n  let status = 500; // 默认 500（服务器错误）\n  if ('status' in err && typeof err.status === 'number') {\n    status = err.status;\n  } else if (err instanceof Error) {\n    status = 500; // 确保 throw new Error() 不会误判为 404\n  } else if (ctx.status === 404 && !(ctx.response as any)._explicitStatus) {\n    status = 404; // 未匹配路由的默认 404\n  } else {\n    status = ctx.status || 500;\n  }\n\n  // Message extraction and sanitization\n  let message = \"\";\n  try {\n    message = (err?.message ?? ctx?.message ?? \"\").toString();\n    // Escape double quotes to prevent JSON injection\n    message = message.replace(/\"/g, '\\\\\"');\n  } catch (e) {\n    message = \"\";\n  }\n\n  return { status, message };\n}","/**\n * Prometheus metrics exporter\n * @Description: Handle business metrics reporting for multiple protocols with enhanced concurrency safety and performance\n * @Author: richen\n * @Date: 2025-04-13\n * @License: BSD (3-Clause)\n */\nimport { PrometheusExporter } from '@opentelemetry/exporter-prometheus';\nimport { MeterProvider } from '@opentelemetry/sdk-metrics';\nimport { Counter, Histogram } from '@opentelemetry/api';\nimport { TraceOptions } from '../trace/itrace';\nimport { Koatty, KoattyContext } from 'koatty_core';\nimport { DefaultLogger as logger } from \"koatty_logger\";\n\n/**\n * Protocol types supported by the metrics collector\n */\nexport enum ProtocolType {\n  HTTP = 'http',\n  WEBSOCKET = 'websocket',\n  GRPC = 'grpc'\n}\n\n/**\n * Path normalization cache for performance optimization\n */\n/**\n * 缓存条目接口\n */\ninterface CacheEntry {\n  value: string;\n  lastAccess: number;\n}\n\n/**\n * 高性能 LRU 缓存 - 使用延迟重组策略\n * - 使用访问时间戳代替物理移动\n * - 定期批量重组，避免频繁的 delete + set 操作\n * - 适合高频读取场景\n */\nclass PathNormalizationCache {\n  private cache = new Map<string, CacheEntry>();\n  private readonly maxSize: number;\n  private totalHits = 0;\n  private totalAccesses = 0;\n  private accessCount = 0;\n  private readonly REORG_THRESHOLD = 1000; // 每 1000 次访问重组一次\n\n  constructor(maxSize = 10000) {\n    this.maxSize = maxSize;\n  }\n\n  /**\n   * 获取缓存值\n   * - 使用时间戳更新访问记录\n   * - 达到阈值时批量重组\n   */\n  get(path: string): string | undefined {\n    this.totalAccesses++;\n    this.accessCount++;\n    \n    const entry = this.cache.get(path);\n    if (entry) {\n      this.totalHits++;\n      \n      // ✅ 只更新时间戳，不移动位置\n      entry.lastAccess = this.accessCount;\n      \n      // ✅ 定期重组而不是每次都重组\n      if (this.accessCount >= this.REORG_THRESHOLD) {\n        this.reorganize();\n      }\n      \n      return entry.value;\n    }\n    return undefined;\n  }\n\n  /**\n   * 设置缓存值\n   */\n  set(path: string, normalized: string): void {\n    const existing = this.cache.get(path);\n    \n    if (existing) {\n      // ✅ 直接更新，不删除\n      existing.value = normalized;\n      existing.lastAccess = this.accessCount;\n      return;\n    }\n\n    // 检查容量\n    if (this.cache.size >= this.maxSize) {\n      this.evictLRU();\n    }\n    \n    // 添加新条目\n    this.cache.set(path, { \n      value: normalized, \n      lastAccess: this.accessCount \n    });\n  }\n\n  /**\n   * 驱逐最少使用的条目\n   */\n  private evictLRU(): void {\n    let oldestKey: string | null = null;\n    let oldestAccess = Infinity;\n    \n    // ✅ 找到最少访问的条目\n    for (const [key, entry] of this.cache) {\n      if (entry.lastAccess < oldestAccess) {\n        oldestAccess = entry.lastAccess;\n        oldestKey = key;\n      }\n    }\n    \n    if (oldestKey) {\n      this.cache.delete(oldestKey);\n    }\n  }\n\n  /**\n   * 定期重组：重置访问计数，避免溢出\n   */\n  private reorganize(): void {\n    this.accessCount = 0;\n    \n    // ✅ 将所有访问时间重置为相对值\n    const entries = Array.from(this.cache.entries())\n      .sort((a, b) => a[1].lastAccess - b[1].lastAccess);\n    \n    this.cache.clear();\n    \n    entries.forEach(([key, entry], index) => {\n      entry.lastAccess = index;\n      this.cache.set(key, entry);\n    });\n  }\n\n  clear(): void {\n    this.cache.clear();\n    this.totalHits = 0;\n    this.totalAccesses = 0;\n    this.accessCount = 0;\n  }\n\n  getStats() {\n    return {\n      size: this.cache.size,\n      maxSize: this.maxSize,\n      hitRate: this.totalAccesses > 0 ? this.totalHits / this.totalAccesses : 0,\n      totalHits: this.totalHits,\n      totalAccesses: this.totalAccesses,\n      utilizationRate: this.cache.size / this.maxSize\n    };\n  }\n}\n\n/**\n * Thread-safe metrics batch processor for improved performance\n */\nclass MetricsBatchProcessor {\n  private batchQueue: Array<{\n    type: 'request' | 'error' | 'response_time' | 'connection';\n    labels: Record<string, string>;\n    value: number;\n    timestamp: number;\n  }> = [];\n  private readonly batchSize: number;\n  private readonly flushInterval: number;\n  private flushTimer: NodeJS.Timeout | null = null;\n  private isProcessing = false;\n\n  constructor(\n    private collector: MetricsCollector,\n    batchSize = 100,\n    flushInterval = 1000\n  ) {\n    this.batchSize = batchSize;\n    this.flushInterval = flushInterval;\n    this.startFlushTimer();\n  }\n\n  addMetric(type: 'request' | 'error' | 'response_time' | 'connection', labels: Record<string, string>, value: number) {\n    this.batchQueue.push({\n      type,\n      labels: { ...labels }, // Clone to avoid reference issues\n      value,\n      timestamp: Date.now()\n    });\n\n    if (this.batchQueue.length >= this.batchSize) {\n      this.flush();\n    }\n  }\n\n  private startFlushTimer() {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n    }\n    this.flushTimer = setInterval(() => {\n      if (this.batchQueue.length > 0) {\n        this.flush();\n      }\n    }, this.flushInterval);\n  }\n\n  private async flush() {\n    if (this.isProcessing || this.batchQueue.length === 0) {\n      return;\n    }\n\n    this.isProcessing = true;\n    const batch = this.batchQueue.splice(0, this.batchSize);\n\n    try {\n      for (const metric of batch) {\n        switch (metric.type) {\n          case 'request':\n            this.collector.requestCounter.add(metric.value, metric.labels);\n            break;\n          case 'error':\n            this.collector.errorCounter.add(metric.value, metric.labels);\n            break;\n          case 'response_time':\n            (this.collector.responseTimeHistogram as any).record(metric.value, metric.labels);\n            break;\n          case 'connection':\n            this.collector.connectionCounter.add(metric.value, metric.labels);\n            break;\n        }\n      }\n    } catch (error) {\n      logger.error('Failed to flush metrics batch:', error);\n    } finally {\n      this.isProcessing = false;\n    }\n  }\n\n  destroy() {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n      this.flushTimer = null;\n    }\n    this.flush(); // Final flush\n  }\n}\n\n/**\n * Enhanced MetricsCollector class with improved concurrency safety and performance\n */\nexport class MetricsCollector {\n  public requestCounter: Counter;\n  public errorCounter: Counter;\n  public responseTimeHistogram: Histogram;\n  public connectionCounter: Counter;\n  \n  private readonly serviceName: string;\n  private readonly pathCache: PathNormalizationCache;\n  private readonly batchProcessor: MetricsBatchProcessor;\n  private readonly startTime: number;\n  private memoryMonitorTimer: NodeJS.Timeout | null = null;\n  \n  // ✅ 合并为单个正则表达式，一次扫描完成所有替换\n  private static readonly ID_PATTERN = /\\/(?:([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|([a-f0-9]{24})|(\\d+))/gi;\n\n  constructor(meterProvider: MeterProvider, serviceName: string) {\n    this.serviceName = serviceName;\n    this.startTime = Date.now();\n    this.pathCache = new PathNormalizationCache();\n    \n    const meter = meterProvider.getMeter(serviceName);\n    this.initializeMetrics(meter);\n    \n    this.batchProcessor = new MetricsBatchProcessor(this);\n    \n    // Setup periodic memory monitoring\n    this.setupMemoryMonitoring();\n  }\n\n  private initializeMetrics(meter: any) {\n    // Universal request metrics (supports all protocols)\n    this.requestCounter = meter.createCounter('requests_total', {\n      description: 'Total requests across all protocols',\n      unit: '1'\n    });\n\n    // Universal error metrics\n    this.errorCounter = meter.createCounter('errors_total', {\n      description: 'Total errors across all protocols',\n      unit: '1'\n    });\n\n    // Universal response time histogram\n    this.responseTimeHistogram = meter.createHistogram('response_time_seconds', {\n      description: 'Response time in seconds across all protocols',\n      unit: 's',\n      advice: { explicitBucketBoundaries: [0.1, 0.5, 1, 2.5, 5, 10] }\n    });\n\n    // WebSocket specific metrics\n    this.connectionCounter = meter.createCounter('websocket_connections_total', {\n      description: 'Total WebSocket connections',\n      unit: '1'\n    });\n\n    logger.info(`Enhanced multi-protocol metrics initialized for service: ${this.serviceName}`);\n  }\n\n  /**\n   * Collect request metrics with enhanced performance and safety\n   */\n  collectRequestMetrics(ctx: KoattyContext, duration: number) {\n    try {\n      const protocol = this.detectProtocol(ctx);\n      const labels = this.createLabelsOptimized(ctx, protocol);\n      \n      // Use batch processor for better performance\n      this.batchProcessor.addMetric('request', labels, 1);\n      this.batchProcessor.addMetric('response_time', labels, duration / 1000);\n      \n      // Record error count based on protocol-specific error conditions\n      if (this.isErrorStatus(ctx.status, protocol)) {\n        const errorLabels = {\n          ...labels,\n          error_type: this.getErrorType(ctx.status, protocol)\n        };\n        this.batchProcessor.addMetric('error', errorLabels, 1);\n      }\n\n      // Protocol-specific metrics\n      this.collectProtocolSpecificMetricsOptimized(ctx, protocol);\n\n      if (typeof logger.debug === 'function') {\n        logger.debug(`Metrics collected for ${protocol.toUpperCase()} ${ctx.method} ${ctx.path}: ${duration}ms, status: ${ctx.status}`);\n      }\n    } catch (error) {\n      // Ensure metrics collection errors don't affect main request flow\n      logger.error('Failed to collect metrics (non-blocking):', error);\n    }\n  }\n\n  /**\n   * Optimized protocol detection with caching\n   */\n  private detectProtocol(ctx: KoattyContext): ProtocolType {\n    // Use cached protocol if available\n    if (ctx._cachedProtocol) {\n      return ctx._cachedProtocol;\n    }\n\n    let protocol: ProtocolType;\n    \n    // Check for WebSocket\n    if (ctx.websocket || ctx.req?.headers?.upgrade === 'websocket') {\n      protocol = ProtocolType.WEBSOCKET;\n    }\n    // Check for gRPC\n    else if (ctx.rpc || ctx.req?.headers?.['content-type']?.includes('application/grpc')) {\n      protocol = ProtocolType.GRPC;\n    }\n    // Default to HTTP\n    else {\n      protocol = ProtocolType.HTTP;\n    }\n\n    // Cache for subsequent calls\n    Object.defineProperty(ctx, '_cachedProtocol', {\n      value: protocol,\n      writable: false,\n      enumerable: false\n    });\n\n    return protocol;\n  }\n\n  /**\n   * Optimized label creation with object pooling\n   */\n  private createLabelsOptimized(ctx: KoattyContext, protocol: ProtocolType): Record<string, string> {\n    const baseLabels: Record<string, string> = {\n      method: ctx.method || 'UNKNOWN',\n      status: (ctx.status || 200).toString(),\n      path: this.normalizePathOptimized(ctx.path || ctx.originalPath || '/'),\n      protocol: protocol\n    };\n\n    // Add protocol-specific labels efficiently\n    switch (protocol) {\n      case ProtocolType.WEBSOCKET:\n        baseLabels['compression'] = this.getWebSocketCompression(ctx);\n        break;\n      \n      case ProtocolType.GRPC:\n        baseLabels['grpc_service'] = this.getGrpcService(ctx);\n        baseLabels['compression'] = this.getGrpcCompression(ctx);\n        break;\n    }\n\n    return baseLabels;\n  }\n\n  /**\n   * High-performance path normalization with caching\n   */\n  private normalizePathOptimized(path: string): string {\n    if (!path) return '/';\n    \n    // Check cache first\n    const cached = this.pathCache.get(path);\n    if (cached !== undefined) {\n      return cached;\n    }\n    \n    // ✅ 使用 indexOf 替代 split，避免创建数组\n    const queryIndex = path.indexOf('?');\n    const cleanPath = queryIndex === -1 ? path : path.substring(0, queryIndex);\n    \n    // ✅ 单次正则扫描替换所有ID模式\n    const normalized = cleanPath.replace(\n      MetricsCollector.ID_PATTERN,\n      (match, uuid, objectid, numeric) => {\n        if (uuid) return '/:uuid';\n        if (objectid) return '/:objectid';\n        if (numeric) return '/:id';\n        return match;\n      }\n    );\n    \n    // Cache the result\n    this.pathCache.set(path, normalized);\n    \n    return normalized;\n  }\n\n  /**\n   * Optimized protocol-specific metrics collection\n   */\n  private collectProtocolSpecificMetricsOptimized(ctx: KoattyContext, protocol: ProtocolType) {\n    switch (protocol) {\n      case ProtocolType.WEBSOCKET:\n        // Track WebSocket connections efficiently\n        if (ctx.websocket?.readyState === 1) {\n          this.batchProcessor.addMetric('connection', {\n            protocol: protocol,\n            service: this.serviceName\n          }, 1);\n        }\n        break;\n    }\n  }\n\n  /**\n   * Setup memory monitoring for proactive management\n   */\n  private setupMemoryMonitoring() {\n    const monitorInterval = 60000; // 1 minute\n    \n    this.memoryMonitorTimer = setInterval(() => {\n      try {\n        const memUsage = process.memoryUsage();\n        const cacheStats = this.pathCache.getStats();\n        \n        // Log memory stats if debug enabled\n        if (typeof logger.debug === 'function') {\n          logger.debug('Metrics collector memory stats:', {\n            heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024) + 'MB',\n            cacheSize: cacheStats.size,\n            cacheHitRate: Math.round(cacheStats.hitRate * 100) + '%'\n          });\n        }\n        \n        // Clear cache if memory pressure is high\n        if (memUsage.heapUsed > 500 * 1024 * 1024) { // 500MB threshold\n          this.pathCache.clear();\n          logger.warn('High memory usage detected, cleared path normalization cache');\n        }\n      } catch (error) {\n        logger.error('Memory monitoring error:', error);\n      }\n    }, monitorInterval);\n  }\n\n  /**\n   * Check if status code represents an error for the given protocol\n   */\n  private isErrorStatus(status: number, protocol: ProtocolType): boolean {\n    if (protocol === ProtocolType.GRPC) {\n      return status !== 0;\n    }\n    return status >= 400;\n  }\n\n  /**\n   * Get WebSocket compression info\n   */\n  private getWebSocketCompression(ctx: KoattyContext): string {\n    const extensions = ctx.req?.headers?.['sec-websocket-extensions'] || '';\n    return extensions.includes('permessage-deflate') ? 'deflate' : 'none';\n  }\n\n  /**\n   * Get gRPC service name\n   */\n  private getGrpcService(ctx: KoattyContext): string {\n    const path = ctx.path || ctx.originalPath || '';\n    const match = path.match(/^\\/([^\\/]+)\\/[^\\/]+$/);\n    return match ? match[1] : 'unknown';\n  }\n\n  /**\n   * Get gRPC compression info\n   */\n  private getGrpcCompression(ctx: KoattyContext): string {\n    const acceptEncoding = ctx.rpc?.call?.metadata?.get('accept-encoding')?.[0] || '';\n    if (acceptEncoding.includes('br')) return 'brotli';\n    if (acceptEncoding.includes('gzip')) return 'gzip';\n    return 'none';\n  }\n\n  /**\n   * Get error type based on status code\n   */\n  private getErrorType(status: number, protocol: ProtocolType): string {\n    if (protocol === ProtocolType.GRPC) {\n      if (status === 0) return 'ok';\n      if (status >= 1 && status <= 16) return 'grpc_error';\n      return 'unknown_error';\n    }\n    \n    if (status >= 400 && status < 500) return 'client_error';\n    if (status >= 500) return 'server_error';\n    return 'unknown_error';\n  }\n\n  /**\n   * Record custom business metrics with safety checks\n   */\n  recordCustomMetric(name: string, value: number, labels: Record<string, string> = {}) {\n    try {\n      console.log(`Custom metric recorded: ${name} = ${value}`, labels);\n      logger.debug(`Custom metric recorded: ${name} = ${value}`, labels);\n    } catch (error) {\n      logger.error(`Failed to record custom metric ${name}:`, error);\n    }\n  }\n\n  /**\n   * Get collector statistics for monitoring\n   */\n  getStats() {\n    return {\n      serviceName: this.serviceName,\n      uptime: Date.now() - this.startTime,\n      pathCacheStats: this.pathCache.getStats(),\n      memoryUsage: process.memoryUsage()\n    };\n  }\n\n  /**\n   * Graceful shutdown\n   */\n  destroy() {\n    try {\n      this.batchProcessor.destroy();\n      this.pathCache.clear();\n      \n      // Clear memory monitoring timer\n      if (this.memoryMonitorTimer) {\n        clearInterval(this.memoryMonitorTimer);\n        this.memoryMonitorTimer = null;\n      }\n      \n      logger.info(`Metrics collector for ${this.serviceName} destroyed`);\n    } catch (error) {\n      logger.error('Error during metrics collector destruction:', error);\n    }\n  }\n}\n\n/**\n * Thread-safe singleton metrics collector manager\n */\nclass MetricsCollectorManager {\n  private static instance: MetricsCollectorManager | null = null;\n  private collector: MetricsCollector | null = null;\n  private readonly lock = { locked: false };\n\n  private constructor() {}\n\n  static getInstance(): MetricsCollectorManager {\n    if (!MetricsCollectorManager.instance) {\n      MetricsCollectorManager.instance = new MetricsCollectorManager();\n    }\n    return MetricsCollectorManager.instance;\n  }\n\n  async setCollector(collector: MetricsCollector): Promise<void> {\n    await this.acquireLock();\n    try {\n      if (this.collector) {\n        this.collector.destroy();\n      }\n      this.collector = collector;\n    } finally {\n      this.releaseLock();\n    }\n  }\n\n  getCollector(): MetricsCollector | null {\n    return this.collector;\n  }\n\n  private async acquireLock(): Promise<void> {\n    while (this.lock.locked) {\n      await new Promise(resolve => setTimeout(resolve, 1));\n    }\n    this.lock.locked = true;\n  }\n\n  private releaseLock(): void {\n    this.lock.locked = false;\n  }\n}\n\n/**\n * Initialize and configure Prometheus metrics exporter with enhanced safety\n */\nexport function initPrometheusExporter(app: Koatty, options: TraceOptions): MeterProvider | null {\n  const isProduction = options.metricsConf?.metricsEndpoint\n    || process.env.NODE_ENV === 'production';\n\n  if (!isProduction || !options.metricsConf?.metricsEndpoint) {\n    logger.info('Prometheus metrics disabled: not in production or no metricsEndpoint configured');\n    return null;\n  }\n\n  try {\n    const exporter = new PrometheusExporter({\n      endpoint: options.metricsConf.metricsEndpoint,\n      port: options.metricsConf.metricsPort || 9464\n    });\n\n    const meterProvider = new MeterProvider({\n      readers: [exporter]\n    });\n\n    // Initialize collector through singleton manager\n    const manager = MetricsCollectorManager.getInstance();\n    const collector = new MetricsCollector(meterProvider, app.name || 'koatty-app');\n    manager.setCollector(collector);\n    \n    // Setup graceful shutdown\n    const cleanup = () => {\n      const currentCollector = manager.getCollector();\n      if (currentCollector) {\n        currentCollector.destroy();\n      }\n    };\n    \n    process.once('SIGTERM', cleanup);\n    process.once('SIGINT', cleanup);\n    \n    logger.info(`Enhanced Prometheus metrics initialized on port ${options.metricsConf.metricsPort || 9464}, endpoint: ${options.metricsConf.metricsEndpoint}`);\n    \n    return meterProvider;\n  } catch (error) {\n    logger.error('Failed to initialize Prometheus exporter:', error);\n    return null;\n  }\n}\n\n/**\n * Get the global metrics collector instance safely\n */\nexport function getMetricsCollector(): MetricsCollector | null {\n  return MetricsCollectorManager.getInstance().getCollector();\n}\n\n/**\n * Collect metrics for any protocol request (enhanced convenience function)\n */\nexport function collectRequestMetrics(ctx: KoattyContext, duration: number) {\n  const collector = getMetricsCollector();\n  if (collector) {\n    collector.collectRequestMetrics(ctx, duration);\n  }\n}\n\n\n","/**\n * @ author: richen\n * @ copyright: Copyright (c) - <richenlin(at)gmail.com>\n * @ license: BSD (3-Clause)\n * @ version: 2025-01-15 10:00:00\n */\n\n/**\n * 超时控制器 - 管理请求超时的定时器生命周期\n * 用于确保定时器能够被正确清除，避免内存泄漏\n */\nexport class TimeoutController {\n  private timerId: NodeJS.Timeout | null = null;\n  private isCleared = false;\n\n  /**\n   * 创建超时 Promise\n   * @param ms 超时时间（毫秒）\n   * @param signal 可选的 AbortSignal 用于外部取消\n   * @returns 永远拒绝的 Promise，超时时抛出错误\n   */\n  createTimeout(ms: number, signal?: AbortSignal): Promise<never> {\n    if (this.isCleared) {\n      return Promise.reject(new Error('TimeoutController already cleared'));\n    }\n\n    return new Promise((_, reject) => {\n      this.timerId = setTimeout(() => {\n        if (!this.isCleared) {\n          reject(new Error('Deadline exceeded'));\n        }\n      }, ms);\n      \n      // 支持 AbortSignal 取消\n      signal?.addEventListener('abort', () => {\n        this.clear();\n        reject(new Error('Request aborted'));\n      }, { once: true });\n    });\n  }\n\n  /**\n   * 清除定时器\n   */\n  clear(): void {\n    if (this.timerId !== null) {\n      clearTimeout(this.timerId);\n      this.timerId = null;\n    }\n    this.isCleared = true;\n  }\n\n  /**\n   * 检查是否已清除\n   */\n  get cleared(): boolean {\n    return this.isCleared;\n  }\n}\n\n","/**\n * \n * @Description: 协议处理器基础接口\n * @Author: richen\n * @Date: 2025-04-04 12:21:48\n * @LastEditTime: 2025-04-04 19:11:05\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { KoattyContext, KoattyNext } from \"koatty_core\";\nimport { catcher } from \"../trace/catcher\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { Span } from '@opentelemetry/api';\nimport { SemanticAttributes } from \"@opentelemetry/semantic-conventions\";\nimport { extensionOptions } from \"../trace/itrace\";\nimport { collectRequestMetrics } from '../opentelemetry/prometheus';\nimport { TimeoutController } from \"../utils/timeout\";\nimport { Exception } from \"koatty_exception\";\n\n\nexport interface Handler {\n  handle(ctx: KoattyContext, next: KoattyNext, ext: extensionOptions): Promise<any>;\n}\n\nexport abstract class BaseHandler implements Handler {\n  abstract handle(ctx: KoattyContext, next: KoattyNext, ext: extensionOptions): Promise<any>;\n\n  protected commonPreHandle(ctx: KoattyContext, ext: extensionOptions) {\n    // Encoding\n    ctx.encoding = ext?.encoding;\n    this.setSecurityHeaders(ctx);\n    this.startTraceSpan(ctx, ext);\n  }\n\n  protected commonPostHandle(ctx: KoattyContext, ext: extensionOptions, msg?: string) {\n    this.logRequest(ctx, ext, msg);\n    this.endTraceSpan(ctx, ext, msg);\n    this.collectMetrics(ctx, ext);\n  }\n\n  protected handleError(err: Error, ctx: KoattyContext, ext: extensionOptions) {\n    return catcher(ctx, err, ext);\n  }\n\n  /**\n   * 通用超时处理包装器\n   * @param ctx - Koatty context\n   * @param next - Next middleware\n   * @param ext - Extension options\n   * @param timeout - Timeout in milliseconds\n   */\n  protected async handleWithTimeout(\n    ctx: KoattyContext,\n    next: Function,\n    ext: extensionOptions,\n    timeout: number\n  ): Promise<void> {\n    if (ext.terminated) {\n      return;\n    }\n\n    const timeoutCtrl = new TimeoutController();\n    try {\n      await Promise.race([next(), timeoutCtrl.createTimeout(timeout)]);\n    } finally {\n      timeoutCtrl.clear();\n    }\n  }\n\n  /**\n   * 检查并设置响应状态\n   * - 将404转为200(如果有body)\n   * - 状态>=400时抛出异常\n   */\n  protected checkAndSetStatus(ctx: KoattyContext): void {\n    if (ctx.body !== undefined && ctx.status === 404) {\n      ctx.status = 200;\n    }\n    if (ctx.status >= 400) {\n      throw new Exception(ctx.message, 1, ctx.status);\n    }\n  }\n\n  private setSecurityHeaders(ctx: KoattyContext) {\n    ctx.set('X-Content-Type-Options', 'nosniff');\n    ctx.set('X-Frame-Options', 'DENY');\n    ctx.set('X-XSS-Protection', '1; mode=block');\n  }\n\n  private startTraceSpan(ctx: KoattyContext, ext: extensionOptions) {\n    if (ext.spanManager) {\n      // ✅ 传递 ctx 参数\n      ext.spanManager.setSpanAttributes(ctx, {\n        [SemanticAttributes.HTTP_URL]: ctx.originalUrl,\n        [SemanticAttributes.HTTP_METHOD]: ctx.method\n      });\n    }\n  }\n\n  private endTraceSpan(ctx: KoattyContext, ext: extensionOptions, msg?: string) {\n    if (ext.spanManager) {\n      // ✅ 传递 ctx 参数\n      ext.spanManager.setSpanAttributes(ctx, {\n        [SemanticAttributes.HTTP_STATUS_CODE]: ctx.status,\n        [SemanticAttributes.HTTP_METHOD]: ctx.method,\n        [SemanticAttributes.HTTP_URL]: ctx.url\n      });\n      ext.spanManager.addSpanEvent(ctx, \"request\", { \"message\": msg });\n      ext.spanManager.endSpan(ctx);\n    }\n  }\n\n  /**\n   * Collect metrics for the request\n   * @param ctx - Koatty context object\n   * @param ext - Extension options\n   */\n  private collectMetrics(ctx: KoattyContext, ext?: extensionOptions) {\n    if (ctx.startTime) {\n      const duration = Date.now() - ctx.startTime;\n      collectRequestMetrics(ctx, duration);\n    }\n  }\n\n  private logRequest(ctx: KoattyContext, ext: extensionOptions, msg: string) {\n    Logger[(ctx.status >= 400 ? 'Error' : 'Info')](msg);\n  }\n}\n\n/**\n * 处理器类型枚举\n */\nexport enum ProtocolType {\n  HTTP = 'http',\n  GRPC = 'grpc',\n  WS = 'ws',\n  GRAPHQL = 'graphql'\n}\n","/*\n * @Description: Response helper with compression support using koa-compress.\n * @Usage: \n * @Author: richen\n * @Date: 2020-11-20 17:37:32\n * @LastEditors: Please set LastEditors\n * @LastEditTime: 2023-11-10 22:18:40\n * @License: BSD (3-Clause)\n * @Copyright (c) - <richenlin(at)gmail.com>\n */\nimport type { KoattyContext } from \"koatty_core\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport type { extensionOptions } from \"../trace/itrace\";\nimport compress from 'koa-compress';\nimport { Readable } from 'stream';\nimport zlib from 'node:zlib';\nimport type { CompressOptions } from 'koa-compress';\n\n// StatusEmpty\nconst StatusEmpty = [204, 205, 304];\n\n/**\n * 安全的 JSON 序列化\n * - 处理循环引用\n * - 处理 BigInt、Symbol、Function\n * - 处理 Error 对象\n * - 错误恢复\n */\nfunction safeJSONStringify(\n  body: any,\n  debug: boolean = false\n): { success: true; data: string } | { success: false; error: string } {\n  const seen = new WeakSet();\n\n  try {\n    const jsonString = JSON.stringify(body, (key, value) => {\n      // 处理 undefined\n      if (value === undefined) {\n        return null;\n      }\n\n      // 处理 BigInt\n      if (typeof value === 'bigint') {\n        return value.toString() + 'n';\n      }\n\n      // 处理 Symbol\n      if (typeof value === 'symbol') {\n        return value.toString();\n      }\n\n      // 处理函数\n      if (typeof value === 'function') {\n        return `[Function: ${value.name || 'anonymous'}]`;\n      }\n\n      // 处理 Error 对象\n      if (value instanceof Error) {\n        return {\n          name: value.name,\n          message: value.message,\n          stack: debug ? value.stack : undefined,\n          code: (value as any).code\n        };\n      }\n\n      // 处理 Date\n      if (value instanceof Date) {\n        return value.toISOString();\n      }\n\n      // 处理 RegExp\n      if (value instanceof RegExp) {\n        return value.toString();\n      }\n\n      // ✅ 循环引用检测 - 必须在返回value之前检查\n      if (typeof value === 'object' && value !== null) {\n        // 检查是否已经遍历过这个对象\n        if (seen.has(value)) {\n          return '[Circular Reference]';\n        }\n        // 标记为已访问\n        seen.add(value);\n      }\n\n      return value;\n    });\n\n    return { success: true, data: jsonString };\n  } catch (error) {\n    const errorMsg = error instanceof Error ? error.message : String(error);\n    Logger.Error('JSON serialization failed:', error);\n\n    return {\n      success: false,\n      error: errorMsg\n    };\n  }\n}\n\n/**\n * 安全的 res.end() 调用\n * - 捕获所有可能的错误\n * - 防止 unhandledRejection\n */\nasync function safeEnd(res: any, data?: string | Buffer): Promise<void> {\n  return new Promise((resolve, reject) => {\n    try {\n      // 尝试使用回调形式\n      let callbackCalled = false;\n      const endResult = res.end(data, (err: Error | undefined) => {\n        callbackCalled = true;\n        if (err) {\n          Logger.Error('res.end() failed:', err);\n          reject(err);\n        } else {\n          resolve();\n        }\n      });\n      \n      // 如果回调在下一个tick之前没有被调用，假设不支持回调（如mock）\n      setImmediate(() => {\n        if (!callbackCalled) {\n          resolve();\n        }\n      });\n    } catch (err) {\n      Logger.Error('res.end() threw exception:', err);\n      reject(err);\n    }\n  });\n}\n\n/**\n * 安全的流处理\n * - 监听所有错误事件\n * - 自动清理资源\n * - 处理客户端断开\n */\nasync function handleStreamResponse(\n  stream: Readable,\n  res: any,\n  ctx: KoattyContext\n): Promise<void> {\n  return new Promise((resolve, reject) => {\n    let errorHandled = false;\n\n    const handleError = (err: Error, source: string) => {\n      if (errorHandled) return;\n      errorHandled = true;\n\n      Logger.Error(`Stream error from ${source}:`, err);\n\n      if (!stream.destroyed) {\n        stream.destroy();\n      }\n\n      if (!res.headersSent) {\n        try {\n          res.statusCode = 500;\n          res.setHeader('Content-Type', 'text/plain');\n          res.end('Internal Server Error: Stream processing failed');\n        } catch (endErr) {\n          Logger.Error('Failed to send error response:', endErr);\n        }\n      } else if (!res.writableEnded) {\n        try {\n          res.end();\n        } catch (endErr) {\n          Logger.Error('Failed to end response:', endErr);\n        }\n      }\n\n      reject(err);\n    };\n\n    const handleFinish = () => {\n      if (errorHandled) return;\n      errorHandled = true;\n      resolve();\n    };\n\n    stream.once('error', (err: Error) => handleError(err, 'stream'));\n    res.once('error', (err: Error) => handleError(err, 'response'));\n    res.once('close', () => {\n      if (!stream.destroyed) {\n        Logger.Warn('Client disconnected, destroying stream');\n        stream.destroy();\n      }\n    });\n\n    try {\n      stream.pipe(res);\n      res.once('finish', handleFinish);\n    } catch (err) {\n      handleError(err as Error, 'pipe');\n    }\n  });\n}\n\n/**\n * Creates a compression middleware based on the client's Accept-Encoding header.\n * Supports Brotli and Gzip compression algorithms.\n * \n * @param {KoattyContext} ctx - The Koatty context object\n * @returns {Function} Compression middleware function\n * - Returns Brotli compression if 'br' is supported\n * - Returns Gzip compression if 'gzip' is supported\n * - Returns pass-through middleware if no compression is supported\n * \n * @remarks\n * - Compression threshold is set to 1024 bytes\n * - Excludes image content types from compression\n * - Brotli compression uses quality level 4\n * - Gzip uses Z_SYNC_FLUSH mode\n */\nexport function compressMiddleware(ctx: KoattyContext): ReturnType<typeof compress> {\n  const acceptEncoding = ctx.get('Accept-Encoding') || '';\n  const options: CompressOptions = {\n    threshold: 1024,\n    filter(contentType: string) {\n      return !/^image\\//i.test(contentType);\n    }\n  };\n\n  if (acceptEncoding.includes('br')) {\n    options.br = {\n      params: {\n        [zlib.constants.BROTLI_PARAM_QUALITY]: 4\n      }\n    };\n    return compress(options);\n  } else if (acceptEncoding.includes('gzip')) {\n    options.gzip = {\n      flush: zlib.constants.Z_SYNC_FLUSH\n    };\n    options.br = false;\n    return compress(options);\n  }\n\n  return (ctx: any, next: any) => next(); // 不压缩时返回空中间件\n\n}\n\n/**\n * Process and send the response to the client based on the context.\n * Handles different response types including empty responses, HEAD requests,\n * null bodies, buffers, strings, streams and JSON.\n * Also applies compression middleware if configured.\n * \n * @param ctx - The Koatty context object containing request and response information\n * @param ext - Optional extension options for additional middleware configuration\n * @returns void | Promise<void> Returns nothing or a Promise that resolves when response is sent\n */\nexport async function respond(ctx: KoattyContext, ext?: extensionOptions) {\n  // allow bypassing koa\n  if (false === ctx.respond) return;\n  if (!ctx.writable) return;\n\n  const res = ctx.res;\n  const body = ctx.body;\n  const code = ctx.status;\n\n  // ✅ ignore body - 使用 safeEnd 确保错误被捕获\n  if (StatusEmpty.includes(code)) {\n    ctx.body = null;\n    return safeEnd(res);\n  }\n\n  // ✅ HEAD method - 使用 safeEnd\n  if ('HEAD' === ctx.method) {\n    if (!res.headersSent && !(<any>ctx.response).has('Content-Length')) {\n      const { length } = ctx.response;\n      if (Number.isInteger(length)) ctx.length = length;\n    }\n    return safeEnd(res);\n  }\n\n  // ✅ status body - 使用 safeEnd\n  if (null == body) {\n    if ((<any>ctx.response)._explicitNullBody) {\n      ctx.response.remove('Content-Type');\n      ctx.response.remove('Transfer-Encoding');\n      return safeEnd(res);\n    }\n    // 转换body为字符串\n    const textBody = ctx.req.httpVersionMajor >= 2 \n      ? String(code) \n      : (ctx.message || String(code));\n    \n    if (!res.headersSent) {\n      ctx.type = 'text';\n      ctx.length = Buffer.byteLength(textBody);\n    }\n    return safeEnd(res, textBody);\n  }\n\n  // status\n  if (code === 404) {\n    ctx.status = 200;\n  }\n\n  // ✅ Apply compression middleware with enhanced error handling\n  try {\n    await compressMiddleware(ctx)(ctx, async () => {\n      // ✅ 重新获取body，因为压缩中间件可能已修改ctx.body\n      const currentBody = ctx.body;\n      \n      // Buffer 响应\n      if (Buffer.isBuffer(currentBody)) {\n        await safeEnd(res, currentBody);\n        return;\n      }\n\n      // 字符串响应\n      if (typeof currentBody === 'string') {\n        await safeEnd(res, currentBody);\n        return;\n      }\n\n      // ✅ 流响应（增强错误处理）\n      if (currentBody instanceof Readable) {\n        await handleStreamResponse(currentBody, res, ctx);\n        return;\n      }\n\n      // ✅ JSON 响应（安全序列化）\n      const jsonResult = safeJSONStringify(currentBody, ext?.debug);\n\n      if (!jsonResult.success) {\n        // JSON 序列化失败，发送错误响应\n        const errMsg = (jsonResult as { success: false; error: string }).error;\n        Logger.Error(`JSON serialization failed: ${errMsg}`);\n        \n        if (!res.headersSent) {\n          ctx.status = 500;\n          ctx.type = 'json';\n        }\n\n        const errorResponse = JSON.stringify({\n          error: 'Internal Server Error',\n          message: 'Failed to serialize response data',\n          details: ext?.debug ? errMsg : undefined\n        });\n\n        await safeEnd(res, errorResponse);\n        return;\n      }\n\n      // 序列化成功，发送响应\n      const jsonData = (jsonResult as { success: true; data: string }).data;\n      if (!res.headersSent) {\n        ctx.type = 'json';\n        ctx.length = Buffer.byteLength(jsonData);\n      }\n      await safeEnd(res, jsonData);\n    });\n  } catch (error) {\n    // ✅ 最外层错误捕获\n    Logger.Error('Response handling failed:', error);\n    \n    // 尝试发送错误响应\n    if (!res.headersSent) {\n      try {\n        res.statusCode = 500;\n        res.setHeader('Content-Type', 'text/plain');\n        res.end('Internal Server Error');\n      } catch (endErr) {\n        Logger.Error('Failed to send error response:', endErr);\n      }\n    }\n  }\n}\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-04-04 12:21:48\n * @LastEditTime: 2025-04-04 20:00:41\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { KoattyContext } from \"koatty_core\";\nimport { Exception } from \"koatty_exception\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { BaseHandler, Handler } from \"./base\";\nimport { extensionOptions } from \"../trace/itrace\";\nimport { respond } from \"./respond\";\nimport { collectRequestMetrics } from \"../opentelemetry/prometheus\";\nimport { SemanticAttributes } from \"@opentelemetry/semantic-conventions\";\n\n/**\n * HTTP request handler middleware for Koatty framework.\n * Handles request timeout, security headers, logging, tracing and error handling.\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {Function} next - Next middleware function\n * @param {extensionOptions} [ext] - Extension options including timeout, encoding, span and other settings\n * @returns {Promise<any>} Response data after handling the request\n * \n * @throws {Exception} When request timeout occurs or status code >= 400\n * \n * Features:\n * - Sets security headers\n * - Handles request timeout (default 10s)\n * - Logs request/response details\n * - OpenTelemetry tracing support\n * - Automatic error handling\n */\nexport class HttpHandler extends BaseHandler implements Handler {\n  private static instance: HttpHandler;\n\n  private constructor() {\n    super();\n  }\n\n  public static getInstance(): HttpHandler {\n    if (!HttpHandler.instance) {\n      HttpHandler.instance = new HttpHandler();\n    }\n    return HttpHandler.instance;\n  }\n\n  async handle(ctx: KoattyContext, next: Function, ext?: extensionOptions): Promise<any> {\n    const timeout = ext.timeout || 10000;\n    let error: any = null;\n\n    this.commonPreHandle(ctx, ext);\n\n    try {\n      // 使用基类的通用超时处理方法\n      await this.handleWithTimeout(ctx, next, ext, timeout);\n\n      // 使用基类的通用状态检查方法\n      this.checkAndSetStatus(ctx);\n      \n      return respond(ctx, ext);\n    } catch (err: any) {\n      error = err;\n      return this.handleError(err, ctx, ext);\n    } finally {\n      // 统一在 finally 块中记录日志和结束追踪\n      // 只记录成功请求或非4xx/5xx的日志（错误日志已由Exception.handler记录）\n      if (!error || ctx.status < 400) {\n        const now = Date.now();\n        const msg = `{\"action\":\"${ctx.method}\",\"status\":\"${ctx.status}\",\"startTime\":\"${ctx.startTime}\",\"duration\":\"${(now - ctx.startTime) || 0}\",\"requestId\":\"${ctx.requestId}\",\"endTime\":\"${now}\",\"path\":\"${ctx.originalPath || '/'}\"}`;\n        this.commonPostHandle(ctx, ext, msg);\n      } else {\n        // 错误情况只处理追踪和指标，日志已经记录过了\n        this.endTraceSpanOnly(ctx, ext);\n        this.collectMetricsOnly(ctx, ext);\n      }\n    }\n  }\n\n  /**\n   * 只结束追踪span，不记录日志\n   */\n  private endTraceSpanOnly(ctx: KoattyContext, ext: extensionOptions) {\n    if (ext.spanManager) {\n      const now = Date.now();\n      const msg = `{\"action\":\"${ctx.method}\",\"status\":\"${ctx.status}\",\"startTime\":\"${ctx.startTime}\",\"duration\":\"${(now - ctx.startTime) || 0}\",\"requestId\":\"${ctx.requestId}\",\"endTime\":\"${now}\",\"path\":\"${ctx.originalPath || '/'}\"}`;\n      \n      // 设置span属性\n      ext.spanManager.setSpanAttributes(ctx, {\n        [SemanticAttributes.HTTP_STATUS_CODE]: ctx.status,\n        [SemanticAttributes.HTTP_METHOD]: ctx.method,\n        [SemanticAttributes.HTTP_URL]: ctx.url\n      });\n      ext.spanManager.addSpanEvent(ctx, \"request\", { \"message\": msg });\n      ext.spanManager.endSpan(ctx);\n    }\n  }\n\n  /**\n   * 只收集指标，不记录日志\n   */\n  private collectMetricsOnly(ctx: KoattyContext, ext: extensionOptions) {\n    if (ctx.startTime) {\n      const duration = Date.now() - ctx.startTime;\n      collectRequestMetrics(ctx, duration);\n    }\n  }\n}\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-03-21 22:07:11\n * @LastEditTime: 2025-03-23 11:41:02\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { BaseHandler, Handler } from './base';\nimport { Transform, Stream } from 'stream';\nimport * as zlib from 'zlib';\nimport { IRpcServerCallImpl, KoattyContext } from \"koatty_core\";\nimport { Exception, StatusCodeConvert } from \"koatty_exception\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { Span } from '@opentelemetry/api';\nimport { SemanticAttributes } from '@opentelemetry/semantic-conventions';\nimport { catcher } from '../trace/catcher';\nimport { extensionOptions } from '../trace/itrace';\nimport { collectRequestMetrics } from '../opentelemetry/prometheus';\n\n\n/**\n * gRPC request handler middleware for Koatty framework.\n * Handles gRPC requests with tracing, timeout, error handling and logging capabilities.\n * \n * @param {KoattyContext} ctx - The Koatty context object\n * @param {Function} next - The next middleware function\n * @param {extensionOptions} [ext] - Extension options including timeout, encoding, span and error handler\n * @returns {Promise<any>} Returns null on success or error result from catcher\n * \n * @throws {Exception} When response status is >= 400\n * @throws {Error} When request timeout exceeded\n */\nexport class GrpcHandler extends BaseHandler implements Handler {\n  private static instance: GrpcHandler;\n\n  private constructor() {\n    super();\n  }\n\n  public static getInstance(): GrpcHandler {\n    if (!GrpcHandler.instance) {\n      GrpcHandler.instance = new GrpcHandler();\n    }\n    return GrpcHandler.instance;\n  }\n\n  async handle(ctx: KoattyContext, next: Function, ext?: extensionOptions): Promise<any> {\n    const timeout = ext.timeout || 10000;\n    const acceptEncoding = ctx.rpc.call.metadata.get('accept-encoding')[0] || '';\n    const compression = acceptEncoding.includes('br') ? 'brotli' : \n                      acceptEncoding.includes('gzip') ? 'gzip' : 'none';\n    let error: any = null;\n\n    ctx?.rpc?.call?.sendMetadata(ctx.rpc.call.metadata);\n\n    this.commonPreHandle(ctx, ext);\n\n    // 监听 gRPC call 的错误事件\n    (<IRpcServerCallImpl<any, any>>ctx?.rpc?.call).once(\"error\", (err) => {\n      error = err;\n      this.handleError(err, ctx, ext);\n    });\n\n    try {\n      // 使用基类的通用超时处理方法\n      await this.handleWithTimeout(ctx, next, ext, timeout);\n\n      // 使用基类的通用状态检查方法\n      this.checkAndSetStatus(ctx);\n\n      // 安全的流压缩处理\n      if (compression !== 'none' && ctx.body instanceof Stream) {\n        try {\n          const compressStream = compression === 'gzip' ? \n            zlib.createGzip({ level: 6 }) : zlib.createBrotliCompress({\n              params: {\n                [zlib.constants.BROTLI_PARAM_QUALITY]: 4\n              }\n            });\n          \n          // 监听压缩流的错误\n          compressStream.once('error', (compressErr) => {\n            Logger.Error('gRPC compression stream error:', compressErr);\n            // 如果压缩失败,使用原始body\n            ctx.body = ctx.body;\n          });\n          \n          // 监听源流的错误\n          (ctx.body as Stream).once('error', (streamErr) => {\n            Logger.Error('gRPC source stream error:', streamErr);\n            compressStream.destroy();\n          });\n          \n          ctx.body = (ctx.body as Stream).pipe(compressStream);\n        } catch (pipeErr) {\n          Logger.Error('gRPC stream pipe error:', pipeErr);\n          // 如果pipe失败,继续使用原始body\n        }\n      }\n      \n      // 安全的gRPC回调\n      try {\n        ctx.rpc.callback(null, ctx.body);\n      } catch (callbackErr) {\n        Logger.Error('gRPC callback error:', callbackErr);\n        // 尝试发送错误响应\n        try {\n          ctx.rpc.callback(callbackErr, null);\n        } catch (fallbackErr) {\n          Logger.Error('gRPC fallback callback error:', fallbackErr);\n        }\n      }\n      \n      return null;\n    } catch (err: any) {\n      error = err;\n      return this.handleError(err, ctx, ext);\n    } finally {\n      // 统一在 finally 块中记录日志和结束追踪\n      // 只记录成功请求或非4xx/5xx的日志（错误日志已由Exception.handler记录）\n      if (!error || ctx.status < 400) {\n        const now = Date.now();\n        const status = StatusCodeConvert(ctx.status);\n        const msg = `{\"action\":\"${ctx.method}\",\"status\":\"${status}\",\"startTime\":\"${ctx.startTime}\",\"duration\":\"${(now - ctx.startTime) || 0}\",\"requestId\":\"${ctx.requestId}\",\"endTime\":\"${now}\",\"path\":\"${ctx.originalPath}\"}`;\n        this.commonPostHandle(ctx, ext, msg);\n      } else {\n        // 错误情况只处理追踪和指标，日志已经记录过了\n        this.endTraceSpanOnly(ctx, ext);\n        this.collectMetricsOnly(ctx, ext);\n      }\n      \n      // 确保 finish 事件被触发（用于清理资源）\n      ctx.res.emit(\"finish\");\n    }\n  }\n\n  /**\n   * 只结束追踪span，不记录日志\n   */\n  private endTraceSpanOnly(ctx: KoattyContext, ext: extensionOptions) {\n    if (ext.spanManager) {\n      const now = Date.now();\n      const status = StatusCodeConvert(ctx.status);\n      const msg = `{\"action\":\"${ctx.method}\",\"status\":\"${status}\",\"startTime\":\"${ctx.startTime}\",\"duration\":\"${(now - ctx.startTime) || 0}\",\"requestId\":\"${ctx.requestId}\",\"endTime\":\"${now}\",\"path\":\"${ctx.originalPath}\"}`;\n      \n      // 设置span属性\n      ext.spanManager.setSpanAttributes(ctx, {\n        [SemanticAttributes.HTTP_STATUS_CODE]: ctx.status,\n        [SemanticAttributes.HTTP_METHOD]: ctx.method,\n        [SemanticAttributes.HTTP_URL]: ctx.url\n      });\n      ext.spanManager.addSpanEvent(ctx, \"request\", { \"message\": msg });\n      ext.spanManager.endSpan(ctx);\n    }\n  }\n\n  /**\n   * 只收集指标，不记录日志\n   */\n  private collectMetricsOnly(ctx: KoattyContext, ext: extensionOptions) {\n    if (ctx.startTime) {\n      const duration = Date.now() - ctx.startTime;\n      collectRequestMetrics(ctx, duration);\n    }\n  }\n}\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-03-21 22:07:11\n * @LastEditTime: 2025-03-23 11:46:32\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { KoattyContext } from \"koatty_core\";\nimport { Exception } from \"koatty_exception\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { Span } from \"@opentelemetry/api\";\nimport { SemanticAttributes } from \"@opentelemetry/semantic-conventions\";\nimport { inspect } from \"util\";\nimport { catcher } from \"../trace/catcher\";\nimport { BaseHandler, Handler } from './base';\nimport { extensionOptions } from \"../trace/itrace\";\nimport { Helper } from \"koatty_lib\";\n\n/**\n * WebSocket handler class implementing the Handler interface.\n * Manages WebSocket connections and handles request/response lifecycle.\n * Uses Singleton pattern to ensure only one instance exists.\n * \n * Features:\n * - Timeout handling for WebSocket connections\n * - Support for WebSocket compression (permessage-deflate)\n * - Request tracking with timing information\n * - Error handling and status code management\n * \n * @class WsHandler\n * @extends BaseHandler\n * @implements Handler\n * \n * @example\n * const handler = WsHandler.getInstance();\n * await handler.handle(ctx, next, options);\n */\nexport class WsHandler extends BaseHandler implements Handler {\n  private static instance: WsHandler;\n\n  private constructor() {\n    super();\n  }\n\n  public static getInstance(): WsHandler {\n    if (!WsHandler.instance) {\n      WsHandler.instance = new WsHandler();\n    }\n    return WsHandler.instance;\n  }\n\n  async handle(ctx: KoattyContext, next: Function, ext?: extensionOptions): Promise<any> {\n    const timeout = ext?.timeout || 10000;\n    const wsExtensions = ctx.req.headers['sec-websocket-extensions'] || '';\n    const useCompression = wsExtensions.includes('permessage-deflate');\n    \n    this.commonPreHandle(ctx, ext);\n    \n    ctx?.res?.once(\"finish\", () => {\n      const now = Date.now();\n      const msg = `{\"action\":\"${ctx.method}\",\"status\":\"${ctx.status}\",\"startTime\":\"${ctx.startTime}\",\"duration\":\"${(now - ctx.startTime) || 0}\",\"requestId\":\"${ctx.requestId}\",\"endTime\":\"${now}\",\"path\":\"${ctx.originalPath || '/'}\"}`;\n      this.commonPostHandle(ctx, ext, msg);\n    });\n\n    try {\n      // ✅ 使用基类的通用超时处理方法\n      await this.handleWithTimeout(ctx, next, ext, timeout);\n\n      // ✅ 使用基类的通用状态检查方法\n      this.checkAndSetStatus(ctx);\n      \n      // ✅ 安全的WebSocket发送 - 只在连接开启且有数据时发送\n      if (ctx?.websocket?.readyState === 1 && !Helper.isTrueEmpty(ctx.body)) {\n        try {\n          const sendOptions = useCompression ? { compress: true } : {};\n          // 使用inspect安全转换,限制深度避免循环引用问题\n          const message = inspect(ctx.body, { \n            depth: 10, \n            breakLength: Infinity,\n            compact: true \n          });\n          \n          // ✅ WebSocket send - 包装在try-catch中捕获同步错误\n          // 注意: 某些WebSocket实现支持回调,某些不支持,所以我们使用try-catch\n          ctx.websocket.send(message, sendOptions);\n          \n          // 监听WebSocket的error事件(如果还没有监听)\n          if (!ctx.websocket.listenerCount || ctx.websocket.listenerCount('error') === 0) {\n            ctx.websocket.once('error', (wsErr: Error) => {\n              Logger.Error('WebSocket error:', wsErr);\n            });\n          }\n        } catch (sendErr) {\n          Logger.Error('WebSocket send error:', sendErr);\n          // 不抛出异常,因为消息已经处理完成\n        }\n      }\n      return null;\n    } catch (err: any) {\n      return this.handleError(err, ctx, ext);\n    } finally {\n      ctx.res.emit(\"finish\");\n    }\n  }\n}\n","/**\n * \n * @Description: 协议处理器工厂类\n * @Author: richen\n * @Date: 2025-04-04 12:21:48\n * @LastEditTime: 2025-04-04 19:11:05\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { ProtocolType } from './base';\nimport type { Handler } from './base';\nimport { HttpHandler } from './http';\nimport { GrpcHandler } from './grpc';\nimport { WsHandler } from './ws';\nimport { DefaultLogger as logger } from 'koatty_logger';\n\n\n/**\n * Factory class for managing protocol handlers.\n * Provides registration and retrieval of handlers for different protocol types (HTTP, GRPC, WS).\n * Initializes with default handlers and supports fallback to HTTP handler.\n */\nexport class HandlerFactory {\n  private static handlers = new Map<ProtocolType, Handler>();\n\n  /**\n   * Initialize with default handlers.\n   */\n  static {\n    this.register(ProtocolType.HTTP, HttpHandler.getInstance());\n    this.register(ProtocolType.GRPC, GrpcHandler.getInstance());\n    this.register(ProtocolType.WS, WsHandler.getInstance());\n  }\n\n  /**\n   * register a handler for a protocol type.\n   * @param type \n   * @param handler \n   */\n  static register(type: ProtocolType, handler: Handler) {\n    this.handlers.set(type, handler);\n  }\n\n  /**\n   * get a handler for a protocol type.\n   * @param type \n   * @returns \n   */\n  static getHandler(type: ProtocolType): Handler {\n    const handler = this.handlers.get(type);\n    if (!handler) {\n      logger.warn(`Handler for protocol ${type} not found, falling back to HTTP`);\n      return this.handlers.get(ProtocolType.HTTP)!;\n    }\n    return handler;\n  }\n}\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-03-23 01:11:24\n * @LastEditTime: 2025-03-23 10:47:44\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n/**\n * Async context tracking module\n * \n * @Description: Provides async context tracking using async_hooks\n * @Author: richen\n * @Date: 2021-11-18 10:44:51\n * @LastEditTime: 2025-03-23 00:56:47\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n * @Usage: \n */\nimport { AsyncLocalStorage, AsyncResource } from \"async_hooks\";\nimport { EventEmitter } from 'events'; // Used in type annotations\n\n// AsyncLocalStorage\nexport const asyncLocalStorage = new AsyncLocalStorage();\n\n// EventEmitter methods to wrap\nconst eventMethods = {\n  add: ['on', 'addListener'],\n  remove: ['off', 'removeListener']\n}\n\n// ✅ 使用 WeakMap 存储 emitter -> { resource, wrappedHandlers } 映射\nconst emitterResourceMap = new WeakMap<EventEmitter, {\n  resource: AsyncResource;\n  wrappedHandlers: WeakMap<Function, Function>;\n}>();\n\nexport function createAsyncResource(key = Symbol('koatty-tracer').toString()):\n AsyncResource & { emitDestroy: () => void } {\n  const resource = new AsyncResource(key);\n  \n  // ✅ WeakMap 会自动清理，无需手动 clear\n  resource.emitDestroy = () => {\n    AsyncResource.prototype.emitDestroy.call(resource);\n    return resource;\n  };\n\n  return resource;\n}\n\n/**\n * Wraps EventEmitter listener registration methods of the\n * given emitter, so that all listeners are run in scope of\n * the provided async resource.\n *\n * @param {*} emitter\n * @param {AsyncResource} asyncResource\n */\nexport function wrapEmitter(emitter: EventEmitter, asyncResource: AsyncResource) {\n  // ✅ 防止重复包装\n  if (emitterResourceMap.has(emitter)) {\n    return;\n  }\n\n  // ✅ 为此 emitter 创建独立的 handler 映射\n  const wrappedHandlers = new WeakMap<Function, Function>();\n  emitterResourceMap.set(emitter, { resource: asyncResource, wrappedHandlers });\n\n  // 包装 add 方法\n  for (const method of eventMethods.add) {\n    wrapEmitterMethod(emitter, method, (original: Function) => \n      function (this: EventEmitter, name: string, handler: (...args: any[]) => void) {\n        // ✅ 使用 WeakMap 存储 handler -> wrappedHandler 映射\n        let wrappedHandler = wrappedHandlers.get(handler);\n        \n        if (!wrappedHandler) {\n          wrappedHandler = (...args: any[]) => {\n            asyncResource.runInAsyncScope(handler, emitter, ...args);\n          };\n          wrappedHandlers.set(handler, wrappedHandler);\n        }\n        \n        return original.call(this, name, wrappedHandler);\n      }\n    );\n  }\n\n  // 包装 remove 方法\n  for (const method of eventMethods.remove) {\n    wrapEmitterMethod(emitter, method, (original: Function) => \n      function (this: EventEmitter, name: string, handler: (...args: any[]) => void) {\n        const wrappedHandler = wrappedHandlers.get(handler);\n        \n        if (wrappedHandler) {\n          wrappedHandlers.delete(handler);\n          return original.call(this, name, wrappedHandler);\n        }\n        \n        return original.call(this, name, handler);\n      }\n    );\n  }\n}\n\n/**\n *\n *\n * @param {*} emitter\n * @param {string} method\n * @param {Function} wrapper\n * @returns {*}  \n */\nexport function wrapEmitterMethod(emitter: EventEmitter, method: string, wrapper: Function) {\n  if (!(method in emitter)) {\n    return;\n  }\n\n  const original = (emitter as any)[method];\n  if (typeof original !== 'function') {\n    return;\n  }\n\n  const wrapped = wrapper(original, method);\n  (emitter as any)[method] = wrapped;\n  return wrapped;\n}\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-03-20 12:08:57\n * @LastEditTime: 2025-04-02 15:03:04\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { DefaultLogger } from \"koatty_logger\";\n\n/**\n * A logger class that provides different levels of logging functionality.\n * Wraps the DefaultLogger to provide error, warning, info, debug and verbose level logging.\n * \n * @export\n * @class Logger\n */\nexport class Logger {\n/** Log an error scenario that was not expected and caused the requested operation to fail. */\n  error(...args: any[]) {\n    DefaultLogger.Error(args);\n  }\n  /**\n   * Log a warning scenario to inform the developer of an issues that should be investigated.\n   * The requested operation may or may not have succeeded or completed.\n   */\n  warn(...args: any[]) {\n    DefaultLogger.Warn(args);\n  }\n  /**\n   * Log a general informational message, this should not affect functionality.\n   * This is also the default logging level so this should NOT be used for logging\n   * debugging level information.\n   */\n  info(...args: any[]) {\n    DefaultLogger.Info(args);\n  }\n  /**\n   * Log a general debug message that can be useful for identifying a failure.\n   * Information logged at this level may include diagnostic details that would\n   * help identify a failure scenario.\n   * For example: Logging the order of execution of async operations.\n   */\n  debug(...args: any[]) {\n    DefaultLogger.Debug(args);\n  }\n  /**\n   * Log a detailed (verbose) trace level logging that can be used to identify failures\n   * where debug level logging would be insufficient, this level of tracing can include\n   * input and output parameters and as such may include PII information passing through\n   * the API. As such it is recommended that this level of tracing should not be enabled\n   * in a production environment.\n   */\n  verbose(...args: any[]) {\n    DefaultLogger.Debug(args);\n  }\n}","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-04-04 12:21:48\n * @LastEditTime: 2025-04-04 19:11:05\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { ExportResult, ExportResultCode } from '@opentelemetry/core';\nimport { DefaultLogger as Logger } from 'koatty_logger';\n\n/**\n * A trace exporter with retry mechanism and circuit breaker pattern for OpenTelemetry.\n * Extends the base OTLPTraceExporter with additional reliability features.\n * \n * Features:\n * - Configurable retry attempts for failed exports\n * - Circuit breaker pattern to prevent cascading failures\n * - Exponential backoff delay between retries\n * \n * @extends OTLPTraceExporter\n * \n * @param {Object} config - Configuration object\n * @param {number} [config.maxRetries=3] - Maximum number of retry attempts\n * @param {number} [config.retryDelay=1000] - Base delay between retries in milliseconds\n * @param {number} [config.failureThreshold=5] - Number of failures before circuit opens\n * @param {number} [config.resetTimeout=30000] - Time in milliseconds before attempting to close circuit\n */\nexport class RetryOTLPTraceExporter extends OTLPTraceExporter {\n  private readonly maxRetries: number;\n  private readonly retryDelay: number;\n  private readonly failureThreshold: number;\n  private readonly resetTimeout: number;\n  \n  private failureCount = 0;\n  private lastFailureTime = 0;\n  private circuitState: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';\n\n  constructor(config: any) {\n    super(config);\n    this.maxRetries = config.maxRetries || 3;\n    this.retryDelay = config.retryDelay || 1000;\n    this.failureThreshold = config.failureThreshold || 5;\n    this.resetTimeout = config.resetTimeout || 30000;\n  }\n\n  async export(spans: any, resultCallback: (result: ExportResult) => void) {\n    // Check circuit breaker state\n    if (this.circuitState === 'OPEN') {\n      const now = Date.now();\n      if (now - this.lastFailureTime > this.resetTimeout) {\n        this.circuitState = 'HALF_OPEN';\n      } else {\n        resultCallback({\n          code: ExportResultCode.FAILED,\n          error: new Error('Circuit breaker is open - skipping export')\n        });\n        return;\n      }\n    }\n\n    let lastError: Error;\n    for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n      try {\n        const result = await super.export(spans, resultCallback);\n        \n        // Reset circuit if successful in HALF_OPEN state\n        if (this.circuitState === 'HALF_OPEN') {\n          this.resetCircuit();\n        }\n        return result;\n      } catch (error) {\n        lastError = error;\n        \n        // Update failure count and check threshold\n        this.failureCount++;\n        if (this.failureCount >= this.failureThreshold) {\n          this.tripCircuit();\n        }\n\n        if (attempt < this.maxRetries) {\n          await new Promise(resolve => setTimeout(resolve, this.retryDelay * attempt));\n        }\n      }\n    }\n\n    resultCallback({code: ExportResultCode.FAILED, error: lastError});\n  }\n\n  private tripCircuit() {\n    this.circuitState = 'OPEN';\n    this.lastFailureTime = Date.now();\n    this.failureCount = 0;\n    Logger.Warn('Circuit breaker tripped - stopping exports temporarily');\n  }\n\n  private resetCircuit() {\n    this.circuitState = 'CLOSED';\n    this.failureCount = 0;\n    Logger.Info('Circuit breaker reset - exports resumed');\n  }\n}\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-04-04 12:21:48\n * @LastEditTime: 2025-04-04 19:11:05\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { Koatty } from 'koatty_core';\nimport { \n  ATTR_SERVICE_NAME, \n  ATTR_SERVICE_VERSION,\n  ATTR_TELEMETRY_SDK_LANGUAGE,\n  ATTR_TELEMETRY_SDK_NAME, \n  ATTR_TELEMETRY_SDK_VERSION,\n  SEMRESATTRS_DEPLOYMENT_ENVIRONMENT\n} from \"@opentelemetry/semantic-conventions\";\n\n/**\n * Creates resource attributes for OpenTelemetry instrumentation\n * \n * @param {Koatty} app - The Koatty application instance\n * @param {any} options - Configuration options containing optional otlpResourceAttributes\n * @returns {Resource} OpenTelemetry resource with configured attributes\n * @throws {Error} When service name is not provided\n */\nexport function createResourceAttributes(app: Koatty, options: any) {\n  const serviceName = process.env.OTEL_SERVICE_NAME || app.name;\n  if (!serviceName) {\n    throw new Error('Service name is required');\n  }\n\n  return resourceFromAttributes(Object.assign(\n    {\n      [ATTR_SERVICE_NAME]: serviceName,\n      [ATTR_SERVICE_VERSION]: process.env.OTEL_SERVICE_VERSION || app.version || '1.0.0',\n      [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: process.env.OTEL_ENV || app.env || 'development',\n      [ATTR_TELEMETRY_SDK_NAME]: 'opentelemetry',\n      [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n      [ATTR_TELEMETRY_SDK_VERSION]: process.env.OTEL_SDK_VERSION || '1.0.0',\n      'process.pid': process.pid\n    },\n    options.otlpResourceAttributes || {}\n  ));\n}\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-04-04 12:21:48\n * @LastEditTime: 2025-04-04 19:11:05\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';\nimport { diag, DiagLogLevel, trace } from '@opentelemetry/api';\nimport { initPrometheusExporter } from './prometheus';\nimport { BasicTracerProvider } from '@opentelemetry/sdk-trace-base';\nimport { Koatty } from 'koatty_core';\nimport { TraceOptions } from '../trace/itrace';\nimport { DefaultLogger as logger } from \"koatty_logger\";\nimport { Logger } from './logger';\nimport { RetryOTLPTraceExporter } from './exporter';\nimport { createResourceAttributes } from './resource';\n\n// Global flag to track if logger has been set\nlet isLoggerSet = false;\n\n/**\n * Initialize OpenTelemetry SDK with trace and metrics exporters\n * \n * @param app - Koatty application instance\n * @param options - Configuration options for tracing\n * @returns NodeSDK instance configured with trace exporters and instrumentations\n * @throws Error if OTLP endpoint is not provided\n * \n * @example\n * ```typescript\n * const sdk = initSDK(app, {\n *   opentelemetryConf: {\n *     endpoint: 'http://localhost:4318/v1/traces'\n *   }\n * });\n * ```\n */\nexport function initSDK(app: Koatty, options: TraceOptions) {\n  const endpoint = options.opentelemetryConf?.endpoint ||\n    process.env.OTEL_EXPORTER_OTLP_ENDPOINT;\n  if (!endpoint) {\n    throw new Error('OTLP endpoint is required');\n  }\n\n  const traceExporter = new RetryOTLPTraceExporter({\n    url: endpoint,\n    headers: options.opentelemetryConf?.headers || {},\n    timeoutMillis: options.opentelemetryConf?.timeout || 10000,\n    maxRetries: 3,\n    retryDelay: 1000\n  });\n\n  const batchOptions = {\n    maxQueueSize: options.opentelemetryConf?.batchMaxQueueSize,\n    maxExportBatchSize: options.opentelemetryConf?.batchMaxExportSize,\n    scheduledDelayMillis: options.opentelemetryConf?.batchDelayMillis,\n    exportTimeoutMillis: options.opentelemetryConf?.batchExportTimeout\n  };\n\n  // Configure logging - only set once\n  if (!isLoggerSet) {\n    const logLevel = logger.getLevel();\n    const diagLogLevel = Object.values(DiagLogLevel).find(\n      (level) => level.toString() === logLevel.toString()\n    ) || DiagLogLevel.INFO;\n\n    diag.setLogger(new Logger(), diagLogLevel as DiagLogLevel);\n    isLoggerSet = true;\n  }\n\n  // Initialize Prometheus exporter\n  const prometheusExporter = initPrometheusExporter(app, options);\n\n  const sdkConfig: any = {\n    resource: createResourceAttributes(app, options),\n    traceExporter,\n    spanProcessors: [new BatchSpanProcessor(traceExporter, batchOptions)],\n    instrumentations: options.opentelemetryConf?.instrumentations || [\n      getNodeAutoInstrumentations({\n        '@opentelemetry/instrumentation-grpc': {\n          enabled: true,\n        },\n        '@opentelemetry/instrumentation-koa': {\n          enabled: true,\n        }\n      })\n    ]\n  };\n  \n  // Enable Prometheus exporter\n  if (prometheusExporter) {\n    sdkConfig.readers = [prometheusExporter];\n  }\n\n  return new NodeSDK(sdkConfig);\n}\n\n/**\n * Start and initialize OpenTelemetry SDK tracer\n * \n * @param sdk - OpenTelemetry NodeSDK instance\n * @param app - Koatty application instance\n * @param options - Trace configuration options\n * \n * @remarks\n * This function initializes the OpenTelemetry SDK and sets up shutdown handlers.\n * If initialization fails, it falls back to BasicTracerProvider.\n * \n * @throws Error when SDK initialization fails\n */\nexport async function startTracer(sdk: NodeSDK, app: Koatty, options: TraceOptions) {\n  const shutdownHandler = async () => {\n    try {\n      await sdk.shutdown();\n      logger.info('OpenTelemetry SDK shut down successfully');\n    } catch (error) {\n      logger.error('Error shutting down OpenTelemetry SDK', error);\n    } finally {\n      app.off(\"appStop\", shutdownHandler);\n    }\n  };\n\n  try {\n    await sdk.start();\n    logger.info('OpenTelemetry SDK started successfully');\n  } catch (err) {\n    logger.error(`OpenTelemetry SDK initialization failed: ${err.message}`, {\n      stack: err.stack,\n      code: err.code,\n      config: {\n        endpoint: options.opentelemetryConf?.endpoint,\n        serviceName: app.name\n      }\n    });\n    trace.setGlobalTracerProvider(new BasicTracerProvider());\n    return;\n  } finally {\n    app.on(\"appStop\", shutdownHandler);\n  }\n}\n","/**\n * \n * @Description: 链路拓扑分析器\n * @Author: richen\n * @Date: 2025-04-06 12:40:00\n * @LastEditTime: 2025-04-06 12:40:00\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { DefaultLogger as logger } from \"koatty_logger\";\n\ninterface ServiceNode {\n  name: string;\n  dependencies: Set<string>;\n}\n\n/**\n * A singleton class for analyzing and managing service topology dependencies.\n * Provides functionality to record, query and visualize service dependencies.\n * \n * @example\n * ```ts\n * const analyzer = TopologyAnalyzer.getInstance();\n * analyzer.recordServiceDependency('serviceA', 'serviceB');\n * const deps = analyzer.getServiceDependencies('serviceA');\n * ```\n * \n * @class TopologyAnalyzer\n */\nconst MAX_ENTRIES = 10000;\nconst MAX_SERVICE_NAME_LENGTH = 100;\nconst WARNING_THRESHOLD = 0.8;\n\nexport class TopologyAnalyzer {\n  private static instance: TopologyAnalyzer;\n  private serviceMap: Map<string, ServiceNode>;\n\n  private constructor() {\n    this.serviceMap = new Map();\n  }\n\n  public static getInstance(): TopologyAnalyzer {\n    if (!TopologyAnalyzer.instance) {\n      TopologyAnalyzer.instance = new TopologyAnalyzer();\n    }\n    return TopologyAnalyzer.instance;\n  }\n\n  public recordServiceDependency(source: string, target: string) {\n    if (source.length > MAX_SERVICE_NAME_LENGTH) {\n      logger.warn(`Service name \"${source}\" exceeds max length (${MAX_SERVICE_NAME_LENGTH}), truncating.`);\n      source = source.substring(0, MAX_SERVICE_NAME_LENGTH);\n    }\n    if (target && target.length > MAX_SERVICE_NAME_LENGTH) {\n      logger.warn(`Service name \"${target}\" exceeds max length (${MAX_SERVICE_NAME_LENGTH}), truncating.`);\n      target = target.substring(0, MAX_SERVICE_NAME_LENGTH);\n    }\n\n    if (this.serviceMap.size >= MAX_ENTRIES && !this.serviceMap.has(source)) {\n      logger.warn(`TopologyAnalyzer capacity limit (${MAX_ENTRIES}) reached. Dropping dependency: ${source} -> ${target}`);\n      return;\n    }\n\n    if (this.serviceMap.size >= MAX_ENTRIES * WARNING_THRESHOLD) {\n      logger.warn(`TopologyAnalyzer approaching capacity: ${this.serviceMap.size}/${MAX_ENTRIES} entries.`);\n    }\n\n    if (!this.serviceMap.has(source)) {\n      this.serviceMap.set(source, {\n        name: source,\n        dependencies: new Set()\n      });\n    }\n\n    if (target && !this.serviceMap.get(source)!.dependencies.has(target)) {\n      this.serviceMap.get(source)!.dependencies.add(target);\n      logger.debug(`Recorded service dependency: ${source} -> ${target}`);\n    }\n  }\n\n  public getServiceDependencies(serviceName: string): string[] {\n    const node = this.serviceMap.get(serviceName);\n    return node ? Array.from(node.dependencies) : [];\n  }\n\n  public getFullTopology(): Record<string, string[]> {\n    const result: Record<string, string[]> = {};\n    this.serviceMap.forEach((node, name) => {\n      result[name] = Array.from(node.dependencies);\n    });\n    return result;\n  }\n\n  public visualizeTopology(): string {\n    let graph = 'digraph G {\\n';\n    this.serviceMap.forEach((node) => {\n      node.dependencies.forEach((dep) => {\n        graph += `  \"${node.name}\" -> \"${dep}\";\\n`;\n      });\n    });\n    graph += '}';\n    return graph;\n  }\n}\n","/*\n * @Description:  \n * @Usage: \n * @Author: richen\n * @Date: 2020-11-20 17:37:32\n * @LastEditors: Please set LastEditors\n * @LastEditTime: 2023-11-10 22:18:40\n * @License: BSD (3-Clause)\n * @Copyright (c) - <richenlin(at)gmail.com>\n */\n\nimport { KoattyContext } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { randomUUID } from 'node:crypto';\nimport { TraceOptions } from \"../trace/itrace\";\n\n/**\n * Get request id from context based on protocol and options.\n * For grpc protocol, get from metadata or request body.\n * For other protocols, get from headers or query parameters.\n * If no request id found, generate a new trace id.\n * \n * @param {KoattyContext} ctx - Koatty context object\n * @param {TraceOptions} options - Trace configuration options\n * @returns {string} Request ID or generated trace ID\n */\nexport function getRequestId(ctx: KoattyContext, options: TraceOptions): string {\n  let requestId = '';\n  switch (ctx.protocol) {\n    case \"grpc\":\n      const request: any = ctx?.getMetaData(\"_body\")[0] || {};\n      requestId = ctx?.getMetaData(<string>options.requestIdName) ||\n        request[<string>options.requestIdName] || '';\n      break;\n    default:\n      if (options.requestIdHeaderName) {\n        const headerValue = ctx.headers?.[options.requestIdHeaderName.toLowerCase()] ||\n          ctx.query?.[options.requestIdName] || '';\n        requestId = Helper.isArray(headerValue) ? headerValue.join(\".\") : headerValue;\n      }\n  }\n  return requestId || getTraceId(options);\n}\n\n/**\n * Generate a trace ID using the provided factory function or UUID\n * @param {TraceOptions} [options] - Optional configuration options\n * @returns {string} The generated trace ID\n */\nexport function getTraceId(options?: TraceOptions) {\n  return Helper.isFunction(options?.idFactory) ? options.idFactory() : randomUUID();\n}\n\n// Export TimeoutController\nexport { TimeoutController } from './timeout';\n","/**\n * Context properties initialization utilities\n * 统一管理请求上下文的公共属性初始化，避免多协议场景下的重复定义问题\n * \n * @Author: richen\n * @Date: 2026-01-30\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { Helper } from \"koatty_lib\";\nimport { KoattyContext } from \"koatty_core\";\n\n/**\n * 安全地定义上下文属性（防止重复定义）\n * Define context property safely (prevent redefinition)\n * \n * @param ctx - Koatty context\n * @param property - Property name\n * @param value - Property value\n * @param setter - Whether the property is writable\n * @returns true if property was defined, false if it already exists\n */\nexport function safeDefine(\n  ctx: KoattyContext,\n  property: string,\n  value: any,\n  setter = false\n): boolean {\n  // 检查属性是否已经存在\n  if (Object.prototype.hasOwnProperty.call(ctx, property)) {\n    return false;\n  }\n  \n  // 使用 Helper.define 定义属性\n  Helper.define(ctx, property, value, setter);\n  return true;\n}\n\n/**\n * 初始化请求的公共属性（startTime, requestId 等）\n * Initialize common request properties (startTime, requestId, etc.)\n * \n * @param ctx - Koatty context\n * @param requestId - Request ID\n * @returns Object containing initialization status\n */\nexport function initializeRequestProperties(\n  ctx: KoattyContext,\n  requestId: string\n): {\n  startTimeInitialized: boolean;\n  requestIdInitialized: boolean;\n} {\n  const startTimeInitialized = safeDefine(ctx, 'startTime', Date.now());\n  const requestIdInitialized = safeDefine(ctx, 'requestId', requestId);\n  \n  return {\n    startTimeInitialized,\n    requestIdInitialized,\n  };\n}\n\n/**\n * 检查上下文是否已经初始化了必需的属性\n * Check if context has required properties initialized\n * \n * @param ctx - Koatty context\n * @returns true if all required properties exist\n */\nexport function hasRequiredProperties(ctx: KoattyContext): boolean {\n  return (\n    Object.prototype.hasOwnProperty.call(ctx, 'startTime') &&\n    Object.prototype.hasOwnProperty.call(ctx, 'requestId')\n  );\n}\n\n/**\n * 获取或初始化请求开始时间\n * Get or initialize request start time\n * \n * @param ctx - Koatty context\n * @returns Request start time in milliseconds\n */\nexport function getOrInitStartTime(ctx: KoattyContext): number {\n  if (!Object.prototype.hasOwnProperty.call(ctx, 'startTime')) {\n    Helper.define(ctx, 'startTime', Date.now());\n  }\n  return ctx.startTime;\n}\n\n/**\n * 获取或初始化请求 ID\n * Get or initialize request ID\n * \n * @param ctx - Koatty context\n * @param idGenerator - Function to generate request ID if not exists\n * @returns Request ID\n */\nexport function getOrInitRequestId(\n  ctx: KoattyContext,\n  idGenerator: () => string\n): string {\n  if (!Object.prototype.hasOwnProperty.call(ctx, 'requestId')) {\n    const requestId = idGenerator();\n    Helper.define(ctx, 'requestId', requestId);\n    return requestId;\n  }\n  return ctx.requestId;\n}\n","/**\n * \n * @Description: \n * @Author: richen\n * @Date: 2025-04-04 12:21:48\n * @LastEditTime: 2025-04-06 12:59:31\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { IOCContainer } from \"koatty_container\";\nimport { AppEvent, Koatty, KoattyContext, KoattyNext } from \"koatty_core\";\nimport { Helper } from \"koatty_lib\";\nimport { SpanManager } from '../opentelemetry/spanManager';\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { performance } from 'node:perf_hooks';\nimport { HandlerFactory } from '../handler/factory';\nimport { ProtocolType } from '../handler/base';\nimport { asyncLocalStorage, createAsyncResource, wrapEmitter } from './wrap';\nimport { extensionOptions, TraceOptions } from \"./itrace\";\nimport { initSDK, startTracer } from \"../opentelemetry/sdk\";\nimport { TopologyAnalyzer } from \"../opentelemetry/topology\";\nimport { getRequestId, getTraceId } from '../utils/utils';\nimport { collectRequestMetrics, initPrometheusExporter } from '../opentelemetry/prometheus';\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { initializeRequestProperties } from '../utils/contextInit';\n\n/**\n * Default retry condition - only retry transient network errors\n */\nconst defaultRetryCondition = (error: Error): boolean => {\n  const transientCodes = ['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'EPIPE'];\n  const code = (error as any).code;\n  return transientCodes.includes(code) || \n    (error.message && /timeout|ECONNRESET|socket hang up/i.test(error.message));\n};\n\n/** \n * defaultOptions\n */\nconst defaultOptions = {\n  // response timeout in milliseconds\n  timeout: 10000,\n  // request id header name\n  requestIdHeaderName: 'X-Request-Id',\n  // request id name\n  requestIdName: \"requestId\",\n  // id factory function\n  idFactory: getTraceId,\n  // encoding\n  encoding: 'utf-8',\n  // Whether to enable trace (default: false)\n  enableTrace: false,\n  // asynchooks enabled\n  asyncHooks: false,\n  /**\n   * Metrics configuration\n   */\n  metricsConf: {\n    /**\n     * Metrics reporter function\n     */\n    // reporter: (metrics: {\n    //   duration: number,\n    //   status: number,\n    //   path: string,\n    //   attributes: Record<string, any>,\n    // }) => void,\n    /**\n     * Default attributes for metrics\n     */\n    defaultAttributes: {},\n    /**\n     * Prometheus metrics endpoint (production only)\n     */\n    metricsEndpoint: '/metrics',\n    /**\n     * Metrics report interval in milliseconds (default: 5000)\n     */\n    reportInterval: 5000,\n    /**\n     * Prometheus metrics port (default: 9464)\n     */\n    metricsPort: 9464,\n  },\n\n  /**\n   * OpenTelemetry configuration\n   */\n  opentelemetryConf: {\n    /**\n     * OTLP endpoint URL\n     */\n    endpoint: \"http://localhost:4318/v1/traces\",\n    /**\n     * Whether to enable topology analysis (default: same as enableTrace)\n     * \n     */\n    enableTopology: false,\n    /**\n     * OTLP headers\n     */\n    headers: {},\n    /**\n     * Resource attributes\n     */\n    resourceAttributes: {},\n    /**\n     * Instrumentations to enable\n     */\n    instrumentations: [] as any,\n    /**\n     * Exporter timeout in milliseconds\n     */\n    timeout: 10000,\n    /**\n     * Maximum lifetime for a span in milliseconds\n     */\n    spanTimeout: 30000,\n    /**\n     * Maximum number of active spans in memory (default: 1000)\n     */\n    maxActiveSpans: 1000,\n    /**\n     * Request attributes to be added to the span\n     */\n    // spanAttributes: (ctx: KoattyContext) => Record<string, any>,\n\n    /**\n     * Sampling rate (0.0 - 1.0)\n     */\n    samplingRate: 1.0,\n    /**\n     * Maximum number of spans in batch queue\n     */\n    batchMaxQueueSize: 2048,\n    /**\n     * Maximum number of spans to export in one batch\n     */\n    batchMaxExportSize: 512,\n    /**\n     * Delay between batch exports in milliseconds\n     */\n    batchDelayMillis: 5000,\n    /**\n     * Timeout for batch export in milliseconds\n     */\n    batchExportTimeout: 30000,\n  },\n  /**\n   * Retry configuration\n   */\n  retryConf: {\n    /**\n     * Whether to enable retry mechanism (default: false)\n     */\n    enabled: false,\n    /**\n     * Max retry count when error occurs (default: 3)\n     */\n    count: 3,\n    /**\n     * Retry interval in milliseconds (default: 1000)\n     */\n    interval: 1000,\n    /**\n     * Custom function to determine if error should be retried\n     */\n    // conditions: (error: any) => boolean,\n  },\n};\n\n/**\n * Trace middleware for Koatty framework that provides request tracing, topology analysis,\n * and request lifecycle management capabilities.\n * \n * @param {TraceOptions} options - Configuration options for the trace middleware\n * @param {Koatty} app - Koatty application instance\n * @returns {Function} Middleware function that handles request tracing and lifecycle\n * \n * Features:\n * - Request tracing with OpenTelemetry\n * - Request ID generation and propagation\n * - Service topology analysis\n * - Request lifecycle management\n * - Server shutdown handling\n * - Async hooks support for request context\n * \n * @export\n */\nexport function Trace(options: TraceOptions, app: Koatty) {\n  options = { ...defaultOptions, ...options };\n\n  // ============================================\n  // 应用级别初始化（在 middleware 创建时完成）\n  // ============================================\n  let spanManager: SpanManager | undefined;\n  let sdk: any;\n  let metricsProvider: any;\n\n  // 1. 初始化 Prometheus Metrics\n  if (options.enableTrace && options.metricsConf?.metricsEndpoint) {\n    try {\n      metricsProvider = initPrometheusExporter(app, options);\n      if (metricsProvider) {\n        Logger.Debug('[Trace] Prometheus metrics initialized');\n      }\n    } catch (error) {\n      Logger.Error('[Trace] Failed to initialize Prometheus:', error);\n    }\n  }\n\n  // 2. 初始化 SpanManager\n  if (options.enableTrace) {\n    try {\n      spanManager = new SpanManager(options);\n      Helper.define(app, 'spanManager', spanManager);\n      Logger.Debug('[Trace] Span Manager initialized');\n    } catch (error) {\n      Logger.Error('[Trace] Failed to initialize SpanManager:', error);\n    }\n  }\n\n  // 3. 初始化 OpenTelemetry SDK\n  if (options.enableTrace) {\n    try {\n      sdk = initSDK(app, options);\n      Helper.define(app, 'otelSDK', sdk);\n      Logger.Debug('[Trace] OpenTelemetry SDK initialized');\n\n      // 4. 在 appStart 事件启动 Tracer\n      app.once(AppEvent.appStart, async () => {\n        try {\n          await startTracer(sdk, app, options);\n          const tracer = sdk.getTracer();\n          Helper.define(app, 'otelTracer', tracer);\n          Logger.Debug('[Trace] Tracer started');\n        } catch (error) {\n          Logger.Error('[Trace] Failed to start tracer:', error);\n        }\n      });\n    } catch (error) {\n      Logger.Error('[Trace] Failed to initialize OpenTelemetry SDK:', error);\n    }\n  }\n\n  // 5. 监听 appStop 事件清理资源\n  app.once(AppEvent.appStop, async () => {\n    Logger.Debug('[Trace] Shutting down tracing infrastructure...');\n    \n    try {\n      // 清理 SpanManager\n      if (spanManager) {\n        spanManager.destroy();\n        Logger.Debug('[Trace] Span Manager destroyed');\n      }\n\n      // 关闭 OpenTelemetry SDK\n      if (sdk) {\n        await sdk.shutdown();\n        Logger.Debug('[Trace] OpenTelemetry SDK shutdown');\n      }\n\n      // 关闭 Prometheus Metrics\n      if (metricsProvider) {\n        // MeterProvider shutdown if needed\n        Logger.Debug('[Trace] Metrics provider shutdown');\n      }\n\n      Logger.Debug('[Trace] Tracing infrastructure shutdown completed');\n    } catch (error) {\n      Logger.Error('[Trace] Error shutting down tracing:', error);\n    }\n  });\n\n  // 创建静态配置对象（只创建一次）\n  const staticExt = {\n    debug: app.appDebug,\n    timeout: options.timeout,\n    encoding: options.encoding,\n    get globalErrorHandler() {\n      const handler = IOCContainer.getClass(\"ExceptionHandler\", \"COMPONENT\");\n      Object.defineProperty(this, 'globalErrorHandler', { value: handler });\n      return handler;\n    },\n  };\n\n  return async (ctx: KoattyContext, next: KoattyNext) => {\n    // Handle server shutdown case first\n    // Support both single server and array of servers\n    // Match server by protocol from ctx.protocol\n    const requestProtocol = (ctx?.protocol || \"http\").toLowerCase();\n    let targetServer: any;\n    \n    if (Array.isArray(app.server)) {\n      // Find server matching the request protocol\n      targetServer = app.server.find((server: any) => {\n        const serverProtocol = server?.protocol?.toLowerCase();\n        // Protocol mapping: https/http2/http3 -> http, wss -> ws\n        if (requestProtocol === 'https' || requestProtocol === 'http2' || requestProtocol === 'http3') {\n          return serverProtocol === 'http' || serverProtocol === 'https' || \n                 serverProtocol === 'http2' || serverProtocol === 'http3';\n        }\n        if (requestProtocol === 'wss') {\n          return serverProtocol === 'ws' || serverProtocol === 'wss';\n        }\n        return serverProtocol === requestProtocol;\n      });\n    } else {\n      targetServer = app.server;\n    }\n    \n    if (targetServer?.status === 503) {\n      ctx.status = 503;\n      ctx.set('Connection', 'close');\n      ctx.body = 'Server is in the process of shutting down';\n      return;\n    }\n\n    // Initialize common request properties (prevent redefinition in multi-protocol scenarios)\n    const requestId = getRequestId(ctx, options);\n    initializeRequestProperties(ctx, requestId);\n\n    // Create span if tracing is enabled and infrastructure is ready\n    // 使用闭包中初始化的资源\n    if (options.enableTrace && spanManager) {\n      const tracer = (app as any).otelTracer;\n      if (tracer) {\n        const serviceName = app.name || \"unknownKoattyProject\";\n        spanManager.createSpan(tracer, ctx, serviceName);\n        // Span is ended in handleRequest finally block after request completion\n      }\n    }\n\n    // Record topology if enabled\n    if (options.opentelemetryConf?.enableTopology ?? options.enableTrace) {\n      const topology = TopologyAnalyzer.getInstance();\n      const serviceName = Array.isArray(ctx.headers['service'])\n        ? ctx.headers['service'][0]\n        : ctx.headers['service'] || 'unknown';\n      topology.recordServiceDependency(app.name, serviceName);\n    }\n\n    // 使用原型链继承静态配置，只添加动态属性\n    const ext = Object.create(staticExt) as extensionOptions;\n    ext.requestId = requestId;\n    ext.terminated = false;\n    ext.spanManager = spanManager;\n\n    // Handle async hooks if enabled\n    if (options.asyncHooks && (ctx.req || ctx.res)) {\n      const asyncResource = createAsyncResource();\n      return asyncLocalStorage.run(requestId, () => {\n        if (ctx.req) wrapEmitter(ctx.req, asyncResource);\n        if (ctx.res) wrapEmitter(ctx.res, asyncResource);\n        return handleRequest(ctx, next, options, ext);\n      });\n    }\n\n    return handleRequest(ctx, next, options, ext);\n  };\n}\n\n/**\n * Handle HTTP request with tracing and metrics reporting\n * \n * @param ctx - Koatty context object\n * @param next - Next middleware function\n * @param options - Trace configuration options\n * @param ext - Extension options containing span information\n * @returns Promise with the request handling result\n * \n * @description\n * Wraps request handling with tracing functionality:\n * - Measures request duration\n * - Reports metrics if configured\n * - Manages span lifecycle\n * - Handles request response\n */\nasync function handleRequest(\n  ctx: KoattyContext,\n  next: KoattyNext,\n  options: TraceOptions,\n  ext: extensionOptions\n) {\n  const startTime = performance.now();\n  let result;\n  const retryConf = options.retryConf || { enabled: false };\n\n  try {\n    if (retryConf.enabled) {\n      const maxRetries = retryConf.count || 3;\n      const interval = retryConf.interval || 1000;\n\n      for (let attempt = 0; attempt <= maxRetries; attempt++) {\n        try {\n          result = await respWarper(ctx, next, options, ext);\n          break;\n        } catch (error) {\n          // Check if error should be retried\n          const shouldRetry = retryConf.conditions\n            ? retryConf.conditions(error)\n            : defaultRetryCondition(error);\n\n          if (!shouldRetry || attempt === maxRetries) {\n            throw error;\n          }\n\n          // Wait before next retry\n          if (interval > 0) {\n            await new Promise(resolve => setTimeout(resolve, interval));\n          }\n        }\n      }\n    } else {\n      result = await respWarper(ctx, next, options, ext);\n    }\n  } finally {\n    // Calculate request duration\n    const duration = performance.now() - startTime;\n\n    // Collect request metrics using the new metrics collector\n    collectRequestMetrics(ctx, duration);\n\n    // Legacy metrics reporter support (for backward compatibility)\n    const metricsConf = options.metricsConf || {};\n    if (metricsConf.reporter) {\n      try {\n        metricsConf.reporter({\n          duration,\n          status: ctx.status || 200,\n          path: ctx.path,\n          attributes: {\n            ...(metricsConf.defaultAttributes || {}),\n            requestId: ctx.requestId,\n            method: ctx.method,\n            protocol: ctx.protocol\n          }\n        });\n      } catch (error) {\n        // Don't let metrics reporting errors affect the request\n        Logger.Warn('Metrics reporter error:', error);\n      }\n    }\n\n    // End span on request completion to ensure accurate durations and prevent memory leaks\n    if (ext.spanManager) {\n      const span = ext.spanManager.getSpan(ctx);\n      if (span) {\n        try {\n          span.setStatus({ code: ctx.status >= 400 ? SpanStatusCode.ERROR : SpanStatusCode.OK });\n          ext.spanManager.endSpan(ctx);\n        } catch (error) {\n          Logger.Warn('Error ending span:', error);\n        }\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Wraps the response handling process with trace functionality.\n * \n * @param ctx - Koatty context object\n * @param next - Next middleware function\n * @param options - Trace configuration options\n * @param ext - Extension options for tracing\n * @returns Promise that resolves after handling the request\n * @throws Rethrows any errors that occur during handling\n */\nasync function respWarper(\n  ctx: KoattyContext,\n  next: KoattyNext,\n  options: TraceOptions,\n  ext: extensionOptions\n) {\n  if (options.requestIdName && ctx.setMetaData) {\n    ctx.setMetaData(options.requestIdName, ctx.requestId);\n  }\n\n  const protocol = (ctx?.protocol || \"http\").toLowerCase();\n  if (protocol === \"grpc\" || protocol === \"ws\" || protocol === \"wss\") {\n    ctx.respond = false;\n  }\n\n  if (options.requestIdHeaderName) {\n    ctx.set(options.requestIdHeaderName, ctx.requestId);\n  }\n\n  if (ctx.rpc?.call?.metadata && options.requestIdName) {\n    ctx.rpc.call.metadata.set(options.requestIdName, ctx.requestId);\n  }\n\n  const handler = HandlerFactory.getHandler(protocol as ProtocolType);\n  return handler.handle(ctx, next, ext);\n}\n"]}