@accordproject/template-engine 3.1.0 → 4.2.1

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 (139) hide show
  1. package/README.md +41 -0
  2. package/lib/JavaScriptEvaluator.d.ts +71 -0
  3. package/lib/JavaScriptEvaluator.js +245 -0
  4. package/lib/JavaScriptEvaluator.js.map +1 -0
  5. package/lib/TemplateArchiveProcessor.d.ts +151 -0
  6. package/lib/TemplateArchiveProcessor.js +447 -0
  7. package/lib/TemplateArchiveProcessor.js.map +1 -0
  8. package/lib/TemplateMarkInterpreter.d.ts +34 -0
  9. package/lib/TemplateMarkInterpreter.js +689 -0
  10. package/lib/TemplateMarkInterpreter.js.map +1 -0
  11. package/lib/TemplateMarkNodes.d.ts +19 -0
  12. package/lib/TemplateMarkNodes.js +45 -0
  13. package/lib/TemplateMarkNodes.js.map +1 -0
  14. package/lib/TemplateMarkToJavaScriptCompiler.d.ts +20 -0
  15. package/lib/TemplateMarkToJavaScriptCompiler.js +99 -0
  16. package/lib/TemplateMarkToJavaScriptCompiler.js.map +1 -0
  17. package/lib/TypeScriptCompilationContext.d.ts +42 -0
  18. package/lib/TypeScriptCompilationContext.js +170 -0
  19. package/lib/TypeScriptCompilationContext.js.map +1 -0
  20. package/lib/TypeScriptRuntime.d.ts +17 -0
  21. package/lib/TypeScriptRuntime.js +84 -0
  22. package/lib/TypeScriptRuntime.js.map +1 -0
  23. package/lib/TypeScriptToJavaScriptCompiler.d.ts +11 -0
  24. package/lib/TypeScriptToJavaScriptCompiler.js +169 -0
  25. package/lib/TypeScriptToJavaScriptCompiler.js.map +1 -0
  26. package/lib/drafting/Boolean/index.d.ts +6 -0
  27. package/lib/drafting/Boolean/index.js +30 -0
  28. package/lib/drafting/Boolean/index.js.map +1 -0
  29. package/lib/drafting/DateTime/index.d.ts +8 -0
  30. package/lib/drafting/DateTime/index.js +33 -0
  31. package/lib/drafting/DateTime/index.js.map +1 -0
  32. package/lib/drafting/Double/format.d.ts +14 -0
  33. package/lib/drafting/Double/format.js +62 -0
  34. package/lib/drafting/Double/format.js.map +1 -0
  35. package/lib/drafting/Double/index.d.ts +8 -0
  36. package/lib/drafting/Double/index.js +33 -0
  37. package/lib/drafting/Double/index.js.map +1 -0
  38. package/lib/drafting/DraftFormat.d.ts +5 -0
  39. package/lib/drafting/DraftFormat.js +18 -0
  40. package/lib/drafting/DraftFormat.js.map +1 -0
  41. package/lib/drafting/Duration/index.d.ts +6 -0
  42. package/lib/drafting/Duration/index.js +39 -0
  43. package/lib/drafting/Duration/index.js.map +1 -0
  44. package/lib/drafting/Integer/format.d.ts +14 -0
  45. package/lib/drafting/Integer/format.js +52 -0
  46. package/lib/drafting/Integer/format.js.map +1 -0
  47. package/lib/drafting/Integer/index.d.ts +8 -0
  48. package/lib/drafting/Integer/index.js +33 -0
  49. package/lib/drafting/Integer/index.js.map +1 -0
  50. package/lib/drafting/Long/index.d.ts +8 -0
  51. package/lib/drafting/Long/index.js +33 -0
  52. package/lib/drafting/Long/index.js.map +1 -0
  53. package/lib/drafting/MonetaryAmount/currencycode.d.ts +35 -0
  54. package/lib/drafting/MonetaryAmount/currencycode.js +53 -0
  55. package/lib/drafting/MonetaryAmount/currencycode.js.map +1 -0
  56. package/lib/drafting/MonetaryAmount/formatTokens.d.ts +13 -0
  57. package/lib/drafting/MonetaryAmount/formatTokens.js +44 -0
  58. package/lib/drafting/MonetaryAmount/formatTokens.js.map +1 -0
  59. package/lib/drafting/MonetaryAmount/index.d.ts +13 -0
  60. package/lib/drafting/MonetaryAmount/index.js +51 -0
  61. package/lib/drafting/MonetaryAmount/index.js.map +1 -0
  62. package/lib/drafting/PreciseAmount/index.d.ts +17 -0
  63. package/lib/drafting/PreciseAmount/index.js +113 -0
  64. package/lib/drafting/PreciseAmount/index.js.map +1 -0
  65. package/lib/drafting/String/index.d.ts +6 -0
  66. package/lib/drafting/String/index.js +25 -0
  67. package/lib/drafting/String/index.js.map +1 -0
  68. package/lib/drafting/index.d.ts +2 -0
  69. package/lib/drafting/index.js +63 -0
  70. package/lib/drafting/index.js.map +1 -0
  71. package/lib/index.d.ts +7 -0
  72. package/lib/index.js +42 -0
  73. package/lib/index.js.map +1 -0
  74. package/lib/llm/LLMConfig.d.ts +121 -0
  75. package/lib/llm/LLMConfig.js +30 -0
  76. package/lib/llm/LLMConfig.js.map +1 -0
  77. package/lib/llm/LLMExecutor.d.ts +77 -0
  78. package/lib/llm/LLMExecutor.js +603 -0
  79. package/lib/llm/LLMExecutor.js.map +1 -0
  80. package/lib/llm/ModelManagerSchema.d.ts +14 -0
  81. package/lib/llm/ModelManagerSchema.js +67 -0
  82. package/lib/llm/ModelManagerSchema.js.map +1 -0
  83. package/lib/llm/Reasoners.d.ts +190 -0
  84. package/lib/llm/Reasoners.js +643 -0
  85. package/lib/llm/Reasoners.js.map +1 -0
  86. package/lib/model-gen/concerto.d.ts +13 -0
  87. package/lib/model-gen/concerto.js +4 -0
  88. package/lib/model-gen/concerto.js.map +1 -0
  89. package/lib/model-gen/concerto.metamodel@1.0.0.d.ts +196 -0
  90. package/lib/model-gen/concerto.metamodel@1.0.0.js +4 -0
  91. package/lib/model-gen/concerto.metamodel@1.0.0.js.map +1 -0
  92. package/lib/model-gen/concerto@1.0.0.d.ts +19 -0
  93. package/lib/model-gen/concerto@1.0.0.js +4 -0
  94. package/lib/model-gen/concerto@1.0.0.js.map +1 -0
  95. package/lib/model-gen/org.accordproject.ciceromark@0.6.0.d.ts +49 -0
  96. package/lib/model-gen/org.accordproject.ciceromark@0.6.0.js +4 -0
  97. package/lib/model-gen/org.accordproject.ciceromark@0.6.0.js.map +1 -0
  98. package/lib/model-gen/org.accordproject.commonmark@0.5.0.d.ts +89 -0
  99. package/lib/model-gen/org.accordproject.commonmark@0.5.0.js +4 -0
  100. package/lib/model-gen/org.accordproject.commonmark@0.5.0.js.map +1 -0
  101. package/lib/model-gen/org.accordproject.templatemark@0.5.0.d.ts +76 -0
  102. package/lib/model-gen/org.accordproject.templatemark@0.5.0.js +11 -0
  103. package/lib/model-gen/org.accordproject.templatemark@0.5.0.js.map +1 -0
  104. package/lib/runtime/declarations.d.ts +2 -0
  105. package/lib/runtime/declarations.js +21 -0
  106. package/lib/runtime/declarations.js.map +1 -0
  107. package/lib/slc/model-gen/concerto.d.ts +13 -0
  108. package/lib/slc/model-gen/concerto.decorator@1.0.0.d.ts +6 -0
  109. package/lib/slc/model-gen/concerto.decorator@1.0.0.js +5 -0
  110. package/lib/slc/model-gen/concerto.decorator@1.0.0.js.map +1 -0
  111. package/lib/slc/model-gen/concerto.js +5 -0
  112. package/lib/slc/model-gen/concerto.js.map +1 -0
  113. package/lib/slc/model-gen/concerto@1.0.0.d.ts +24 -0
  114. package/lib/slc/model-gen/concerto@1.0.0.js +6 -0
  115. package/lib/slc/model-gen/concerto@1.0.0.js.map +1 -0
  116. package/lib/slc/model-gen/org.accordproject.contract@0.2.0.d.ts +7 -0
  117. package/lib/slc/model-gen/org.accordproject.contract@0.2.0.js +5 -0
  118. package/lib/slc/model-gen/org.accordproject.contract@0.2.0.js.map +1 -0
  119. package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.d.ts +15 -0
  120. package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.js +4 -0
  121. package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.js.map +1 -0
  122. package/lib/slc/model-gen/org.accordproject.time@0.3.0.d.ts +46 -0
  123. package/lib/slc/model-gen/org.accordproject.time@0.3.0.js +48 -0
  124. package/lib/slc/model-gen/org.accordproject.time@0.3.0.js.map +1 -0
  125. package/lib/utils.d.ts +35 -0
  126. package/lib/utils.js +122 -0
  127. package/lib/utils.js.map +1 -0
  128. package/lib/worker.d.ts +1 -0
  129. package/{dist → lib}/worker.js +12 -10
  130. package/lib/worker.js.map +1 -0
  131. package/package.json +46 -25
  132. package/umd/template-engine.js +13 -0
  133. package/umd/template-engine.js.LICENSE.txt +21 -0
  134. package/dist/index.d.ts +0 -186
  135. package/dist/index.js +0 -1275
  136. package/dist/index.js.map +0 -1
  137. package/dist/index.mjs +0 -1248
  138. package/dist/index.mjs.map +0 -1
  139. package/dist/worker.js.map +0 -1
