@contractspec/lib.feature-flags 1.57.0 → 1.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/contracts/index.js +636 -0
- package/dist/browser/docs/feature-flags.docblock.js +71 -0
- package/dist/browser/docs/index.js +71 -0
- package/dist/browser/entities/index.js +306 -0
- package/dist/browser/evaluation/index.js +223 -0
- package/dist/browser/events.js +296 -0
- package/dist/browser/feature-flags.capability.js +28 -0
- package/dist/browser/feature-flags.feature.js +55 -0
- package/dist/browser/index.js +1583 -0
- package/dist/contracts/index.d.ts +944 -950
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +635 -906
- package/dist/docs/feature-flags.docblock.d.ts +2 -1
- package/dist/docs/feature-flags.docblock.d.ts.map +1 -0
- package/dist/docs/feature-flags.docblock.js +18 -22
- package/dist/docs/index.d.ts +2 -1
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +72 -1
- package/dist/entities/index.d.ts +159 -164
- package/dist/entities/index.d.ts.map +1 -1
- package/dist/entities/index.js +297 -315
- package/dist/evaluation/index.d.ts +119 -122
- package/dist/evaluation/index.d.ts.map +1 -1
- package/dist/evaluation/index.js +215 -212
- package/dist/events.d.ts +480 -486
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +272 -511
- package/dist/feature-flags.capability.d.ts +2 -7
- package/dist/feature-flags.capability.d.ts.map +1 -1
- package/dist/feature-flags.capability.js +29 -25
- package/dist/feature-flags.feature.d.ts +1 -6
- package/dist/feature-flags.feature.d.ts.map +1 -1
- package/dist/feature-flags.feature.js +54 -146
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1584 -8
- package/dist/node/contracts/index.js +636 -0
- package/dist/node/docs/feature-flags.docblock.js +71 -0
- package/dist/node/docs/index.js +71 -0
- package/dist/node/entities/index.js +306 -0
- package/dist/node/evaluation/index.js +223 -0
- package/dist/node/events.js +296 -0
- package/dist/node/feature-flags.capability.js +28 -0
- package/dist/node/feature-flags.feature.js +55 -0
- package/dist/node/index.js +1583 -0
- package/package.json +117 -30
- package/dist/contracts/index.js.map +0 -1
- package/dist/docs/feature-flags.docblock.js.map +0 -1
- package/dist/entities/index.js.map +0 -1
- package/dist/evaluation/index.js.map +0 -1
- package/dist/events.js.map +0 -1
- package/dist/feature-flags.capability.js.map +0 -1
- package/dist/feature-flags.feature.js.map +0 -1
|
@@ -1,109 +1,108 @@
|
|
|
1
|
-
//#region src/evaluation/index.d.ts
|
|
2
1
|
/**
|
|
3
2
|
* Feature flag evaluation engine.
|
|
4
3
|
*
|
|
5
4
|
* Provides deterministic evaluation of feature flags based on targeting rules
|
|
6
5
|
* and experiment assignments.
|
|
7
6
|
*/
|
|
8
|
-
interface EvaluationContext {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
7
|
+
export interface EvaluationContext {
|
|
8
|
+
/** User identifier */
|
|
9
|
+
userId?: string;
|
|
10
|
+
/** Organization identifier */
|
|
11
|
+
orgId?: string;
|
|
12
|
+
/** User's plan (free, pro, enterprise, etc.) */
|
|
13
|
+
plan?: string;
|
|
14
|
+
/** User segment or cohort */
|
|
15
|
+
segment?: string;
|
|
16
|
+
/** Session identifier for anonymous users */
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
/** Additional custom attributes */
|
|
19
|
+
attributes?: Record<string, unknown>;
|
|
21
20
|
}
|
|
22
|
-
interface FeatureFlag {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
export interface FeatureFlag {
|
|
22
|
+
id: string;
|
|
23
|
+
key: string;
|
|
24
|
+
status: 'OFF' | 'ON' | 'GRADUAL';
|
|
25
|
+
defaultValue: boolean;
|
|
26
|
+
variants?: VariantConfig[];
|
|
28
27
|
}
|
|
29
|
-
interface TargetingRule {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
export interface TargetingRule {
|
|
29
|
+
id: string;
|
|
30
|
+
priority: number;
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
attribute: string;
|
|
33
|
+
operator: RuleOperator;
|
|
34
|
+
value: unknown;
|
|
35
|
+
rolloutPercentage?: number;
|
|
36
|
+
serveValue?: boolean;
|
|
37
|
+
serveVariant?: string;
|
|
39
38
|
}
|
|
40
|
-
interface Experiment {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
export interface Experiment {
|
|
40
|
+
id: string;
|
|
41
|
+
key: string;
|
|
42
|
+
status: 'DRAFT' | 'RUNNING' | 'PAUSED' | 'COMPLETED' | 'CANCELLED';
|
|
43
|
+
variants: ExperimentVariant[];
|
|
44
|
+
audiencePercentage: number;
|
|
45
|
+
audienceFilter?: Record<string, unknown>;
|
|
47
46
|
}
|
|
48
|
-
interface VariantConfig {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
export interface VariantConfig {
|
|
48
|
+
key: string;
|
|
49
|
+
name: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
weight?: number;
|
|
53
52
|
}
|
|
54
|
-
interface ExperimentVariant {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
export interface ExperimentVariant {
|
|
54
|
+
key: string;
|
|
55
|
+
name: string;
|
|
56
|
+
percentage: number;
|
|
58
57
|
}
|
|
59
|
-
interface EvaluationResult {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
58
|
+
export interface EvaluationResult {
|
|
59
|
+
enabled: boolean;
|
|
60
|
+
variant?: string;
|
|
61
|
+
reason: EvaluationReason;
|
|
62
|
+
ruleId?: string;
|
|
63
|
+
experimentId?: string;
|
|
65
64
|
}
|
|
66
|
-
type EvaluationReason = 'FLAG_OFF' | 'FLAG_ON' | 'DEFAULT_VALUE' | 'RULE_MATCH' | 'PERCENTAGE_ROLLOUT' | 'EXPERIMENT_VARIANT' | 'FLAG_NOT_FOUND';
|
|
67
|
-
type RuleOperator = 'EQ' | 'NEQ' | 'IN' | 'NIN' | 'CONTAINS' | 'NOT_CONTAINS' | 'GT' | 'GTE' | 'LT' | 'LTE' | 'PERCENTAGE';
|
|
65
|
+
export type EvaluationReason = 'FLAG_OFF' | 'FLAG_ON' | 'DEFAULT_VALUE' | 'RULE_MATCH' | 'PERCENTAGE_ROLLOUT' | 'EXPERIMENT_VARIANT' | 'FLAG_NOT_FOUND';
|
|
66
|
+
export type RuleOperator = 'EQ' | 'NEQ' | 'IN' | 'NIN' | 'CONTAINS' | 'NOT_CONTAINS' | 'GT' | 'GTE' | 'LT' | 'LTE' | 'PERCENTAGE';
|
|
68
67
|
/**
|
|
69
68
|
* Simple hash function for consistent bucketing.
|
|
70
69
|
* Uses a deterministic algorithm so the same input always produces the same bucket.
|
|
71
70
|
*/
|
|
72
|
-
declare function hashToBucket(value: string, seed?: string): number;
|
|
71
|
+
export declare function hashToBucket(value: string, seed?: string): number;
|
|
73
72
|
/**
|
|
74
73
|
* Get subject identifier from context for consistent hashing.
|
|
75
74
|
*/
|
|
76
|
-
declare function getSubjectId(context: EvaluationContext): string;
|
|
75
|
+
export declare function getSubjectId(context: EvaluationContext): string;
|
|
77
76
|
/**
|
|
78
77
|
* Evaluate a single targeting rule condition.
|
|
79
78
|
*/
|
|
80
|
-
declare function evaluateRuleCondition(rule: TargetingRule, context: EvaluationContext): boolean;
|
|
81
|
-
interface FlagRepository {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
79
|
+
export declare function evaluateRuleCondition(rule: TargetingRule, context: EvaluationContext): boolean;
|
|
80
|
+
export interface FlagRepository {
|
|
81
|
+
getFlag(key: string, orgId?: string): Promise<FeatureFlag | null>;
|
|
82
|
+
getRules(flagId: string): Promise<TargetingRule[]>;
|
|
83
|
+
getActiveExperiment(flagId: string): Promise<Experiment | null>;
|
|
84
|
+
getExperimentAssignment(experimentId: string, subjectType: string, subjectId: string): Promise<string | null>;
|
|
85
|
+
saveExperimentAssignment(experimentId: string, subjectType: string, subjectId: string, variant: string, bucket: number): Promise<void>;
|
|
87
86
|
}
|
|
88
|
-
interface EvaluationLogger {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
87
|
+
export interface EvaluationLogger {
|
|
88
|
+
log(evaluation: {
|
|
89
|
+
flagId: string;
|
|
90
|
+
flagKey: string;
|
|
91
|
+
subjectType: string;
|
|
92
|
+
subjectId: string;
|
|
93
|
+
result: boolean;
|
|
94
|
+
variant?: string;
|
|
95
|
+
reason: string;
|
|
96
|
+
ruleId?: string;
|
|
97
|
+
experimentId?: string;
|
|
98
|
+
context?: EvaluationContext;
|
|
99
|
+
}): void;
|
|
101
100
|
}
|
|
102
|
-
interface FlagEvaluatorOptions {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
101
|
+
export interface FlagEvaluatorOptions {
|
|
102
|
+
repository: FlagRepository;
|
|
103
|
+
logger?: EvaluationLogger;
|
|
104
|
+
/** Whether to log evaluations (default: false for performance) */
|
|
105
|
+
logEvaluations?: boolean;
|
|
107
106
|
}
|
|
108
107
|
/**
|
|
109
108
|
* Feature flag evaluator.
|
|
@@ -114,50 +113,48 @@ interface FlagEvaluatorOptions {
|
|
|
114
113
|
* 3. Experiments (if running)
|
|
115
114
|
* 4. Default value (fallback)
|
|
116
115
|
*/
|
|
117
|
-
declare class FlagEvaluator {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
116
|
+
export declare class FlagEvaluator {
|
|
117
|
+
private repository;
|
|
118
|
+
private logger?;
|
|
119
|
+
private logEvaluations;
|
|
120
|
+
constructor(options: FlagEvaluatorOptions);
|
|
121
|
+
/**
|
|
122
|
+
* Evaluate a feature flag.
|
|
123
|
+
*/
|
|
124
|
+
evaluate(key: string, context: EvaluationContext): Promise<EvaluationResult>;
|
|
125
|
+
/**
|
|
126
|
+
* Evaluate experiment and assign variant.
|
|
127
|
+
*/
|
|
128
|
+
private evaluateExperiment;
|
|
129
|
+
/**
|
|
130
|
+
* Assign a variant based on bucket and variant percentages.
|
|
131
|
+
*/
|
|
132
|
+
private assignVariant;
|
|
133
|
+
/**
|
|
134
|
+
* Create evaluation result.
|
|
135
|
+
*/
|
|
136
|
+
private makeResult;
|
|
137
|
+
/**
|
|
138
|
+
* Log evaluation and return result.
|
|
139
|
+
*/
|
|
140
|
+
private logAndReturn;
|
|
142
141
|
}
|
|
143
142
|
/**
|
|
144
143
|
* In-memory flag repository for testing and development.
|
|
145
144
|
*/
|
|
146
|
-
declare class InMemoryFlagRepository implements FlagRepository {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
145
|
+
export declare class InMemoryFlagRepository implements FlagRepository {
|
|
146
|
+
private flags;
|
|
147
|
+
private rules;
|
|
148
|
+
private experiments;
|
|
149
|
+
private assignments;
|
|
150
|
+
addFlag(flag: FeatureFlag): void;
|
|
151
|
+
addRule(flagId: string, rule: TargetingRule): void;
|
|
152
|
+
addExperiment(experiment: Experiment, flagId: string): void;
|
|
153
|
+
getFlag(key: string): Promise<FeatureFlag | null>;
|
|
154
|
+
getRules(flagId: string): Promise<TargetingRule[]>;
|
|
155
|
+
getActiveExperiment(flagId: string): Promise<Experiment | null>;
|
|
156
|
+
getExperimentAssignment(experimentId: string, subjectType: string, subjectId: string): Promise<string | null>;
|
|
157
|
+
saveExperimentAssignment(experimentId: string, subjectType: string, subjectId: string, variant: string): Promise<void>;
|
|
158
|
+
clear(): void;
|
|
160
159
|
}
|
|
161
|
-
//#endregion
|
|
162
|
-
export { EvaluationContext, EvaluationLogger, EvaluationReason, EvaluationResult, Experiment, ExperimentVariant, FeatureFlag, FlagEvaluator, FlagEvaluatorOptions, FlagRepository, InMemoryFlagRepository, RuleOperator, TargetingRule, VariantConfig, evaluateRuleCondition, getSubjectId, hashToBucket };
|
|
163
160
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evaluation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,iBAAiB;IAChC,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IACnE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,SAAS,GACT,eAAe,GACf,YAAY,GACZ,oBAAoB,GACpB,oBAAoB,GACpB,gBAAgB,CAAC;AAErB,MAAM,MAAM,YAAY,GACpB,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,UAAU,GACV,cAAc,GACd,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,YAAY,CAAC;AAIjB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,MAAM,CAU7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAE/D;AAID;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CA0DT;AA2BD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACnD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAChE,uBAAuB,CACrB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,wBAAwB,CACtB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,UAAU,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,iBAAiB,CAAC;KAC7B,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,kEAAkE;IAClE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,MAAM,CAAC,CAAmB;IAClC,OAAO,CAAC,cAAc,CAAU;gBAEpB,OAAO,EAAE,oBAAoB;IAMzC;;OAEG;IACG,QAAQ,CACZ,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC;IAqE5B;;OAEG;YACW,kBAAkB;IAsDhC;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;OAEG;IACH,OAAO,CAAC,YAAY;CA4BrB;AAID;;GAEG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAIhC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAMlD,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIrD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAIjD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIlD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAI/D,uBAAuB,CAC3B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKnB,wBAAwB,CAC5B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAKhB,KAAK,IAAI,IAAI;CAMd"}
|