@arizeai/phoenix-otel 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/esm/createNoOpProvider.d.ts +6 -0
  2. package/dist/esm/createNoOpProvider.d.ts.map +1 -0
  3. package/dist/esm/createNoOpProvider.js +9 -0
  4. package/dist/esm/createNoOpProvider.js.map +1 -0
  5. package/dist/esm/index.d.ts +5 -2
  6. package/dist/esm/index.d.ts.map +1 -1
  7. package/dist/esm/index.js +5 -2
  8. package/dist/esm/index.js.map +1 -1
  9. package/dist/esm/register.d.ts +13 -1
  10. package/dist/esm/register.d.ts.map +1 -1
  11. package/dist/esm/register.js +9 -2
  12. package/dist/esm/register.js.map +1 -1
  13. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  14. package/dist/esm/utils.d.ts +3 -0
  15. package/dist/esm/utils.d.ts.map +1 -0
  16. package/dist/esm/utils.js +4 -0
  17. package/dist/esm/utils.js.map +1 -0
  18. package/dist/src/createNoOpProvider.d.ts +6 -0
  19. package/dist/src/createNoOpProvider.d.ts.map +1 -0
  20. package/dist/src/createNoOpProvider.js +12 -0
  21. package/dist/src/createNoOpProvider.js.map +1 -0
  22. package/dist/src/index.d.ts +5 -2
  23. package/dist/src/index.d.ts.map +1 -1
  24. package/dist/src/index.js +21 -3
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/register.d.ts +13 -1
  27. package/dist/src/register.d.ts.map +1 -1
  28. package/dist/src/register.js +9 -2
  29. package/dist/src/register.js.map +1 -1
  30. package/dist/src/utils.d.ts +3 -0
  31. package/dist/src/utils.d.ts.map +1 -0
  32. package/dist/src/utils.js +7 -0
  33. package/dist/src/utils.js.map +1 -0
  34. package/dist/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +1 -1
  36. package/src/createNoOpProvider.ts +10 -0
  37. package/src/index.ts +13 -2
  38. package/src/register.ts +21 -1
  39. package/src/utils.ts +9 -0
@@ -0,0 +1,6 @@
1
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
2
+ /**
3
+ * For dry runs we create a provider that doesn't export traces.
4
+ */
5
+ export declare function createNoOpProvider(): NodeTracerProvider;
6
+ //# sourceMappingURL=createNoOpProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createNoOpProvider.d.ts","sourceRoot":"","sources":["../../src/createNoOpProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,kBAAkB,uBAIjC"}
@@ -0,0 +1,9 @@
1
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
2
+ /**
3
+ * For dry runs we create a provider that doesn't export traces.
4
+ */
5
+ export function createNoOpProvider() {
6
+ const provider = new NodeTracerProvider({});
7
+ return provider;
8
+ }
9
+ //# sourceMappingURL=createNoOpProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createNoOpProvider.js","sourceRoot":"","sources":["../../src/createNoOpProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAE5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,5 +1,8 @@
1
- export { trace } from "@opentelemetry/api";
1
+ export { trace, context, type DiagLogLevel, type Tracer, SpanStatusCode, } from "@opentelemetry/api";
2
2
  export { registerInstrumentations } from "@opentelemetry/instrumentation";
3
- export { type RegisterParams, register } from "./register.js";
4
3
  export { type Instrumentation } from "@opentelemetry/instrumentation";