package/dist/index.js DELETED
@@ -1,1275 +0,0 @@
1
- 'use strict';
2
-
3
- var jp = require('jsonpath');
4
- var traverse = require('traverse');
5
- var browserOrNode = require('browser-or-node');
6
- var os = require('os');
7
- var concertoCore = require('@accordproject/concerto-core');
8
- var dayjs = require('dayjs');
9
- var utc = require('dayjs/plugin/utc');
10
- var toWords = require('to-words');
11
- var markdownCommon = require('@accordproject/markdown-common');
12
- var vfs = require('@typescript/vfs');
13
- var twoslash = require('@typescript/twoslash');
14
- var concertoCodegen = require('@accordproject/concerto-codegen');
15
- var concertoUtil = require('@accordproject/concerto-util');
16
- var markdownTemplate = require('@accordproject/markdown-template');
17
- var fs = require('fs');
18
- var lzstring = require('lz-string');
19
- var child_process = require('child_process');
20
- var path = require('path');
21
- var markdownTransform = require('@accordproject/markdown-transform');
22
-
23
- function _interopNamespaceDefault(e) {
24
- var n = Object.create(null);
25
- if (e) {
26
- Object.keys(e).forEach(function (k) {
27
- if (k !== 'default') {
28
- var d = Object.getOwnPropertyDescriptor(e, k);
29
- Object.defineProperty(n, k, d.get ? d : {
30
- enumerable: true,
31
- get: function () { return e[k]; }
32
- });
33
- }
34
- });
35
- }
36
- n.default = e;
37
- return Object.freeze(n);
38
- }
39
-
40
- var lzstring__namespace = /*#__PURE__*/_interopNamespaceDefault(lzstring);
41
-
42
- function booleanDrafter(value) {
43
- if (value) {
44
- return "true";
45
- } else {
46
- return "false";
47
- }
48
- }
49
-
50
- dayjs.extend(utc);
51
- function dateTimeDrafter(value, format) {
52
- const f = format ? format : "MM/DD/YYYY";
53
- return dayjs.utc(value).format(f);
54
- }
55
-
56
- function draftDoubleIEEE(value) {
57
- if (Math.floor(value) === value) {
58
- return new Number(value).toFixed(1);
59
- } else {
60
- return "" + value;
61
- }
62
- }
63
- function draftDoubleFormat(value, format) {
64
- if (format === "text") {
65
- const converter = new toWords.ToWords();
66
- const res = converter.convert(value);
67
- return res;
68
- } else {
69
- return format.replace(/0(.)0((.)(0+))?/gi, function(_a, sep1, _b, sep2, digits) {
70
- const len = digits ? digits.length : 0;
71
- const vs = value.toFixed(len);
72
- let res = "";
73
- if (sep2) {
74
- const d = vs.substring(vs.length - len);
75
- res += sep2 + d;
76
- }
77
- let i = vs.substring(0, vs.length - (len === 0 ? 0 : len + 1));
78
- while (i.length > 3) {
79
- res = sep1 + i.substring(i.length - 3) + res;
80
- i = i.substring(0, i.length - 3);
81
- }
82
- return i + res;
83
- });
84
- }
85
- }
86
-
87
- function doubleDrafter(value, format) {
88
- if (format) {
89
- return draftDoubleFormat(value, format);
90
- } else {
91
- return draftDoubleIEEE(value);
92
- }
93
- }
94
-
95
- function draftInteger(value) {
96
- return "" + value;
97
- }
98
- function draftIntegerFormat(value, format) {
99
- if (format === "text") {
100
- const converter = new toWords.ToWords();
101
- const res = converter.convert(value);
102
- return res;
103
- } else {
104
- return format.replace(/0(.)0/gi, function(_a, sep1) {
105
- const vs = value.toFixed(0);
106
- let res = "";
107
- let i = vs.substring(0, vs.length);
108
- while (i.length > 3) {
109
- res = sep1 + i.substring(i.length - 3) + res;
110
- i = i.substring(0, i.length - 3);
111
- }
112
- return i + res;
113
- });
114
- }
115
- }
116
-
117
- function integerDrafter(value, format) {
118
- if (format) {
119
- return draftIntegerFormat(value, format);
120
- } else {
121
- return draftInteger(value);
122
- }
123
- }
124
-
125
- function isDuration(value) {
126
- return value != null && typeof value === "object" && "amount" in value && "unit" in value && typeof value.amount === "number" && typeof value.unit === "string";
127
- }
128
- function durationDrafter(value) {
129
- if (!isDuration(value)) {
130
- return "0 unknown";
131
- }
132
- return `${value.amount} ${value.unit}`;
133
- }
134
-
135
- function longDrafter(value, format) {
136
- if (format) {
137
- return draftIntegerFormat(value, format);
138
- } else {
139
- return draftInteger(value);
140
- }
141
- }
142
-
143
- var CurrencyCode = /* @__PURE__ */ ((CurrencyCode2) => {
144
- CurrencyCode2["USD"] = "$";
145
- CurrencyCode2["EUR"] = "\u20AC";
146
- CurrencyCode2["JPY"] = "\xA5";
147
- CurrencyCode2["GBP"] = "\xA3";
148
- CurrencyCode2["AUD"] = "A$";
149
- CurrencyCode2["CAD"] = "C$";
150
- CurrencyCode2["CHF"] = "CHF";
151
- CurrencyCode2["CNY"] = "\u5143";
152
- CurrencyCode2["HKD"] = "HK$";
153
- CurrencyCode2["NZD"] = "NZ$";
154
- CurrencyCode2["KRW"] = "\u20A9";
155
- CurrencyCode2["SGD"] = "S$";
156
- CurrencyCode2["MXN"] = "MEX$";
157
- CurrencyCode2["INR"] = "\u20B9";
158
- CurrencyCode2["RUB"] = "\u20BD";
159
- CurrencyCode2["ZAR"] = "R";
160
- CurrencyCode2["TRY"] = "\u20BA";
161
- CurrencyCode2["BRL"] = "R$";
162
- CurrencyCode2["TWD"] = "NT$";
163
- CurrencyCode2["PLN"] = "z\u0142";
164
- CurrencyCode2["THB"] = "\u0E3F";
165
- CurrencyCode2["IDR"] = "Rp";
166
- CurrencyCode2["HUF"] = "Ft";
167
- CurrencyCode2["CZK"] = "K\u010D";
168
- CurrencyCode2["ILS"] = "\u20AA";
169
- CurrencyCode2["CLP"] = "CLP$";
170
- CurrencyCode2["PHP"] = "\u20B1";
171
- CurrencyCode2["AED"] = "\u062F.\u0625";
172
- CurrencyCode2["COP"] = "COL$";
173
- CurrencyCode2["SAR"] = "\uFDFC";
174
- CurrencyCode2["MYR"] = "RM";
175
- CurrencyCode2["RON"] = "L";
176
- CurrencyCode2["BGN"] = "\u043B\u0432.";
177
- return CurrencyCode2;
178
- })(CurrencyCode || {});
179
-
180
- function monetaryAmountDefaultDrafter(value) {
181
- return "" + draftDoubleIEEE(value.doubleValue) + " " + value.currencyCode;
182
- }
183
- function codeSymbol(c) {
184
- const index = Object.keys(CurrencyCode).indexOf(c);
185
- if (index >= 0) {
186
- return Object.values(CurrencyCode)[index];
187
- } else {
188
- return c;
189
- }
190
- }
191
- function monetaryAmountFormatDrafter(value, format) {
192
- return draftDoubleFormat(
193
- value.doubleValue,
194
- format.replace(/K/gi, codeSymbol(value.currencyCode)).replace(/CCC/gi, value.currencyCode)
195
- );
196
- }
197
- function monetaryAmountDrafter(value, format) {
198
- if (format) {
199
- return monetaryAmountFormatDrafter(value, format);
200
- } else {
201
- return monetaryAmountDefaultDrafter(value);
202
- }
203
- }
204
-
205
- function stringDrafter(value) {
206
- return value;
207
- }
208
-
209
- function getDrafter(typeName) {
210
- switch (typeName) {
211
- case "Boolean":
212
- return booleanDrafter;
213
- case "DateTime":
214
- return dateTimeDrafter;
215
- case "Double":
216
- return doubleDrafter;
217
- case "Integer":
218
- return integerDrafter;
219
- case "Long":
220
- return longDrafter;
221
- case "org.accordproject.money@0.3.0.MonetaryAmount":
222
- return monetaryAmountDrafter;
223
- case "org.accordproject.time@0.3.0.Duration":
224
- return durationDrafter;
225
- case "org.accordproject.time@0.3.0.Period":
226
- return durationDrafter;
227
- case "String":
228
- return stringDrafter;
229
- default:
230
- return null;
231
- }
232
- }
233
-
234
- const TEMPLATEMARK_RE = /^(org\.accordproject\.templatemark)@(.+)\.(\w+)Definition$/;
235
- const FORMULA_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormulaDefinition$/;
236
- const VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.VariableDefinition$/;
237
- const CONDITIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ConditionalDefinition$/;
238
- const ENUM_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.EnumVariableDefinition$/;
239
- const FORMATTED_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormattedVariableDefinition$/;
240
- const WITH_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.WithDefinition$/;
241
- const LISTBLOCK_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ListBlockDefinition$/;
242
- const JOIN_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.JoinDefinition$/;
243
- const OPTIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.OptionalDefinition$/;
244
- const CLAUSE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ClauseDefinition$/;
245
- const CONTRACT_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ContractDefinition$/;
246
- const FOREACH_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ForeachDefinition$/;
247
- const NAVIGATION_NODES = [
248
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.ListBlockDefinition`,
249
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.WithDefinition`,
250
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.JoinDefinition`,
251
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.OptionalDefinition`,
252
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition`,
253
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.ContractDefinition`,
254
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.ForeachBlockDefinition`
255
- ];
256
-
257
- function ensureDirSync(path) {
258
- if (!fs.existsSync(path)) {
259
- fs.mkdirSync(path, { recursive: true });
260
- }
261
- }
262
- function removeSync(path) {
263
- fs.rmSync(path, { recursive: true, force: true });
264
- }
265
- function writeFunctionToString(templateClass, functionName, returnType, code) {
266
- let result = "";
267
- result += "/// ---cut---\n";
268
- result += `export function ${functionName}(data:TemplateModel.I${templateClass.getName()}, library:any, options:GenerationOptions) : ${returnType} {
269
- `;
270
- result += " const now = dayjs(options?.now);\n";
271
- result += " const locale = options?.locale;\n";
272
- templateClass.getProperties().forEach((p) => {
273
- result += ` const ${p.getName()} = data.${p.getName()};
274
- `;
275
- });
276
- result += " " + code.trim() + "\n";
277
- result += "}\n";
278
- result += "\n";
279
- return result;
280
- }
281
- function nameUserCode(templateMarkDom) {
282
- return traverse(templateMarkDom).map(function(x) {
283
- if (x && (x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition` && x.condition || x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition` && x.condition)) {
284
- x.functionName = `condition_${this.path.join("_")}`;
285
- }
286
- this.update(x);
287
- });
288
- }
289
- function getTemplateClassDeclaration(modelManager, templateConceptFqn) {
290
- const introspector = new concertoCore.Introspector(modelManager);
291
- try {
292
- return markdownTemplate.templatemarkutil.findTemplateConcept(introspector, "clause", templateConceptFqn);
293
- } catch (err) {
294
- console.log(err);
295
- throw err;
296
- }
297
- }
298
-
299
- class TypeScriptCompilationContext {
300
- constructor(modelManager, templateConceptFqn) {
301
- this.modelManager = modelManager;
302
- this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
303
- }
304
- getTypeScriptFiles() {
305
- const result = {};
306
- const visitor = new concertoCodegen.CodeGen.TypescriptVisitor();
307
- const writer = new concertoUtil.InMemoryWriter();
308
- const params = {
309
- fileWriter: writer
310
- };
311
- this.modelManager.accept(visitor, params);
312
- writer.getFilesInMemory().forEach((value, key) => {
313
- result[key] = value;
314
- });
315
- return result;
316
- }
317
- getCompilationContext() {
318
- const files = this.getTypeScriptFiles();
319
- let result = "";
320
- Object.keys(files).forEach((key) => {
321
- const content = files[key];
322
- result += `
323
- // @filename: ${key}
324
- ${content}
325
- `;
326
- });
327
- result += `
328
- // @filename: code.ts
329
- import * as TemplateModel from './${this.templateClass.getNamespace()}';
330
- import dayjs from 'dayjs';
331
- import jp from 'jsonpath';
332
-
333
- type GenerationOptions = {
334
- now?:string,
335
- locale?:string
336
- }
337
- `;
338
- return result;
339
- }
340
- }
341
-
342
- const DAYJS_BASE64 = "Ly8vIDxyZWZlcmVuY2UgcGF0aD0iLi9sb2NhbGUvaW5kZXguZC50cyIgLz4KCmV4cG9ydCA9IGRheWpzOwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUpOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIHN0cmljdD86IGJvb2xlYW4pOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIGxvY2FsZT86IHN0cmluZywgc3RyaWN0PzogYm9vbGVhbik6IGRheWpzLkRheWpzCgpkZWNsYXJlIG5hbWVzcGFjZSBkYXlqcyB7CiAgaW50ZXJmYWNlIENvbmZpZ1R5cGVNYXAgewogICAgZGVmYXVsdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IERheWpzIHwgbnVsbCB8IHVuZGVmaW5lZAogIH0KCiAgZXhwb3J0IHR5cGUgQ29uZmlnVHlwZSA9IENvbmZpZ1R5cGVNYXBba2V5b2YgQ29uZmlnVHlwZU1hcF0KCiAgZXhwb3J0IGludGVyZmFjZSBGb3JtYXRPYmplY3QgeyBsb2NhbGU/OiBzdHJpbmcsIGZvcm1hdD86IHN0cmluZywgdXRjPzogYm9vbGVhbiB9CgogIGV4cG9ydCB0eXBlIE9wdGlvblR5cGUgPSBGb3JtYXRPYmplY3QgfCBzdHJpbmcgfCBzdHJpbmdbXQoKICBleHBvcnQgdHlwZSBVbml0VHlwZVNob3J0ID0gJ2QnIHwgJ0QnIHwgJ00nIHwgJ3knIHwgJ2gnIHwgJ20nIHwgJ3MnIHwgJ21zJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmcgPSAnbWlsbGlzZWNvbmQnIHwgJ3NlY29uZCcgfCAnbWludXRlJyB8ICdob3VyJyB8ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyB8ICdkYXRlJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmdQbHVyYWwgPSAnbWlsbGlzZWNvbmRzJyB8ICdzZWNvbmRzJyB8ICdtaW51dGVzJyB8ICdob3VycycgfCAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycgfCAnZGF0ZXMnCiAgCiAgZXhwb3J0IHR5cGUgVW5pdFR5cGUgPSBVbml0VHlwZUxvbmcgfCBVbml0VHlwZUxvbmdQbHVyYWwgfCBVbml0VHlwZVNob3J0OwoKICBleHBvcnQgdHlwZSBPcFVuaXRUeXBlID0gVW5pdFR5cGUgfCAid2VlayIgfCAid2Vla3MiIHwgJ3cnOwogIGV4cG9ydCB0eXBlIFFVbml0VHlwZSA9IFVuaXRUeXBlIHwgInF1YXJ0ZXIiIHwgInF1YXJ0ZXJzIiB8ICdRJzsKICBleHBvcnQgdHlwZSBNYW5pcHVsYXRlVHlwZSA9IEV4Y2x1ZGU8T3BVbml0VHlwZSwgJ2RhdGUnIHwgJ2RhdGVzJz47CiAgY2xhc3MgRGF5anMgewogICAgY29uc3RydWN0b3IgKGNvbmZpZz86IENvbmZpZ1R5cGUpCiAgICAvKioKICAgICAqIEFsbCBEYXkuanMgb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBTdGlsbCwgYGRheWpzI2Nsb25lYCBjYW4gY3JlYXRlIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGlmIHlvdSBuZWVkIG9uZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5jbG9uZSgpLy8gPT4gRGF5anMKICAgICAqIGRheWpzKGRheWpzKCcyMDE5LTAxLTI1JykpIC8vIHBhc3NpbmcgYSBEYXlqcyBvYmplY3QgdG8gYSBjb25zdHJ1Y3RvciB3aWxsIGFsc28gY2xvbmUgaXQKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvZGF5anMtY2xvbmUKICAgICAqLwogICAgY2xvbmUoKTogRGF5anMKICAgIC8qKgogICAgICogVGhpcyByZXR1cm5zIGEgYGJvb2xlYW5gIGluZGljYXRpbmcgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBjb250YWlucyBhIHZhbGlkIGRhdGUgb3Igbm90LgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzVmFsaWQoKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvaXMtdmFsaWQKICAgICAqLwogICAgaXNWYWxpZCgpOiBib29sZWFuCiAgICAvKioKICAgICAqIEdldCB0aGUgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS55ZWFyKCkvLyA9PiAyMDIwCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHllYXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkueWVhcigyMDAwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1vbnRoLgogICAgICoKICAgICAqIE1vbnRocyBhcmUgemVybyBpbmRleGVkLCBzbyBKYW51YXJ5IGlzIG1vbnRoIDAuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkubW9udGgoKS8vID0+IDAtMTEKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9tb250aAogICAgICovCiAgICBtb250aCgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBtb250aC4KICAgICAqCiAgICAgKiBNb250aHMgYXJlIHplcm8gaW5kZXhlZCwgc28gSmFudWFyeSBpcyBtb250aCAwLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgdG8gMTEuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5tb250aCgwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbW9udGgKICAgICAqLwogICAgbW9udGgodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF0ZSBvZiB0aGUgbW9udGguCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZGF0ZSgpLy8gPT4gMS0zMQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2RhdGUKICAgICAqLwogICAgZGF0ZSgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBkYXRlIG9mIHRoZSBtb250aC4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAxIHRvIDMxLiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IG1vbnRocy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5kYXRlKDEpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9kYXRlCiAgICAgKi8KICAgIGRhdGUodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLgogICAgICoKICAgICAqIFJldHVybnMgbnVtYmVycyBmcm9tIDAgKFN1bmRheSkgdG8gNiAoU2F0dXJkYXkpLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmRheSgpLy8gMC02CiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvZGF5CiAgICAgKi8KICAgIGRheSgpOiAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2CiAgICAvKioKICAgICAqIFNldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgKFN1bmRheSkgdG8gNiAoU2F0dXJkYXkpLiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIG5leHQgd2Vla3MuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZGF5KDApLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9kYXkKICAgICAqLwogICAgZGF5KHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIGhvdXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuaG91cigpLy8gPT4gMC0yMwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2hvdXIKICAgICAqLwogICAgaG91cigpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBob3VyLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgdG8gMjMuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgZGF5LgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmhvdXIoMTIpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9ob3VyCiAgICAgKi8KICAgIGhvdXIodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgbWludXRlcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taW51dGUoKS8vID0+IDAtNTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9taW51dGUKICAgICAqLwogICAgbWludXRlKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIG1pbnV0ZXMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA1OS4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBob3VyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbnV0ZSg1OSkvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L21pbnV0ZQogICAgICovCiAgICBtaW51dGUodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZWNvbmQoKS8vID0+IDAtNTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9zZWNvbmQKICAgICAqLwogICAgc2Vjb25kKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHNlY29uZHMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA1OS4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBtaW51dGVzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNlY29uZCgxKS8vIERheWpzCiAgICAgKiBgYGAKICAgICAqLwogICAgc2Vjb25kKHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taWxsaXNlY29uZCgpLy8gPT4gMC05OTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9taWxsaXNlY29uZAogICAgICovCiAgICBtaWxsaXNlY29uZCgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBtaWxsaXNlY29uZHMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA5OTkuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taWxsaXNlY29uZCgxKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbWlsbGlzZWNvbmQKICAgICAqLwogICAgbWlsbGlzZWNvbmQodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdlbmVyaWMgc2V0dGVyLCBhY2NlcHRpbmcgdW5pdCBhcyBmaXJzdCBhcmd1bWVudCwgYW5kIHZhbHVlIGFzIHNlY29uZCwgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBhcHBsaWVkIGNoYW5nZXMuCiAgICAgKgogICAgICogSW4gZ2VuZXJhbDoKICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZXQodW5pdCwgdmFsdWUpID09PSBkYXlqcygpW3VuaXRdKHZhbHVlKQogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZXQoJ2RhdGUnLCAxKQogICAgICogZGF5anMoKS5zZXQoJ21vbnRoJywgMykgLy8gQXByaWwKICAgICAqIGRheWpzKCkuc2V0KCdzZWNvbmQnLCAzMCkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9zZXQKICAgICAqLwogICAgc2V0KHVuaXQ6IFVuaXRUeXBlLCB2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogU3RyaW5nIGdldHRlciwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbiBnZXR0aW5nIGZyb20gRGF5LmpzIG9iamVjdC4KICAgICAqCiAgICAgKiBJbiBnZW5lcmFsOgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmdldCh1bml0KSA9PT0gZGF5anMoKVt1bml0XSgpCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmdldCgneWVhcicpCiAgICAgKiBkYXlqcygpLmdldCgnbW9udGgnKSAvLyBzdGFydCAwCiAgICAgKiBkYXlqcygpLmdldCgnZGF0ZScpCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvZ2V0CiAgICAgKi8KICAgIGdldCh1bml0OiBVbml0VHlwZSk6IG51bWJlcgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY2xvbmVkIERheS5qcyBvYmplY3Qgd2l0aCBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBhZGRlZC4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5hZGQoNywgJ2RheScpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9hZGQKICAgICAqLwogICAgYWRkKHZhbHVlOiBudW1iZXIsIHVuaXQ/OiBNYW5pcHVsYXRlVHlwZSk6IERheWpzCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjbG9uZWQgRGF5LmpzIG9iamVjdCB3aXRoIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIHN1YnRyYWN0ZWQuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuc3VidHJhY3QoNywgJ3llYXInKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvc3VidHJhY3QKICAgICAqLwogICAgc3VidHJhY3QodmFsdWU6IG51bWJlciwgdW5pdD86IE1hbmlwdWxhdGVUeXBlKTogRGF5anMKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNsb25lZCBEYXkuanMgb2JqZWN0IGFuZCBzZXQgaXQgdG8gdGhlIHN0YXJ0IG9mIGEgdW5pdCBvZiB0aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnN0YXJ0T2YoJ3llYXInKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvc3RhcnQtb2YKICAgICAqLwogICAgc3RhcnRPZih1bml0OiBPcFVuaXRUeXBlKTogRGF5anMKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNsb25lZCBEYXkuanMgb2JqZWN0IGFuZCBzZXQgaXQgdG8gdGhlIGVuZCBvZiBhIHVuaXQgb2YgdGltZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5lbmRPZignbW9udGgnKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvZW5kLW9mCiAgICAgKi8KICAgIGVuZE9mKHVuaXQ6IE9wVW5pdFR5cGUpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIGZvcm1hdHRlZCBkYXRlIGFjY29yZGluZyB0byB0aGUgc3RyaW5nIG9mIHRva2VucyBwYXNzZWQgaW4uCiAgICAgKgogICAgICogVG8gZXNjYXBlIGNoYXJhY3RlcnMsIHdyYXAgdGhlbSBpbiBzcXVhcmUgYnJhY2tldHMgKGUuZy4gW01NXSkuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZm9ybWF0KCkvLyA9PiBjdXJyZW50IGRhdGUgaW4gSVNPODYwMSwgd2l0aG91dCBmcmFjdGlvbiBzZWNvbmRzIGUuZy4gJzIwMjAtMDQtMDJUMDg6MDI6MTctMDU6MDAnCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLmZvcm1hdCgnW1lZWVllc2NhcGVdIFlZWVktTU0tRERUSEg6bW06c3NaW1pdJykvLyAnWVlZWWVzY2FwZSAyMDE5LTAxLTI1VDAwOjAwOjAwLTAyOjAwWicKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykuZm9ybWF0KCdERC9NTS9ZWVlZJykgLy8gJzI1LzAxLzIwMTknCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvZm9ybWF0CiAgICAgKi8KICAgIGZvcm1hdCh0ZW1wbGF0ZT86IHN0cmluZyk6IHN0cmluZwogICAgLyoqCiAgICAgKiBUaGlzIGluZGljYXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRlLXRpbWUgaW4gdGhlIHNwZWNpZmllZCB1bml0LgogICAgICoKICAgICAqIFRvIGdldCB0aGUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHMsIHVzZSBgZGF5anMjZGlmZmAKICAgICAqIGBgYAogICAgICogY29uc3QgZGF0ZTEgPSBkYXlqcygnMjAxOS0wMS0yNScpCiAgICAgKiBjb25zdCBkYXRlMiA9IGRheWpzKCcyMDE4LTA2LTA1JykKICAgICAqIGRhdGUxLmRpZmYoZGF0ZTIpIC8vIDIwMjE0MDAwMDAwIGRlZmF1bHQgbWlsbGlzZWNvbmRzCiAgICAgKiBkYXRlMS5kaWZmKCkgLy8gbWlsbGlzZWNvbmRzIHRvIGN1cnJlbnQgdGltZQogICAgICogYGBgCiAgICAgKgogICAgICogVG8gZ2V0IHRoZSBkaWZmZXJlbmNlIGluIGFub3RoZXIgdW5pdCBvZiBtZWFzdXJlbWVudCwgcGFzcyB0aGF0IG1lYXN1cmVtZW50IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCiAgICAgKiBgYGAKICAgICAqIGNvbnN0IGRhdGUxID0gZGF5anMoJzIwMTktMDEtMjUnKQogICAgICogZGF0ZTEuZGlmZignMjAxOC0wNi0wNScsICdtb250aCcpIC8vIDcKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9kaWZmZXJlbmNlCiAgICAgKi8KICAgIGRpZmYoZGF0ZT86IENvbmZpZ1R5cGUsIHVuaXQ/OiBRVW5pdFR5cGUgfCBPcFVuaXRUeXBlLCBmbG9hdD86IGJvb2xlYW4pOiBudW1iZXIKICAgIC8qKgogICAgICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgKiptaWxsaXNlY29uZHMqKiBzaW5jZSB0aGUgVW5peCBFcG9jaCBvZiB0aGUgRGF5LmpzIG9iamVjdC4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS52YWx1ZU9mKCkgLy8gMTU0ODM4MTYwMDAwMAogICAgICogK2RheWpzKDE1NDgzODE2MDAwMDApIC8vIDE1NDgzODE2MDAwMDAKICAgICAqIGBgYAogICAgICogVG8gZ2V0IGEgVW5peCB0aW1lc3RhbXAgKHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gpIGZyb20gYSBEYXkuanMgb2JqZWN0LCB5b3Ugc2hvdWxkIHVzZSBVbml4IFRpbWVzdGFtcCBgZGF5anMjdW5peCgpYC4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L3VuaXgtdGltZXN0YW1wLW1pbGxpc2Vjb25kcwogICAgICovCiAgICB2YWx1ZU9mKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBUaGlzIHJldHVybnMgdGhlIFVuaXggdGltZXN0YW1wICh0aGUgbnVtYmVyIG9mICoqc2Vjb25kcyoqIHNpbmNlIHRoZSBVbml4IEVwb2NoKSBvZiB0aGUgRGF5LmpzIG9iamVjdC4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS51bml4KCkgLy8gMTU0ODM4MTYwMAogICAgICogYGBgCiAgICAgKiBUaGlzIHZhbHVlIGlzIGZsb29yZWQgdG8gdGhlIG5lYXJlc3Qgc2Vjb25kLCBhbmQgZG9lcyBub3QgaW5jbHVkZSBhIG1pbGxpc2Vjb25kcyBjb21wb25lbnQuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS91bml4LXRpbWVzdGFtcAogICAgICovCiAgICB1bml4KCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBjdXJyZW50IG1vbnRoLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLmRheXNJbk1vbnRoKCkgLy8gMzEKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9kYXlzLWluLW1vbnRoCiAgICAgKi8KICAgIGRheXNJbk1vbnRoKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBUbyBnZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgYERhdGVgIG9iamVjdCBwYXJzZWQgZnJvbSB0aGUgRGF5LmpzIG9iamVjdCB1c2UgYGRheWpzI3RvRGF0ZWAuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykudG9EYXRlKCkvLyA9PiBEYXRlCiAgICAgKiBgYGAKICAgICAqLwogICAgdG9EYXRlKCk6IERhdGUKICAgIC8qKgogICAgICogVG8gc2VyaWFsaXplIGFzIGFuIElTTyA4NjAxIHN0cmluZy4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS50b0pTT04oKSAvLyAnMjAxOS0wMS0yNVQwMjowMDowMC4wMDBaJwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2FzLWpzb24KICAgICAqLwogICAgdG9KU09OKCk6IHN0cmluZwogICAgLyoqCiAgICAgKiBUbyBmb3JtYXQgYXMgYW4gSVNPIDg2MDEgc3RyaW5nLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnRvSVNPU3RyaW5nKCkgLy8gJzIwMTktMDEtMjVUMDI6MDA6MDAuMDAwWicKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9hcy1pc28tc3RyaW5nCiAgICAgKi8KICAgIHRvSVNPU3RyaW5nKCk6IHN0cmluZwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRlLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnRvU3RyaW5nKCkgLy8gJ0ZyaSwgMjUgSmFuIDIwMTkgMDI6MDA6MDAgR01UJwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2FzLXN0cmluZwogICAgICovCiAgICB0b1N0cmluZygpOiBzdHJpbmcKICAgIC8qKgogICAgICogR2V0IHRoZSBVVEMgb2Zmc2V0IGluIG1pbnV0ZXMuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkudXRjT2Zmc2V0KCkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS91dGMtb2Zmc2V0CiAgICAgKi8KICAgIHV0Y09mZnNldCgpOiBudW1iZXIKICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyBiZWZvcmUgdGhlIG90aGVyIHN1cHBsaWVkIGRhdGUtdGltZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc0JlZm9yZShkYXlqcygnMjAxMS0wMS0wMScpKSAvLyBkZWZhdWx0IG1pbGxpc2Vjb25kcwogICAgICogYGBgCiAgICAgKiBJZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUgZ3JhbnVsYXJpdHkgdG8gYSB1bml0IG90aGVyIHRoYW4gbWlsbGlzZWNvbmRzLCBwYXNzIGl0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQmVmb3JlKCcyMDExLTAxLTAxJywgJ3llYXInKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcXVlcnkvaXMtYmVmb3JlCiAgICAgKi8KICAgIGlzQmVmb3JlKGRhdGU/OiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzU2FtZShkYXlqcygnMjAxMS0wMS0wMScpKSAvLyBkZWZhdWx0IG1pbGxpc2Vjb25kcwogICAgICogYGBgCiAgICAgKiBJZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUgZ3JhbnVsYXJpdHkgdG8gYSB1bml0IG90aGVyIHRoYW4gbWlsbGlzZWNvbmRzLCBwYXNzIGl0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzU2FtZSgnMjAxMS0wMS0wMScsICd5ZWFyJykvLyA9PiBib29sZWFuCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL3F1ZXJ5L2lzLXNhbWUKICAgICAqLwogICAgaXNTYW1lKGRhdGU/OiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyBhZnRlciB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQWZ0ZXIoZGF5anMoJzIwMTEtMDEtMDEnKSkgLy8gZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGBgYAogICAgICogSWYgeW91IHdhbnQgdG8gbGltaXQgdGhlIGdyYW51bGFyaXR5IHRvIGEgdW5pdCBvdGhlciB0aGFuIG1pbGxpc2Vjb25kcywgcGFzcyBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc0FmdGVyKCcyMDExLTAxLTAxJywgJ3llYXInKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcXVlcnkvaXMtYWZ0ZXIKICAgICAqLwogICAgaXNBZnRlcihkYXRlPzogQ29uZmlnVHlwZSwgdW5pdD86IE9wVW5pdFR5cGUpOiBib29sZWFuCgogICAgbG9jYWxlKCk6IHN0cmluZwoKICAgIGxvY2FsZShwcmVzZXQ6IHN0cmluZyB8IElMb2NhbGUsIG9iamVjdD86IFBhcnRpYWw8SUxvY2FsZT4pOiBEYXlqcwogIH0KCiAgZXhwb3J0IHR5cGUgUGx1Z2luRnVuYzxUID0gdW5rbm93bj4gPSAob3B0aW9uOiBULCBjOiB0eXBlb2YgRGF5anMsIGQ6IHR5cGVvZiBkYXlqcykgPT4gdm9pZAoKICBleHBvcnQgZnVuY3Rpb24gZXh0ZW5kPFQgPSB1bmtub3duPihwbHVnaW46IFBsdWdpbkZ1bmM8VD4sIG9wdGlvbj86IFQpOiBEYXlqcwoKICBleHBvcnQgZnVuY3Rpb24gbG9jYWxlKHByZXNldD86IHN0cmluZyB8IElMb2NhbGUsIG9iamVjdD86IFBhcnRpYWw8SUxvY2FsZT4sIGlzTG9jYWw/OiBib29sZWFuKTogc3RyaW5nCgogIGV4cG9ydCBmdW5jdGlvbiBpc0RheWpzKGQ6IGFueSk6IGQgaXMgRGF5anMKCiAgZXhwb3J0IGZ1bmN0aW9uIHVuaXgodDogbnVtYmVyKTogRGF5anMKCiAgY29uc3QgTHMgOiB7IFtrZXk6IHN0cmluZ10gOiAgSUxvY2FsZSB9Cn0K";
343
- const JSONPATH_BASE64 = "dHlwZSBQYXRoQ29tcG9uZW50ID0gc3RyaW5nIHwgbnVtYmVyOwoKLyoqCiAqIEZpbmQgZWxlbWVudHMgaW4gYG9iamAgbWF0Y2hpbmcgYHBhdGhFeHByZXNzaW9uYC4gUmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0CiAqIHNhdGlzZnkgdGhlIHByb3ZpZGVkIEpTT05QYXRoIGV4cHJlc3Npb24sb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZSB3ZXJlIG1hdGNoZWQuCiAqIFJldHVybnMgb25seSBmaXJzdCBgY291bnRgIGVsZW1lbnRzIGlmIHNwZWNpZmllZC4KICovCmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHF1ZXJ5KG9iajogYW55LCBwYXRoRXhwcmVzc2lvbjogc3RyaW5nLCBjb3VudD86IG51bWJlcik6IGFueVtdOwoKLyoqCiAqIEZpbmQgcGF0aHMgdG8gZWxlbWVudHMgaW4gYG9iamAgbWF0Y2hpbmcgYHBhdGhFeHByZXNzaW9uYC4gUmV0dXJucyBhbiBhcnJheSBvZgogKiBlbGVtZW50IHBhdGhzIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgSlNPTlBhdGggZXhwcmVzc2lvbi4gRWFjaCBwYXRoIGlzIGl0c2VsZiBhbgogKiBhcnJheSBvZiBrZXlzIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gd2l0aGluIGBvYmpgIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LiBSZXR1cm5zCiAqIG9ubHkgZmlyc3QgYGNvdW50YCBwYXRocyBpZiBzcGVjaWZpZWQuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXRocyhvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgY291bnQ/OiBudW1iZXIpOiBQYXRoQ29tcG9uZW50W11bXTsKCi8qKgogKiBGaW5kIGVsZW1lbnRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHBhdGhzIGluIGBvYmpgIG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuCiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9kZSBvYmplY3RzIHdoZXJlIGVhY2ggbm9kZSBoYXMgYSBgcGF0aGAgY29udGFpbmluZyBhbiBhcnJheSBvZgogKiBrZXlzIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gd2l0aGluIGBvYmpgLCBhbmQgYSBgdmFsdWVgIHBvaW50aW5nIHRvIHRoZSBtYXRjaGVkCiAqIGVsZW1lbnQuIFJldHVybnMgb25seSBmaXJzdCBgY291bnRgIG5vZGVzIGlmIHNwZWNpZmllZC4KICovCmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIG5vZGVzKAogICAgb2JqOiBhbnksCiAgICBwYXRoRXhwcmVzc2lvbjogc3RyaW5nLAogICAgY291bnQ/OiBudW1iZXIsCik6IEFycmF5PHsgcGF0aDogUGF0aENvbXBvbmVudFtdOyB2YWx1ZTogYW55IH0+OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuIElmIGBuZXdWYWx1ZWAgaXMKICogcHJvdmlkZWQsIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB2YWx1ZShvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZyk6IGFueTsKZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gdmFsdWU8VD4ob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcsIG5ld1ZhbHVlOiBUKTogVDsKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXJlbnQob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcpOiBhbnk7CgovKioKICogUnVucyB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gYGZuYCBvbiBlYWNoIG1hdGNoaW5nIGVsZW1lbnQsIGFuZCByZXBsYWNlcyBlYWNoCiAqIG1hdGNoaW5nIGVsZW1lbnQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyB0aGUKICogdmFsdWUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQgYXMgaXRzIG9ubHkgcGFyYW1ldGVyLiBSZXR1cm5zIG1hdGNoaW5nIG5vZGVzIHdpdGgKICogdGhlaXIgdXBkYXRlZCB2YWx1ZXMuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBhcHBseSgKICAgIG9iajogYW55LAogICAgcGF0aEV4cHJlc3Npb246IHN0cmluZywKICAgIGZuOiAoeDogYW55KSA9PiBhbnksCik6IEFycmF5PHsgcGF0aDogUGF0aENvbXBvbmVudFtdOyB2YWx1ZTogYW55IH0+OwoKLyoqCiAqIFBhcnNlIHRoZSBwcm92aWRlZCBKU09OUGF0aCBleHByZXNzaW9uIGludG8gcGF0aCBjb21wb25lbnRzIGFuZCB0aGVpciBhc3NvY2lhdGVkCiAqIG9wZXJhdGlvbnMuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXJzZShwYXRoRXhwcmVzc2lvbjogc3RyaW5nKTogYW55W107CgovKioKICogUmV0dXJucyBhIHBhdGggZXhwcmVzc2lvbiBpbiBzdHJpbmcgZm9ybSwgZ2l2ZW4gYSBwYXRoLiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgZWl0aGVyCiAqIGJlIGEgZmxhdCBhcnJheSBvZiBrZXlzLCBhcyByZXR1cm5lZCBieSBganAubm9kZXNgIGZvciBleGFtcGxlLCBvciBtYXkgYWx0ZXJuYXRpdmVseSBiZSBhCiAqIGZ1bGx5IHBhcnNlZCBwYXRoIGV4cHJlc3Npb24gaW4gdGhlIGZvcm0gb2YgYW4gYXJyYXkgb2YgcGF0aCBjb21wb25lbnRzIGFzIHJldHVybmVkCiAqIGJ5IGBqcC5wYXJzZWAuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBzdHJpbmdpZnkocGF0aDogUGF0aENvbXBvbmVudFtdKTogc3RyaW5nOwoKZXhwb3J0IGFzIG5hbWVzcGFjZSBqc29ucGF0aDsK";
344
- const SMART_LEGAL_CONTRACT_BASE64 = "LyoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAqLwoKLy8gd2UgZHVwbGljYXRlIHRoZXNlIGludGVyZmFjZXMgaGVyZSB0byBhdm9pZCBpbXBvcnRzIGludG8gdGhlIHJ1bnRpbWUKaW50ZXJmYWNlIElDb25jZXB0IHsKICAgICRjbGFzczogc3RyaW5nOwogfQoKaW50ZXJmYWNlIElUcmFuc2FjdGlvbiBleHRlbmRzIElDb25jZXB0IHsKICAgICR0aW1lc3RhbXA6IERhdGU7CiB9CgppbnRlcmZhY2UgSUV2ZW50IGV4dGVuZHMgSUNvbmNlcHQgewogICAkdGltZXN0YW1wOiBEYXRlOwp9CgppbnRlcmZhY2UgSVN0YXRlIHsKICAgICRpZGVudGlmaWVyOiBzdHJpbmc7Cn0KCmludGVyZmFjZSBFbmdpbmVSZXNwb25zZTxTIGV4dGVuZHMgSVN0YXRlPiB7CiAgICBzdGF0ZT86IFM7CiAgICBldmVudHM/OiBBcnJheTxJRXZlbnQ+Cn0KCmludGVyZmFjZSBJUmVxdWVzdCBleHRlbmRzIElUcmFuc2FjdGlvbiB7Cn0KCmludGVyZmFjZSBJUmVzcG9uc2UgZXh0ZW5kcyBJVHJhbnNhY3Rpb24gewp9CgppbnRlcmZhY2UgSUFzc2V0IGV4dGVuZHMgSUNvbmNlcHQgewogICAkaWRlbnRpZmllcjogc3RyaW5nOwp9CgppbnRlcmZhY2UgSUNvbnRyYWN0IGV4dGVuZHMgSUFzc2V0IHsKICAgY29udHJhY3RJZDogc3RyaW5nOwp9CgppbnRlcmZhY2UgSUNsYXVzZSBleHRlbmRzIElBc3NldCB7CiAgIGNsYXVzZUlkOiBzdHJpbmc7Cn0KCmludGVyZmFjZSBUcmlnZ2VyUmVzcG9uc2U8UyBleHRlbmRzIElTdGF0ZSA9IElTdGF0ZT4gZXh0ZW5kcyBFbmdpbmVSZXNwb25zZTxTPiB7CiAgICByZXN1bHQ6IElSZXNwb25zZTsKfQoKaW50ZXJmYWNlIEluaXRSZXNwb25zZTxTIGV4dGVuZHMgSVN0YXRlPiBleHRlbmRzIEVuZ2luZVJlc3BvbnNlPFM+IHt9Cgp0eXBlIFRlbXBsYXRlRGF0YSA9IElDb250cmFjdHxJQ2xhdXNlOwoKZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRlbXBsYXRlTG9naWM8VCBleHRlbmRzIFRlbXBsYXRlRGF0YSwgUyBleHRlbmRzIElTdGF0ZSA9IElTdGF0ZT4gewogICAgYWJzdHJhY3QgdHJpZ2dlcihkYXRhOiBULCByZXF1ZXN0OiBJUmVxdWVzdCwgc3RhdGU6UykgOiBQcm9taXNlPFRyaWdnZXJSZXNwb25zZTxTPj47CiAgICBpbml0KGRhdGE6IFQpIDogUHJvbWlzZTxJbml0UmVzcG9uc2U8Uz58dW5kZWZpbmVkPjsKfQo=";
345
-
346
- const TYPESCRIPT_URL = process.env.TYPESCRIPT_URL ? process.env.TYPESCRIPT_URL : "https://cdn.jsdelivr.net/npm/typescript@4.9.4/+esm";
347
- const SCRIPT_TARGET = 9;
348
- const MODULE_KIND = 6;
349
- class TypeScriptToJavaScriptCompiler {
350
- constructor(modelManager, templateConceptFqn) {
351
- this.context = new TypeScriptCompilationContext(modelManager, templateConceptFqn).getCompilationContext();
352
- this.typescriptUrl = TYPESCRIPT_URL;
353
- }
354
- async initialize(typescriptUrl) {
355
- if (typescriptUrl) {
356
- this.typescriptUrl = typescriptUrl;
357
- }
358
- if (typeof window === "undefined") {
359
- this.ts = (await import('typescript')).default;
360
- if (!this.ts) {
361
- throw new Error("Failed to load typescript module");
362
- }
363
- this.fsMap = vfs.createDefaultMapFromNodeModules({
364
- target: SCRIPT_TARGET
365
- });
366
- } else {
367
- this.ts = (await import(this.typescriptUrl)).default;
368
- if (!this.ts) {
369
- throw new Error("Failed to dynamically load typescript");
370
- }
371
- this.fsMap = await vfs.createDefaultMapFromCDN({ target: SCRIPT_TARGET }, this.ts.version, false, this.ts);
372
- }
373
- this.fsMap.set("/node_modules/@types/dayjs/index.d.ts", Buffer.from(DAYJS_BASE64, "base64").toString());
374
- this.fsMap.set("/node_modules/@types/jsonpath/index.d.ts", Buffer.from(JSONPATH_BASE64, "base64").toString());
375
- }
376
- compile(typescript) {
377
- if (!this.fsMap) {
378
- throw new Error("initialize must be awaited before compile is called.");
379
- }
380
- const twoSlashCode = `
381
- ${this.context}
382
- ${typescript}
383
- `;
384
- const options = {
385
- fsMap: this.fsMap,
386
- tsModule: this.ts,
387
- defaultCompilerOptions: {
388
- target: SCRIPT_TARGET,
389
- module: MODULE_KIND
390
- },
391
- lzstringModule: lzstring__namespace,
392
- defaultOptions: {
393
- showEmit: true,
394
- noErrorValidation: true,
395
- showEmittedFile: "code.js"
396
- }
397
- };
398
- const result = twoslash.twoslasher(twoSlashCode, "ts", options);
399
- return result;
400
- }
401
- }
402
-
403
- var CodeType = /* @__PURE__ */ ((CodeType2) => {
404
- CodeType2["TYPESCRIPT"] = "TYPESCRIPT";
405
- CodeType2["ES_2020"] = "ES_2020";
406
- return CodeType2;
407
- })(CodeType || {});
408
-
409
- const CODE_NODES = [
410
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.FormulaDefinition`,
411
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition`,
412
- `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition`
413
- ];
414
- function checkCode$1(code) {
415
- if (code.type !== CodeType.TYPESCRIPT) {
416
- throw new Error(`Cannot compile ${code.contents} as it is not Typescript.`);
417
- }
418
- }
419
- class TemplateMarkToJavaScriptCompiler {
420
- constructor(modelManager, templateConceptFqn) {
421
- this.modelManager = modelManager;
422
- this.compiler = new TypeScriptToJavaScriptCompiler(modelManager, templateConceptFqn);
423
- this.templateClass = getTemplateClassDeclaration(modelManager, templateConceptFqn);
424
- }
425
- async initialize() {
426
- await this.compiler.initialize();
427
- }
428
- compile(templateJson) {
429
- const namedTemplateMark = nameUserCode(templateJson);
430
- const that = this;
431
- const errors = Array();
432
- const compiled = traverse(namedTemplateMark).map(function(x) {
433
- if (x && CODE_NODES.includes(x.$class)) {
434
- if (x.code) {
435
- checkCode$1(x.code);
436
- const result = that.compiler.compile(writeFunctionToString(that.templateClass, x.name, "any", x.code.contents));
437
- if (result.errors.length === 0) {
438
- x.code.contents = result.code;
439
- x.code.type = CodeType.ES_2020;
440
- this.update(x);
441
- } else {
442
- errors.push({
443
- nodeId: x.name,
444
- code: x.code.contents,
445
- errors: result.errors
446
- });
447
- }
448
- } else if (x.condition) {
449
- checkCode$1(x.condition);
450
- const result = that.compiler.compile(writeFunctionToString(that.templateClass, x.functionName, "boolean", x.condition.contents));
451
- if (result.errors.length === 0) {
452
- x.condition.contents = result.code;
453
- x.condition.type = CodeType.ES_2020;
454
- this.update(x);
455
- } else {
456
- errors.push({
457
- nodeId: x.functionName,
458
- code: x.condition.contents,
459
- errors: result.errors
460
- });
461
- }
462
- }
463
- }
464
- });
465
- if (errors.length === 0) {
466
- return compiled;
467
- } else {
468
- throw errors;
469
- }
470
- }
471
- }
472
-
473
- function joinList(data, joinDef, options) {
474
- if (joinDef.separator) {
475
- return data.join(joinDef.separator);
476
- } else {
477
- const formatter = new Intl.ListFormat(
478
- joinDef.locale ? joinDef.locale : options?.locale,
479
- {
480
- style: joinDef.style,
481
- type: joinDef.type
482
- }
483
- );
484
- return formatter.format(data);
485
- }
486
- }
487
-
488
- async function sleep(msec) {
489
- return new Promise((resolve) => setTimeout(resolve, msec));
490
- }
491
- const _import = async (path2) => new Function("specifier", "return import(specifier)")(path2);
492
- const dynamicImport = async (path2, symbol) => {
493
- const mod = await _import(path2);
494
- return symbol ? mod.symbol : mod.default;
495
- };
496
- class JavaScriptEvaluator {
497
- // queue of work to do
498
- constructor(options = { waitInterval: 50, maxWorkers: 8, maxQueueDepth: 1e3 }) {
499
- this.options = options;
500
- this.workers = [];
501
- this.queue = [];
502
- }
503
- /**
504
- * Evaluates a JS function in process.
505
- * @param {EvalRequest} request - the eval request
506
- * @returns {Promise} a promise to the result
507
- */
508
- async evalDangerously(request) {
509
- return new Promise((resolve, reject) => {
510
- try {
511
- if (request.verbose) {
512
- console.log(request.code);
513
- }
514
- const start = (/* @__PURE__ */ new Date()).getTime();
515
- let result = null;
516
- if (!request.templateLogic) {
517
- const fun = new Function(...["dayjs", "jp", ...request.argumentNames], request.code);
518
- result = fun(...[dayjs, jp, ...request.arguments]);
519
- const end = (/* @__PURE__ */ new Date()).getTime();
520
- resolve({ result, elapsed: end - start });
521
- } else {
522
- const dataUri = "data:text/javascript;base64," + btoa(request.code);
523
- dynamicImport(dataUri).then((templateLogicConstructor) => {
524
- const instance = new templateLogicConstructor();
525
- if (!request.functionName) {
526
- throw new Error("No function name specified for template logic");
527
- }
528
- result = instance[request.functionName](...request.arguments);
529
- const end = (/* @__PURE__ */ new Date()).getTime();
530
- resolve({ result, elapsed: end - start });
531
- }).catch((err) => {
532
- console.error(err);
533
- if (err instanceof Error) {
534
- reject({
535
- message: err.message,
536
- stack: err.stack
537
- });
538
- } else {
539
- reject({
540
- message: String(err)
541
- });
542
- }
543
- });
544
- }
545
- } catch (err) {
546
- console.error(err);
547
- if (err instanceof Error) {
548
- reject({
549
- message: err.message,
550
- stack: err.stack
551
- });
552
- } else {
553
- reject({
554
- message: String(err)
555
- });
556
- }
557
- }
558
- });
559
- }
560
- /**
561
- * Evaluates a JS function using a node child process
562
- * @param {EvalRequest} request the eval request
563
- * @param {EvalOptions} options the options for the request
564
- * @returns {Promise<EvalResponse>} the async result
565
- */
566
- async evalChildProcess(request, options = { timeout: 1e4 }) {
567
- return new Promise((resolve, reject) => {
568
- const now = (/* @__PURE__ */ new Date()).getTime();
569
- const workItem = {
570
- startTime: now,
571
- expireTime: now + options.timeout,
572
- request,
573
- resolve,
574
- reject
575
- };
576
- if (this.queue.length >= this.options.maxQueueDepth) {
577
- reject({ maxQueueDepthExceeded: true, elapsed: 0 });
578
- return;
579
- }
580
- this.queue.push(workItem);
581
- this.processQueue(options);
582
- });
583
- }
584
- processQueue(options) {
585
- const now = (/* @__PURE__ */ new Date()).getTime();
586
- const notExpired = this.queue.filter((w) => now < w.expireTime);
587
- const expired = this.queue.filter((w) => now >= w.expireTime);
588
- this.queue = notExpired;
589
- expired.forEach((w) => {
590
- w.reject({ timeout: true, starvation: true, elapsed: now - w.startTime });
591
- });
592
- if (this.workers.length < this.options.maxWorkers) {
593
- const next = this.queue.shift();
594
- if (next) {
595
- this.doWork(next, options).then((result) => next.resolve(result)).catch((error) => next.reject(error));
596
- }
597
- } else {
598
- sleep(this.options.waitInterval).then(() => {
599
- this.processQueue(options);
600
- });
601
- }
602
- }
603
- getWorkerPath() {
604
- try {
605
- const thisPath = require.resolve("@accordproject/template-engine");
606
- return path.join(thisPath, "..", "worker.js");
607
- } catch (err) {
608
- return path.join(__dirname, "..", "dist", "worker.js");
609
- }
610
- }
611
- doWork(work, options) {
612
- return new Promise((resolve, reject) => {
613
- const start = (/* @__PURE__ */ new Date()).getTime();
614
- if (!child_process.fork) {
615
- reject({ message: "Cannot use evalChildProcess because child_process.fork is not defined." });
616
- }
617
- const workerPath = this.getWorkerPath();
618
- const worker = child_process.fork(workerPath, { timeout: options.timeout, env: {} });
619
- if (worker.pid === void 0 || worker.pid === null) {
620
- throw new Error("Failed to fork child process");
621
- }
622
- this.workers.push(worker);
623
- work.pid = worker.pid;
624
- let result;
625
- worker.on("error", (err) => {
626
- this.workers = this.workers.filter((w) => w.pid !== worker.pid);
627
- const end = (/* @__PURE__ */ new Date()).getTime();
628
- if (err instanceof Error) {
629
- reject({
630
- message: err.message,
631
- stack: err.stack,
632
- elapsed: end - start
633
- });
634
- } else {
635
- reject({
636
- message: String(err),
637
- elapsed: end - start
638
- });
639
- }
640
- });
641
- worker.on("message", (msg) => {
642
- result = msg;
643
- });
644
- worker.on("exit", (code) => {
645
- if (code === null) {
646
- this.workers = this.workers.filter((w) => w.pid !== worker.pid);
647
- const end = (/* @__PURE__ */ new Date()).getTime();
648
- reject({ timeout: true, elapsed: end - start });
649
- } else if (code === 0 && result) {
650
- this.workers = this.workers.filter((w) => w.pid !== worker.pid);
651
- const end = (/* @__PURE__ */ new Date()).getTime();
652
- resolve({ ...result, elapsed: end - start });
653
- } else {
654
- this.workers = this.workers.filter((w) => w.pid !== worker.pid);
655
- const end = (/* @__PURE__ */ new Date()).getTime();
656
- reject({ code, result, elapsed: end - start });
657
- }
658
- });
659
- worker.send(work.request);
660
- });
661
- }
662
- }
663
-
664
- function checkCode(code) {
665
- if (code.type !== CodeType.ES_2020) {
666
- throw new Error(`Cannot run ${code.contents} as it is not ES_2020 JavaScript.`);
667
- }
668
- }
669
- const javaScriptEvaluator = browserOrNode.isBrowser ? new JavaScriptEvaluator() : new JavaScriptEvaluator({
670
- maxWorkers: process.env.MAX_WORKERS ? Number.parseInt(process.env.MAX_WORKERS) : os.availableParallelism(),
671
- // how many child processes
672
- waitInterval: process.env.WAIT_INTERVAL ? Number.parseInt(process.env.WAIT_INTERVAL) : 50,
673
- // how long to wait before rescheduling work
674
- maxQueueDepth: process.env.MAX_QUEUE_DEPTH ? Number.parseInt(process.env.MAX_QUEUE_DEPTH) : 1e3
675
- // max requests to queue
676
- });
677
- const TEMPLATEMARK_ROOT_NODES = [
678
- "org.accordproject.templatemark@0.5.0.ClauseDefinition",
679
- "org.accordproject.templatemark@0.5.0.ContractDefinition"
680
- ];
681
- const DOCUMENT_ROOT = "org.accordproject.commonmark@0.5.0.Document";
682
- async function evaluateJavaScript(clauseLibrary, data, fn, options) {
683
- if (options?.disableJavaScriptEvaluation) {
684
- throw new Error("JavaScript evaluation is disabled.");
685
- }
686
- if (!data || !fn) {
687
- throw new Error(`Cannot evaluate JS ${fn} against ${data}`);
688
- }
689
- const functionArgNames = new Array();
690
- functionArgNames.push("data");
691
- functionArgNames.push("library");
692
- functionArgNames.push("options");
693
- const functionArgValues = new Array();
694
- functionArgValues.push(data);
695
- functionArgValues.push(clauseLibrary);
696
- functionArgValues.push(options);
697
- const expression = fn.substring(fn.indexOf("{") + 1, fn.lastIndexOf("}"));
698
- if (expression.trim().length === 0) {
699
- throw new Error("Empty expression");
700
- }
701
- try {
702
- const request = { code: expression, argumentNames: functionArgNames, arguments: functionArgValues };
703
- if (options?.childProcessJavaScriptEvaluation) {
704
- if (browserOrNode.isBrowser) {
705
- throw new Error("Child process evaluation is not supported inside web browser");
706
- }
707
- const evalOptions = options?.timeout ? { timeout: options.timeout } : void 0;
708
- const r = await javaScriptEvaluator.evalChildProcess(request, evalOptions);
709
- return r;
710
- } else {
711
- const r = await javaScriptEvaluator.evalDangerously(request);
712
- return r;
713
- }
714
- } catch (err) {
715
- throw new Error(`Caught error ${JSON.stringify(err)} evaluating ${expression} with arguments ${JSON.stringify(functionArgValues)}`);
716
- }
717
- }
718
- function getJsonPath(rootData, currentNode, paths) {
719
- if (!currentNode) {
720
- throw new Error("Node must be supplied");
721
- }
722
- if (!currentNode.name) {
723
- throw new Error(`Node must have a name: ${JSON.stringify(currentNode)}`);
724
- }
725
- if (currentNode.name.indexOf(".") >= 0) {
726
- throw new Error(`Invalid name property ${currentNode.name}`);
727
- }
728
- if (!paths || !paths.length || paths.length < 1) {
729
- throw new Error("Paths must be supplied");
730
- }
731
- const withPath = [];
732
- for (let n = 1; n < paths.length; n++) {
733
- const sub = paths.slice(0, n);
734
- const obj = traverse.get(rootData, sub);
735
- if (obj && obj.$class) {
736
- if (NAVIGATION_NODES.indexOf(obj.$class) >= 0) {
737
- if (obj.name !== "top") {
738
- withPath.push(`['${obj.name}']`);
739
- }
740
- }
741
- }
742
- }
743
- if (currentNode.name !== "this" && currentNode.name !== "top") {
744
- withPath.push(`['${currentNode.name}']`);
745
- }
746
- return withPath.length > 0 ? `$${withPath.join("")}` : "$";
747
- }
748
- async function evaluateUserCode(clauseLibrary, templateMark, data, options) {
749
- const result = {};
750
- const paths = traverse(templateMark).paths();
751
- for (let n = 0; n < paths.length; n++) {
752
- const path = paths[n];
753
- const context = traverse(templateMark).get(path);
754
- if (typeof context === "object" && context.$class && typeof context.$class === "string") {
755
- const nodeClass = context.$class;
756
- if (FORMULA_DEFINITION_RE.test(nodeClass)) {
757
- if (context.code) {
758
- checkCode(context.code);
759
- const evalResponse = await evaluateJavaScript(clauseLibrary, data, context.code.contents, options);
760
- result[path.join("/")] = JSON.stringify(evalResponse.result);
761
- } else {
762
- throw new Error("Formula node is missing code.");
763
- }
764
- } else if (CONDITIONAL_DEFINITION_RE.test(nodeClass) || CLAUSE_DEFINITION_RE.test(nodeClass)) {
765
- if (context.condition) {
766
- checkCode(context.condition);
767
- const evalResponse = await evaluateJavaScript(clauseLibrary, data, context.condition.contents, options);
768
- result[path.join("/")] = JSON.stringify(evalResponse.result);
769
- }
770
- }
771
- }
772
- }
773
- return result;
774
- }
775
- async function generateOptionalBlocks(modelManager, clauseLibrary, templateMark, data, options) {
776
- const result = {};
777
- const paths = traverse(templateMark).paths();
778
- for (let n = 0; n < paths.length; n++) {
779
- const thisPath = paths[n];
780
- const context = traverse(templateMark).get(thisPath);
781
- if (typeof context === "object" && context.$class && typeof context.$class === "string") {
782
- const nodeClass = context.$class;
783
- if (OPTIONAL_DEFINITION_RE.test(nodeClass)) {
784
- const path = getJsonPath(templateMark, context, thisPath);
785
- const variableValues = jp.query(data, path, 1);
786
- if (variableValues.length > 0) {
787
- const optionalPropertyValue = variableValues[0];
788
- if (context.whenSome && context.whenSome.length > 0) {
789
- const whenSomeParagraph = {
790
- $class: "org.accordproject.commonmark@0.5.0.Paragraph",
791
- nodes: context.whenSome
792
- };
793
- const subResult = await generateAgreement(modelManager, clauseLibrary, whenSomeParagraph, optionalPropertyValue, options);
794
- result[thisPath.join("/")] = subResult.nodes ? subResult.nodes : [];
795
- } else {
796
- result[thisPath.join("/")] = [];
797
- }
798
- }
799
- }
800
- }
801
- }
802
- return result;
803
- }
804
- async function generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, nodeRegExp, childNodeClass, options) {
805
- const result = {};
806
- const paths = traverse(templateMark).paths();
807
- for (let n = 0; n < paths.length; n++) {
808
- const thisPath = paths[n];
809
- const context = traverse(templateMark).get(thisPath);
810
- if (typeof context === "object" && context.$class && typeof context.$class === "string") {
811
- const nodeClass = context.$class;
812
- if (nodeRegExp.test(nodeClass)) {
813
- const path = getJsonPath(templateMark, context, thisPath);
814
- const variableValues = jp.query(data, path, 1);
815
- if (variableValues.length === 0) {
816
- throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
817
- } else {
818
- const arrayData = variableValues[0];
819
- if (!Array.isArray(arrayData)) {
820
- throw new Error(`Values found for path '${path}' in data ${data} is not an array: ${arrayData}.`);
821
- } else {
822
- const firstChild = context.nodes[0];
823
- const hasListWrapper = firstChild && firstChild.$class === `${markdownCommon.CommonMarkModel.NAMESPACE}.List` && Array.isArray(firstChild.nodes) && firstChild.nodes.length > 0;
824
- const itemTemplate = hasListWrapper ? firstChild.nodes[0] : firstChild;
825
- const nodes = [];
826
- for (let n2 = 0; n2 < arrayData.length; n2++) {
827
- const arrayItem = arrayData[n2];
828
- const subResult = await generateAgreement(modelManager, clauseLibrary, itemTemplate, arrayItem, options);
829
- const childNodes = hasListWrapper ? subResult.nodes ? subResult.nodes : [] : [subResult];
830
- nodes.push({
831
- $class: childNodeClass,
832
- nodes: childNodes
833
- });
834
- }
835
- result[thisPath.join("/")] = nodes;
836
- }
837
- }
838
- }
839
- }
840
- }
841
- return result;
842
- }
843
- async function generateAgreement(modelManager, clauseLibrary, templateMark, data, options) {
844
- const introspector = new concertoCore.Introspector(modelManager);
845
- const userCodeResults = await evaluateUserCode(clauseLibrary, templateMark, data, options);
846
- const listBlockResults = await generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, LISTBLOCK_DEFINITION_RE, `${markdownCommon.CommonMarkModel.NAMESPACE}.Item`, options);
847
- const foreachBlockResults = await generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, FOREACH_DEFINITION_RE, `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`, options);
848
- const optionalBlockResults = await generateOptionalBlocks(modelManager, clauseLibrary, templateMark, data, options);
849
- return traverse(templateMark).map(function(context) {
850
- let stopHere = false;
851
- if (typeof context === "object" && context.$class && typeof context.$class === "string") {
852
- const nodeClass = context.$class;
853
- const match = nodeClass.match(TEMPLATEMARK_RE);
854
- if (match && match.length > 1) {
855
- context.$class = `${markdownCommon.CiceroMarkModel.NAMESPACE}.${match[3]}`;
856
- }
857
- if (CONTRACT_DEFINITION_RE.test(nodeClass)) {
858
- context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`;
859
- delete context.name;
860
- delete context.elementType;
861
- }
862
- if (WITH_DEFINITION_RE.test(nodeClass)) {
863
- context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`;
864
- delete context.name;
865
- delete context.elementType;
866
- } else if (FORMULA_DEFINITION_RE.test(nodeClass)) {
867
- if (context.code) {
868
- const result = userCodeResults[this.path.join("/")];
869
- if (result === null) {
870
- context.value = "<null>";
871
- } else if (typeof result === "string") {
872
- context.value = result;
873
- } else {
874
- context.value = JSON.stringify(result);
875
- }
876
- delete context.code;
877
- } else {
878
- throw new Error("Formula node is missing code.");
879
- }
880
- } else if (LISTBLOCK_DEFINITION_RE.test(nodeClass)) {
881
- context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.List`;
882
- delete context.elementType;
883
- delete context.name;
884
- context.nodes = listBlockResults[this.path.join("/")];
885
- stopHere = true;
886
- } else if (JOIN_DEFINITION_RE.test(nodeClass)) {
887
- const path = getJsonPath(templateMark, context, this.path);
888
- const variableValues = jp.query(data, path, 1);
889
- if (variableValues.length === 0) {
890
- throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
891
- } else {
892
- const arrayData = variableValues[0];
893
- if (!Array.isArray(arrayData)) {
894
- throw new Error(`Values found for path '${path}' in data ${data} is not an array: ${arrayData}.`);
895
- } else {
896
- context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Text`;
897
- const drafter = getDrafter(context.elementType);
898
- context.text = joinList(arrayData.map((arrayItem) => {
899
- return drafter ? drafter(arrayItem, context.format) : arrayItem;
900
- }), context, options);
901
- delete context.elementType;
902
- delete context.name;
903
- delete context.separator;
904
- delete context.locale;
905
- delete context.type;
906
- delete context.style;
907
- delete context.nodes;
908
- stopHere = true;
909
- }
910
- }
911
- } else if (FOREACH_DEFINITION_RE.test(nodeClass)) {
912
- context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Foreach`;
913
- delete context.elementType;
914
- delete context.name;
915
- context.nodes = foreachBlockResults[this.path.join("/")];
916
- stopHere = true;
917
- } else if (VARIABLE_DEFINITION_RE.test(nodeClass) || ENUM_VARIABLE_DEFINITION_RE.test(nodeClass) || FORMATTED_VARIABLE_DEFINITION_RE.test(nodeClass)) {
918
- if (typeof data === "object") {
919
- const path = getJsonPath(templateMark, context, this.path);
920
- const variableValues = jp.query(data, path, 1);
921
- if (variableValues.length === 0) {
922
- throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
923
- } else {
924
- const variableValue = variableValues[0];
925
- const type = concertoCore.ModelUtil.isPrimitiveType(context.elementType) ? null : introspector.getClassDeclaration(context.elementType);
926
- const drafter = getDrafter(type && type.isEnum() ? "String" : context.elementType);
927
- context.value = drafter ? drafter(variableValue, context.format) : JSON.stringify(variableValue);
928
- }
929
- } else {
930
- const variableValue = data;
931
- const type = concertoCore.ModelUtil.isPrimitiveType(context.elementType) ? null : introspector.getClassDeclaration(context.elementType);
932
- const drafter = getDrafter(type && type.isEnum() ? "String" : context.elementType);
933
- context.value = drafter ? drafter(variableValue, context.format) : JSON.stringify(variableValue);
934
- }
935
- } else if (CONDITIONAL_DEFINITION_RE.test(nodeClass)) {
936
- if (context.condition) {
937
- const key = this.path.join("/");
938
- const resultStr = userCodeResults[key];
939
- if (resultStr === void 0 || resultStr === null) {
940
- context.isTrue = false;
941
- } else {
942
- try {
943
- context.isTrue = !!JSON.parse(resultStr);
944
- } catch (err) {
945
- throw new Error(`Invalid JSON boolean result for condition '${key}': ${String(err)}`);
946
- }
947
- }
948
- } else {
949
- const path = getJsonPath(templateMark, context, this.path);
950
- const variableValues = jp.query(data, path, 1);
951
- if (variableValues && variableValues.length) {
952
- if (variableValues.length === 1) {
953
- context.isTrue = !!variableValues[0];
954
- } else {
955
- throw new Error(`Multiple values found for path '${path}' in data ${data}.`);
956
- }
957
- } else {
958
- context.isTrue = false;
959
- }
960
- }
961
- context.nodes = context.isTrue ? context.whenTrue : context.whenFalse;
962
- delete context.condition;
963
- delete context.dependencies;
964
- delete context.functionName;
965
- } else if (CLAUSE_DEFINITION_RE.test(nodeClass)) {
966
- const path = getJsonPath(templateMark, context, this.path);
967
- const variableValues = jp.query(data, path, 1);
968
- if (context.condition) {
969
- checkCode(context.condition);
970
- const key = this.path.join("/");
971
- const resultStr = userCodeResults[key];
972
- let result = false;
973
- if (resultStr === void 0 || resultStr === null) {
974
- result = false;
975
- } else {
976
- try {
977
- result = !!JSON.parse(resultStr);
978
- } catch (err) {
979
- throw new Error(`Invalid JSON boolean result for condition '${key}': ${String(err)}`);
980
- }
981
- }
982
- if (!result) {
983
- delete context.nodes;
984
- stopHere = true;
985
- }
986
- } else if (context.name !== "top" && (variableValues.length === 0 || variableValues[0] === void 0 || variableValues[0] === null)) {
987
- delete context.nodes;
988
- stopHere = true;
989
- }
990
- delete context.condition;
991
- delete context.functionName;
992
- } else if (OPTIONAL_DEFINITION_RE.test(nodeClass)) {
993
- const path = getJsonPath(templateMark, context, this.path);
994
- const variableValues = jp.query(data, path, 1);
995
- if (variableValues && variableValues.length) {
996
- if (variableValues.length === 1) {
997
- context.hasSome = true;
998
- context.whenNone = [];
999
- if (optionalBlockResults[this.path.join("/")]) {
1000
- context.nodes = optionalBlockResults[this.path.join("/")];
1001
- context.whenSome = [];
1002
- stopHere = true;
1003
- } else {
1004
- context.nodes = context.whenSome;
1005
- }
1006
- } else {
1007
- throw new Error(`Multiple values found for path '${path}' in data ${data}.`);
1008
- }
1009
- } else {
1010
- context.hasSome = false;
1011
- context.whenSome = [];
1012
- context.nodes = context.whenNone;
1013
- }
1014
- }
1015
- }
1016
- this.update(context, stopHere);
1017
- });
1018
- }
1019
- class TemplateMarkInterpreter {
1020
- constructor(modelManager, clauseLibrary, templateConceptFqn) {
1021
- this.modelManager = modelManager;
1022
- this.clauseLibrary = clauseLibrary;
1023
- this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
1024
- }
1025
- /**
1026
- * Checks that a TemplateMark JSON document is valid with respect to the
1027
- * TemplateMark model, as well as the template model.
1028
- *
1029
- * Checks:
1030
- * 1. Variable names are valid properties in the template model
1031
- * 2. Optional properties have guards
1032
- * @param {*} templateMark the TemplateMark JSON object
1033
- * @returns {*} TemplateMark JSON that has been typed checked and has type metadata added
1034
- * @throws {Error} if the templateMark document is invalid
1035
- */
1036
- checkTypes(templateMark) {
1037
- const modelManager = new concertoCore.ModelManager();
1038
- modelManager.addCTOModel(markdownCommon.ConcertoMetaModel.MODEL, "concertometamodel.cto");
1039
- modelManager.addCTOModel(markdownCommon.CommonMarkModel.MODEL, "commonmark.cto");
1040
- modelManager.addCTOModel(markdownCommon.TemplateMarkModel.MODEL, "templatemark.cto");
1041
- const factory = new concertoCore.Factory(modelManager);
1042
- const serializer = new concertoCore.Serializer(factory, modelManager, {});
1043
- try {
1044
- serializer.fromJSON(templateMark, {});
1045
- } catch (err) {
1046
- throw new Error(`Generated invalid agreement: ${err}: ${JSON.stringify(templateMark, null, 2)}`);
1047
- }
1048
- const errors = [];
1049
- const templateClass = this.templateClass;
1050
- const guardBlockPaths = /* @__PURE__ */ new Map();
1051
- traverse(templateMark).forEach(function(node) {
1052
- if (!node || typeof node !== "object" || !node.$class) return;
1053
- const currentPath = this.path.join("/");
1054
- if (OPTIONAL_DEFINITION_RE.test(node.$class) || CONDITIONAL_DEFINITION_RE.test(node.$class) || WITH_DEFINITION_RE.test(node.$class)) {
1055
- guardBlockPaths.set(node.name, currentPath);
1056
- }
1057
- if (VARIABLE_DEFINITION_RE.test(node.$class) || ENUM_VARIABLE_DEFINITION_RE.test(node.$class) || FORMATTED_VARIABLE_DEFINITION_RE.test(node.$class)) {
1058
- const propName = node.name;
1059
- if (propName && propName !== "this") {
1060
- try {
1061
- const property = templateClass.getProperty(propName);
1062
- if (property && property.isOptional()) {
1063
- const guardPath = guardBlockPaths.get(propName);
1064
- const isGuarded = guardPath !== void 0 && (currentPath === guardPath || currentPath.startsWith(guardPath + "/"));
1065
- if (!isGuarded) {
1066
- errors.push({
1067
- propertyName: propName,
1068
- message: `Optional property '${propName}' is used without a guard. Wrap it in {{#optional ${propName}}}...{{/optional}} or {{#if ${propName}}}...{{/if}}.`
1069
- });
1070
- }
1071
- }
1072
- } catch {
1073
- }
1074
- }
1075
- }
1076
- });
1077
- if (errors.length > 0) {
1078
- const errorMessage = `Optional properties used without guards: ${errors.map((e) => e.propertyName).join(", ")}`;
1079
- const error = new Error(errorMessage);
1080
- error.errors = errors;
1081
- throw error;
1082
- }
1083
- return templateMark;
1084
- }
1085
- /**
1086
- * Compiles the code nodes containing TS to code nodes containing JS.
1087
- * @param {*} templateMark the TemplateMark JSON object
1088
- * @returns {*} TemplateMark JSON with JS nodes
1089
- * @throws {Error} if the templateMark document is invalid
1090
- */
1091
- async compileTypeScriptToJavaScript(templateMark) {
1092
- const clazz = templateMark.$class;
1093
- if (clazz !== DOCUMENT_ROOT) {
1094
- throw new Error(`JSON is not CommonMark. $class is '${clazz}'. ${JSON.stringify(templateMark, null, 2)}`);
1095
- }
1096
- if (!templateMark.nodes || !templateMark.nodes.length || templateMark.nodes.length < 1) {
1097
- throw new Error(`CommonMark does not have nodes: ${JSON.stringify(templateMark, null, 2)}`);
1098
- }
1099
- const firstChild = templateMark.nodes[0];
1100
- const firstChildClazz = firstChild.$class;
1101
- if (!TEMPLATEMARK_ROOT_NODES.includes(firstChildClazz)) {
1102
- throw new Error(`First child is not templatemark. $class is '${firstChildClazz}'. ${JSON.stringify(templateMark, null, 2)}`);
1103
- }
1104
- const templateConcept = firstChild.elementType;
1105
- if (!templateConcept) {
1106
- throw new Error(`First child is not typed: ${JSON.stringify(templateMark, null, 2)}`);
1107
- }
1108
- if (firstChild.name !== "top") {
1109
- throw new Error('First child is not named "top"!');
1110
- }
1111
- const compiler = new TemplateMarkToJavaScriptCompiler(this.modelManager, templateConcept);
1112
- await compiler.initialize();
1113
- return compiler.compile(templateMark);
1114
- }
1115
- validateCiceroMark(ciceroMark) {
1116
- const modelManager = new concertoCore.ModelManager();
1117
- modelManager.addCTOModel(markdownCommon.ConcertoMetaModel.MODEL, "concertometamodel.cto");
1118
- modelManager.addCTOModel(markdownCommon.CommonMarkModel.MODEL, "commonmark.cto");
1119
- modelManager.addCTOModel(markdownCommon.CiceroMarkModel.MODEL, "ciceromark.cto");
1120
- const factory = new concertoCore.Factory(modelManager);
1121
- const serializer = new concertoCore.Serializer(factory, modelManager, {});
1122
- try {
1123
- return serializer.fromJSON(ciceroMark, {});
1124
- } catch (err) {
1125
- throw new Error(`Generated invalid agreement: ${err}: ${JSON.stringify(ciceroMark, null, 2)}`);
1126
- }
1127
- }
1128
- async generate(templateMark, data, options) {
1129
- const factory = new concertoCore.Factory(this.modelManager);
1130
- const serializer = new concertoCore.Serializer(factory, this.modelManager, {});
1131
- const templateData = serializer.fromJSON(data, {});
1132
- if (templateData.getFullyQualifiedType() !== this.templateClass.getFullyQualifiedName()) {
1133
- throw new Error(`Template data must be of type '${this.templateClass.getFullyQualifiedName()}'.`);
1134
- }
1135
- const typedTemplateMark = this.checkTypes(templateMark);
1136
- const jsTemplateMark = await this.compileTypeScriptToJavaScript(typedTemplateMark);
1137
- const ciceroMark = await generateAgreement(this.modelManager, this.clauseLibrary, jsTemplateMark, data, options);
1138
- return this.validateCiceroMark(ciceroMark);
1139
- }
1140
- }
1141
-
1142
- class TemplateArchiveProcessor {
1143
- /**
1144
- * Creates a template archive processor
1145
- * @param {Template} template - the template to be used by the processor
1146
- */
1147
- constructor(template) {
1148
- this.template = template;
1149
- }
1150
- /**
1151
- * Drafts a template by merging it with data
1152
- * @param {any} data the data to merge with the template
1153
- * @param {string} format the output format
1154
- * @param {any} options merge options
1155
- * @param {[string]} currentTime the current value for 'now'
1156
- * @returns {Promise} the drafted content
1157
- */
1158
- async draft(data, format, options, currentTime) {
1159
- const metadata = this.template.getMetadata();
1160
- const templateKind = metadata.getTemplateType() !== 0 ? "clause" : "contract";
1161
- const modelManager = this.template.getModelManager();
1162
- const engine = new TemplateMarkInterpreter(modelManager, {});
1163
- const templateMarkTransformer = new markdownTemplate.TemplateMarkTransformer();
1164
- const templateMarkDom = templateMarkTransformer.fromMarkdownTemplate(
1165
- { content: this.template.getTemplate() },
1166
- modelManager,
1167
- templateKind,
1168
- { options }
1169
- );
1170
- const now = currentTime ? currentTime : (/* @__PURE__ */ new Date()).toISOString();
1171
- const ciceroMark = await engine.generate(templateMarkDom, data, { now });
1172
- const result = markdownTransform.transform(ciceroMark.toJSON(), "ciceromark", ["ciceromark_unquoted", format], null, options);
1173
- return result;
1174
- }
1175
- /**
1176
- * Compile the logic of a template
1177
- * @param {boolean} [enableCompiledLogicCache] - whether to cache the compiled logic for future use
1178
- * @returns {Promise<Record<string, TwoSlashReturn>>} the compiled code for each typescript file
1179
- */
1180
- async compileLogic(enableCompiledLogicCache = false) {
1181
- if (enableCompiledLogicCache && this.compiledLogicCache) {
1182
- return this.compiledLogicCache;
1183
- }
1184
- const logicManager = this.template.getLogicManager();
1185
- if (logicManager.getLanguage() === "typescript") {
1186
- const compiledCode = {};
1187
- const tsFiles = logicManager.getScriptManager().getScriptsForTarget("typescript");
1188
- for (let n = 0; n < tsFiles.length; n++) {
1189
- const tsFile = tsFiles[n];
1190
- const compiler = new TypeScriptToJavaScriptCompiler(
1191
- this.template.getModelManager(),
1192
- this.template.getTemplateModel().getFullyQualifiedName()
1193
- );
1194
- await compiler.initialize();
1195
- const code = `${Buffer.from(SMART_LEGAL_CONTRACT_BASE64, "base64").toString()}
1196
- ${tsFile.getContents()}`;
1197
- const result = compiler.compile(code);
1198
- compiledCode[tsFile.getIdentifier()] = result;
1199
- }
1200
- if (enableCompiledLogicCache) {
1201
- this.compiledLogicCache = compiledCode;
1202
- }
1203
- return compiledCode;
1204
- } else {
1205
- throw new Error("Only TypeScript is supported at this time");
1206
- }
1207
- }
1208
- /**
1209
- * Trigger the logic of a template.
1210
- * @param {object} data - the data for the template
1211
- * @param {object} request - the request to send to the template logic
1212
- * @param {object} state - the current state of the template
1213
- * @param {[string]} currentTime - the current time, defaults to now
1214
- * @param {[number]} utcOffset - the UTC offset, defaults to zero
1215
- * @param {boolean} [enableCompiledLogicCache] - whether to use the compiled logic cache
1216
- * @returns {Promise<TriggerResponse>} the response and any events
1217
- */
1218
- async trigger(data, request, state, currentTime, utcOffset, enableCompiledLogicCache) {
1219
- const compiledCode = await this.compileLogic(enableCompiledLogicCache);
1220
- const resolvedTime = currentTime ?? (/* @__PURE__ */ new Date()).toISOString();
1221
- const resolvedOffset = utcOffset ?? 0;
1222
- const evaluator = new JavaScriptEvaluator();
1223
- const evalResponse = await evaluator.evalDangerously({
1224
- templateLogic: true,
1225
- verbose: false,
1226
- functionName: "trigger",
1227
- code: compiledCode["logic/logic.ts"].code,
1228
- // TODO DCS - how to find the code to run?
1229
- argumentNames: ["data", "request", "state"],
1230
- arguments: [data, request, state, resolvedTime, resolvedOffset]
1231
- });
1232
- if (evalResponse.result) {
1233
- return evalResponse.result;
1234
- } else {
1235
- throw new Error("Trigger failed with message: " + evalResponse.message);
1236
- }
1237
- }
1238
- /**
1239
- * Init the logic of a template.
1240
- * @param {object} data - the data for the template
1241
- * @param {[string]} currentTime - the current time, defaults to now
1242
- * @param {[number]} utcOffset - the UTC offset, defaults to zero
1243
- * @param {boolean} [enableCompiledLogicCache] - whether to use the compiled logic cache
1244
- * @returns {Promise<InitResponse>} the new state
1245
- */
1246
- async init(data, currentTime, utcOffset, enableCompiledLogicCache) {
1247
- const compiledCode = await this.compileLogic(enableCompiledLogicCache);
1248
- const resolvedTime = currentTime ?? (/* @__PURE__ */ new Date()).toISOString();
1249
- const resolvedOffset = utcOffset ?? 0;
1250
- const evaluator = new JavaScriptEvaluator();
1251
- const evalResponse = await evaluator.evalDangerously({
1252
- templateLogic: true,
1253
- verbose: false,
1254
- functionName: "init",
1255
- code: compiledCode["logic/logic.ts"].code,
1256
- // TODO DCS - how to find the code to run?
1257
- argumentNames: ["data"],
1258
- arguments: [data, resolvedTime, resolvedOffset]
1259
- });
1260
- if (evalResponse.result) {
1261
- return evalResponse.result;
1262
- } else {
1263
- throw new Error("Init failed with message: " + evalResponse.message);
1264
- }
1265
- }
1266
- }
1267
-
1268
- exports.TemplateArchiveProcessor = TemplateArchiveProcessor;
1269
- exports.TemplateMarkInterpreter = TemplateMarkInterpreter;
1270
- exports.ensureDirSync = ensureDirSync;
1271
- exports.getTemplateClassDeclaration = getTemplateClassDeclaration;
1272
- exports.nameUserCode = nameUserCode;
1273
- exports.removeSync = removeSync;
1274
- exports.writeFunctionToString = writeFunctionToString;
1275
- //# sourceMappingURL=index.js.map