nuxeo-development-framework 6.1.5 → 6.1.7

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/bundles/nuxeo-development-framework.umd.js +688 -1009
  2. package/bundles/nuxeo-development-framework.umd.js.map +1 -1
  3. package/esm2015/lib/components/ndf-filters/components/__parts/filter-autocomplete-input/filter-autocomplete.service.js +7 -5
  4. package/esm2015/lib/components/ndf-filters/containers/filters-panel/filters-panel.component.js +9 -9
  5. package/esm2015/lib/components/ndf-filters/models/base-field-config.js +1 -1
  6. package/esm2015/lib/components/ndf-filters/pipes/check-condition.pipe.js +9 -4
  7. package/esm2015/lib/components/ndf-filters/pipes/evaluate-label.pipe.js +3 -3
  8. package/esm2015/lib/components/pdf-tron/pdftron/pdftron.component.js +2 -1
  9. package/esm2015/lib/components/pdf-tron/pdftron/silent-pdftron.service.js +2 -1
  10. package/esm2015/lib/components/reports/ndf-reports/models/details.js +1 -1
  11. package/esm2015/lib/components/reports/ndf-reports/models/graph-definition.js +1 -1
  12. package/esm2015/lib/components/reports/ndf-reports/pipes/check-condition.pipe.js +3 -3
  13. package/esm2015/lib/components/reports/ndf-reports/services/report-config-mapper.service.js +28 -15
  14. package/esm2015/lib/components/reports/ndf-reports/services/reports-hooks.service.js +3 -3
  15. package/esm2015/lib/components/tables/dynamic-table/dynamic-table/dynamic-table.component.js +1 -1
  16. package/esm2015/lib/components/tables/dynamic-table/services/table-hooks.service.js +4 -4
  17. package/esm2015/lib/components/tables/ndf-table/models/table-config.js +1 -1
  18. package/esm2015/lib/shared/index.js +5 -6
  19. package/esm2015/lib/shared-services/global-pdftron.service.js +2 -1
  20. package/esm2015/public-api.js +12 -13
  21. package/fesm2015/nuxeo-development-framework.js +644 -938
  22. package/fesm2015/nuxeo-development-framework.js.map +1 -1
  23. package/lib/components/ndf-filters/components/__parts/filter-autocomplete-input/filter-autocomplete.service.d.ts +1 -2
  24. package/lib/components/ndf-filters/containers/filters-panel/filters-panel.component.d.ts +3 -3
  25. package/lib/components/ndf-filters/models/base-field-config.d.ts +1 -1
  26. package/lib/components/ndf-filters/pipes/check-condition.pipe.d.ts +1 -2
  27. package/lib/components/reports/ndf-reports/models/details.d.ts +1 -1
  28. package/lib/components/reports/ndf-reports/models/graph-definition.d.ts +2 -2
  29. package/lib/components/reports/ndf-reports/services/report-config-mapper.service.d.ts +2 -2
  30. package/lib/components/tables/ndf-table/models/table-config.d.ts +1 -1
  31. package/lib/shared/index.d.ts +7 -5
  32. package/package.json +1 -1
  33. package/public-api.d.ts +11 -12
  34. package/esm2015/lib/shared/evaluator/evaluator.js +0 -318
  35. package/esm2015/lib/shared/evaluator/index.js +0 -3
  36. package/esm2015/lib/shared/evaluator/types.js +0 -2
  37. package/lib/shared/evaluator/evaluator.d.ts +0 -79
  38. package/lib/shared/evaluator/index.d.ts +0 -2
  39. package/lib/shared/evaluator/types.d.ts +0 -18
@@ -1,6 +1,5 @@
1
1
  import { Injector } from '@angular/core';
2
2
  import { BaseService } from '../../../../../shared/services/base';
3
- import { InterpolateString } from '../../../../../shared/evaluator';
4
3
  import { AggregationFieldConfig, SearchConfig } from '../../../models';
5
4
  import * as i0 from "@angular/core";