4
+ export { type NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
5
+ export * from "./createNoOpProvider.js";
6
+ export * from "./register.js";
7
+ export * from "./utils.js";
5
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,4 +1,7 @@
1
- export { trace } from "@opentelemetry/api";
1
+ export { trace, context, SpanStatusCode, } from "@opentelemetry/api";
2
2
  export { registerInstrumentations } from "@opentelemetry/instrumentation";
3
- export { register } from "./register.js";
3
+ // Phoenix abstractions
4
+ export * from "./createNoOpProvider.js";
5
+ export * from "./register.js";
6
+ export * from "./utils.js";
4
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAuB,QAAQ,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,OAAO,EAGP,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAI1E,uBAAuB;AACvB,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
2
2
  import { Instrumentation } from "@opentelemetry/instrumentation";
3
+ import { DiagLogLevel } from "@opentelemetry/api";
4
+ export type Headers = Record<string, string>;
3
5
  /**
4
6
  * Configuration parameters for registering Phoenix OpenTelemetry tracing
5
7
  */
@@ -20,6 +22,10 @@ export type RegisterParams = {
20
22
  * If not provided, environment variables are checked.
21
23
  */
22
24
  apiKey?: string;
25
+ /**
26
+ * Headers to be used when communicating with the OTLP collector
27
+ */
28
+ headers?: Headers;
23
29
  /**
24
30
  * Whether to use batching for span processing.
25
31
  * It is recommended to use batching in production environments
@@ -36,6 +42,11 @@ export type RegisterParams = {
36
42
  * @default true
37
43
  */
38
44
  global?: boolean;
45
+ /**
46
+ * The diag log level to set for the built in DiagConsoleLogger instance.
47
+ * Omit to disable built in logging.
48
+ */
49
+ diagLogLevel?: DiagLogLevel;
39
50
  };
40
51
  /**
41
52
  * Registers Phoenix OpenTelemetry tracing with the specified configuration
@@ -47,6 +58,7 @@ export type RegisterParams = {
47
58
  * @param params.instrumentations - A list of instrumentation to register
48
59
  * @param params.batch - Whether to use batching for span processing
49
60
  * @param params.global - Whether to set the tracer as a global provider
61
+ * @param params.diagLogLevel - the diagnostics log level
50
62
  * @returns {NodeTracerProvider} The configured NodeTracerProvider instance
51
63
  *
52
64
  * @example
@@ -61,7 +73,7 @@ export type RegisterParams = {
61
73
  * });
62
74
  * ```
63
75
  */
64
- export declare function register({ url: paramsUrl, apiKey: paramsApiKey, projectName, instrumentations, batch, global, }: RegisterParams): NodeTracerProvider;
76
+ export declare function register({ url: paramsUrl, apiKey: paramsApiKey, headers: paramsHeaders, projectName, instrumentations, batch, global, diagLogLevel, }: RegisterParams): NodeTracerProvider;
65
77
  /**
66
78
  * A utility method to normalize the URL to be HTTP compatible.
67
79
  * Assumes we are using HTTP over gRPC and ensures the URL ends with the correct traces endpoint.
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,WAAuB,EACvB,gBAAgB,EAChB,KAAY,EACZ,MAAa,GACd,EAAE,cAAc,GAAG,kBAAkB,CAqCrC;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3D"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAA2B,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAkB,EAC3B,WAAuB,EACvB,gBAAgB,EAChB,KAAY,EACZ,MAAa,EACb,YAAY,GACb,EAAE,cAAc,GAAG,kBAAkB,CA0CrC;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3D"}
@@ -5,6 +5,7 @@ import { resourceFromAttributes } from "@opentelemetry/resources";
5
5
  import { NodeTracerProvider, } from "@opentelemetry/sdk-trace-node";
6
6
  import { getEnvApiKey, getEnvCollectorURL } from "./config.js";
7
7
  import { registerInstrumentations, } from "@opentelemetry/instrumentation";
8
+ import { diag, DiagConsoleLogger } from "@opentelemetry/api";
8
9
  /**
9
10
  * Registers Phoenix OpenTelemetry tracing with the specified configuration
10
11
  *
@@ -15,6 +16,7 @@ import { registerInstrumentations, } from "@opentelemetry/instrumentation";
15
16
  * @param params.instrumentations - A list of instrumentation to register
16
17
  * @param params.batch - Whether to use batching for span processing
17
18
  * @param params.global - Whether to set the tracer as a global provider
19
+ * @param params.diagLogLevel - the diagnostics log level
18
20
  * @returns {NodeTracerProvider} The configured NodeTracerProvider instance
19
21
  *
20
22
  * @example
@@ -29,10 +31,15 @@ import { registerInstrumentations, } from "@opentelemetry/instrumentation";
29
31
  * });
30
32
  * ```
31
33
  */
32
- export function register({ url: paramsUrl, apiKey: paramsApiKey, projectName = "default", instrumentations, batch = true, global = true, }) {
34
+ export function register({ url: paramsUrl, apiKey: paramsApiKey, headers: paramsHeaders = {}, projectName = "default", instrumentations, batch = true, global = true, diagLogLevel, }) {
35
+ if (diagLogLevel) {
36
+ diag.setLogger(new DiagConsoleLogger(), diagLogLevel);
37
+ }
33
38
  const url = ensureCollectorEndpoint(paramsUrl || getEnvCollectorURL() || "http://localhost:6006");
34
39
  const apiKey = paramsApiKey || getEnvApiKey();
35
- const headers = {};
40
+ const headers = Array.isArray(paramsHeaders)
41
+ ? Object.fromEntries(paramsHeaders)
42
+ : paramsHeaders;
36
43
  const configureHeaders = typeof apiKey == "string";
37
44
  if (configureHeaders) {
38
45
  headers["authorization"] = `Bearer ${apiKey}`;
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,kBAAkB,GAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAEL,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AAwCxC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,WAAW,GAAG,SAAS,EACvB,gBAAgB,EAChB,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,IAAI,GACE;IACf,MAAM,GAAG,GAAG,uBAAuB,CACjC,SAAS,IAAI,kBAAkB,EAAE,IAAI,uBAAuB,CAC7D,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC;IAC9C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,OAAO,MAAM,IAAI,QAAQ,CAAC;IACnD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;QACrC,GAAG;QACH,OAAO;KACR,CAAC,CAAC;IACH,IAAI,aAA4B,CAAC;IACjC,IAAI,KAAK,EAAE,CAAC;QACV,aAAa,GAAG,IAAI,+BAA+B,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAI,gCAAgC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC;QACtC,QAAQ,EAAE,sBAAsB,CAAC;YAC/B,CAAC,wBAAwB,CAAC,EAAE,WAAW;SACxC,CAAC;QACF,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC,CAAC,CAAC;IAEH,IAAI,gBAAgB,EAAE,CAAC;QACrB,wBAAwB,CAAC;YACvB,gBAAgB;YAChB,cAAc,EAAE,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,kBAAkB,GAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAEL,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAgB,MAAM,oBAAoB,CAAC;AAmD3E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAa,GAAG,EAAE,EAC3B,WAAW,GAAG,SAAS,EACvB,gBAAgB,EAChB,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,IAAI,EACb,YAAY,GACG;IACf,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,CAAC,IAAI,iBAAiB,EAAE,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,GAAG,GAAG,uBAAuB,CACjC,SAAS,IAAI,kBAAkB,EAAE,IAAI,uBAAuB,CAC7D,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAY,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;QACnD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC;QACnC,CAAC,CAAC,aAAa,CAAC;IAClB,MAAM,gBAAgB,GAAG,OAAO,MAAM,IAAI,QAAQ,CAAC;IACnD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;QACrC,GAAG;QACH,OAAO;KACR,CAAC,CAAC;IACH,IAAI,aAA4B,CAAC;IACjC,IAAI,KAAK,EAAE,CAAC;QACV,aAAa,GAAG,IAAI,+BAA+B,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAI,gCAAgC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC;QACtC,QAAQ,EAAE,sBAAsB,CAAC;YAC/B,CAAC,wBAAwB,CAAC,EAAE,WAAW;SACxC,CAAC;QACF,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC,CAAC,CAAC;IAEH,IAAI,gBAAgB,EAAE,CAAC;QACrB,wBAAwB,CAAC;YACvB,gBAAgB;YAChB,cAAc,EAAE,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjC,CAAC"}