@the-trybe/formula-engine 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +6 -0
- package/PRD_FORMULA_ENGINE.md +1863 -0
- package/README.md +382 -0
- package/dist/decimal-utils.d.ts +180 -0
- package/dist/decimal-utils.js +355 -0
- package/dist/dependency-extractor.d.ts +20 -0
- package/dist/dependency-extractor.js +103 -0
- package/dist/dependency-graph.d.ts +60 -0
- package/dist/dependency-graph.js +252 -0
- package/dist/errors.d.ts +161 -0
- package/dist/errors.js +260 -0
- package/dist/evaluator.d.ts +51 -0
- package/dist/evaluator.js +494 -0
- package/dist/formula-engine.d.ts +79 -0
- package/dist/formula-engine.js +355 -0
- package/dist/functions.d.ts +3 -0
- package/dist/functions.js +720 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +61 -0
- package/dist/lexer.d.ts +25 -0
- package/dist/lexer.js +357 -0
- package/dist/parser.d.ts +32 -0
- package/dist/parser.js +372 -0
- package/dist/types.d.ts +228 -0
- package/dist/types.js +62 -0
- package/jest.config.js +23 -0
- package/package.json +35 -0
- package/src/decimal-utils.ts +408 -0
- package/src/dependency-extractor.ts +117 -0
- package/src/dependency-graph.test.ts +238 -0
- package/src/dependency-graph.ts +288 -0
- package/src/errors.ts +296 -0
- package/src/evaluator.ts +604 -0
- package/src/formula-engine.test.ts +660 -0
- package/src/formula-engine.ts +430 -0
- package/src/functions.ts +770 -0
- package/src/index.ts +103 -0
- package/src/lexer.test.ts +288 -0
- package/src/lexer.ts +394 -0
- package/src/parser.test.ts +349 -0
- package/src/parser.ts +449 -0
- package/src/types.ts +347 -0
- package/tsconfig.json +29 -0
package/dist/errors.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeneralFormulaError = exports.MaxExpressionLengthError = exports.MaxRecursionError = exports.MaxIterationsError = exports.SecurityError = exports.ConfigurationError = exports.InvalidDecimalError = exports.DecimalDivisionByZeroError = exports.DecimalUnderflowError = exports.DecimalOverflowError = exports.DecimalError = exports.IndexAccessError = exports.PropertyAccessError = exports.InvalidOperationError = exports.ArgumentCountError = exports.TypeMismatchError = exports.DivisionByZeroError = exports.DuplicateFormulaError = exports.UndefinedFunctionError = exports.UndefinedVariableError = exports.CircularDependencyError = exports.InvalidNumberError = exports.UnterminatedStringError = exports.UnexpectedTokenError = exports.SyntaxError = exports.FormulaEngineError = void 0;
|
|
4
|
+
class FormulaEngineError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = this.constructor.name;
|
|
8
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.FormulaEngineError = FormulaEngineError;
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Parse Errors
|
|
14
|
+
// ============================================================================
|
|
15
|
+
class SyntaxError extends FormulaEngineError {
|
|
16
|
+
constructor(message, position, line, column, expression) {
|
|
17
|
+
super(`${message} at line ${line}, column ${column}`);
|
|
18
|
+
this.position = position;
|
|
19
|
+
this.line = line;
|
|
20
|
+
this.column = column;
|
|
21
|
+
this.expression = expression;
|
|
22
|
+
this.code = 'PARSE_SYNTAX_ERROR';
|
|
23
|
+
this.category = 'PARSE';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.SyntaxError = SyntaxError;
|
|
27
|
+
class UnexpectedTokenError extends FormulaEngineError {
|
|
28
|
+
constructor(token, expected, position) {
|
|
29
|
+
super(`Unexpected token '${token}', expected one of: ${expected.join(', ')}`);
|
|
30
|
+
this.token = token;
|
|
31
|
+
this.expected = expected;
|
|
32
|
+
this.position = position;
|
|
33
|
+
this.code = 'PARSE_UNEXPECTED_TOKEN';
|
|
34
|
+
this.category = 'PARSE';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.UnexpectedTokenError = UnexpectedTokenError;
|
|
38
|
+
class UnterminatedStringError extends FormulaEngineError {
|
|
39
|
+
constructor(position) {
|
|
40
|
+
super(`Unterminated string starting at position ${position}`);
|
|
41
|
+
this.code = 'PARSE_UNTERMINATED_STRING';
|
|
42
|
+
this.category = 'PARSE';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.UnterminatedStringError = UnterminatedStringError;
|
|
46
|
+
class InvalidNumberError extends FormulaEngineError {
|
|
47
|
+
constructor(value, position) {
|
|
48
|
+
super(`Invalid number '${value}' at position ${position}`);
|
|
49
|
+
this.code = 'PARSE_INVALID_NUMBER';
|
|
50
|
+
this.category = 'PARSE';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.InvalidNumberError = InvalidNumberError;
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Validation Errors
|
|
56
|
+
// ============================================================================
|
|
57
|
+
class CircularDependencyError extends FormulaEngineError {
|
|
58
|
+
constructor(cycle, involvedFormulas) {
|
|
59
|
+
super(`Circular dependency detected: ${cycle.join(' → ')}`);
|
|
60
|
+
this.cycle = cycle;
|
|
61
|
+
this.involvedFormulas = involvedFormulas;
|
|
62
|
+
this.code = 'VALIDATION_CIRCULAR_DEPENDENCY';
|
|
63
|
+
this.category = 'VALIDATION';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.CircularDependencyError = CircularDependencyError;
|
|
67
|
+
class UndefinedVariableError extends FormulaEngineError {
|
|
68
|
+
constructor(variableName, expression) {
|
|
69
|
+
super(`Undefined variable: ${variableName}`);
|
|
70
|
+
this.variableName = variableName;
|
|
71
|
+
this.expression = expression;
|
|
72
|
+
this.code = 'VALIDATION_UNDEFINED_VARIABLE';
|
|
73
|
+
this.category = 'VALIDATION';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.UndefinedVariableError = UndefinedVariableError;
|
|
77
|
+
class UndefinedFunctionError extends FormulaEngineError {
|
|
78
|
+
constructor(functionName) {
|
|
79
|
+
super(`Undefined function: ${functionName}`);
|
|
80
|
+
this.functionName = functionName;
|
|
81
|
+
this.code = 'VALIDATION_UNDEFINED_FUNCTION';
|
|
82
|
+
this.category = 'VALIDATION';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.UndefinedFunctionError = UndefinedFunctionError;
|
|
86
|
+
class DuplicateFormulaError extends FormulaEngineError {
|
|
87
|
+
constructor(formulaId) {
|
|
88
|
+
super(`Duplicate formula ID: ${formulaId}`);
|
|
89
|
+
this.formulaId = formulaId;
|
|
90
|
+
this.code = 'VALIDATION_DUPLICATE_FORMULA';
|
|
91
|
+
this.category = 'VALIDATION';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.DuplicateFormulaError = DuplicateFormulaError;
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// Evaluation Errors
|
|
97
|
+
// ============================================================================
|
|
98
|
+
class DivisionByZeroError extends FormulaEngineError {
|
|
99
|
+
constructor() {
|
|
100
|
+
super('Division by zero');
|
|
101
|
+
this.code = 'EVAL_DIVISION_BY_ZERO';
|
|
102
|
+
this.category = 'EVALUATION';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.DivisionByZeroError = DivisionByZeroError;
|
|
106
|
+
class TypeMismatchError extends FormulaEngineError {
|
|
107
|
+
constructor(expected, actual, context) {
|
|
108
|
+
const expectedStr = Array.isArray(expected) ? expected.join(' or ') : expected;
|
|
109
|
+
super(`Type mismatch: expected ${expectedStr}, got ${actual} in ${context}`);
|
|
110
|
+
this.expected = expected;
|
|
111
|
+
this.actual = actual;
|
|
112
|
+
this.context = context;
|
|
113
|
+
this.code = 'EVAL_TYPE_MISMATCH';
|
|
114
|
+
this.category = 'EVALUATION';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.TypeMismatchError = TypeMismatchError;
|
|
118
|
+
class ArgumentCountError extends FormulaEngineError {
|
|
119
|
+
constructor(functionName, expected, actual) {
|
|
120
|
+
const expectedStr = expected.min === expected.max
|
|
121
|
+
? `${expected.min}`
|
|
122
|
+
: expected.max === -1
|
|
123
|
+
? `at least ${expected.min}`
|
|
124
|
+
: `${expected.min}-${expected.max}`;
|
|
125
|
+
super(`Function ${functionName} expects ${expectedStr} arguments, got ${actual}`);
|
|
126
|
+
this.functionName = functionName;
|
|
127
|
+
this.expected = expected;
|
|
128
|
+
this.actual = actual;
|
|
129
|
+
this.code = 'EVAL_ARGUMENT_COUNT';
|
|
130
|
+
this.category = 'EVALUATION';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.ArgumentCountError = ArgumentCountError;
|
|
134
|
+
class InvalidOperationError extends FormulaEngineError {
|
|
135
|
+
constructor(operator, operandTypes) {
|
|
136
|
+
super(`Cannot apply operator '${operator}' to types: ${operandTypes.join(', ')}`);
|
|
137
|
+
this.operator = operator;
|
|
138
|
+
this.operandTypes = operandTypes;
|
|
139
|
+
this.code = 'EVAL_INVALID_OPERATION';
|
|
140
|
+
this.category = 'EVALUATION';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.InvalidOperationError = InvalidOperationError;
|
|
144
|
+
class PropertyAccessError extends FormulaEngineError {
|
|
145
|
+
constructor(property, objectType) {
|
|
146
|
+
super(`Cannot access property '${property}' on ${objectType}`);
|
|
147
|
+
this.property = property;
|
|
148
|
+
this.objectType = objectType;
|
|
149
|
+
this.code = 'EVAL_PROPERTY_ACCESS';
|
|
150
|
+
this.category = 'EVALUATION';
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.PropertyAccessError = PropertyAccessError;
|
|
154
|
+
class IndexAccessError extends FormulaEngineError {
|
|
155
|
+
constructor(index, objectType) {
|
|
156
|
+
super(`Cannot use index '${index}' on ${objectType}`);
|
|
157
|
+
this.index = index;
|
|
158
|
+
this.objectType = objectType;
|
|
159
|
+
this.code = 'EVAL_INDEX_ACCESS';
|
|
160
|
+
this.category = 'EVALUATION';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.IndexAccessError = IndexAccessError;
|
|
164
|
+
// ============================================================================
|
|
165
|
+
// Decimal Errors
|
|
166
|
+
// ============================================================================
|
|
167
|
+
class DecimalError extends FormulaEngineError {
|
|
168
|
+
constructor(message) {
|
|
169
|
+
super(message);
|
|
170
|
+
this.code = 'DECIMAL_ERROR';
|
|
171
|
+
this.category = 'EVALUATION';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.DecimalError = DecimalError;
|
|
175
|
+
class DecimalOverflowError extends DecimalError {
|
|
176
|
+
constructor(value, maxExponent) {
|
|
177
|
+
super(`Decimal overflow: exponent exceeds ${maxExponent}`);
|
|
178
|
+
this.value = value;
|
|
179
|
+
this.maxExponent = maxExponent;
|
|
180
|
+
this.code = 'DECIMAL_OVERFLOW';
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.DecimalOverflowError = DecimalOverflowError;
|
|
184
|
+
class DecimalUnderflowError extends DecimalError {
|
|
185
|
+
constructor(value, minExponent) {
|
|
186
|
+
super(`Decimal underflow: exponent below ${minExponent}`);
|
|
187
|
+
this.value = value;
|
|
188
|
+
this.minExponent = minExponent;
|
|
189
|
+
this.code = 'DECIMAL_UNDERFLOW';
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.DecimalUnderflowError = DecimalUnderflowError;
|
|
193
|
+
class DecimalDivisionByZeroError extends DecimalError {
|
|
194
|
+
constructor() {
|
|
195
|
+
super('Division by zero');
|
|
196
|
+
this.code = 'DECIMAL_DIVISION_BY_ZERO';
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.DecimalDivisionByZeroError = DecimalDivisionByZeroError;
|
|
200
|
+
class InvalidDecimalError extends DecimalError {
|
|
201
|
+
constructor(input) {
|
|
202
|
+
super(`Invalid decimal value: "${input}"`);
|
|
203
|
+
this.input = input;
|
|
204
|
+
this.code = 'INVALID_DECIMAL';
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.InvalidDecimalError = InvalidDecimalError;
|
|
208
|
+
// ============================================================================
|
|
209
|
+
// Configuration Errors
|
|
210
|
+
// ============================================================================
|
|
211
|
+
class ConfigurationError extends FormulaEngineError {
|
|
212
|
+
constructor(message) {
|
|
213
|
+
super(message);
|
|
214
|
+
this.code = 'CONFIGURATION_ERROR';
|
|
215
|
+
this.category = 'CONFIGURATION';
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
exports.ConfigurationError = ConfigurationError;
|
|
219
|
+
// ============================================================================
|
|
220
|
+
// Security Errors
|
|
221
|
+
// ============================================================================
|
|
222
|
+
class SecurityError extends FormulaEngineError {
|
|
223
|
+
constructor(message) {
|
|
224
|
+
super(message);
|
|
225
|
+
this.code = 'SECURITY_ERROR';
|
|
226
|
+
this.category = 'EVALUATION';
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
exports.SecurityError = SecurityError;
|
|
230
|
+
class MaxIterationsError extends SecurityError {
|
|
231
|
+
constructor(limit) {
|
|
232
|
+
super(`Maximum iterations exceeded: ${limit}`);
|
|
233
|
+
this.code = 'MAX_ITERATIONS_EXCEEDED';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.MaxIterationsError = MaxIterationsError;
|
|
237
|
+
class MaxRecursionError extends SecurityError {
|
|
238
|
+
constructor(limit) {
|
|
239
|
+
super(`Maximum recursion depth exceeded: ${limit}`);
|
|
240
|
+
this.code = 'MAX_RECURSION_EXCEEDED';
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
exports.MaxRecursionError = MaxRecursionError;
|
|
244
|
+
class MaxExpressionLengthError extends SecurityError {
|
|
245
|
+
constructor(length, limit) {
|
|
246
|
+
super(`Expression length ${length} exceeds maximum ${limit}`);
|
|
247
|
+
this.code = 'MAX_EXPRESSION_LENGTH_EXCEEDED';
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.MaxExpressionLengthError = MaxExpressionLengthError;
|
|
251
|
+
// Concrete class for general errors
|
|
252
|
+
class GeneralFormulaError extends FormulaEngineError {
|
|
253
|
+
constructor(message) {
|
|
254
|
+
super(message);
|
|
255
|
+
this.code = 'GENERAL_ERROR';
|
|
256
|
+
this.category = 'EVALUATION';
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.GeneralFormulaError = GeneralFormulaError;
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFzQixrQkFBbUIsU0FBUSxLQUFLO0lBSXBELFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBVEQsZ0RBU0M7QUFFRCwrRUFBK0U7QUFDL0UsZUFBZTtBQUNmLCtFQUErRTtBQUUvRSxNQUFhLFdBQVksU0FBUSxrQkFBa0I7SUFJakQsWUFDRSxPQUFlLEVBQ1IsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLE1BQWMsRUFDZCxVQUFrQjtRQUV6QixLQUFLLENBQUMsR0FBRyxPQUFPLFlBQVksSUFBSSxZQUFZLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFML0MsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVE7UUFSbEIsU0FBSSxHQUFHLG9CQUFvQixDQUFDO1FBQzVCLGFBQVEsR0FBa0IsT0FBTyxDQUFDO0lBVTNDLENBQUM7Q0FDRjtBQWJELGtDQWFDO0FBRUQsTUFBYSxvQkFBcUIsU0FBUSxrQkFBa0I7SUFJMUQsWUFDUyxLQUFhLEVBQ2IsUUFBa0IsRUFDbEIsUUFBZ0I7UUFFdkIsS0FBSyxDQUFDLHFCQUFxQixLQUFLLHVCQUF1QixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUp2RSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtR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Q0FBQyxDQUFDO1FBSlIsU0FBSSxHQUFXLGdCQUFnQixDQUFDO1FBQ2hDLGFBQVEsR0FBa0IsWUFBWSxDQUFDO0lBSWhELENBQUM7Q0FDRjtBQVBELHNDQU9DO0FBRUQsTUFBYSxrQkFBbUIsU0FBUSxhQUFhO0lBR25ELFlBQVksS0FBYTtRQUN2QixLQUFLLENBQUMsZ0NBQWdDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFIL0IsU0FBSSxHQUFXLHlCQUF5QixDQUFDO0lBSTNELENBQUM7Q0FDRjtBQU5ELGdEQU1DO0FBRUQsTUFBYSxpQkFBa0IsU0FBUSxhQUFhO0lBR2xELFlBQVksS0FBYTtRQUN2QixLQUFLLENBQUMscUNBQXFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFIcEMsU0FBSSxHQUFXLHdCQUF3QixDQUFDO0lBSTFELENBQUM7Q0FDRjtBQU5ELDhDQU1DO0FBRUQsTUFBYSx3QkFBeUIsU0FBUSxhQUFhO0lBR3pELFlBQVksTUFBYyxFQUFFLEtBQWE7UUFDdkMsS0FBSyxDQUFDLHFCQUFxQixNQUFNLG9CQUFvQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBSDlDLFNBQUksR0FBVyxnQ0FBZ0MsQ0FBQztJQUlsRSxDQUFDO0NBQ0Y7QUFORCw0REFNQztBQUVELG9DQUFvQztBQUNwQyxNQUFhLG1CQUFvQixTQUFRLGtCQUFrQjtJQUl6RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSlIsU0FBSSxHQUFXLGVBQWUsQ0FBQztRQUMvQixhQUFRLEdBQWtCLFlBQVksQ0FBQztJQUloRCxDQUFDO0NBQ0Y7QUFQRCxrREFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZhbHVlVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBFcnJvckNhdGVnb3J5ID0gJ1BBUlNFJyB8ICdWQUxJREFUSU9OJyB8ICdFVkFMVUFUSU9OJyB8ICdDT05GSUdVUkFUSU9OJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm11bGFFbmdpbmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeTtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG5ldy50YXJnZXQucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXJzZSBFcnJvcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFN5bnRheEVycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdQQVJTRV9TWU5UQVhfRVJST1InO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdQQVJTRSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBwb3NpdGlvbjogbnVtYmVyLFxuICAgIHB1YmxpYyBsaW5lOiBudW1iZXIsXG4gICAgcHVibGljIGNvbHVtbjogbnVtYmVyLFxuICAgIHB1YmxpYyBleHByZXNzaW9uOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoYCR7bWVzc2FnZX0gYXQgbGluZSAke2xpbmV9LCBjb2x1bW4gJHtjb2x1bW59YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRUb2tlbkVycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdQQVJTRV9VTkVYUEVDVEVEX1RPS0VOJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnUEFSU0UnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0b2tlbjogc3RyaW5nLFxuICAgIHB1YmxpYyBleHBlY3RlZDogc3RyaW5nW10sXG4gICAgcHVibGljIHBvc2l0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIoYFVuZXhwZWN0ZWQgdG9rZW4gJyR7dG9rZW59JywgZXhwZWN0ZWQgb25lIG9mOiAke2V4cGVjdGVkLmpvaW4oJywgJyl9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVudGVybWluYXRlZFN0cmluZ0Vycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdQQVJTRV9VTlRFUk1JTkFURURfU1RSSU5HJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnUEFSU0UnO1xuXG4gIGNvbnN0cnVjdG9yKHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBzdXBlcihgVW50ZXJtaW5hdGVkIHN0cmluZyBzdGFydGluZyBhdCBwb3NpdGlvbiAke3Bvc2l0aW9ufWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkTnVtYmVyRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ1BBUlNFX0lOVkFMSURfTlVNQkVSJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnUEFSU0UnO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBzdXBlcihgSW52YWxpZCBudW1iZXIgJyR7dmFsdWV9JyBhdCBwb3NpdGlvbiAke3Bvc2l0aW9ufWApO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZhbGlkYXRpb24gRXJyb3JzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lFcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnVkFMSURBVElPTl9DSVJDVUxBUl9ERVBFTkRFTkNZJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnVkFMSURBVElPTic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGN5Y2xlOiBzdHJpbmdbXSxcbiAgICBwdWJsaWMgaW52b2x2ZWRGb3JtdWxhczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICR7Y3ljbGUuam9pbignIOKGkiAnKX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5kZWZpbmVkVmFyaWFibGVFcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnVkFMSURBVElPTl9VTkRFRklORURfVkFSSUFCTEUnO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdWQUxJREFUSU9OJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmFyaWFibGVOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGV4cHJlc3Npb246IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihgVW5kZWZpbmVkIHZhcmlhYmxlOiAke3ZhcmlhYmxlTmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5kZWZpbmVkRnVuY3Rpb25FcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnVkFMSURBVElPTl9VTkRFRklORURfRlVOQ1RJT04nO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdWQUxJREFUSU9OJztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZnVuY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgVW5kZWZpbmVkIGZ1bmN0aW9uOiAke2Z1bmN0aW9uTmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRHVwbGljYXRlRm9ybXVsYUVycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdWQUxJREFUSU9OX0RVUExJQ0FURV9GT1JNVUxBJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnVkFMSURBVElPTic7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGZvcm11bGFJZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYER1cGxpY2F0ZSBmb3JtdWxhIElEOiAke2Zvcm11bGFJZH1gKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFdmFsdWF0aW9uIEVycm9yc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgRGl2aXNpb25CeVplcm9FcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnRVZBTF9ESVZJU0lPTl9CWV9aRVJPJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnRVZBTFVBVElPTic7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ0RpdmlzaW9uIGJ5IHplcm8nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZU1pc21hdGNoRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ0VWQUxfVFlQRV9NSVNNQVRDSCc7XG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBFcnJvckNhdGVnb3J5ID0gJ0VWQUxVQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBleHBlY3RlZDogVmFsdWVUeXBlIHwgVmFsdWVUeXBlW10gfCBzdHJpbmcsXG4gICAgcHVibGljIGFjdHVhbDogVmFsdWVUeXBlIHwgc3RyaW5nLFxuICAgIHB1YmxpYyBjb250ZXh0OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRTdHIgPSBBcnJheS5pc0FycmF5KGV4cGVjdGVkKSA/IGV4cGVjdGVkLmpvaW4oJyBvciAnKSA6IGV4cGVjdGVkO1xuICAgIHN1cGVyKGBUeXBlIG1pc21hdGNoOiBleHBlY3RlZCAke2V4cGVjdGVkU3RyfSwgZ290ICR7YWN0dWFsfSBpbiAke2NvbnRleHR9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFyZ3VtZW50Q291bnRFcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnRVZBTF9BUkdVTUVOVF9DT1VOVCc7XG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBFcnJvckNhdGVnb3J5ID0gJ0VWQUxVQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgZXhwZWN0ZWQ6IHsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0sXG4gICAgcHVibGljIGFjdHVhbDogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IGV4cGVjdGVkU3RyID0gZXhwZWN0ZWQubWluID09PSBleHBlY3RlZC5tYXhcbiAgICAgID8gYCR7ZXhwZWN0ZWQubWlufWBcbiAgICAgIDogZXhwZWN0ZWQubWF4ID09PSAtMVxuICAgICAgICA/IGBhdCBsZWFzdCAke2V4cGVjdGVkLm1pbn1gXG4gICAgICAgIDogYCR7ZXhwZWN0ZWQubWlufS0ke2V4cGVjdGVkLm1heH1gO1xuICAgIHN1cGVyKGBGdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX0gZXhwZWN0cyAke2V4cGVjdGVkU3RyfSBhcmd1bWVudHMsIGdvdCAke2FjdHVhbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZE9wZXJhdGlvbkVycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdFVkFMX0lOVkFMSURfT1BFUkFUSU9OJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnRVZBTFVBVElPTic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgcHVibGljIG9wZXJhbmRUeXBlczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoYENhbm5vdCBhcHBseSBvcGVyYXRvciAnJHtvcGVyYXRvcn0nIHRvIHR5cGVzOiAke29wZXJhbmRUeXBlcy5qb2luKCcsICcpfWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUFjY2Vzc0Vycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdFVkFMX1BST1BFUlRZX0FDQ0VTUyc7XG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBFcnJvckNhdGVnb3J5ID0gJ0VWQUxVQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBwcm9wZXJ0eTogc3RyaW5nLFxuICAgIHB1YmxpYyBvYmplY3RUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgJyR7cHJvcGVydHl9JyBvbiAke29iamVjdFR5cGV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZGV4QWNjZXNzRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ0VWQUxfSU5ERVhfQUNDRVNTJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnRVZBTFVBVElPTic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluZGV4OiB1bmtub3duLFxuICAgIHB1YmxpYyBvYmplY3RUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoYENhbm5vdCB1c2UgaW5kZXggJyR7aW5kZXh9JyBvbiAke29iamVjdFR5cGV9YCk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVjaW1hbCBFcnJvcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIERlY2ltYWxFcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdERUNJTUFMX0VSUk9SJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnRVZBTFVBVElPTic7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlY2ltYWxPdmVyZmxvd0Vycm9yIGV4dGVuZHMgRGVjaW1hbEVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgY29kZTogc3RyaW5nID0gJ0RFQ0lNQUxfT1ZFUkZMT1cnO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogc3RyaW5nLCBwdWJsaWMgbWF4RXhwb25lbnQ6IG51bWJlcikge1xuICAgIHN1cGVyKGBEZWNpbWFsIG92ZXJmbG93OiBleHBvbmVudCBleGNlZWRzICR7bWF4RXhwb25lbnR9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlY2ltYWxVbmRlcmZsb3dFcnJvciBleHRlbmRzIERlY2ltYWxFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdERUNJTUFMX1VOREVSRkxPVyc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBtaW5FeHBvbmVudDogbnVtYmVyKSB7XG4gICAgc3VwZXIoYERlY2ltYWwgdW5kZXJmbG93OiBleHBvbmVudCBiZWxvdyAke21pbkV4cG9uZW50fWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWNpbWFsRGl2aXNpb25CeVplcm9FcnJvciBleHRlbmRzIERlY2ltYWxFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdERUNJTUFMX0RJVklTSU9OX0JZX1pFUk8nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdEaXZpc2lvbiBieSB6ZXJvJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWREZWNpbWFsRXJyb3IgZXh0ZW5kcyBEZWNpbWFsRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBjb2RlOiBzdHJpbmcgPSAnSU5WQUxJRF9ERUNJTUFMJztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5wdXQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBJbnZhbGlkIGRlY2ltYWwgdmFsdWU6IFwiJHtpbnB1dH1cImApO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb24gRXJyb3JzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ0NPTkZJR1VSQVRJT05fRVJST1InO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdDT05GSUdVUkFUSU9OJztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZWN1cml0eSBFcnJvcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5RXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlOiBzdHJpbmcgPSAnU0VDVVJJVFlfRVJST1InO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdFVkFMVUFUSU9OJztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4SXRlcmF0aW9uc0Vycm9yIGV4dGVuZHMgU2VjdXJpdHlFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdNQVhfSVRFUkFUSU9OU19FWENFRURFRCc7XG5cbiAgY29uc3RydWN0b3IobGltaXQ6IG51bWJlcikge1xuICAgIHN1cGVyKGBNYXhpbXVtIGl0ZXJhdGlvbnMgZXhjZWVkZWQ6ICR7bGltaXR9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1heFJlY3Vyc2lvbkVycm9yIGV4dGVuZHMgU2VjdXJpdHlFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdNQVhfUkVDVVJTSU9OX0VYQ0VFREVEJztcblxuICBjb25zdHJ1Y3RvcihsaW1pdDogbnVtYmVyKSB7XG4gICAgc3VwZXIoYE1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkOiAke2xpbWl0fWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXhFeHByZXNzaW9uTGVuZ3RoRXJyb3IgZXh0ZW5kcyBTZWN1cml0eUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgY29kZTogc3RyaW5nID0gJ01BWF9FWFBSRVNTSU9OX0xFTkdUSF9FWENFRURFRCc7XG5cbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGxpbWl0OiBudW1iZXIpIHtcbiAgICBzdXBlcihgRXhwcmVzc2lvbiBsZW5ndGggJHtsZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSAke2xpbWl0fWApO1xuICB9XG59XG5cbi8vIENvbmNyZXRlIGNsYXNzIGZvciBnZW5lcmFsIGVycm9yc1xuZXhwb3J0IGNsYXNzIEdlbmVyYWxGb3JtdWxhRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlOiBzdHJpbmcgPSAnR0VORVJBTF9FUlJPUic7XG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBFcnJvckNhdGVnb3J5ID0gJ0VWQUxVQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ASTNode, EvaluationContext, EvaluationResult, FunctionDefinition, FormulaEngineConfig } from './types';
|
|
2
|
+
import { DecimalUtils } from './decimal-utils';
|
|
3
|
+
export declare class Evaluator {
|
|
4
|
+
private parser;
|
|
5
|
+
private decimalUtils;
|
|
6
|
+
private functions;
|
|
7
|
+
private strictMode;
|
|
8
|
+
private securityConfig;
|
|
9
|
+
private recursionDepth;
|
|
10
|
+
private iterationCount;
|
|
11
|
+
private accessedVariables;
|
|
12
|
+
constructor(decimalUtils: DecimalUtils, functions: Map<string, FunctionDefinition>, config?: FormulaEngineConfig);
|
|
13
|
+
/**
|
|
14
|
+
* Evaluate an expression string
|
|
15
|
+
*/
|
|
16
|
+
evaluate(expression: string, context: EvaluationContext): EvaluationResult;
|
|
17
|
+
/**
|
|
18
|
+
* Evaluate an AST node
|
|
19
|
+
*/
|
|
20
|
+
evaluateNode(node: ASTNode, context: EvaluationContext): unknown;
|
|
21
|
+
private checkRecursionLimit;
|
|
22
|
+
private checkIterationLimit;
|
|
23
|
+
private evaluateVariable;
|
|
24
|
+
private maybeConvertToDecimal;
|
|
25
|
+
private evaluateBinaryOperation;
|
|
26
|
+
private evaluateUnaryOperation;
|
|
27
|
+
private evaluateConditional;
|
|
28
|
+
private evaluateFunctionCall;
|
|
29
|
+
private evaluateSumWithExpression;
|
|
30
|
+
private evaluateFilter;
|
|
31
|
+
private evaluateMap;
|
|
32
|
+
private evaluateMemberAccess;
|
|
33
|
+
private evaluateIndexAccess;
|
|
34
|
+
private isNumeric;
|
|
35
|
+
private toDecimal;
|
|
36
|
+
private toNumber;
|
|
37
|
+
private toBool;
|
|
38
|
+
private typeOf;
|
|
39
|
+
private add;
|
|
40
|
+
private subtract;
|
|
41
|
+
private multiply;
|
|
42
|
+
private divide;
|
|
43
|
+
private modulo;
|
|
44
|
+
private power;
|
|
45
|
+
private negate;
|
|
46
|
+
private equals;
|
|
47
|
+
private lessThan;
|
|
48
|
+
private greaterThan;
|
|
49
|
+
private lessThanOrEqual;
|
|
50
|
+
private greaterThanOrEqual;
|
|
51
|
+
}
|