6
5
  export declare class FilterAutocompleteService extends BaseService {
@@ -8,7 +7,7 @@ export declare class FilterAutocompleteService extends BaseService {
8
7
  private readonly _aggregationService;
9
8
  constructor(injector: Injector);
10
9
  customSearch(searchText: string, query: SearchConfig['search']['query'], fieldConfig: AggregationFieldConfig): import("rxjs").Observable<import("../../../models").FilterOption[]>;
11
- replacePlaceholder(template: InterpolateString, searchText: string): string;
10
+ replacePlaceholder(template: string, searchText: string): string;
12
11
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterAutocompleteService, never>;
13
12
  static ɵprov: i0.ɵɵInjectableDeclaration<FilterAutocompleteService>;
14
13
  }
@@ -1,11 +1,11 @@
1
+ import { Direction } from '@angular/cdk/bidi';
1
2
  import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
3
  import { FormGroup } from '@angular/forms';
4
+ import { TranslateService } from '@ngx-translate/core';
3
5
  import { Observable } from 'rxjs';
6
+ import { NuxeoService } from '../../../../core/services';
4
7
  import { AggregationResponse, FieldConfigModel, FormQueryModel } from '../../models';
5
8
  import { BaseFiltersPanel } from './base-filters-panel';
6
- import { Direction } from '@angular/cdk/bidi';
7
- import { TranslateService } from '@ngx-translate/core';
8
- import { NuxeoService } from '../../../../core/services';
9
9
  import * as i0 from "@angular/core";
10
10
  export declare class FiltersPanelComponent extends BaseFiltersPanel implements OnInit, OnChanges {
11
11
  private _translateService;
@@ -1,4 +1,4 @@
1
- import { EvaluatedString, InterpolateString } from '../../../shared/evaluator';
1
+ import { EvaluatedString, InterpolateString } from '../../../shared';
2
2
  import { TranslateKey } from '../../../shared/models';
3
3
  import { ComparisonOperator } from './types-helper';
4
4
  export declare type BaseFieldConfig = {
@@ -1,12 +1,11 @@
1
1
  import { PipeTransform } from '@angular/core';
2
- import { Evaluator } from '../../../shared/evaluator';
3
2
  import { NuxeoService } from '../../../core/services';
4
3
  import * as i0 from "@angular/core";
5
4
  export declare class CheckConditionPipe implements PipeTransform {
6
5
  nuxeoService: NuxeoService;
7
6
  user: Record<string, any>;
8
7
  constructor(nuxeoService: NuxeoService);
9
- transform(condition: string, aggregations: Record<string, any>, language: string, filterValues: Record<string, any>): Evaluator;
8
+ transform(condition: string, aggregations: Record<string, any>, language: string, filterValues: Record<string, any>): any;
10
9
  static ɵfac: i0.ɵɵFactoryDeclaration<CheckConditionPipe, never>;
11
10
  static ɵpipe: i0.ɵɵPipeDeclaration<CheckConditionPipe, "checkCondition">;
12
11
  }
@@ -1,7 +1,7 @@
1
1
  import { FilterMode, TableColumnConfig, TableExportConfig, TableSortConfig, TableSortOptions } from '../../../tables/ndf-table';
2
- import { NdfReportsRequest } from './request';
3
2
  import { EvaluatedString } from '../../../../shared';
4
3
  import { NdfReportsFilters } from './ndf-reports.config';
4
+ import { NdfReportsRequest } from './request';
5
5
  export declare type ReportDetailsConfig = {
6
6
  enabled: boolean;
7
7
  source: ReportDetailsKey | ReportConfigOptions;
@@ -1,11 +1,11 @@
1
1
  import { DialogPosition } from '@angular/material/dialog';
2
2
  import { ChartDataset, ChartType, Plugin } from 'chart.js';
3
3
  import { CustomChartOptions } from '../../charts';
4
+ import { EvaluatedString } from '../../../../shared';
5
+ import { CHARTS_TYPES } from '../constants';
4
6
  import { BaseReportConfig } from './base';
5
7
  import { ChartOptionsByType } from './common';
6
8
  import { ReportDataSource } from './report-data-source';
7
- import { CHARTS_TYPES } from '../constants';
8
- import { EvaluatedString } from '../../../../shared';
9
9
  declare type chartTypes = Omit<typeof CHARTS_TYPES, 'line'>;
10
10
  export declare type AllowedChartType = chartTypes[keyof chartTypes];
11
11
  export interface ChartTypeConfig {
@@ -1,7 +1,7 @@
1
+ import { TranslateService } from '@ngx-translate/core';
1
2
  import { CustomChart, CustomChartDefinition, DigitChart, DigitChartDefinition, DynamicLineChart, DynamicLineChartDefinition, GraphChart, GraphChartDefinition } from '../models';
2
- import { ChartPluginsRegistry } from './chart-plugins-registry.service';
3
3
  import { ChartCallbacksRegisterService } from './chart-callbacks-register.services';
4
- import { TranslateService } from '@ngx-translate/core';
4
+ import { ChartPluginsRegistry } from './chart-plugins-registry.service';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class ReportConfigMapperService {
7
7
  private readonly _chartPluginsRegistry;
@@ -1,7 +1,7 @@
1
+ import { EvaluatedString } from '../../../../shared';
1
2
  import { TableColumnAction, TableColumnConfig } from './table-column';
2
3
  import { NdfTableOptions } from './table-options';
3
4
  import { TableDefaultSortModel, TablePaginationOptions, TableSortOptions } from './types';
4
- import { EvaluatedString } from '../../../../shared';
5
5
  /**
6
6
  * Configuration type for the NDF Table component.
7
7
  * Extends `TablePaginationOptions` and provides additional properties
@@ -1,7 +1,9 @@
1
- export * from './directives';
2
- export * from './services';
3
1
  export * from './components';
4
- export * from './models';
5
- export * from './libraryShared.module';
6
- export * from './evaluator';
7
2
  export * from './constants';
3
+ export * from './directives';
4
+ export * from './libraryShared.module';
5
+ export * from './models';
6
+ export * from './services';
7
+ export declare type InterpolateString = string;
8
+ export declare type Whitespace = '' | ' ' | `${any}`;
9
+ export declare type EvaluatedString<VAR extends string = 'show'> = `${string}${VAR}${Whitespace}=${Whitespace}${string}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nuxeo-development-framework",
3
- "version": "6.1.5",
3
+ "version": "6.1.7",
4
4
  "peerDependencies": {
5
5
  "@angular/animations": "12.2.3",
6
6
  "@angular/common": "12.2.3",
package/public-api.d.ts CHANGED
@@ -117,11 +117,11 @@ export * from './lib/components/latest-activity/components/single-activity/singl
117
117
  export * from './lib/components/latest-activity/latest-activity.module';
118
118
  export * from './lib/components/pagination/pagination.module';
119
119
  export * from './lib/components/pagination/pagination/pagination.component';
120
+ export * from './lib/components/pdf-tron/directives/ndf-tron-extract-text.directive';
120
121
  export * from './lib/components/pdf-tron/pdf-tron.module';
121
122
  export * from './lib/components/pdf-tron/pdftron/pdftron.component';
122
123
  export * from './lib/components/pdf-tron/pdftron/pdftron.service';
123
124
  export * from './lib/components/pdf-tron/pdftron/silent-pdftron.service';
124
- export * from './lib/components/pdf-tron/directives/ndf-tron-extract-text.directive';
125
125
  export * from './lib/components/select/select.module';
126
126
  export * from './lib/components/select/select/select.component';
127
127
  export * from './lib/components/users-card/users-card.component';
@@ -178,18 +178,18 @@ export * from './lib/components/toasts';
178
178
  export * from './lib/components/dynamic-fields-renderer/dynamic-fields-renderer.module';
179
179
  export * from './lib/components/dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component';
180
180
  export * from './lib/shared/components/button/button.component';
181
+ export * from './lib/shared/components/general-notification-popup/general-notification-popup.component';
181
182
  export * from './lib/shared/components/item-list/item-list.component';
182
183
  export * from './lib/shared/components/no-data/no-data.component';
183
184
  export * from './lib/shared/components/read-more/read-more.component';
184
185
  export * from './lib/shared/components/search-autocomplete/search-autocomplete.component';
185
186
  export * from './lib/shared/components/spinner/spinner.component';
186
187
  export * from './lib/shared/components/user-card/user-card.component';
187
- export * from './lib/shared/components/general-notification-popup/general-notification-popup.component';
188
188
  export * from './lib/shared/libraryShared.module';
189
+ export * from './lib/shared-services/apis-errors-messages.service';
189
190
  export * from './lib/shared-services/global-admin.service';
190
191
  export * from './lib/shared-services/shared-services.module';
191
192
  export * from './lib/shared-services/user.service';
192
- export * from './lib/shared-services/apis-errors-messages.service';
193
193
  export * from './lib/core/adapters/adapter.service';
194
194
  export * from './lib/core/enums/language.enum';
195
195
  export * from './lib/core/env/index';
@@ -230,21 +230,20 @@ export * from './lib/configuration/app-config.service';
230
230
  export * from './lib/configuration/helpers/app-initializer';
231
231
  export * from './lib/directive/permissions/evaluators.service';
232
232
  export * from './lib/components/comments/services/comment-api.service';
233
- export * from './lib/shared/directives';
234
- export * from './lib/core/tokens';
233
+ export * from './lib/components/ndf-config-editor';
235
234
  export * from './lib/components/ndf-datepicker';
235
+ export * from './lib/components/ndf-filters';
236
236
  export * from './lib/components/ndf-panel';
237
+ export * from './lib/components/ndf-scanner';
238
+ export * from './lib/components/ndf-signatures';
237
239
  export * from './lib/components/ndf-tabs';
240
+ export * from './lib/components/ndf-uploader';
238
241
  export * from './lib/components/no-data-found';
242
+ export * from './lib/components/reports/chart-panel';
239
243
  export * from './lib/components/reports/charts';
240
244
  export * from './lib/components/reports/ndf-reports';
241
- export * from './lib/components/reports/chart-panel';
242
245
  export * from './lib/components/skeleton';
243
246
  export * from './lib/components/tables';
244
- export * from './lib/components/ndf-config-editor';
245
- export * from './lib/components/ndf-filters';
246
- export * from './lib/components/ndf-uploader';
247
- export * from './lib/components/ndf-scanner';
248
- export * from './lib/components/ndf-signatures';
249
- export * from './lib/shared/evaluator';
247
+ export * from './lib/core/tokens';
250
248
  export * from './lib/shared/constants';
249
+ export * from './lib/shared/directives';
@@ -1,318 +0,0 @@
1
- import _, { get, keys, set, trim, values } from 'lodash';
2
- import stringHash from 'string-hash';
3
- /**
4
- * Creates a secure context for function evaluation that prevents access to the window object.
5
- * @returns {Record<string, any>} A secure context object with safe properties.
6
- */
7
- function createSecureContext() {
8
- // Create a secure context with only safe properties
9
- return {
10
- // Add any safe globals here that should be accessible
11
- console: {
12
- log: console.log,
13
- warn: console.warn,
14
- error: console.error
15
- },
16
- // Add other safe objects/functions as needed
17
- Math,
18
- Date,
19
- Number,
20
- String,
21
- Boolean,
22
- Array,
23
- Object,
24
- JSON,
25
- // Prevent access to window
26
- window: undefined,
27
- self: undefined,
28
- globalThis: undefined,
29
- _: _ // Include lodash if needed, but ensure it's used safely
30
- };
31
- }
32
- /**
33
- * A utility class for evaluating expressions, interpolating strings, and working with templates.
34
- * This class provides static methods for dynamic evaluation of code, string interpolation,
35
- * and template processing with caching capabilities.
36
- */
37
- export class Evaluator {
38
- /**
39
- * Creates a function from a string or returns the function if already provided.
40
- * Uses a secure context to prevent access to the window object by default.
41
- * @param {string|Function} func - The function or string to convert to a function.
42
- * @param {...any} params - The parameters to pass to the function.
43
- * @param {EvaluatorOptions} [options={}] - Optional configuration for the evaluation.
44
- * @returns {Function} - The resulting function.
45
- */
46
- static evaluator(func, ...params) {
47
- // Extract options if the last parameter is an options object
48
- let options = {};
49
- if (params.length > 0 &&
50
- params[params.length - 1] &&
51
- typeof params[params.length - 1] === 'object' &&
52
- 'securityMode' in params[params.length - 1]) {
53
- options = params.pop();
54
- }
55
- if (typeof func === 'function') {
56
- return func;
57
- }
58
- if (typeof params[0] === 'object') {
59
- params = keys(params[0]);
60
- }
61
- // Check if we should use secure mode (default) or unsafe mode
62
- const securityMode = options.securityMode || 'secure';
63
- if (securityMode === 'unsafe') {
64
- // In unsafe mode, create a function with access to all globals
65
- return new Function(...params, func);
66
- }
67
- const sandbox = createSecureContext();
68
- const sandboxKeys = Object.keys(sandbox);
69
- const sandboxAssignments = sandboxKeys.map((key) => `const ${key} = sandbox.${key};`).join('');
70
- const wrapper = new Function(...params, 'sandbox', `${sandboxAssignments}${func}`);
71
- return (...args) => wrapper(...args, sandbox);
72
- }
73
- /**
74
- * Replaces template expressions in a string with values from data.
75
- * Supports function calls within templates and fallback values using || syntax.
76
- * By default, ensures evaluation happens in a secure context to prevent access to window object.
77
- * @param {string} rawTemplate - The template string containing expressions to interpolate.
78
- * @param {Record<string, any>} data - The data object containing values to use for interpolation.
79
- * @param {EvaluatorOptions} [options={}] - Optional configuration for the interpolation process.
80
- * @returns {string} - The interpolated string with all expressions replaced with actual values.
81
- */
82
- static interpolateString(rawTemplate, data, options = {}) {
83
- if (!rawTemplate) {
84
- return '';
85
- }
86
- if (typeof rawTemplate !== 'string') {
87
- return rawTemplate.toString();
88
- }
89
- // Check if we should use secure mode (default) or unsafe mode
90
- const securityMode = options.securityMode || 'secure';
91
- // Create a secure data object if needed
92
- const secureData = securityMode === 'unsafe'
93
- ? data
94
- : Object.assign(Object.assign(Object.assign({}, createSecureContext()), data), {
95
- // Ensure these remain undefined
96
- window: undefined, self: undefined, globalThis: undefined });
97
- return rawTemplate.replace(/({{\s*(.*?)\s*}})/g, (match, $1, expression) => {
98
- if (expression.indexOf('(') !== -1) {
99
- return expression.replace(/([^(]+)\(([^)]+)\s*\);?/, (_, fnName, argsStr) => {
100
- fnName = trim(fnName);
101
- const func = get(secureData, fnName);
102
- if (func) {
103
- if (argsStr) {
104
- const args = argsStr.split(',').map((arg) => {
105
- const trimmed = trim(arg);
106
- if (/^['"]/.test(trimmed))
107
- return trimmed.slice(1, -1);
108
- return get(secureData, trimmed);
109
- });
110
- return Evaluator.evaluate(func, args, '', false, secureData, options);
111
- }
112
- return Evaluator.evaluate(func, [], '', false, secureData, options);
113
- }
114
- return '';
115
- });
116
- }
117
- else {
118
- let dataPath = expression;
119
- if (expression.indexOf('?') !== -1) {
120
- dataPath = expression.replace(/\?\./g, '.');
121
- }
122
- const parts = dataPath.split('||').map((item) => item.trim());
123
- let value = '';
124
- let path = '';
125
- for (let i = 0; i < parts.length; i++) {
126
- path = parts[i];
127
- if (_.has(secureData, path)) {
128
- value = _.get(secureData, path);
129
- break;
130
- }
131
- }
132
- if (options.data) {
133
- set(options.data, path, value);
134
- }
135
- return value;
136
- }
137
- });
138
- }
139
- /**
140
- * Performs an evaluation using the evaluation context of this component.
141
- * By default, ensures evaluation happens in a secure context to prevent access to window object.
142
- * @param {string|Function|object} func - The function or string to evaluate.
143
- * @param {object} args - The arguments to pass to the evaluation.
144
- * @param {string} ret - The name of the variable within the evaluation context to return.
145
- * @param {boolean} interpolate - Determines if it should replace all {{ }} token references with actual data.
146
- * @param {object} context - - The evaluation context.
147
- * @param {EvaluatorOptions } options - The options to pass to the evaluation.
148
- * @returns {*} - The result of the evaluation.
149
- */
150
- static evaluate(func, args = {}, ret = 'show', interpolate = false, context = {}, options = {}) {
151
- let returnVal = null;
152
- const field = args.field ? args.field : { key: 'unknown' };
153
- const fieldKey = field.key;
154
- if (typeof func === 'string') {
155
- if (ret) {
156
- func = `var ${ret};${func};return ${ret}`;
157
- }
158
- if (interpolate) {
159
- func = Evaluator.interpolate(func, args, options);
160
- }
161
- try {
162
- // Pass the security mode option to the evaluator
163
- const evaluatorOptions = { securityMode: options.securityMode || 'secure' };
164
- func = Evaluator.evaluator(func, args, context, evaluatorOptions);
165
- args = Array.isArray(args) ? args : values(args);
166
- }
167
- catch (err) {
168
- console.warn(`An error occured within the custom function for ${fieldKey}`, err);
169
- returnVal = null;
170
- func = false;
171
- }
172
- }
173
- if (typeof func === 'function') {
174
- try {
175
- returnVal = Evaluator.execute(func, args, context, options);
176
- }
177
- catch (err) {
178
- returnVal = null;
179
- console.warn(`An error occured within custom function for ${fieldKey}`, err);
180
- }
181
- }
182
- else if (func) {
183
- console.warn(`Unknown function type for ${fieldKey}`);
184
- }
185
- return returnVal;
186
- }
187
- /**
188
- * Executes a function with provided arguments and context.
189
- * By default, ensures execution happens in a secure context to prevent access to window object.
190
- * @param {Function} func - The function to execute.
191
- * @param {any[]|Record<string, any>} args - The arguments to pass to the function, either as an array or object.
192
- * @param {Record<string, any>} [context={}] - The context (this) to use when executing the function.
193
- * @param {EvaluatorOptions} [options={}] - Optional configuration for the execution.
194
- * @returns {any} - The result of the function execution.
195
- */
196
- static execute(func, args, context = {}, options = {}) {
197
- // Check if we should use secure mode (default) or unsafe mode
198
- const securityMode = options.securityMode || 'secure';
199
- if (securityMode === 'unsafe') {
200
- // In unsafe mode, execute with the original context
201
- return Array.isArray(args) ? func.apply(context, args) : func.call(context, args);
202
- }
203
- else {
204
- // In secure mode, create a secure context by merging the provided context with our secure context
205
- const secureContext = Object.assign(Object.assign(Object.assign({}, createSecureContext()), context), {
206
- // Ensure these remain undefined even if they were in the provided context
207
- window: undefined, self: undefined, globalThis: undefined });
208
- // Execute the function with the secure context
209
- return Array.isArray(args) ? func.apply(secureContext, args) : func.call(secureContext, args);
210
- }
211
- }
212
- /**
213
- * Creates a template function from a string with caching for performance.
214
- * By default, ensures the template function executes in a secure context.
215
- * @param {string} template - The template string to compile into a function.
216
- * @param {string} [hash] - Optional hash to use as cache key. If not provided, a hash will be generated from the template.
217
- * @param {EvaluatorOptions} [options={}] - Optional configuration for the template.
218
- * @returns {Function|undefined} - The compiled template function, or undefined if compilation fails.
219
- */
220
- static template(template, hash, options = {}) {
221
- hash = hash || stringHash(template).toString();
222
- // If hash contains options object, extract it
223
- if (typeof hash === 'object' && 'securityMode' in hash) {
224
- options = hash;
225
- hash = stringHash(template).toString();
226
- }
227
- // Check if we have a cached version
228
- const cacheKey = hash + (options.securityMode || 'secure');
229
- if (Evaluator.cache[cacheKey]) {
230
- return Evaluator.cache[cacheKey];
231
- }
232
- try {
233
- template = template.replace(/ctx\./g, '');
234
- // Create the template function using lodash
235
- const templateFunc = _.template(template, Evaluator.templateSettings);
236
- // Check if we should use secure mode (default) or unsafe mode
237
- const securityMode = options.securityMode || 'secure';
238
- if (securityMode === 'unsafe') {
239
- // In unsafe mode, return the original template function
240
- return (Evaluator.cache[cacheKey] = templateFunc);
241
- }
242
- else {
243
- // In secure mode, wrap the template function to ensure it runs in a secure context
244
- const secureTemplateFunc = (data) => {
245
- // Create a secure context for the template
246
- const secureData = Object.assign(Object.assign(Object.assign({}, createSecureContext()), data), {
247
- // Ensure these remain undefined
248
- window: undefined, self: undefined, globalThis: undefined });
249
- return templateFunc(secureData);
250
- };
251
- // Cache and return the secure template function
252
- return (Evaluator.cache[cacheKey] = secureTemplateFunc);
253
- }
254
- }
255
- catch (err) {
256
- console.warn('Error while processing template', err, template);
257
- return undefined;
258
- }
259
- }
260
- /**
261
- * Interpolates a template with data, handling both function templates and string templates.
262
- * By default, ensures interpolation happens in a secure context to prevent access to window object.
263
- * @param {string|Function} rawTemplate - The template to interpolate, either as a string or a function.
264
- * @param {Record<string, any>} data - The data object to use for interpolation.
265
- * @param {EvaluatorOptions} options - Options for the interpolation process.
266
- * @returns {string|any} - The result of the interpolation, typically a string but could be any type depending on the template.
267
- */
268
- static interpolate(rawTemplate, data, options = {}) {
269
- if (typeof rawTemplate === 'function') {
270
- try {
271
- // If the template is a function, execute it with the data
272
- // We can't directly secure a provided function, but we can use execute
273
- // to run it in a secure context if needed
274
- if (options.securityMode !== 'unsafe') {
275
- const secureData = Object.assign(Object.assign(Object.assign({}, createSecureContext()), data), { window: undefined, self: undefined, globalThis: undefined });
276
- return rawTemplate(secureData);
277
- }
278
- else {
279
- return rawTemplate(data);
280
- }
281
- }
282
- catch (err) {
283
- console.warn('Error interpolating template', err, data);
284
- return err.message;
285
- }
286
- }
287
- rawTemplate = String(rawTemplate);
288
- // Pass the security mode option to the template method
289
- const template = Evaluator.template(rawTemplate, undefined, options);
290
- if (typeof template === 'function') {
291
- try {
292
- return template(data);
293
- }
294
- catch (err) {
295
- console.warn('Error interpolating template', err, rawTemplate, data);
296
- return err.message;
297
- }
298
- }
299
- return template;
300
- }
301
- }
302
- /**
303
- * Cache for storing compiled template functions to improve performance.
304
- * Keys are string hashes of the template, values are the compiled functions.
305
- */
306
- Evaluator.cache = {};
307
- /**
308
- * Settings for template processing, defining regex patterns for different template operations.
309
- * - interpolate: Pattern for variable interpolation ({{ variable }})
310
- * - evaluate: Pattern for code evaluation ({% code %})
311
- * - escape: Pattern for HTML escaping ({{{ variable }}})
312
- */
313
- Evaluator.templateSettings = {
314
- interpolate: /{{([\s\S]+?)}}/g,
315
- evaluate: /\{%([\s\S]+?)%\}/g,
316
- escape: /\{\{\{([\s\S]+?)\}\}\}/g
317
- };
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnV4ZW8tZGV2ZWxvcG1lbnQtZnJhbWV3b3JrL3NyYy9saWIvc2hhcmVkL2V2YWx1YXRvci9ldmFsdWF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3pELE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUlyQzs7O0dBR0c7QUFDSCxTQUFTLG1CQUFtQjtJQUMzQixvREFBb0Q7SUFDcEQsT0FBTztRQUNOLHNEQUFzRDtRQUN0RCxPQUFPLEVBQUU7WUFDUixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNwQjtRQUNELDZDQUE2QztRQUM3QyxJQUFJO1FBQ0osSUFBSTtRQUNKLE1BQU07UUFDTixNQUFNO1FBQ04sT0FBTztRQUNQLEtBQUs7UUFDTCxNQUFNO1FBQ04sSUFBSTtRQUNKLDJCQUEyQjtRQUMzQixNQUFNLEVBQUUsU0FBUztRQUNqQixJQUFJLEVBQUUsU0FBUztRQUNmLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLENBQUMsRUFBRSxDQUFDLENBQUMsd0RBQXdEO0tBQzdELENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxTQUFTO0lBbUJyQjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUF1QixFQUFFLEdBQUcsTUFBYTtRQUN6RCw2REFBNkQ7UUFDN0QsSUFBSSxPQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUNuQyxJQUNDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNqQixNQUFNLENBQUMsTUFB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LENBQUM7YUFDdEI7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLE9BQVEsR0FBYSxDQUFDLE9BQU8sQ0FBQzthQUM5QjtTQUNEO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDakIsQ0FBQzs7QUF0VkQ7OztHQUdHO0FBQ0ksZUFBSyxHQUE2QixFQUFFLENBQUM7QUFFNUM7Ozs7O0dBS0c7QUFDSSwwQkFBZ0IsR0FBcUI7SUFDM0MsV0FBVyxFQUFFLGlCQUFpQjtJQUM5QixRQUFRLEVBQUUsbUJBQW1CO0lBQzdCLE1BQU0sRUFBRSx5QkFBeUI7Q0FDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfLCB7IGdldCwga2V5cywgc2V0LCB0cmltLCB2YWx1ZXMgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgc3RyaW5nSGFzaCBmcm9tICdzdHJpbmctaGFzaCc7XHJcblxyXG5pbXBvcnQgeyBFdmFsdWF0b3JPcHRpb25zLCBUZW1wbGF0ZVNldHRpbmdzIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHNlY3VyZSBjb250ZXh0IGZvciBmdW5jdGlvbiBldmFsdWF0aW9uIHRoYXQgcHJldmVudHMgYWNjZXNzIHRvIHRoZSB3aW5kb3cgb2JqZWN0LlxyXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gQSBzZWN1cmUgY29udGV4dCBvYmplY3Qgd2l0aCBzYWZlIHByb3BlcnRpZXMuXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVTZWN1cmVDb250ZXh0KCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG5cdC8vIENyZWF0ZSBhIHNlY3VyZSBjb250ZXh0IHdpdGggb25seSBzYWZlIHByb3BlcnRpZXNcclxuXHRyZXR1cm4ge1xyXG5cdFx0Ly8gQWRkIGFueSBzYWZlIGdsb2JhbHMgaGVyZSB0aGF0IHNob3VsZCBiZSBhY2Nlc3NpYmxlXHJcblx0XHRjb25zb2xlOiB7XHJcblx0XHRcdGxvZzogY29uc29sZS5sb2csXHJcblx0XHRcdHdhcm46IGNvbnNvbGUud2FybixcclxuXHRcdFx0ZXJyb3I6IGNvbnNvbGUuZXJyb3JcclxuXHRcdH0sXHJcblx0XHQvLyBBZGQgb3RoZXIgc2FmZSBvYmplY3RzL2Z1bmN0aW9ucyBhcyBuZWVkZWRcclxuXHRcdE1hdGgsXHJcblx0XHREYXRlLFxyXG5cdFx0TnVtYmVyLFxyXG5cdFx0U3RyaW5nLFxyXG5cdFx0Qm9vbGVhbixcclxuXHRcdEFycmF5LFxyXG5cdFx0T2JqZWN0LFxyXG5cdFx0SlNPTixcclxuXHRcdC8vIFByZXZlbnQgYWNjZXNzIHRvIHdpbmRvd1xyXG5cdFx0d2luZG93OiB1bmRlZmluZWQsXHJcblx0XHRzZWxmOiB1bmRlZmluZWQsXHJcblx0XHRnbG9iYWxUaGlzOiB1bmRlZmluZWQsXHJcblx0XHRfOiBfIC8vIEluY2x1ZGUgbG9kYXNoIGlmIG5lZWRlZCwgYnV0IGVuc3VyZSBpdCdzIHVzZWQgc2FmZWx5XHJcblx0fTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdXRpbGl0eSBjbGFzcyBmb3IgZXZhbHVhdGluZyBleHByZXNzaW9ucywgaW50ZXJwb2xhdGluZyBzdHJpbmdzLCBhbmQgd29ya2luZyB3aXRoIHRlbXBsYXRlcy5cclxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgZHluYW1pYyBldmFsdWF0aW9uIG9mIGNvZGUsIHN0cmluZyBpbnRlcnBvbGF0aW9uLFxyXG4gKiBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGNhY2hpbmcgY2FwYWJpbGl0aWVzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2YWx1YXRvciB7XHJcblx0LyoqXHJcblx0ICogQ2FjaGUgZm9yIHN0b3JpbmcgY29tcGlsZWQgdGVtcGxhdGUgZnVuY3Rpb25zIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXHJcblx0ICogS2V5cyBhcmUgc3RyaW5nIGhhc2hlcyBvZiB0aGUgdGVtcGxhdGUsIHZhbHVlcyBhcmUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9ucy5cclxuXHQgKi9cclxuXHRzdGF0aWMgY2FjaGU6IFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPiA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXR0aW5ncyBmb3IgdGVtcGxhdGUgcHJvY2Vzc2luZywgZGVmaW5pbmcgcmVnZXggcGF0dGVybnMgZm9yIGRpZmZlcmVudCB0ZW1wbGF0ZSBvcGVyYXRpb25zLlxyXG5cdCAqIC0gaW50ZXJwb2xhdGU6IFBhdHRlcm4gZm9yIHZhcmlhYmxlIGludGVycG9sYXRpb24gKHt7IHZhcmlhYmxlIH19KVxyXG5cdCAqIC0gZXZhbHVhdGU6IFBhdHRlcm4gZm9yIGNvZGUgZXZhbHVhdGlvbiAoeyUgY29kZSAlfSlcclxuXHQgKiAtIGVzY2FwZTogUGF0dGVybiBmb3IgSFRNTCBlc2NhcGluZyAoe3t7IHZhcmlhYmxlIH19fSlcclxuXHQgKi9cclxuXHRzdGF0aWMgdGVtcGxhdGVTZXR0aW5nczogVGVtcGxhdGVTZXR0aW5ncyA9IHtcclxuXHRcdGludGVycG9sYXRlOiAve3soW1xcc1xcU10rPyl9fS9nLFxyXG5cdFx0ZXZhbHVhdGU6IC9cXHslKFtcXHNcXFNdKz8pJVxcfS9nLFxyXG5cdFx0ZXNjYXBlOiAvXFx7XFx7XFx7KFtcXHNcXFNdKz8pXFx9XFx9XFx9L2dcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSBhIHN0cmluZyBvciByZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBhbHJlYWR5IHByb3ZpZGVkLlxyXG5cdCAqIFVzZXMgYSBzZWN1cmUgY29udGV4dCB0byBwcmV2ZW50IGFjY2VzcyB0byB0aGUgd2luZG93IG9iamVjdCBieSBkZWZhdWx0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSBmdW5jIC0gVGhlIGZ1bmN0aW9uIG9yIHN0cmluZyB0byBjb252ZXJ0IHRvIGEgZnVuY3Rpb24uXHJcblx0ICogQHBhcmFtIHsuLi5hbnl9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7RXZhbHVhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGV2YWx1YXRpb24uXHJcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSAtIFRoZSByZXN1bHRpbmcgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0c3RhdGljIGV2YWx1YXRvcihmdW5jOiBzdHJpbmcgfCBGdW5jdGlvbiwgLi4ucGFyYW1zOiBhbnlbXSk6IEZ1bmN0aW9uIHtcclxuXHRcdC8vIEV4dHJhY3Qgb3B0aW9ucyBpZiB0aGUgbGFzdCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9ucyBvYmplY3RcclxuXHRcdGxldCBvcHRpb25zOiBFdmFsdWF0b3JPcHRpb25zID0ge307XHJcblx0XHRpZiAoXHJcblx0XHRcdHBhcmFtcy5sZW5ndGggPiAwICYmXHJcblx0XHRcdHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV0gJiZcclxuXHRcdFx0dHlwZW9mIHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV0gPT09ICdvYmplY3QnICYmXHJcblx0XHRcdCdzZWN1cml0eU1vZGUnIGluIHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV1cclxuXHRcdCkge1xyXG5cdFx0XHRvcHRpb25zID0gcGFyYW1zLnBvcCgpIGFzIEV2YWx1YXRvck9wdGlvbnM7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdHJldHVybiBmdW5jO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgcGFyYW1zWzBdID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRwYXJhbXMgPSBrZXlzKHBhcmFtc1swXSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHVzZSBzZWN1cmUgbW9kZSAoZGVmYXVsdCkgb3IgdW5zYWZlIG1vZGVcclxuXHRcdGNvbnN0IHNlY3VyaXR5TW9kZSA9IG9wdGlvbnMuc2VjdXJpdHlNb2RlIHx8ICdzZWN1cmUnO1xyXG5cclxuXHRcdGlmIChzZWN1cml0eU1vZGUgPT09ICd1bnNhZmUnKSB7XHJcblx0XHRcdC8vIEluIHVuc2FmZSBtb2RlLCBjcmVhdGUgYSBmdW5jdGlvbiB3aXRoIGFjY2VzcyB0byBhbGwgZ2xvYmFsc1xyXG5cdFx0XHRyZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLnBhcmFtcywgZnVuYyBhcyBzdHJpbmcpO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3Qgc2FuZGJveCA9IGNyZWF0ZVNlY3VyZUNvbnRleHQoKTtcclxuXHRcdGNvbnN0IHNhbmRib3hLZXlzID0gT2JqZWN0LmtleXMoc2FuZGJveCk7XHJcblx0XHRjb25zdCBzYW5kYm94QXNzaWdubWVudHMgPSBzYW5kYm94S2V5cy5tYXAoKGtleSkgPT4gYGNvbnN0ICR7a2V5fSA9IHNhbmRib3guJHtrZXl9O2ApLmpvaW4oJycpO1xyXG5cclxuXHRcdGNvbnN0IHdyYXBwZXIgPSBuZXcgRnVuY3Rpb24oLi4ucGFyYW1zLCAnc2FuZGJveCcsIGAke3NhbmRib3hBc3NpZ25tZW50c30ke2Z1bmMgYXMgc3RyaW5nfWApO1xyXG5cclxuXHRcdHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHdyYXBwZXIoLi4uYXJncywgc2FuZGJveCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXBsYWNlcyB0ZW1wbGF0ZSBleHByZXNzaW9ucyBpbiBhIHN0cmluZyB3aXRoIHZhbHVlcyBmcm9tIGRhdGEuXHJcblx0ICogU3VwcG9ydHMgZnVuY3Rpb24gY2FsbHMgd2l0aGluIHRlbXBsYXRlcyBhbmQgZmFsbGJhY2sgdmFsdWVzIHVzaW5nIHx8IHN5bnRheC5cclxuXHQgKiBCeSBkZWZhdWx0LCBlbnN1cmVzIGV2YWx1YXRpb24gaGFwcGVucyBpbiBhIHNlY3VyZSBjb250ZXh0IHRvIHByZXZlbnQgYWNjZXNzIHRvIHdpbmRvdyBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHJhd1RlbXBsYXRlIC0gVGhlIHRlbXBsYXRlIHN0cmluZyBjb250YWluaW5nIGV4cHJlc3Npb25zIHRvIGludGVycG9sYXRlLlxyXG5cdCAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBjb250YWluaW5nIHZhbHVlcyB0byB1c2UgZm9yIGludGVycG9sYXRpb24uXHJcblx0ICogQHBhcmFtIHtFdmFsdWF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgaW50ZXJwb2xhdGlvbiBwcm9jZXNzLlxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGludGVycG9sYXRlZCBzdHJpbmcgd2l0aCBhbGwgZXhwcmVzc2lvbnMgcmVwbGFjZWQgd2l0aCBhY3R1YWwgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBpbnRlcnBvbGF0ZVN0cmluZyhyYXdUZW1wbGF0ZTogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvcHRpb25zOiBFdmFsdWF0b3JPcHRpb25zID0ge30pOiBzdHJpbmcge1xyXG5cdFx0aWYgKCFyYXdUZW1wbGF0ZSkge1xyXG5cdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblx0XHRpZiAodHlwZW9mIHJhd1RlbXBsYXRlICE9PSAnc3RyaW5nJykge1xyXG5cdFx0XHRyZXR1cm4gKHJhd1RlbXBsYXRlIGFzIGFueSkudG9TdHJpbmcoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGVjayBpZiB3ZSBzaG91bGQgdXNlIHNlY3VyZSBtb2RlIChkZWZhdWx0KSBvciB1bnNhZmUgbW9kZVxyXG5cdFx0Y29uc3Qgc2VjdXJpdHlNb2RlID0gb3B0aW9ucy5zZWN1cml0eU1vZGUgfHwgJ3NlY3VyZSc7XHJcblxyXG5cdFx0Ly8gQ3JlYXRlIGEgc2VjdXJlIGRhdGEgb2JqZWN0IGlmIG5lZWRlZFxyXG5cdFx0Y29uc3Qgc2VjdXJlRGF0YSA9XHJcblx0XHRcdHNlY3VyaXR5TW9kZSA9PT0gJ3Vuc2FmZSdcclxuXHRcdFx0XHQ/IGRhdGFcclxuXHRcdFx0XHQ6IHtcclxuXHRcdFx0XHRcdFx0Li4uY3JlYXRlU2VjdXJlQ29udGV4dCgpLFxyXG5cdFx0XHRcdFx0XHQuLi5kYXRhLFxyXG5cdFx0XHRcdFx0XHQvLyBFbnN1cmUgdGhlc2UgcmVtYWluIHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHR3aW5kb3c6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdFx0c2VsZjogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHRnbG9iYWxUaGlzOiB1bmRlZmluZWRcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0cmV0dXJuIHJhd1RlbXBsYXRlLnJlcGxhY2UoLyh7e1xccyooLio/KVxccyp9fSkvZywgKG1hdGNoOiBzdHJpbmcsICQxOiBzdHJpbmcsIGV4cHJlc3Npb246IHN0cmluZykgPT4ge1xyXG5cdFx0XHRpZiAoZXhwcmVzc2lvbi5pbmRleE9mKCcoJykgIT09IC0xKSB7XHJcblx0XHRcdFx0cmV0dXJuIGV4cHJlc3Npb24ucmVwbGFjZSgvKFteKF0rKVxcKChbXildKylcXHMqXFwpOz8vLCAoXzogc3RyaW5nLCBmbk5hbWU6IHN0cmluZywgYXJnc1N0cjogc3RyaW5nKSA9PiB7XHJcblx0XHRcdFx0XHRmbk5hbWUgPSB0cmltKGZuTmFtZSk7XHJcblx0XHRcdFx0XHRjb25zdCBmdW5jID0gZ2V0KHNlY3VyZURhdGEsIGZuTmFtZSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGZ1bmMpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGFyZ3NTdHIpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBhcmdzID0gYXJnc1N0ci5zcGxpdCgnLCcpLm1hcCgoYXJnOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRyaW1tZWQgPSB0cmltKGFyZyk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoL15bJ1wiXS8udGVzdCh0cmltbWVkKSkgcmV0dXJuIHRyaW1tZWQuc2xpY2UoMSwgLTEpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGdldChzZWN1cmVEYXRhLCB0cmltbWVkKTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gRXZhbHVhdG9yLmV2YWx1YXRlKGZ1bmMsIGFyZ3MsICcnLCBmYWxzZSwgc2VjdXJlRGF0YSwgb3B0aW9ucyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuIEV2YWx1YXRvci5ldmFsdWF0ZShmdW5jLCBbXSwgJycsIGZhbHNlLCBzZWN1cmVEYXRhLCBvcHRpb25zKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiAnJztcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsZXQgZGF0YVBhdGggPSBleHByZXNzaW9uO1xyXG5cdFx0XHRcdGlmIChleHByZXNzaW9uLmluZGV4T2YoJz8nKSAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdGRhdGFQYXRoID0gZXhwcmVzc2lvbi5yZXBsYWNlKC9cXD9cXC4vZywgJy4nKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgcGFydHMgPSBkYXRhUGF0aC5zcGxpdCgnfHwnKS5tYXAoKGl0ZW06IHN0cmluZykgPT4gaXRlbS50cmltKCkpO1xyXG5cdFx0XHRcdGxldCB2YWx1ZSA9ICcnO1xyXG5cdFx0XHRcdGxldCBwYXRoID0gJyc7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0cGF0aCA9IHBhcnRzW2ldO1xyXG5cdFx0XHRcdFx0aWYgKF8uaGFzKHNlY3VyZURhdGEsIHBhdGgpKSB7XHJcblx0XHRcdFx0XHRcdHZhbHVlID0gXy5nZXQoc2VjdXJlRGF0YSwgcGF0aCk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAob3B0aW9ucy5kYXRhKSB7XHJcblx0XHRcdFx0XHRzZXQob3B0aW9ucy5kYXRhLCBwYXRoLCB2YWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhbiBldmFsdWF0aW9uIHVzaW5nIHRoZSBldmFsdWF0aW9uIGNvbnRleHQgb2YgdGhpcyBjb21wb25lbnQuXHJcblx0ICogQnkgZGVmYXVsdCwgZW5zdXJlcyBldmFsdWF0aW9uIGhhcHBlbnMgaW4gYSBzZWN1cmUgY29udGV4dCB0byBwcmV2ZW50IGFjY2VzcyB0byB3aW5kb3cgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufG9iamVjdH0gZnVuYyAtIFRoZSBmdW5jdGlvbiBvciBzdHJpbmcgdG8gZXZhbHVhdGUuXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGV2YWx1YXRpb24uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHJldCAtIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB3aXRoaW4gdGhlIGV2YWx1YXRpb24gY29udGV4dCB0byByZXR1cm4uXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBpbnRlcnBvbGF0ZSAtIERldGVybWluZXMgaWYgaXQgc2hvdWxkIHJlcGxhY2UgYWxsIHt7IH19IHRva2VuIHJlZmVyZW5jZXMgd2l0aCBhY3R1YWwgZGF0YS5cclxuXHQgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCAtICAgLSBUaGUgZXZhbHVhdGlvbiBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7RXZhbHVhdG9yT3B0aW9ucyB9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBldmFsdWF0aW9uLlxyXG5cdCAqIEByZXR1cm5zIHsqfSAtIFRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24uXHJcblx0ICovXHJcblx0c3RhdGljIGV2YWx1YXRlKFxyXG5cdFx0ZnVuYzogYW55LFxyXG5cdFx0YXJnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxyXG5cdFx0cmV0OiBzdHJpbmcgPSAnc2hvdycsXHJcblx0XHRpbnRlcnBvbGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxyXG5cdFx0Y29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxyXG5cdFx0b3B0aW9uczogRXZhbHVhdG9yT3B0aW9ucyA9IHt9XHJcblx0KTogYW55IHtcclxuXHRcdGxldCByZXR1cm5WYWwgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGZpZWxkID0gYXJncy5maWVsZCA/IGFyZ3MuZmllbGQgOiB7IGtleTogJ3Vua25vd24nIH07XHJcblx0XHRjb25zdCBmaWVsZEtleSA9IGZpZWxkLmtleTtcclxuXHJcblx0XHRpZiAodHlwZW9mIGZ1bmMgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdGlmIChyZXQpIHtcclxuXHRcdFx0XHRmdW5jID0gYHZhciAke3JldH07JHtmdW5jfTtyZXR1cm4gJHtyZXR9YDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKGludGVycG9sYXRlKSB7XHJcblx0XHRcdFx0ZnVuYyA9IEV2YWx1YXRvci5pbnRlcnBvbGF0ZShmdW5jLCBhcmdzLCBvcHRpb25zKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBQYXNzIHRoZSBzZWN1cml0eSBtb2RlIG9wdGlvbiB0byB0aGUgZXZhbHVhdG9yXHJcblx0XHRcdFx0Y29uc3QgZXZhbHVhdG9yT3B0aW9ucyA9IHsgc2VjdXJpdHlNb2RlOiBvcHRpb25zLnNlY3VyaXR5TW9kZSB8fCAnc2VjdXJlJyB9O1xyXG5cdFx0XHRcdGZ1bmMgPSBFdmFsdWF0b3IuZXZhbHVhdG9yKGZ1bmMsIGFyZ3MsIGNvbnRleHQsIGV2YWx1YXRvck9wdGlvbnMpO1xyXG5cdFx0XHRcdGFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IHZhbHVlcyhhcmdzKTtcclxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKGBBbiBlcnJvciBvY2N1cmVkIHdpdGhpbiB0aGUgY3VzdG9tIGZ1bmN0aW9uIGZvciAke2ZpZWxkS2V5fWAsIGVycik7XHJcblx0XHRcdFx0cmV0dXJuVmFsID0gbnVsbDtcclxuXHRcdFx0XHRmdW5jID0gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRyZXR1cm5WYWwgPSBFdmFsdWF0b3IuZXhlY3V0ZShmdW5jLCBhcmdzLCBjb250ZXh0LCBvcHRpb25zKTtcclxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XHJcblx0XHRcdFx0cmV0dXJuVmFsID0gbnVsbDtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oYEFuIGVycm9yIG9jY3VyZWQgd2l0aGluIGN1c3RvbSBmdW5jdGlvbiBmb3IgJHtmaWVsZEtleX1gLCBlcnIpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGZ1bmMpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKGBVbmtub3duIGZ1bmN0aW9uIHR5cGUgZm9yICR7ZmllbGRLZXl9YCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmV0dXJuVmFsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgYSBmdW5jdGlvbiB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50cyBhbmQgY29udGV4dC5cclxuXHQgKiBCeSBkZWZhdWx0LCBlbnN1cmVzIGV4ZWN1dGlvbiBoYXBwZW5zIGluIGEgc2VjdXJlIGNvbnRleHQgdG8gcHJldmVudCBhY2Nlc3MgdG8gd2luZG93IG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXHJcblx0ICogQHBhcmFtIHthbnlbXXxSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiwgZWl0aGVyIGFzIGFuIGFycmF5IG9yIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtjb250ZXh0PXt9XSAtIFRoZSBjb250ZXh0ICh0aGlzKSB0byB1c2Ugd2hlbiBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7RXZhbHVhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGV4ZWN1dGlvbi5cclxuXHQgKiBAcmV0dXJucyB7YW55fSAtIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGV4ZWN1dGlvbi5cclxuXHQgKi9cclxuXHRzdGF0aWMgZXhlY3V0ZShcclxuXHRcdGZ1bmM6IEZ1bmN0aW9uLFxyXG5cdFx0YXJnczogYW55W10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG5cdFx0Y29udGV4dDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxyXG5cdFx0b3B0aW9uczogRXZhbHVhdG9yT3B0aW9ucyA9IHt9XHJcblx0KTogYW55IHtcclxuXHRcdC8vIENoZWNrIGlmIHdlIHNob3VsZCB1c2Ugc2VjdXJlIG1vZGUgKGRlZmF1bHQpIG9yIHVuc2FmZSBtb2RlXHJcblx0XHRjb25zdCBzZWN1cml0eU1vZGUgPSBvcHRpb25zLnNlY3VyaXR5TW9kZSB8fCAnc2VjdXJlJztcclxuXHJcblx0XHRpZiAoc2VjdXJpdHlNb2RlID09PSAndW5zYWZlJykge1xyXG5cdFx0XHQvLyBJbiB1bnNhZmUgbW9kZSwgZXhlY3V0ZSB3aXRoIHRoZSBvcmlnaW5hbCBjb250ZXh0XHJcblx0XHRcdHJldHVybiBBcnJheS5pc0FycmF5KGFyZ3MpID8gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKSA6IGZ1bmMuY2FsbChjb250ZXh0LCBhcmdzKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIEluIHNlY3VyZSBtb2RlLCBjcmVhdGUgYSBzZWN1cmUgY29udGV4dCBieSBtZXJnaW5nIHRoZSBwcm92aWRlZCBjb250ZXh0IHdpdGggb3VyIHNlY3VyZSBjb250ZXh0XHJcblx0XHRcdGNvbnN0IHNlY3VyZUNvbnRleHQgPSB7XHJcblx0XHRcdFx0Li4uY3JlYXRlU2VjdXJlQ29udGV4dCgpLFxyXG5cdFx0XHRcdC4uLmNvbnRleHQsXHJcblx0XHRcdFx0Ly8gRW5zdXJlIHRoZXNlIHJlbWFpbiB1bmRlZmluZWQgZXZlbiBpZiB0aGV5IHdlcmUgaW4gdGhlIHByb3ZpZGVkIGNvbnRleHRcclxuXHRcdFx0XHR3aW5kb3c6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHRzZWxmOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0Z2xvYmFsVGhpczogdW5kZWZpbmVkXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBzZWN1cmUgY29udGV4dFxyXG5cdFx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcmdzKSA/IGZ1bmMuYXBwbHkoc2VjdXJlQ29udGV4dCwgYXJncykgOiBmdW5jLmNhbGwoc2VjdXJlQ29udGV4dCwgYXJncyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgdGVtcGxhdGUgZnVuY3Rpb24gZnJvbSBhIHN0cmluZyB3aXRoIGNhY2hpbmcgZm9yIHBlcmZvcm1hbmNlLlxyXG5cdCAqIEJ5IGRlZmF1bHQsIGVuc3VyZXMgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGV4ZWN1dGVzIGluIGEgc2VjdXJlIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlIC0gVGhlIHRlbXBsYXRlIHN0cmluZyB0byBjb21waWxlIGludG8gYSBmdW5jdGlvbi5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2hhc2hdIC0gT3B0aW9uYWwgaGFzaCB0byB1c2UgYXMgY2FjaGUga2V5LiBJZiBub3QgcHJvdmlkZWQsIGEgaGFzaCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZS5cclxuXHQgKiBAcGFyYW0ge0V2YWx1YXRvck9wdGlvbnN9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZW1wbGF0ZS5cclxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb258dW5kZWZpbmVkfSAtIFRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiwgb3IgdW5kZWZpbmVkIGlmIGNvbXBpbGF0aW9uIGZhaWxzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyB0ZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBoYXNoPzogc3RyaW5nLCBvcHRpb25zOiBFdmFsdWF0b3JPcHRpb25zID0ge30pOiBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XHJcblx0XHRoYXNoID0gaGFzaCB8fCBzdHJpbmdIYXNoKHRlbXBsYXRlKS50b1N0cmluZygpO1xyXG5cclxuXHRcdC8vIElmIGhhc2ggY29udGFpbnMgb3B0aW9ucyBvYmplY3QsIGV4dHJhY3QgaXRcclxuXHRcdGlmICh0eXBlb2YgaGFzaCA9PT0gJ29iamVjdCcgJiYgJ3NlY3VyaXR5TW9kZScgaW4gaGFzaCkge1xyXG5cdFx0XHRvcHRpb25zID0gaGFzaCBhcyB1bmtub3duIGFzIEV2YWx1YXRvck9wdGlvbnM7XHJcblx0XHRcdGhhc2ggPSBzdHJpbmdIYXNoKHRlbXBsYXRlKS50b1N0cmluZygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgdmVyc2lvblxyXG5cdFx0Y29uc3QgY2FjaGVLZXkgPSBoYXNoICsgKG9wdGlvbnMuc2VjdXJpdHlNb2RlIHx8ICdzZWN1cmUnKTtcclxuXHRcdGlmIChFdmFsdWF0b3IuY2FjaGVbY2FjaGVLZXldKSB7XHJcblx0XHRcdHJldHVybiBFdmFsdWF0b3IuY2FjaGVbY2FjaGVLZXldO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZSgvY3R4XFwuL2csICcnKTtcclxuXHJcblx0XHRcdC8vIENyZWF0ZSB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gdXNpbmcgbG9kYXNoXHJcblx0XHRcdGNvbnN0IHRlbXBsYXRlRnVuYyA9IF8udGVtcGxhdGUodGVtcGxhdGUsIEV2YWx1YXRvci50ZW1wbGF0ZVNldHRpbmdzKTtcclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIHdlIHNob3VsZCB1c2Ugc2VjdXJlIG1vZGUgKGRlZmF1bHQpIG9yIHVuc2FmZSBtb2RlXHJcblx0XHRcdGNvbnN0IHNlY3VyaXR5TW9kZSA9IG9wdGlvbnMuc2VjdXJpdHlNb2RlIHx8ICdzZWN1cmUnO1xyXG5cclxuXHRcdFx0aWYgKHNlY3VyaXR5TW9kZSA9PT0gJ3Vuc2FmZScpIHtcclxuXHRcdFx0XHQvLyBJbiB1bnNhZmUgbW9kZSwgcmV0dXJuIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSBmdW5jdGlvblxyXG5cdFx0XHRcdHJldHVybiAoRXZhbHVhdG9yLmNhY2hlW2NhY2hlS2V5XSA9IHRlbXBsYXRlRnVuYyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gSW4gc2VjdXJlIG1vZGUsIHdyYXAgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSBpdCBydW5zIGluIGEgc2VjdXJlIGNvbnRleHRcclxuXHRcdFx0XHRjb25zdCBzZWN1cmVUZW1wbGF0ZUZ1bmMgPSAoZGF0YTogYW55KSA9PiB7XHJcblx0XHRcdFx0XHQvLyBDcmVhdGUgYSBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRlbXBsYXRlXHJcblx0XHRcdFx0XHRjb25zdCBzZWN1cmVEYXRhID0ge1xyXG5cdFx0XHRcdFx0XHQuLi5jcmVhdGVTZWN1cmVDb250ZXh0KCksXHJcblx0XHRcdFx0XHRcdC4uLmRhdGEsXHJcblx0XHRcdFx0XHRcdC8vIEVuc3VyZSB0aGVzZSByZW1haW4gdW5kZWZpbmVkXHJcblx0XHRcdFx0XHRcdHdpbmRvdzogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHRzZWxmOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdGdsb2JhbFRoaXM6IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gdGVtcGxhdGVGdW5jKHNlY3VyZURhdGEpO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdC8vIENhY2hlIGFuZCByZXR1cm4gdGhlIHNlY3VyZSB0ZW1wbGF0ZSBmdW5jdGlvblxyXG5cdFx0XHRcdHJldHVybiAoRXZhbHVhdG9yLmNhY2hlW2NhY2hlS2V5XSA9IHNlY3VyZVRlbXBsYXRlRnVuYyk7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oJ0Vycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGVtcGxhdGUnLCBlcnIsIHRlbXBsYXRlKTtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludGVycG9sYXRlcyBhIHRlbXBsYXRlIHdpdGggZGF0YSwgaGFuZGxpbmcgYm90aCBmdW5jdGlvbiB0ZW1wbGF0ZXMgYW5kIHN0cmluZyB0ZW1wbGF0ZXMuXHJcblx0ICogQnkgZGVmYXVsdCwgZW5zdXJlcyBpbnRlcnBvbGF0aW9uIGhhcHBlbnMgaW4gYSBzZWN1cmUgY29udGV4dCB0byBwcmV2ZW50IGFjY2VzcyB0byB3aW5kb3cgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfEZ1bmN0aW9ufSByYXdUZW1wbGF0ZSAtIFRoZSB0ZW1wbGF0ZSB0byBpbnRlcnBvbGF0ZSwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uXHJcblx0ICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IHRvIHVzZSBmb3IgaW50ZXJwb2xhdGlvbi5cclxuXHQgKiBAcGFyYW0ge0V2YWx1YXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgaW50ZXJwb2xhdGlvbiBwcm9jZXNzLlxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd8YW55fSAtIFRoZSByZXN1bHQgb2YgdGhlIGludGVycG9sYXRpb24sIHR5cGljYWxseSBhIHN0cmluZyBidXQgY291bGQgYmUgYW55IHR5cGUgZGVwZW5kaW5nIG9uIHRoZSB0ZW1wbGF0ZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgaW50ZXJwb2xhdGUoXHJcblx0XHRyYXdUZW1wbGF0ZTogc3RyaW5nIHwgRnVuY3Rpb24sXHJcblx0XHRkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG5cdFx0b3B0aW9uczogRXZhbHVhdG9yT3B0aW9ucyA9IHt9XHJcblx0KTogc3RyaW5nIHwgYW55IHtcclxuXHRcdGlmICh0eXBlb2YgcmF3VGVtcGxhdGUgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHQvLyBJZiB0aGUgdGVtcGxhdGUgaXMgYSBmdW5jdGlvbiwgZXhlY3V0ZSBpdCB3aXRoIHRoZSBkYXRhXHJcblx0XHRcdFx0Ly8gV2UgY2FuJ3QgZGlyZWN0bHkgc2VjdXJlIGEgcHJvdmlkZWQgZnVuY3Rpb24sIGJ1dCB3ZSBjYW4gdXNlIGV4ZWN1dGVcclxuXHRcdFx0XHQvLyB0byBydW4gaXQgaW4gYSBzZWN1cmUgY29udGV4dCBpZiBuZWVkZWRcclxuXHRcdFx0XHRpZiAob3B0aW9ucy5zZWN1cml0eU1vZGUgIT09ICd1bnNhZmUnKSB7XHJcblx0XHRcdFx0XHRjb25zdCBzZWN1cmVEYXRhID0ge1xyXG5cdFx0XHRcdFx0XHQuLi5jcmVhdGVTZWN1cmVDb250ZXh0KCksXHJcblx0XHRcdFx0XHRcdC4uLmRhdGEsXHJcblx0XHRcdFx0XHRcdHdpbmRvdzogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHRzZWxmOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdGdsb2JhbFRoaXM6IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdHJldHVybiByYXdUZW1wbGF0ZShzZWN1cmVEYXRhKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHJhd1RlbXBsYXRlKGRhdGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCdFcnJvciBpbnRlcnBvbGF0aW5nIHRlbXBsYXRlJywgZXJyLCBkYXRhKTtcclxuXHRcdFx0XHRyZXR1cm4gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJhd1RlbXBsYXRlID0gU3RyaW5nKHJhd1RlbXBsYXRlKTtcclxuXHRcdC8vIFBhc3MgdGhlIHNlY3VyaXR5IG1vZGUgb3B0aW9uIHRvIHRoZSB0ZW1wbGF0ZSBtZXRob2RcclxuXHRcdGNvbnN0IHRlbXBsYXRlID0gRXZhbHVhdG9yLnRlbXBsYXRlKHJhd1RlbXBsYXRlLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRyZXR1cm4gdGVtcGxhdGUoZGF0YSk7XHJcblx0XHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybignRXJyb3IgaW50ZXJwb2xhdGluZyB0ZW1wbGF0ZScsIGVyciwgcmF3VGVtcGxhdGUsIGRhdGEpO1xyXG5cdFx0XHRcdHJldHVybiAoZXJyIGFzIEVycm9yKS5tZXNzYWdlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRlbXBsYXRlO1xyXG5cdH1cclxufVxyXG4iXX0=
@@ -1,3 +0,0 @@
1
- export * from './evaluator';
2
- export * from './types';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9zaGFyZWQvZXZhbHVhdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ldmFsdWF0b3InO1xyXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJ1xyXG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9zaGFyZWQvZXZhbHVhdG9yL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBFdmFsdWF0b3JPcHRpb25zID0ge1xyXG5cdGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG5cdC8qKlxyXG5cdCAqIENvbnRyb2xzIHRoZSBzZWN1cml0eSBsZXZlbCBvZiBldmFsdWF0aW9uLlxyXG5cdCAqIC0gJ3NlY3VyZScgKGRlZmF1bHQpOiBQcmV2ZW50cyBhY2Nlc3MgdG8gd2luZG93IG9iamVjdCBhbmQgb3RoZXIgZ2xvYmFsIG9iamVjdHNcclxuXHQgKiAtICd1bnNhZmUnOiBBbGxvd3MgYWNjZXNzIHRvIGFsbCBnbG9iYWwgb2JqZWN0cyAodXNlIHdpdGggY2F1dGlvbilcclxuXHQgKi9cclxuXHRzZWN1cml0eU1vZGU/OiAnc2VjdXJlJyB8ICd1bnNhZmUnO1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgVGVtcGxhdGVTZXR0aW5ncyA9IHtcclxuXHRpbnRlcnBvbGF0ZTogUmVnRXhwO1xyXG5cdGV2YWx1YXRlOiBSZWdFeHA7XHJcblx0ZXNjYXBlOiBSZWdFeHA7XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBJbnRlcnBvbGF0ZVN0cmluZyA9IHN0cmluZztcclxuXHJcbmV4cG9ydCB0eXBlIEV2YWx1YXRlZFN0cmluZzxWQVIgZXh0ZW5kcyBzdHJpbmcgPSAnc2hvdyc+ID0gYCR7c3RyaW5nfSR7VkFSfSR7V2hpdGVzcGFjZX09JHtXaGl0ZXNwYWNlfSR7c3RyaW5nfWA7XHJcblxyXG50eXBlIFdoaXRlc3BhY2UgPSAnJyB8ICcgJyB8IGAke2FueX1gO1xyXG4iXX0=