velocious 1.0.552 → 1.0.555

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 (117) hide show
  1. package/README.md +2 -0
  2. package/build/background-jobs/status-reporter.js +15 -2
  3. package/build/background-jobs/worker.js +5 -1
  4. package/build/frontend-models/base.js +105 -47
  5. package/build/frontend-models/transport-deadline.js +66 -0
  6. package/build/src/background-jobs/status-reporter.d.ts +3 -1
  7. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  8. package/build/src/background-jobs/status-reporter.js +16 -3
  9. package/build/src/background-jobs/worker.d.ts.map +1 -1
  10. package/build/src/background-jobs/worker.js +6 -2
  11. package/build/src/frontend-models/base.d.ts +10 -1
  12. package/build/src/frontend-models/base.d.ts.map +1 -1
  13. package/build/src/frontend-models/base.js +71 -26
  14. package/build/src/frontend-models/transport-deadline.d.ts +26 -0
  15. package/build/src/frontend-models/transport-deadline.d.ts.map +1 -0
  16. package/build/src/frontend-models/transport-deadline.js +61 -0
  17. package/build/src/testing/factory/association-declaration.d.ts +37 -0
  18. package/build/src/testing/factory/association-declaration.d.ts.map +1 -0
  19. package/build/src/testing/factory/association-declaration.js +41 -0
  20. package/build/src/testing/factory/declarations.d.ts +190 -0
  21. package/build/src/testing/factory/declarations.d.ts.map +1 -0
  22. package/build/src/testing/factory/declarations.js +98 -0
  23. package/build/src/testing/factory/definition-builder.d.ts +132 -0
  24. package/build/src/testing/factory/definition-builder.d.ts.map +1 -0
  25. package/build/src/testing/factory/definition-builder.js +417 -0
  26. package/build/src/testing/factory/errors.d.ts +62 -0
  27. package/build/src/testing/factory/errors.d.ts.map +1 -0
  28. package/build/src/testing/factory/errors.js +67 -0
  29. package/build/src/testing/factory/evaluation-context.d.ts +95 -0
  30. package/build/src/testing/factory/evaluation-context.d.ts.map +1 -0
  31. package/build/src/testing/factory/evaluation-context.js +175 -0
  32. package/build/src/testing/factory/events.d.ts +21 -0
  33. package/build/src/testing/factory/events.d.ts.map +1 -0
  34. package/build/src/testing/factory/events.js +26 -0
  35. package/build/src/testing/factory/factory-definition.d.ts +39 -0
  36. package/build/src/testing/factory/factory-definition.d.ts.map +1 -0
  37. package/build/src/testing/factory/factory-definition.js +35 -0
  38. package/build/src/testing/factory/factory-registry.d.ts +263 -0
  39. package/build/src/testing/factory/factory-registry.d.ts.map +1 -0
  40. package/build/src/testing/factory/factory-registry.js +438 -0
  41. package/build/src/testing/factory/factory-runner.d.ts +179 -0
  42. package/build/src/testing/factory/factory-runner.d.ts.map +1 -0
  43. package/build/src/testing/factory/factory-runner.js +266 -0
  44. package/build/src/testing/factory/index.d.ts +18 -0
  45. package/build/src/testing/factory/index.d.ts.map +1 -0
  46. package/build/src/testing/factory/index.js +21 -0
  47. package/build/src/testing/factory/linter.d.ts +55 -0
  48. package/build/src/testing/factory/linter.d.ts.map +1 -0
  49. package/build/src/testing/factory/linter.js +106 -0
  50. package/build/src/testing/factory/model-contract.d.ts +11 -0
  51. package/build/src/testing/factory/model-contract.d.ts.map +1 -0
  52. package/build/src/testing/factory/model-contract.js +26 -0
  53. package/build/src/testing/factory/node/load-definitions.d.ts +24 -0
  54. package/build/src/testing/factory/node/load-definitions.d.ts.map +1 -0
  55. package/build/src/testing/factory/node/load-definitions.js +87 -0
  56. package/build/src/testing/factory/sequence.d.ts +73 -0
  57. package/build/src/testing/factory/sequence.d.ts.map +1 -0
  58. package/build/src/testing/factory/sequence.js +78 -0
  59. package/build/src/testing/factory/strategies/attributes-for.d.ts +21 -0
  60. package/build/src/testing/factory/strategies/attributes-for.d.ts.map +1 -0
  61. package/build/src/testing/factory/strategies/attributes-for.js +22 -0
  62. package/build/src/testing/factory/strategies/base.d.ts +101 -0
  63. package/build/src/testing/factory/strategies/base.d.ts.map +1 -0
  64. package/build/src/testing/factory/strategies/base.js +191 -0
  65. package/build/src/testing/factory/strategies/build.d.ts +20 -0
  66. package/build/src/testing/factory/strategies/build.d.ts.map +1 -0
  67. package/build/src/testing/factory/strategies/build.js +34 -0
  68. package/build/src/testing/factory/strategies/create.d.ts +32 -0
  69. package/build/src/testing/factory/strategies/create.d.ts.map +1 -0
  70. package/build/src/testing/factory/strategies/create.js +57 -0
  71. package/build/src/testing/factory/trait-definition.d.ts +22 -0
  72. package/build/src/testing/factory/trait-definition.d.ts.map +1 -0
  73. package/build/src/testing/factory/trait-definition.js +22 -0
  74. package/build/testing/factory/association-declaration.js +50 -0
  75. package/build/testing/factory/declarations.js +110 -0
  76. package/build/testing/factory/definition-builder.js +476 -0
  77. package/build/testing/factory/errors.js +79 -0
  78. package/build/testing/factory/evaluation-context.js +199 -0
  79. package/build/testing/factory/events.js +30 -0
  80. package/build/testing/factory/factory-definition.js +41 -0
  81. package/build/testing/factory/factory-registry.js +501 -0
  82. package/build/testing/factory/factory-runner.js +296 -0
  83. package/build/testing/factory/index.js +24 -0
  84. package/build/testing/factory/linter.js +119 -0
  85. package/build/testing/factory/model-contract.js +31 -0
  86. package/build/testing/factory/node/load-definitions.js +103 -0
  87. package/build/testing/factory/sequence.js +91 -0
  88. package/build/testing/factory/strategies/attributes-for.js +24 -0
  89. package/build/testing/factory/strategies/base.js +209 -0
  90. package/build/testing/factory/strategies/build.js +42 -0
  91. package/build/testing/factory/strategies/create.js +68 -0
  92. package/build/testing/factory/trait-definition.js +24 -0
  93. package/build/tsconfig.tsbuildinfo +1 -1
  94. package/package.json +1 -1
  95. package/src/background-jobs/status-reporter.js +15 -2
  96. package/src/background-jobs/worker.js +5 -1
  97. package/src/frontend-models/base.js +105 -47
  98. package/src/frontend-models/transport-deadline.js +66 -0
  99. package/src/testing/factory/association-declaration.js +50 -0
  100. package/src/testing/factory/declarations.js +110 -0
  101. package/src/testing/factory/definition-builder.js +476 -0
  102. package/src/testing/factory/errors.js +79 -0
  103. package/src/testing/factory/evaluation-context.js +199 -0
  104. package/src/testing/factory/events.js +30 -0
  105. package/src/testing/factory/factory-definition.js +41 -0
  106. package/src/testing/factory/factory-registry.js +501 -0
  107. package/src/testing/factory/factory-runner.js +296 -0
  108. package/src/testing/factory/index.js +24 -0
  109. package/src/testing/factory/linter.js +119 -0
  110. package/src/testing/factory/model-contract.js +31 -0
  111. package/src/testing/factory/node/load-definitions.js +103 -0
  112. package/src/testing/factory/sequence.js +91 -0
  113. package/src/testing/factory/strategies/attributes-for.js +24 -0
  114. package/src/testing/factory/strategies/base.js +209 -0
  115. package/src/testing/factory/strategies/build.js +42 -0
  116. package/src/testing/factory/strategies/create.js +68 -0
  117. package/src/testing/factory/trait-definition.js +24 -0
@@ -0,0 +1,417 @@
1
+ // @ts-check
2
+ import { isPlainObject } from "is-plain-object";
3
+ import DatabaseRecord from "../../database/record/index.js";
4
+ import { attributeDeclaration, callbackDeclaration, initializeWithDeclaration, skipCreateDeclaration, toCreateDeclaration, traitIncludeDeclaration } from "./declarations.js";
5
+ import AssociationDeclaration from "./association-declaration.js";
6
+ import FactoryDefinition from "./factory-definition.js";
7
+ import Sequence from "./sequence.js";
8
+ import TraitDefinition from "./trait-definition.js";
9
+ import { InvalidDefinitionError } from "./errors.js";
10
+ /** Callback phases accepted by `before`/`after` mapped to their event suffix. */
11
+ const CALLBACK_PHASES = { all: "All", build: "Build", create: "Create" };
12
+ /**
13
+ * Resolves a `before`/`after` phase into the concrete event name.
14
+ * @param {"before" | "after"} prefix - Callback prefix.
15
+ * @param {string} phase - Declared phase (all/build/create).
16
+ * @returns {string} - Concrete event name (e.g. "afterCreate").
17
+ */
18
+ function eventNameFor(prefix, phase) {
19
+ const suffix = /** @type {Record<string, string>} */ (CALLBACK_PHASES)[phase];
20
+ if (!suffix) {
21
+ throw new InvalidDefinitionError(`Unknown callback phase "${String(phase)}". Use one of: ${Object.keys(CALLBACK_PHASES).join(", ")}`);
22
+ }
23
+ return `${prefix}${suffix}`;
24
+ }
25
+ /**
26
+ * Validates a declared name is a non-empty string.
27
+ * @param {string} name - Name to validate.
28
+ * @param {string} what - What is being named (for the message).
29
+ * @returns {void}
30
+ */
31
+ function assertName(name, what) {
32
+ if (!name || typeof name !== "string") {
33
+ throw new InvalidDefinitionError(`${what} name must be a non-empty string, got: ${String(name)}`);
34
+ }
35
+ }
36
+ /**
37
+ * Builds an association declaration from the loose `association(name, ...)` args:
38
+ * leading strings are traits and a trailing plain object supplies factory/strategy
39
+ * plus overrides.
40
+ * @param {string} name - Relationship name.
41
+ * @param {Array<?>} args - Remaining arguments.
42
+ * @returns {AssociationDeclaration} - The declaration.
43
+ */
44
+ function buildAssociationDeclaration(name, args) {
45
+ /** @type {string[]} */
46
+ const traits = [];
47
+ /** @type {Record<string, ?>} */
48
+ let options = {};
49
+ for (const arg of args) {
50
+ if (typeof arg === "string") {
51
+ traits.push(arg);
52
+ }
53
+ else if (isPlainObject(arg)) {
54
+ options = arg;
55
+ }
56
+ else {
57
+ throw new InvalidDefinitionError(`Invalid association argument for "${name}": ${String(arg)}`);
58
+ }
59
+ }
60
+ const { factory, strategy, ...overrides } = options;
61
+ return new AssociationDeclaration({ name, factory, strategy, traits, overrides });
62
+ }
63
+ /**
64
+ * Parses the polymorphic `sequence(name, ...)` argument forms into a Sequence.
65
+ * @param {string} name - Sequence name.
66
+ * @param {Array<?>} args - Remaining arguments (initial/options and/or formatter).
67
+ * @returns {Sequence} - The constructed sequence.
68
+ */
69
+ function buildSequence(name, args) {
70
+ assertName(name, "Sequence");
71
+ let initial = 1;
72
+ /** @type {string[]} */
73
+ let aliases = [];
74
+ /** @type {import("./sequence.js").SequenceFormatter | undefined} */
75
+ let formatter;
76
+ for (const arg of args) {
77
+ if (typeof arg === "function") {
78
+ formatter = arg;
79
+ }
80
+ else if (typeof arg === "number") {
81
+ initial = arg;
82
+ }
83
+ else if (isPlainObject(arg)) {
84
+ if (typeof arg.initial === "number")
85
+ initial = arg.initial;
86
+ if (Array.isArray(arg.aliases))
87
+ aliases = arg.aliases;
88
+ }
89
+ else if (arg !== undefined) {
90
+ throw new InvalidDefinitionError(`Invalid sequence argument for "${name}": ${String(arg)}`);
91
+ }
92
+ }
93
+ return new Sequence({ name, initial, formatter, aliases });
94
+ }
95
+ /**
96
+ * Collects declarations for one factory/trait block. Shared by factory blocks,
97
+ * trait blocks and the root registry-defaults block.
98
+ */
99
+ class DeclarationCollector {
100
+ /** Builds a collector. */
101
+ constructor() {
102
+ /** @type {import("./declarations.js").Declaration[]} - Ordered declarations. */
103
+ this.declarations = [];
104
+ }
105
+ /**
106
+ * Records a literal/lazy attribute.
107
+ * @param {string} name - Attribute name.
108
+ * @param {?} value - Literal value or lazy function.
109
+ * @returns {void}
110
+ */
111
+ attribute(name, value) {
112
+ assertName(name, "Attribute");
113
+ this.declarations.push(attributeDeclaration(name, value, false));
114
+ }
115
+ /**
116
+ * Records a transient attribute.
117
+ * @param {string} name - Transient name.
118
+ * @param {?} value - Literal value or lazy function.
119
+ * @returns {void}
120
+ */
121
+ transient(name, value) {
122
+ assertName(name, "Transient");
123
+ this.declarations.push(attributeDeclaration(name, value, true));
124
+ }
125
+ /**
126
+ * Records an association.
127
+ * @param {string} name - Relationship name.
128
+ * @param {Array<?>} args - Traits and/or an options object.
129
+ * @returns {void}
130
+ */
131
+ association(name, ...args) {
132
+ assertName(name, "Association");
133
+ this.declarations.push(buildAssociationDeclaration(name, args));
134
+ }
135
+ /**
136
+ * Records a before-callback.
137
+ * @param {string} phase - Phase (all/build/create).
138
+ * @param {import("./declarations.js").CallbackDeclaration["fn"]} fn - Callback body.
139
+ * @returns {void}
140
+ */
141
+ before(phase, fn) {
142
+ this.declarations.push(callbackDeclaration(eventNameFor("before", phase), fn));
143
+ }
144
+ /**
145
+ * Records an after-callback.
146
+ * @param {string} phase - Phase (all/build/create).
147
+ * @param {import("./declarations.js").CallbackDeclaration["fn"]} fn - Callback body.
148
+ * @returns {void}
149
+ */
150
+ after(phase, fn) {
151
+ this.declarations.push(callbackDeclaration(eventNameFor("after", phase), fn));
152
+ }
153
+ /**
154
+ * Records a custom constructor.
155
+ * @param {import("./declarations.js").InitializeWithDeclaration["fn"]} fn - Constructor body.
156
+ * @returns {void}
157
+ */
158
+ initializeWith(fn) {
159
+ this.declarations.push(initializeWithDeclaration(fn));
160
+ }
161
+ /**
162
+ * Records a custom persistence hook.
163
+ * @param {import("./declarations.js").ToCreateDeclaration["fn"]} fn - Persistence body.
164
+ * @returns {void}
165
+ */
166
+ toCreate(fn) {
167
+ this.declarations.push(toCreateDeclaration(fn));
168
+ }
169
+ /**
170
+ * Records that persistence should be skipped for the create strategy.
171
+ * @returns {void}
172
+ */
173
+ skipCreate() {
174
+ this.declarations.push(skipCreateDeclaration());
175
+ }
176
+ }
177
+ /**
178
+ * Runs a trait block against a fresh collector and compiles it into a definition.
179
+ * @param {string} name - Trait name.
180
+ * @param {(builder: object) => void} callback - Trait builder callback.
181
+ * @returns {TraitDefinition} - Compiled trait.
182
+ */
183
+ function compileTrait(name, callback) {
184
+ assertName(name, "Trait");
185
+ if (typeof callback !== "function") {
186
+ throw new InvalidDefinitionError(`Trait "${name}" requires a builder function`);
187
+ }
188
+ const collector = new DeclarationCollector();
189
+ const builder = {
190
+ attribute: (/** @type {string} */ attrName, /** @type {?} */ value) => collector.attribute(attrName, value),
191
+ transient: (/** @type {string} */ attrName, /** @type {?} */ value) => collector.transient(attrName, value),
192
+ association: (/** @type {string} */ assocName, /** @type {Array<?>} */ ...args) => collector.association(assocName, ...args),
193
+ before: (/** @type {string} */ phase, /** @type {?} */ fn) => collector.before(phase, fn),
194
+ after: (/** @type {string} */ phase, /** @type {?} */ fn) => collector.after(phase, fn),
195
+ initializeWith: (/** @type {?} */ fn) => collector.initializeWith(fn),
196
+ toCreate: (/** @type {?} */ fn) => collector.toCreate(fn),
197
+ skipCreate: () => collector.skipCreate(),
198
+ trait: (/** @type {string} */ includeName) => {
199
+ assertName(includeName, "Trait include");
200
+ collector.declarations.push(traitIncludeDeclaration(includeName));
201
+ }
202
+ };
203
+ callback(builder);
204
+ return new TraitDefinition({ name, declarations: collector.declarations });
205
+ }
206
+ /**
207
+ * A single `define`/`modify` session. It walks the builder callbacks, compiles
208
+ * immutable definitions and registers them into the target registry, throwing on
209
+ * duplicate or structurally invalid declarations at definition time.
210
+ */
211
+ export default class DefinitionSession {
212
+ /**
213
+ * Builds a session.
214
+ * @param {import("./factory-registry.js").default} registry - Target registry.
215
+ */
216
+ constructor(registry) {
217
+ /** @type {import("./factory-registry.js").default} - Target registry. */
218
+ this.registry = registry;
219
+ }
220
+ /**
221
+ * Runs a root `define` callback.
222
+ * @param {(builder: object) => void} callback - Root builder callback.
223
+ * @returns {void}
224
+ */
225
+ run(callback) {
226
+ if (typeof callback !== "function") {
227
+ throw new InvalidDefinitionError("define requires a builder callback");
228
+ }
229
+ callback(this._rootBuilder());
230
+ }
231
+ /**
232
+ * Runs a `modify` callback that reopens existing factories to append/override
233
+ * declarations, recompiling each into a fresh immutable definition rather than
234
+ * mutating the original.
235
+ * @param {(builder: object) => void} callback - Modify builder callback.
236
+ * @returns {void}
237
+ */
238
+ runModify(callback) {
239
+ if (typeof callback !== "function") {
240
+ throw new InvalidDefinitionError("modify requires a builder callback");
241
+ }
242
+ callback(this._modifyBuilder());
243
+ }
244
+ /**
245
+ * Builds the builder object exposed to `modify`.
246
+ * @returns {object} - Modify builder.
247
+ */
248
+ _modifyBuilder() {
249
+ return {
250
+ factory: (/** @type {string} */ name, /** @type {(builder: object) => void} */ cb) => this._modifyFactory(name, cb),
251
+ trait: (/** @type {string} */ name, /** @type {(builder: object) => void} */ cb) => this.registry._registerGlobalTrait(compileTrait(name, cb)),
252
+ sequence: (/** @type {string} */ name, /** @type {Array<?>} */ ...args) => this.registry._registerSequence(buildSequence(name, args), null),
253
+ before: (/** @type {string} */ phase, /** @type {?} */ fn) => this.registry._addGlobalDeclaration(callbackDeclaration(eventNameFor("before", phase), fn)),
254
+ after: (/** @type {string} */ phase, /** @type {?} */ fn) => this.registry._addGlobalDeclaration(callbackDeclaration(eventNameFor("after", phase), fn)),
255
+ initializeWith: (/** @type {?} */ fn) => this.registry._addGlobalDeclaration(initializeWithDeclaration(fn)),
256
+ toCreate: (/** @type {?} */ fn) => this.registry._addGlobalDeclaration(toCreateDeclaration(fn)),
257
+ skipCreate: () => this.registry._addGlobalDeclaration(skipCreateDeclaration())
258
+ };
259
+ }
260
+ /**
261
+ * Recompiles an existing factory with appended declarations.
262
+ * @param {string} name - Existing factory name.
263
+ * @param {(builder: object) => void} cb - Factory builder callback.
264
+ * @returns {void}
265
+ */
266
+ _modifyFactory(name, cb) {
267
+ assertName(name, "Factory");
268
+ const existing = this.registry._factories.get(name);
269
+ if (!existing) {
270
+ throw new InvalidDefinitionError(`Cannot modify unknown factory "${name}"`);
271
+ }
272
+ const collector = new DeclarationCollector();
273
+ /** @type {Array<{name: string, modelOrOptions: ?, cb: ?}>} */
274
+ const nestedFactories = [];
275
+ const localTraits = new Map(existing.localTraits);
276
+ /** @type {Sequence[]} */
277
+ const scopedSequences = [];
278
+ if (typeof cb === "function") {
279
+ cb(this._factoryBuilder(collector, nestedFactories, localTraits, scopedSequences));
280
+ }
281
+ const merged = new FactoryDefinition({
282
+ name: existing.name,
283
+ modelClass: existing.modelClass,
284
+ parentName: existing.parentName,
285
+ aliases: [...existing.aliases],
286
+ declarations: [...existing.declarations, ...collector.declarations],
287
+ localTraits
288
+ });
289
+ this.registry._replaceFactoryDefinition(merged);
290
+ for (const sequence of scopedSequences) {
291
+ this.registry._registerSequence(sequence, name);
292
+ }
293
+ for (const nested of nestedFactories) {
294
+ this._defineFactory(nested.name, nested.modelOrOptions, nested.cb, name);
295
+ }
296
+ }
297
+ /**
298
+ * Builds the root builder object exposed to `define`.
299
+ * @returns {object} - Root builder.
300
+ */
301
+ _rootBuilder() {
302
+ return {
303
+ factory: (/** @type {string} */ name, /** @type {?} */ modelOrOptions, /** @type {?} */ cb) => this._defineFactory(name, modelOrOptions, cb, null),
304
+ trait: (/** @type {string} */ name, /** @type {(builder: object) => void} */ cb) => this.registry._registerGlobalTrait(compileTrait(name, cb)),
305
+ sequence: (/** @type {string} */ name, /** @type {Array<?>} */ ...args) => this.registry._registerSequence(buildSequence(name, args), null),
306
+ before: (/** @type {string} */ phase, /** @type {?} */ fn) => this.registry._addGlobalDeclaration(callbackDeclaration(eventNameFor("before", phase), fn)),
307
+ after: (/** @type {string} */ phase, /** @type {?} */ fn) => this.registry._addGlobalDeclaration(callbackDeclaration(eventNameFor("after", phase), fn)),
308
+ initializeWith: (/** @type {?} */ fn) => this.registry._addGlobalDeclaration(initializeWithDeclaration(fn)),
309
+ toCreate: (/** @type {?} */ fn) => this.registry._addGlobalDeclaration(toCreateDeclaration(fn)),
310
+ skipCreate: () => this.registry._addGlobalDeclaration(skipCreateDeclaration())
311
+ };
312
+ }
313
+ /**
314
+ * Compiles and registers a factory (and its nested children/local traits/scoped
315
+ * sequences).
316
+ * @param {string} name - Factory name.
317
+ * @param {?} modelOrOptions - Model class or options object.
318
+ * @param {?} cb - Factory builder callback.
319
+ * @param {string | null} inheritedParent - Parent name for nested factories.
320
+ * @returns {void}
321
+ */
322
+ _defineFactory(name, modelOrOptions, cb, inheritedParent) {
323
+ assertName(name, "Factory");
324
+ let modelClass = null;
325
+ let builderCallback = cb;
326
+ /** @type {Record<string, ?>} */
327
+ let options = {};
328
+ if (typeof cb === "function") {
329
+ // Three-argument form: the second argument is the model class or options.
330
+ if (typeof modelOrOptions === "function") {
331
+ modelClass = modelOrOptions;
332
+ }
333
+ else if (isPlainObject(modelOrOptions)) {
334
+ options = modelOrOptions;
335
+ modelClass = options.model || options.class || null;
336
+ }
337
+ else if (modelOrOptions !== undefined) {
338
+ throw new InvalidDefinitionError(`Factory "${name}" model must be a class or an options object`);
339
+ }
340
+ }
341
+ else if (typeof modelOrOptions === "function") {
342
+ // Two-argument form with a trailing function. A backend model class means
343
+ // "no builder"; any other function is the builder (child inherits its model).
344
+ if (modelOrOptions.prototype instanceof DatabaseRecord) {
345
+ modelClass = modelOrOptions;
346
+ }
347
+ else {
348
+ builderCallback = modelOrOptions;
349
+ }
350
+ }
351
+ else if (isPlainObject(modelOrOptions)) {
352
+ options = modelOrOptions;
353
+ modelClass = options.model || options.class || null;
354
+ }
355
+ else if (modelOrOptions !== undefined) {
356
+ throw new InvalidDefinitionError(`Factory "${name}" model must be a class or an options object`);
357
+ }
358
+ const parentName = options.parent || inheritedParent || null;
359
+ const aliases = Array.isArray(options.aliases) ? options.aliases : [];
360
+ const baseTraits = Array.isArray(options.traits) ? options.traits : [];
361
+ const collector = new DeclarationCollector();
362
+ /** @type {Array<{name: string, modelOrOptions: ?, cb: ?}>} */
363
+ const nestedFactories = [];
364
+ /** @type {Map<string, TraitDefinition>} */
365
+ const localTraits = new Map();
366
+ /** @type {Sequence[]} */
367
+ const scopedSequences = [];
368
+ if (typeof builderCallback === "function") {
369
+ builderCallback(this._factoryBuilder(collector, nestedFactories, localTraits, scopedSequences));
370
+ }
371
+ const declarations = [...baseTraits.map((traitName) => traitIncludeDeclaration(traitName)), ...collector.declarations];
372
+ const definition = new FactoryDefinition({ name, modelClass, parentName, aliases, declarations, localTraits });
373
+ this.registry._registerFactoryDefinition(definition);
374
+ for (const sequence of scopedSequences) {
375
+ this.registry._registerSequence(sequence, name);
376
+ }
377
+ for (const nested of nestedFactories) {
378
+ this._defineFactory(nested.name, nested.modelOrOptions, nested.cb, name);
379
+ }
380
+ }
381
+ /**
382
+ * Builds the factory builder object.
383
+ * @param {DeclarationCollector} collector - Declaration collector.
384
+ * @param {Array<{name: string, modelOrOptions: ?, cb: ?}>} nestedFactories - Nested factory sink.
385
+ * @param {Map<string, TraitDefinition>} localTraits - Local trait sink.
386
+ * @param {Sequence[]} scopedSequences - Scoped sequence sink.
387
+ * @returns {object} - Factory builder.
388
+ */
389
+ _factoryBuilder(collector, nestedFactories, localTraits, scopedSequences) {
390
+ return {
391
+ attribute: (/** @type {string} */ attrName, /** @type {?} */ value) => collector.attribute(attrName, value),
392
+ transient: (/** @type {string} */ attrName, /** @type {?} */ value) => collector.transient(attrName, value),
393
+ association: (/** @type {string} */ assocName, /** @type {Array<?>} */ ...args) => collector.association(assocName, ...args),
394
+ before: (/** @type {string} */ phase, /** @type {?} */ fn) => collector.before(phase, fn),
395
+ after: (/** @type {string} */ phase, /** @type {?} */ fn) => collector.after(phase, fn),
396
+ initializeWith: (/** @type {?} */ fn) => collector.initializeWith(fn),
397
+ toCreate: (/** @type {?} */ fn) => collector.toCreate(fn),
398
+ skipCreate: () => collector.skipCreate(),
399
+ sequence: (/** @type {string} */ seqName, /** @type {Array<?>} */ ...args) => scopedSequences.push(buildSequence(seqName, args)),
400
+ trait: (/** @type {string} */ traitName, /** @type {((builder: object) => void) | undefined} */ traitCb) => {
401
+ if (typeof traitCb === "function") {
402
+ const compiled = compileTrait(traitName, traitCb);
403
+ if (localTraits.has(traitName)) {
404
+ throw new InvalidDefinitionError(`Local trait "${traitName}" is already defined on this factory`);
405
+ }
406
+ localTraits.set(traitName, compiled);
407
+ }
408
+ else {
409
+ assertName(traitName, "Trait include");
410
+ collector.declarations.push(traitIncludeDeclaration(traitName));
411
+ }
412
+ },
413
+ factory: (/** @type {string} */ childName, /** @type {?} */ childModelOrOptions, /** @type {?} */ childCb) => nestedFactories.push({ name: childName, modelOrOptions: childModelOrOptions, cb: childCb })
414
+ };
415
+ }
416
+ }
417
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZmFjdG9yeS9kZWZpbml0aW9uLWJ1aWxkZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUM3QyxPQUFPLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMzRCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDeEIsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLHNCQUFzQixNQUFNLDhCQUE4QixDQUFBO0FBQ2pFLE9BQU8saUJBQWlCLE1BQU0seUJBQXlCLENBQUE7QUFDdkQsT0FBTyxRQUFRLE1BQU0sZUFBZSxDQUFBO0FBQ3BDLE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUVsRCxpRkFBaUY7QUFDakYsTUFBTSxlQUFlLEdBQUcsRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFBO0FBRXRFOzs7OztHQUtHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUs7SUFDakMsTUFBTSxNQUFNLEdBQUcscUNBQXFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU3RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksc0JBQXNCLENBQUMsMkJBQTJCLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENB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T0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUNsQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO29CQUVqRCxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDL0IsTUFBTSxJQUFJLHNCQUFzQixDQUFDLGdCQUFnQixTQUFTLHNDQUFzQyxDQUFDLENBQUE7b0JBQ25HLENBQUM7b0JBRUQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUE7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixVQUFVLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFBO29CQUN0QyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO2dCQUNqRSxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUMzRyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBQyxDQUFDO1NBQzVGLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tIFwiaXMtcGxhaW4tb2JqZWN0XCJcbmltcG9ydCBEYXRhYmFzZVJlY29yZCBmcm9tIFwiLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbmltcG9ydCB7XG4gIGF0dHJpYnV0ZURlY2xhcmF0aW9uLFxuICBjYWxsYmFja0RlY2xhcmF0aW9uLFxuICBpbml0aWFsaXplV2l0aERlY2xhcmF0aW9uLFxuICBza2lwQ3JlYXRlRGVjbGFyYXRpb24sXG4gIHRvQ3JlYXRlRGVjbGFyYXRpb24sXG4gIHRyYWl0SW5jbHVkZURlY2xhcmF0aW9uXG59IGZyb20gXCIuL2RlY2xhcmF0aW9ucy5qc1wiXG5pbXBvcnQgQXNzb2NpYXRpb25EZWNsYXJhdGlvbiBmcm9tIFwiLi9hc3NvY2lhdGlvbi1kZWNsYXJhdGlvbi5qc1wiXG5pbXBvcnQgRmFjdG9yeURlZmluaXRpb24gZnJvbSBcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCJcbmltcG9ydCBTZXF1ZW5jZSBmcm9tIFwiLi9zZXF1ZW5jZS5qc1wiXG5pbXBvcnQgVHJhaXREZWZpbml0aW9uIGZyb20gXCIuL3RyYWl0LWRlZmluaXRpb24uanNcIlxuaW1wb3J0IHtJbnZhbGlkRGVmaW5pdGlvbkVycm9yfSBmcm9tIFwiLi9lcnJvcnMuanNcIlxuXG4vKiogQ2FsbGJhY2sgcGhhc2VzIGFjY2VwdGVkIGJ5IGBiZWZvcmVgL2BhZnRlcmAgbWFwcGVkIHRvIHRoZWlyIGV2ZW50IHN1ZmZpeC4gKi9cbmNvbnN0IENBTExCQUNLX1BIQVNFUyA9IHthbGw6IFwiQWxsXCIsIGJ1aWxkOiBcIkJ1aWxkXCIsIGNyZWF0ZTogXCJDcmVhdGVcIn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGBiZWZvcmVgL2BhZnRlcmAgcGhhc2UgaW50byB0aGUgY29uY3JldGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7XCJiZWZvcmVcIiB8IFwiYWZ0ZXJcIn0gcHJlZml4IC0gQ2FsbGJhY2sgcHJlZml4LlxuICogQHBhcmFtIHtzdHJpbmd9IHBoYXNlIC0gRGVjbGFyZWQgcGhhc2UgKGFsbC9idWlsZC9jcmVhdGUpLlxuICogQHJldHVybnMge3N0cmluZ30gLSBDb25jcmV0ZSBldmVudCBuYW1lIChlLmcuIFwiYWZ0ZXJDcmVhdGVcIikuXG4gKi9cbmZ1bmN0aW9uIGV2ZW50TmFtZUZvcihwcmVmaXgsIHBoYXNlKSB7XG4gIGNvbnN0IHN1ZmZpeCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi8gKENBTExCQUNLX1BIQVNFUylbcGhhc2VdXG5cbiAgaWYgKCFzdWZmaXgpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZERlZmluaXRpb25FcnJvcihgVW5rbm93biBjYWxsYmFjayBwaGFzZSBcIiR7U3RyaW5nKHBoYXNlKX1cIi4gVXNlIG9uZSBvZjogJHtPYmplY3Qua2V5cyhDQUxMQkFDS19QSEFTRVMpLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3ByZWZpeH0ke3N1ZmZpeH1gXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgZGVjbGFyZWQgbmFtZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2hhdCAtIFdoYXQgaXMgYmVpbmcgbmFtZWQgKGZvciB0aGUgbWVzc2FnZSkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0TmFtZShuYW1lLCB3aGF0KSB7XG4gIGlmICghbmFtZSB8fCB0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKGAke3doYXR9IG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGdvdDogJHtTdHJpbmcobmFtZSl9YClcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhbiBhc3NvY2lhdGlvbiBkZWNsYXJhdGlvbiBmcm9tIHRoZSBsb29zZSBgYXNzb2NpYXRpb24obmFtZSwgLi4uKWAgYXJnczpcbiAqIGxlYWRpbmcgc3RyaW5ncyBhcmUgdHJhaXRzIGFuZCBhIHRyYWlsaW5nIHBsYWluIG9iamVjdCBzdXBwbGllcyBmYWN0b3J5L3N0cmF0ZWd5XG4gKiBwbHVzIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gUmVtYWluaW5nIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIHtBc3NvY2lhdGlvbkRlY2xhcmF0aW9ufSAtIFRoZSBkZWNsYXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYnVpbGRBc3NvY2lhdGlvbkRlY2xhcmF0aW9uKG5hbWUsIGFyZ3MpIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgdHJhaXRzID0gW11cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgbGV0IG9wdGlvbnMgPSB7fVxuXG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJhaXRzLnB1c2goYXJnKVxuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhcmcpKSB7XG4gICAgICBvcHRpb25zID0gYXJnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKGBJbnZhbGlkIGFzc29jaWF0aW9uIGFyZ3VtZW50IGZvciBcIiR7bmFtZX1cIjogJHtTdHJpbmcoYXJnKX1gKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHtmYWN0b3J5LCBzdHJhdGVneSwgLi4ub3ZlcnJpZGVzfSA9IG9wdGlvbnNcblxuICByZXR1cm4gbmV3IEFzc29jaWF0aW9uRGVjbGFyYXRpb24oe25hbWUsIGZhY3RvcnksIHN0cmF0ZWd5LCB0cmFpdHMsIG92ZXJyaWRlc30pXG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBwb2x5bW9ycGhpYyBgc2VxdWVuY2UobmFtZSwgLi4uKWAgYXJndW1lbnQgZm9ybXMgaW50byBhIFNlcXVlbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBTZXF1ZW5jZSBuYW1lLlxuICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIFJlbWFpbmluZyBhcmd1bWVudHMgKGluaXRpYWwvb3B0aW9ucyBhbmQvb3IgZm9ybWF0dGVyKS5cbiAqIEByZXR1cm5zIHtTZXF1ZW5jZX0gLSBUaGUgY29uc3RydWN0ZWQgc2VxdWVuY2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2VxdWVuY2UobmFtZSwgYXJncykge1xuICBhc3NlcnROYW1lKG5hbWUsIFwiU2VxdWVuY2VcIilcblxuICBsZXQgaW5pdGlhbCA9IDFcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgbGV0IGFsaWFzZXMgPSBbXVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VxdWVuY2UuanNcIikuU2VxdWVuY2VGb3JtYXR0ZXIgfCB1bmRlZmluZWR9ICovXG4gIGxldCBmb3JtYXR0ZXJcblxuICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZm9ybWF0dGVyID0gYXJnXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpbml0aWFsID0gYXJnXG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGFyZykpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnLmluaXRpYWwgPT09IFwibnVtYmVyXCIpIGluaXRpYWwgPSBhcmcuaW5pdGlhbFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnLmFsaWFzZXMpKSBhbGlhc2VzID0gYXJnLmFsaWFzZXNcbiAgICB9IGVsc2UgaWYgKGFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZERlZmluaXRpb25FcnJvcihgSW52YWxpZCBzZXF1ZW5jZSBhcmd1bWVudCBmb3IgXCIke25hbWV9XCI6ICR7U3RyaW5nKGFyZyl9YClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlcXVlbmNlKHtuYW1lLCBpbml0aWFsLCBmb3JtYXR0ZXIsIGFsaWFzZXN9KVxufVxuXG4vKipcbiAqIENvbGxlY3RzIGRlY2xhcmF0aW9ucyBmb3Igb25lIGZhY3RvcnkvdHJhaXQgYmxvY2suIFNoYXJlZCBieSBmYWN0b3J5IGJsb2NrcyxcbiAqIHRyYWl0IGJsb2NrcyBhbmQgdGhlIHJvb3QgcmVnaXN0cnktZGVmYXVsdHMgYmxvY2suXG4gKi9cbmNsYXNzIERlY2xhcmF0aW9uQ29sbGVjdG9yIHtcbiAgLyoqIEJ1aWxkcyBhIGNvbGxlY3Rvci4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbltdfSAtIE9yZGVyZWQgZGVjbGFyYXRpb25zLiAqL1xuICAgIHRoaXMuZGVjbGFyYXRpb25zID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGEgbGl0ZXJhbC9sYXp5IGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZSAtIExpdGVyYWwgdmFsdWUgb3IgbGF6eSBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICBhc3NlcnROYW1lKG5hbWUsIFwiQXR0cmlidXRlXCIpXG4gICAgdGhpcy5kZWNsYXJhdGlvbnMucHVzaChhdHRyaWJ1dGVEZWNsYXJhdGlvbihuYW1lLCB2YWx1ZSwgZmFsc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYSB0cmFuc2llbnQgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRyYW5zaWVudCBuYW1lLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gTGl0ZXJhbCB2YWx1ZSBvciBsYXp5IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRyYW5zaWVudChuYW1lLCB2YWx1ZSkge1xuICAgIGFzc2VydE5hbWUobmFtZSwgXCJUcmFuc2llbnRcIilcbiAgICB0aGlzLmRlY2xhcmF0aW9ucy5wdXNoKGF0dHJpYnV0ZURlY2xhcmF0aW9uKG5hbWUsIHZhbHVlLCB0cnVlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGFuIGFzc29jaWF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXRzIGFuZC9vciBhbiBvcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NvY2lhdGlvbihuYW1lLCAuLi5hcmdzKSB7XG4gICAgYXNzZXJ0TmFtZShuYW1lLCBcIkFzc29jaWF0aW9uXCIpXG4gICAgdGhpcy5kZWNsYXJhdGlvbnMucHVzaChidWlsZEFzc29jaWF0aW9uRGVjbGFyYXRpb24obmFtZSwgYXJncykpXG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGJlZm9yZS1jYWxsYmFjay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBoYXNlIC0gUGhhc2UgKGFsbC9idWlsZC9jcmVhdGUpLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkNhbGxiYWNrRGVjbGFyYXRpb25bXCJmblwiXX0gZm4gLSBDYWxsYmFjayBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGJlZm9yZShwaGFzZSwgZm4pIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9ucy5wdXNoKGNhbGxiYWNrRGVjbGFyYXRpb24oZXZlbnROYW1lRm9yKFwiYmVmb3JlXCIsIHBoYXNlKSwgZm4pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYW4gYWZ0ZXItY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwaGFzZSAtIFBoYXNlIChhbGwvYnVpbGQvY3JlYXRlKS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5DYWxsYmFja0RlY2xhcmF0aW9uW1wiZm5cIl19IGZuIC0gQ2FsbGJhY2sgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhZnRlcihwaGFzZSwgZm4pIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9ucy5wdXNoKGNhbGxiYWNrRGVjbGFyYXRpb24oZXZlbnROYW1lRm9yKFwiYWZ0ZXJcIiwgcGhhc2UpLCBmbikpXG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGN1c3RvbSBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5Jbml0aWFsaXplV2l0aERlY2xhcmF0aW9uW1wiZm5cIl19IGZuIC0gQ29uc3RydWN0b3IgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBpbml0aWFsaXplV2l0aChmbikge1xuICAgIHRoaXMuZGVjbGFyYXRpb25zLnB1c2goaW5pdGlhbGl6ZVdpdGhEZWNsYXJhdGlvbihmbikpXG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGN1c3RvbSBwZXJzaXN0ZW5jZSBob29rLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLlRvQ3JlYXRlRGVjbGFyYXRpb25bXCJmblwiXX0gZm4gLSBQZXJzaXN0ZW5jZSBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRvQ3JlYXRlKGZuKSB7XG4gICAgdGhpcy5kZWNsYXJhdGlvbnMucHVzaCh0b0NyZWF0ZURlY2xhcmF0aW9uKGZuKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoYXQgcGVyc2lzdGVuY2Ugc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjcmVhdGUgc3RyYXRlZ3kuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2tpcENyZWF0ZSgpIHtcbiAgICB0aGlzLmRlY2xhcmF0aW9ucy5wdXNoKHNraXBDcmVhdGVEZWNsYXJhdGlvbigpKVxuICB9XG59XG5cbi8qKlxuICogUnVucyBhIHRyYWl0IGJsb2NrIGFnYWluc3QgYSBmcmVzaCBjb2xsZWN0b3IgYW5kIGNvbXBpbGVzIGl0IGludG8gYSBkZWZpbml0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUcmFpdCBuYW1lLlxuICogQHBhcmFtIHsoYnVpbGRlcjogb2JqZWN0KSA9PiB2b2lkfSBjYWxsYmFjayAtIFRyYWl0IGJ1aWxkZXIgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7VHJhaXREZWZpbml0aW9ufSAtIENvbXBpbGVkIHRyYWl0LlxuICovXG5mdW5jdGlvbiBjb21waWxlVHJhaXQobmFtZSwgY2FsbGJhY2spIHtcbiAgYXNzZXJ0TmFtZShuYW1lLCBcIlRyYWl0XCIpXG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWREZWZpbml0aW9uRXJyb3IoYFRyYWl0IFwiJHtuYW1lfVwiIHJlcXVpcmVzIGEgYnVpbGRlciBmdW5jdGlvbmApXG4gIH1cblxuICBjb25zdCBjb2xsZWN0b3IgPSBuZXcgRGVjbGFyYXRpb25Db2xsZWN0b3IoKVxuICBjb25zdCBidWlsZGVyID0ge1xuICAgIGF0dHJpYnV0ZTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBhdHRyTmFtZSwgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSkgPT4gY29sbGVjdG9yLmF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUpLFxuICAgIHRyYW5zaWVudDogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBhdHRyTmFtZSwgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSkgPT4gY29sbGVjdG9yLnRyYW5zaWVudChhdHRyTmFtZSwgdmFsdWUpLFxuICAgIGFzc29jaWF0aW9uOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGFzc29jTmFtZSwgLyoqIEB0eXBlIHtBcnJheTw/Pn0gKi8gLi4uYXJncykgPT4gY29sbGVjdG9yLmFzc29jaWF0aW9uKGFzc29jTmFtZSwgLi4uYXJncyksXG4gICAgYmVmb3JlOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHBoYXNlLCAvKiogQHR5cGUgez99ICovIGZuKSA9PiBjb2xsZWN0b3IuYmVmb3JlKHBoYXNlLCBmbiksXG4gICAgYWZ0ZXI6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gcGhhc2UsIC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IGNvbGxlY3Rvci5hZnRlcihwaGFzZSwgZm4pLFxuICAgIGluaXRpYWxpemVXaXRoOiAoLyoqIEB0eXBlIHs/fSAqLyBmbikgPT4gY29sbGVjdG9yLmluaXRpYWxpemVXaXRoKGZuKSxcbiAgICB0b0NyZWF0ZTogKC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IGNvbGxlY3Rvci50b0NyZWF0ZShmbiksXG4gICAgc2tpcENyZWF0ZTogKCkgPT4gY29sbGVjdG9yLnNraXBDcmVhdGUoKSxcbiAgICB0cmFpdDogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBpbmNsdWRlTmFtZSkgPT4ge1xuICAgICAgYXNzZXJ0TmFtZShpbmNsdWRlTmFtZSwgXCJUcmFpdCBpbmNsdWRlXCIpXG4gICAgICBjb2xsZWN0b3IuZGVjbGFyYXRpb25zLnB1c2godHJhaXRJbmNsdWRlRGVjbGFyYXRpb24oaW5jbHVkZU5hbWUpKVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGJ1aWxkZXIpXG5cbiAgcmV0dXJuIG5ldyBUcmFpdERlZmluaXRpb24oe25hbWUsIGRlY2xhcmF0aW9uczogY29sbGVjdG9yLmRlY2xhcmF0aW9uc30pXG59XG5cbi8qKlxuICogQSBzaW5nbGUgYGRlZmluZWAvYG1vZGlmeWAgc2Vzc2lvbi4gSXQgd2Fsa3MgdGhlIGJ1aWxkZXIgY2FsbGJhY2tzLCBjb21waWxlc1xuICogaW1tdXRhYmxlIGRlZmluaXRpb25zIGFuZCByZWdpc3RlcnMgdGhlbSBpbnRvIHRoZSB0YXJnZXQgcmVnaXN0cnksIHRocm93aW5nIG9uXG4gKiBkdXBsaWNhdGUgb3Igc3RydWN0dXJhbGx5IGludmFsaWQgZGVjbGFyYXRpb25zIGF0IGRlZmluaXRpb24gdGltZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVmaW5pdGlvblNlc3Npb24ge1xuICAvKipcbiAgICogQnVpbGRzIGEgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBUYXJnZXQgcmVnaXN0cnkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWdpc3RyeSkge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9mYWN0b3J5LXJlZ2lzdHJ5LmpzXCIpLmRlZmF1bHR9IC0gVGFyZ2V0IHJlZ2lzdHJ5LiAqL1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSByb290IGBkZWZpbmVgIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0geyhidWlsZGVyOiBvYmplY3QpID0+IHZvaWR9IGNhbGxiYWNrIC0gUm9vdCBidWlsZGVyIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJ1bihjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREZWZpbml0aW9uRXJyb3IoXCJkZWZpbmUgcmVxdWlyZXMgYSBidWlsZGVyIGNhbGxiYWNrXCIpXG4gICAgfVxuXG4gICAgY2FsbGJhY2sodGhpcy5fcm9vdEJ1aWxkZXIoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYG1vZGlmeWAgY2FsbGJhY2sgdGhhdCByZW9wZW5zIGV4aXN0aW5nIGZhY3RvcmllcyB0byBhcHBlbmQvb3ZlcnJpZGVcbiAgICogZGVjbGFyYXRpb25zLCByZWNvbXBpbGluZyBlYWNoIGludG8gYSBmcmVzaCBpbW11dGFibGUgZGVmaW5pdGlvbiByYXRoZXIgdGhhblxuICAgKiBtdXRhdGluZyB0aGUgb3JpZ2luYWwuXG4gICAqIEBwYXJhbSB7KGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZH0gY2FsbGJhY2sgLSBNb2RpZnkgYnVpbGRlciBjYWxsYmFjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBydW5Nb2RpZnkoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKFwibW9kaWZ5IHJlcXVpcmVzIGEgYnVpbGRlciBjYWxsYmFja1wiKVxuICAgIH1cblxuICAgIGNhbGxiYWNrKHRoaXMuX21vZGlmeUJ1aWxkZXIoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGJ1aWxkZXIgb2JqZWN0IGV4cG9zZWQgdG8gYG1vZGlmeWAuXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gTW9kaWZ5IGJ1aWxkZXIuXG4gICAqL1xuICBfbW9kaWZ5QnVpbGRlcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmFjdG9yeTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lLCAvKiogQHR5cGUgeyhidWlsZGVyOiBvYmplY3QpID0+IHZvaWR9ICovIGNiKSA9PiB0aGlzLl9tb2RpZnlGYWN0b3J5KG5hbWUsIGNiKSxcbiAgICAgIHRyYWl0OiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIG5hbWUsIC8qKiBAdHlwZSB7KGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZH0gKi8gY2IpID0+XG4gICAgICAgIHRoaXMucmVnaXN0cnkuX3JlZ2lzdGVyR2xvYmFsVHJhaXQoY29tcGlsZVRyYWl0KG5hbWUsIGNiKSksXG4gICAgICBzZXF1ZW5jZTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lLCAvKiogQHR5cGUge0FycmF5PD8+fSAqLyAuLi5hcmdzKSA9PlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5Ll9yZWdpc3RlclNlcXVlbmNlKGJ1aWxkU2VxdWVuY2UobmFtZSwgYXJncyksIG51bGwpLFxuICAgICAgYmVmb3JlOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHBoYXNlLCAvKiogQHR5cGUgez99ICovIGZuKSA9PlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5Ll9hZGRHbG9iYWxEZWNsYXJhdGlvbihjYWxsYmFja0RlY2xhcmF0aW9uKGV2ZW50TmFtZUZvcihcImJlZm9yZVwiLCBwaGFzZSksIGZuKSksXG4gICAgICBhZnRlcjogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBwaGFzZSwgLyoqIEB0eXBlIHs/fSAqLyBmbikgPT5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5fYWRkR2xvYmFsRGVjbGFyYXRpb24oY2FsbGJhY2tEZWNsYXJhdGlvbihldmVudE5hbWVGb3IoXCJhZnRlclwiLCBwaGFzZSksIGZuKSksXG4gICAgICBpbml0aWFsaXplV2l0aDogKC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IHRoaXMucmVnaXN0cnkuX2FkZEdsb2JhbERlY2xhcmF0aW9uKGluaXRpYWxpemVXaXRoRGVjbGFyYXRpb24oZm4pKSxcbiAgICAgIHRvQ3JlYXRlOiAoLyoqIEB0eXBlIHs/fSAqLyBmbikgPT4gdGhpcy5yZWdpc3RyeS5fYWRkR2xvYmFsRGVjbGFyYXRpb24odG9DcmVhdGVEZWNsYXJhdGlvbihmbikpLFxuICAgICAgc2tpcENyZWF0ZTogKCkgPT4gdGhpcy5yZWdpc3RyeS5fYWRkR2xvYmFsRGVjbGFyYXRpb24oc2tpcENyZWF0ZURlY2xhcmF0aW9uKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcGlsZXMgYW4gZXhpc3RpbmcgZmFjdG9yeSB3aXRoIGFwcGVuZGVkIGRlY2xhcmF0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBFeGlzdGluZyBmYWN0b3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7KGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZH0gY2IgLSBGYWN0b3J5IGJ1aWxkZXIgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX21vZGlmeUZhY3RvcnkobmFtZSwgY2IpIHtcbiAgICBhc3NlcnROYW1lKG5hbWUsIFwiRmFjdG9yeVwiKVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnJlZ2lzdHJ5Ll9mYWN0b3JpZXMuZ2V0KG5hbWUpXG5cbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZERlZmluaXRpb25FcnJvcihgQ2Fubm90IG1vZGlmeSB1bmtub3duIGZhY3RvcnkgXCIke25hbWV9XCJgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBEZWNsYXJhdGlvbkNvbGxlY3RvcigpXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7bmFtZTogc3RyaW5nLCBtb2RlbE9yT3B0aW9uczogPywgY2I6ID99Pn0gKi9cbiAgICBjb25zdCBuZXN0ZWRGYWN0b3JpZXMgPSBbXVxuICAgIGNvbnN0IGxvY2FsVHJhaXRzID0gbmV3IE1hcChleGlzdGluZy5sb2NhbFRyYWl0cylcbiAgICAvKiogQHR5cGUge1NlcXVlbmNlW119ICovXG4gICAgY29uc3Qgc2NvcGVkU2VxdWVuY2VzID0gW11cblxuICAgIGlmICh0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY2IodGhpcy5fZmFjdG9yeUJ1aWxkZXIoY29sbGVjdG9yLCBuZXN0ZWRGYWN0b3JpZXMsIGxvY2FsVHJhaXRzLCBzY29wZWRTZXF1ZW5jZXMpKVxuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBGYWN0b3J5RGVmaW5pdGlvbih7XG4gICAgICBuYW1lOiBleGlzdGluZy5uYW1lLFxuICAgICAgbW9kZWxDbGFzczogZXhpc3RpbmcubW9kZWxDbGFzcyxcbiAgICAgIHBhcmVudE5hbWU6IGV4aXN0aW5nLnBhcmVudE5hbWUsXG4gICAgICBhbGlhc2VzOiBbLi4uZXhpc3RpbmcuYWxpYXNlc10sXG4gICAgICBkZWNsYXJhdGlvbnM6IFsuLi5leGlzdGluZy5kZWNsYXJhdGlvbnMsIC4uLmNvbGxlY3Rvci5kZWNsYXJhdGlvbnNdLFxuICAgICAgbG9jYWxUcmFpdHNcbiAgICB9KVxuXG4gICAgdGhpcy5yZWdpc3RyeS5fcmVwbGFjZUZhY3RvcnlEZWZpbml0aW9uKG1lcmdlZClcblxuICAgIGZvciAoY29uc3Qgc2VxdWVuY2Ugb2Ygc2NvcGVkU2VxdWVuY2VzKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJ5Ll9yZWdpc3RlclNlcXVlbmNlKHNlcXVlbmNlLCBuYW1lKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5lc3RlZEZhY3Rvcmllcykge1xuICAgICAgdGhpcy5fZGVmaW5lRmFjdG9yeShuZXN0ZWQubmFtZSwgbmVzdGVkLm1vZGVsT3JPcHRpb25zLCBuZXN0ZWQuY2IsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcm9vdCBidWlsZGVyIG9iamVjdCBleHBvc2VkIHRvIGBkZWZpbmVgLlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFJvb3QgYnVpbGRlci5cbiAgICovXG4gIF9yb290QnVpbGRlcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmFjdG9yeTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lLCAvKiogQHR5cGUgez99ICovIG1vZGVsT3JPcHRpb25zLCAvKiogQHR5cGUgez99ICovIGNiKSA9PlxuICAgICAgICB0aGlzLl9kZWZpbmVGYWN0b3J5KG5hbWUsIG1vZGVsT3JPcHRpb25zLCBjYiwgbnVsbCksXG4gICAgICB0cmFpdDogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBuYW1lLCAvKiogQHR5cGUgeyhidWlsZGVyOiBvYmplY3QpID0+IHZvaWR9ICovIGNiKSA9PlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5Ll9yZWdpc3Rlckdsb2JhbFRyYWl0KGNvbXBpbGVUcmFpdChuYW1lLCBjYikpLFxuICAgICAgc2VxdWVuY2U6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gbmFtZSwgLyoqIEB0eXBlIHtBcnJheTw/Pn0gKi8gLi4uYXJncykgPT5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5fcmVnaXN0ZXJTZXF1ZW5jZShidWlsZFNlcXVlbmNlKG5hbWUsIGFyZ3MpLCBudWxsKSxcbiAgICAgIGJlZm9yZTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBwaGFzZSwgLyoqIEB0eXBlIHs/fSAqLyBmbikgPT5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5fYWRkR2xvYmFsRGVjbGFyYXRpb24oY2FsbGJhY2tEZWNsYXJhdGlvbihldmVudE5hbWVGb3IoXCJiZWZvcmVcIiwgcGhhc2UpLCBmbikpLFxuICAgICAgYWZ0ZXI6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gcGhhc2UsIC8qKiBAdHlwZSB7P30gKi8gZm4pID0+XG4gICAgICAgIHRoaXMucmVnaXN0cnkuX2FkZEdsb2JhbERlY2xhcmF0aW9uKGNhbGxiYWNrRGVjbGFyYXRpb24oZXZlbnROYW1lRm9yKFwiYWZ0ZXJcIiwgcGhhc2UpLCBmbikpLFxuICAgICAgaW5pdGlhbGl6ZVdpdGg6ICgvKiogQHR5cGUgez99ICovIGZuKSA9PiB0aGlzLnJlZ2lzdHJ5Ll9hZGRHbG9iYWxEZWNsYXJhdGlvbihpbml0aWFsaXplV2l0aERlY2xhcmF0aW9uKGZuKSksXG4gICAgICB0b0NyZWF0ZTogKC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IHRoaXMucmVnaXN0cnkuX2FkZEdsb2JhbERlY2xhcmF0aW9uKHRvQ3JlYXRlRGVjbGFyYXRpb24oZm4pKSxcbiAgICAgIHNraXBDcmVhdGU6ICgpID0+IHRoaXMucmVnaXN0cnkuX2FkZEdsb2JhbERlY2xhcmF0aW9uKHNraXBDcmVhdGVEZWNsYXJhdGlvbigpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlcyBhbmQgcmVnaXN0ZXJzIGEgZmFjdG9yeSAoYW5kIGl0cyBuZXN0ZWQgY2hpbGRyZW4vbG9jYWwgdHJhaXRzL3Njb3BlZFxuICAgKiBzZXF1ZW5jZXMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHs/fSBtb2RlbE9yT3B0aW9ucyAtIE1vZGVsIGNsYXNzIG9yIG9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gez99IGNiIC0gRmFjdG9yeSBidWlsZGVyIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGluaGVyaXRlZFBhcmVudCAtIFBhcmVudCBuYW1lIGZvciBuZXN0ZWQgZmFjdG9yaWVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9kZWZpbmVGYWN0b3J5KG5hbWUsIG1vZGVsT3JPcHRpb25zLCBjYiwgaW5oZXJpdGVkUGFyZW50KSB7XG4gICAgYXNzZXJ0TmFtZShuYW1lLCBcIkZhY3RvcnlcIilcblxuICAgIGxldCBtb2RlbENsYXNzID0gbnVsbFxuICAgIGxldCBidWlsZGVyQ2FsbGJhY2sgPSBjYlxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgbGV0IG9wdGlvbnMgPSB7fVxuXG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBUaHJlZS1hcmd1bWVudCBmb3JtOiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBtb2RlbCBjbGFzcyBvciBvcHRpb25zLlxuICAgICAgaWYgKHR5cGVvZiBtb2RlbE9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG1vZGVsQ2xhc3MgPSBtb2RlbE9yT3B0aW9uc1xuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KG1vZGVsT3JPcHRpb25zKSkge1xuICAgICAgICBvcHRpb25zID0gbW9kZWxPck9wdGlvbnNcbiAgICAgICAgbW9kZWxDbGFzcyA9IG9wdGlvbnMubW9kZWwgfHwgb3B0aW9ucy5jbGFzcyB8fCBudWxsXG4gICAgICB9IGVsc2UgaWYgKG1vZGVsT3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWREZWZpbml0aW9uRXJyb3IoYEZhY3RvcnkgXCIke25hbWV9XCIgbW9kZWwgbXVzdCBiZSBhIGNsYXNzIG9yIGFuIG9wdGlvbnMgb2JqZWN0YClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2RlbE9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBUd28tYXJndW1lbnQgZm9ybSB3aXRoIGEgdHJhaWxpbmcgZnVuY3Rpb24uIEEgYmFja2VuZCBtb2RlbCBjbGFzcyBtZWFuc1xuICAgICAgLy8gXCJubyBidWlsZGVyXCI7IGFueSBvdGhlciBmdW5jdGlvbiBpcyB0aGUgYnVpbGRlciAoY2hpbGQgaW5oZXJpdHMgaXRzIG1vZGVsKS5cbiAgICAgIGlmIChtb2RlbE9yT3B0aW9ucy5wcm90b3R5cGUgaW5zdGFuY2VvZiBEYXRhYmFzZVJlY29yZCkge1xuICAgICAgICBtb2RlbENsYXNzID0gbW9kZWxPck9wdGlvbnNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1aWxkZXJDYWxsYmFjayA9IG1vZGVsT3JPcHRpb25zXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KG1vZGVsT3JPcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IG1vZGVsT3JPcHRpb25zXG4gICAgICBtb2RlbENsYXNzID0gb3B0aW9ucy5tb2RlbCB8fCBvcHRpb25zLmNsYXNzIHx8IG51bGxcbiAgICB9IGVsc2UgaWYgKG1vZGVsT3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKGBGYWN0b3J5IFwiJHtuYW1lfVwiIG1vZGVsIG11c3QgYmUgYSBjbGFzcyBvciBhbiBvcHRpb25zIG9iamVjdGApXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50TmFtZSA9IG9wdGlvbnMucGFyZW50IHx8IGluaGVyaXRlZFBhcmVudCB8fCBudWxsXG4gICAgY29uc3QgYWxpYXNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlhc2VzKSA/IG9wdGlvbnMuYWxpYXNlcyA6IFtdXG4gICAgY29uc3QgYmFzZVRyYWl0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy50cmFpdHMpID8gb3B0aW9ucy50cmFpdHMgOiBbXVxuXG4gICAgY29uc3QgY29sbGVjdG9yID0gbmV3IERlY2xhcmF0aW9uQ29sbGVjdG9yKClcbiAgICAvKiogQHR5cGUge0FycmF5PHtuYW1lOiBzdHJpbmcsIG1vZGVsT3JPcHRpb25zOiA/LCBjYjogP30+fSAqL1xuICAgIGNvbnN0IG5lc3RlZEZhY3RvcmllcyA9IFtdXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBUcmFpdERlZmluaXRpb24+fSAqL1xuICAgIGNvbnN0IGxvY2FsVHJhaXRzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtTZXF1ZW5jZVtdfSAqL1xuICAgIGNvbnN0IHNjb3BlZFNlcXVlbmNlcyA9IFtdXG5cbiAgICBpZiAodHlwZW9mIGJ1aWxkZXJDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBidWlsZGVyQ2FsbGJhY2sodGhpcy5fZmFjdG9yeUJ1aWxkZXIoY29sbGVjdG9yLCBuZXN0ZWRGYWN0b3JpZXMsIGxvY2FsVHJhaXRzLCBzY29wZWRTZXF1ZW5jZXMpKVxuICAgIH1cblxuICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IFsuLi5iYXNlVHJhaXRzLm1hcCgodHJhaXROYW1lKSA9PiB0cmFpdEluY2x1ZGVEZWNsYXJhdGlvbih0cmFpdE5hbWUpKSwgLi4uY29sbGVjdG9yLmRlY2xhcmF0aW9uc11cbiAgICBjb25zdCBkZWZpbml0aW9uID0gbmV3IEZhY3RvcnlEZWZpbml0aW9uKHtuYW1lLCBtb2RlbENsYXNzLCBwYXJlbnROYW1lLCBhbGlhc2VzLCBkZWNsYXJhdGlvbnMsIGxvY2FsVHJhaXRzfSlcblxuICAgIHRoaXMucmVnaXN0cnkuX3JlZ2lzdGVyRmFjdG9yeURlZmluaXRpb24oZGVmaW5pdGlvbilcblxuICAgIGZvciAoY29uc3Qgc2VxdWVuY2Ugb2Ygc2NvcGVkU2VxdWVuY2VzKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJ5Ll9yZWdpc3RlclNlcXVlbmNlKHNlcXVlbmNlLCBuYW1lKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5lc3RlZEZhY3Rvcmllcykge1xuICAgICAgdGhpcy5fZGVmaW5lRmFjdG9yeShuZXN0ZWQubmFtZSwgbmVzdGVkLm1vZGVsT3JPcHRpb25zLCBuZXN0ZWQuY2IsIG5hbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZmFjdG9yeSBidWlsZGVyIG9iamVjdC5cbiAgICogQHBhcmFtIHtEZWNsYXJhdGlvbkNvbGxlY3Rvcn0gY29sbGVjdG9yIC0gRGVjbGFyYXRpb24gY29sbGVjdG9yLlxuICAgKiBAcGFyYW0ge0FycmF5PHtuYW1lOiBzdHJpbmcsIG1vZGVsT3JPcHRpb25zOiA/LCBjYjogP30+fSBuZXN0ZWRGYWN0b3JpZXMgLSBOZXN0ZWQgZmFjdG9yeSBzaW5rLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFRyYWl0RGVmaW5pdGlvbj59IGxvY2FsVHJhaXRzIC0gTG9jYWwgdHJhaXQgc2luay5cbiAgICogQHBhcmFtIHtTZXF1ZW5jZVtdfSBzY29wZWRTZXF1ZW5jZXMgLSBTY29wZWQgc2VxdWVuY2Ugc2luay5cbiAgICogQHJldHVybnMge29iamVjdH0gLSBGYWN0b3J5IGJ1aWxkZXIuXG4gICAqL1xuICBfZmFjdG9yeUJ1aWxkZXIoY29sbGVjdG9yLCBuZXN0ZWRGYWN0b3JpZXMsIGxvY2FsVHJhaXRzLCBzY29wZWRTZXF1ZW5jZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGF0dHJOYW1lLCAvKiogQHR5cGUgez99ICovIHZhbHVlKSA9PiBjb2xsZWN0b3IuYXR0cmlidXRlKGF0dHJOYW1lLCB2YWx1ZSksXG4gICAgICB0cmFuc2llbnQ6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gYXR0ck5hbWUsIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUpID0+IGNvbGxlY3Rvci50cmFuc2llbnQoYXR0ck5hbWUsIHZhbHVlKSxcbiAgICAgIGFzc29jaWF0aW9uOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGFzc29jTmFtZSwgLyoqIEB0eXBlIHtBcnJheTw/Pn0gKi8gLi4uYXJncykgPT4gY29sbGVjdG9yLmFzc29jaWF0aW9uKGFzc29jTmFtZSwgLi4uYXJncyksXG4gICAgICBiZWZvcmU6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gcGhhc2UsIC8qKiBAdHlwZSB7P30gKi8gZm4pID0+IGNvbGxlY3Rvci5iZWZvcmUocGhhc2UsIGZuKSxcbiAgICAgIGFmdGVyOiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHBoYXNlLCAvKiogQHR5cGUgez99ICovIGZuKSA9PiBjb2xsZWN0b3IuYWZ0ZXIocGhhc2UsIGZuKSxcbiAgICAgIGluaXRpYWxpemVXaXRoOiAoLyoqIEB0eXBlIHs/fSAqLyBmbikgPT4gY29sbGVjdG9yLmluaXRpYWxpemVXaXRoKGZuKSxcbiAgICAgIHRvQ3JlYXRlOiAoLyoqIEB0eXBlIHs/fSAqLyBmbikgPT4gY29sbGVjdG9yLnRvQ3JlYXRlKGZuKSxcbiAgICAgIHNraXBDcmVhdGU6ICgpID0+IGNvbGxlY3Rvci5za2lwQ3JlYXRlKCksXG4gICAgICBzZXF1ZW5jZTogKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBzZXFOYW1lLCAvKiogQHR5cGUge0FycmF5PD8+fSAqLyAuLi5hcmdzKSA9PiBzY29wZWRTZXF1ZW5jZXMucHVzaChidWlsZFNlcXVlbmNlKHNlcU5hbWUsIGFyZ3MpKSxcbiAgICAgIHRyYWl0OiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHRyYWl0TmFtZSwgLyoqIEB0eXBlIHsoKGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovIHRyYWl0Q2IpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFpdENiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVUcmFpdCh0cmFpdE5hbWUsIHRyYWl0Q2IpXG5cbiAgICAgICAgICBpZiAobG9jYWxUcmFpdHMuaGFzKHRyYWl0TmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRGVmaW5pdGlvbkVycm9yKGBMb2NhbCB0cmFpdCBcIiR7dHJhaXROYW1lfVwiIGlzIGFscmVhZHkgZGVmaW5lZCBvbiB0aGlzIGZhY3RvcnlgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxvY2FsVHJhaXRzLnNldCh0cmFpdE5hbWUsIGNvbXBpbGVkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydE5hbWUodHJhaXROYW1lLCBcIlRyYWl0IGluY2x1ZGVcIilcbiAgICAgICAgICBjb2xsZWN0b3IuZGVjbGFyYXRpb25zLnB1c2godHJhaXRJbmNsdWRlRGVjbGFyYXRpb24odHJhaXROYW1lKSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZhY3Rvcnk6ICgvKiogQHR5cGUge3N0cmluZ30gKi8gY2hpbGROYW1lLCAvKiogQHR5cGUgez99ICovIGNoaWxkTW9kZWxPck9wdGlvbnMsIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRDYikgPT5cbiAgICAgICAgbmVzdGVkRmFjdG9yaWVzLnB1c2goe25hbWU6IGNoaWxkTmFtZSwgbW9kZWxPck9wdGlvbnM6IGNoaWxkTW9kZWxPck9wdGlvbnMsIGNiOiBjaGlsZENifSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Raised when a factory, trait or sequence is declared twice within the same
3
+ * registry, matching FactoryBot's duplicate-definition guard.
4
+ */
5
+ export class DuplicateDefinitionError extends FactoryError {
6
+ }
7
+ /**
8
+ * Raised when attribute or factory/trait resolution forms a cycle. The message
9
+ * always contains the full offending path so the author can break it.
10
+ */
11
+ export class FactoryCycleError extends FactoryError {
12
+ }
13
+ /**
14
+ * Base error for every Factory-framework failure so callers can catch the whole
15
+ * family with a single `instanceof FactoryError` check.
16
+ */
17
+ export class FactoryError extends Error {
18
+ /**
19
+ * Builds a factory error.
20
+ * @param {string} message - Human readable description of the failure.
21
+ */
22
+ constructor(message: string);
23
+ }
24
+ /**
25
+ * Raised when a definition is structurally invalid at declaration time (bad
26
+ * names, option shapes, event names, or model references).
27
+ */
28
+ export class InvalidDefinitionError extends FactoryError {
29
+ }
30
+ /**
31
+ * Raised when a build/create strategy is asked to construct a class that is not a
32
+ * supported, initialized Velocious backend record.
33
+ */
34
+ export class ModelContractError extends FactoryError {
35
+ }
36
+ /**
37
+ * Raised when setup-time mutation (define/modify/reset/sequence set/rewind) is
38
+ * attempted while the registry has in-flight evaluations.
39
+ */
40
+ export class RegistryBusyError extends FactoryError {
41
+ }
42
+ /**
43
+ * Raised when a lazy attribute references another attribute that does not exist.
44
+ */
45
+ export class UndefinedAttributeError extends FactoryError {
46
+ }
47
+ /**
48
+ * Raised when a strategy references a factory name that was never registered.
49
+ */
50
+ export class UndefinedFactoryError extends FactoryError {
51
+ }
52
+ /**
53
+ * Raised when a sequence name cannot be resolved in the factory-local or global scope.
54
+ */
55
+ export class UndefinedSequenceError extends FactoryError {
56
+ }
57
+ /**
58
+ * Raised when a trait name cannot be resolved in the factory-local or global scope.
59
+ */
60
+ export class UndefinedTraitError extends FactoryError {
61
+ }
62
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/errors.js"],"names":[],"mappings":"AAiBA;;;GAGG;AACH;CAAsD;AAsBtD;;;GAGG;AACH;CAA+C;AA7C/C;;;GAGG;AACH;IACE;;;OAGG;IACH,qBAFW,MAAM,EAKhB;CACF;AAkCD;;;GAGG;AACH;CAAoD;AAEpD;;;GAGG;AACH;CAAgD;AAEhD;;;GAGG;AACH;CAA+C;AA3B/C;;GAEG;AACH;CAAqD;AAlBrD;;GAEG;AACH;CAAmD;AAOnD;;GAEG;AACH;CAAoD;AARpD;;GAEG;AACH;CAAiD"}
@@ -0,0 +1,67 @@
1
+ // @ts-check
2
+ /**
3
+ * Base error for every Factory-framework failure so callers can catch the whole
4
+ * family with a single `instanceof FactoryError` check.
5
+ */
6
+ class FactoryError extends Error {
7
+ /**
8
+ * Builds a factory error.
9
+ * @param {string} message - Human readable description of the failure.
10
+ */
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = this.constructor.name;
14
+ }
15
+ }
16
+ /**
17
+ * Raised when a factory, trait or sequence is declared twice within the same
18
+ * registry, matching FactoryBot's duplicate-definition guard.
19
+ */
20
+ class DuplicateDefinitionError extends FactoryError {
21
+ }
22
+ /**
23
+ * Raised when a strategy references a factory name that was never registered.
24
+ */
25
+ class UndefinedFactoryError extends FactoryError {
26
+ }
27
+ /**
28
+ * Raised when a trait name cannot be resolved in the factory-local or global scope.
29
+ */
30
+ class UndefinedTraitError extends FactoryError {
31
+ }
32
+ /**
33
+ * Raised when a sequence name cannot be resolved in the factory-local or global scope.
34
+ */
35
+ class UndefinedSequenceError extends FactoryError {
36
+ }
37
+ /**
38
+ * Raised when a lazy attribute references another attribute that does not exist.
39
+ */
40
+ class UndefinedAttributeError extends FactoryError {
41
+ }
42
+ /**
43
+ * Raised when attribute or factory/trait resolution forms a cycle. The message
44
+ * always contains the full offending path so the author can break it.
45
+ */
46
+ class FactoryCycleError extends FactoryError {
47
+ }
48
+ /**
49
+ * Raised when a definition is structurally invalid at declaration time (bad
50
+ * names, option shapes, event names, or model references).
51
+ */
52
+ class InvalidDefinitionError extends FactoryError {
53
+ }
54
+ /**
55
+ * Raised when a build/create strategy is asked to construct a class that is not a
56
+ * supported, initialized Velocious backend record.
57
+ */
58
+ class ModelContractError extends FactoryError {
59
+ }
60
+ /**
61
+ * Raised when setup-time mutation (define/modify/reset/sequence set/rewind) is
62
+ * attempted while the registry has in-flight evaluations.
63
+ */
64
+ class RegistryBusyError extends FactoryError {
65
+ }
66
+ export { DuplicateDefinitionError, FactoryCycleError, FactoryError, InvalidDefinitionError, ModelContractError, RegistryBusyError, UndefinedAttributeError, UndefinedFactoryError, UndefinedSequenceError, UndefinedTraitError };
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZmFjdG9yeS9lcnJvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7R0FHRztBQUNILE1BQU0sWUFBYSxTQUFRLEtBQUs7SUFDOUI7OztPQUdHO0lBQ0gsWUFBWSxPQUFPO1FBQ2pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUE7SUFDbkMsQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSx3QkFBeUIsU0FBUSxZQUFZO0NBQUc7QUFFdEQ7O0dBRUc7QUFDSCxNQUFNLHFCQUFzQixTQUFRLFlBQVk7Q0FBRztBQUVuRDs7R0FFRztBQUNILE1BQU0sbUJBQW9CLFNBQVEsWUFBWTtDQUFHO0FBRWpEOztHQUVHO0FBQ0gsTUFBTSxzQkFBdUIsU0FBUSxZQUFZO0NBQUc7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLHVCQUF3QixTQUFRLFlBQVk7Q0FBRztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFrQixTQUFRLFlBQVk7Q0FBRztBQUUvQzs7O0dBR0c7QUFDSCxNQUFNLHNCQUF1QixTQUFRLFlBQVk7Q0FBRztBQUVwRDs7O0dBR0c7QUFDSCxNQUFNLGtCQUFtQixTQUFRLFlBQVk7Q0FBRztBQUVoRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFrQixTQUFRLFlBQVk7Q0FBRztBQUUvQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ3BCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBldmVyeSBGYWN0b3J5LWZyYW1ld29yayBmYWlsdXJlIHNvIGNhbGxlcnMgY2FuIGNhdGNoIHRoZSB3aG9sZVxuICogZmFtaWx5IHdpdGggYSBzaW5nbGUgYGluc3RhbmNlb2YgRmFjdG9yeUVycm9yYCBjaGVjay5cbiAqL1xuY2xhc3MgRmFjdG9yeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQnVpbGRzIGEgZmFjdG9yeSBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBIdW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmFpbHVyZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZVxuICB9XG59XG5cbi8qKlxuICogUmFpc2VkIHdoZW4gYSBmYWN0b3J5LCB0cmFpdCBvciBzZXF1ZW5jZSBpcyBkZWNsYXJlZCB0d2ljZSB3aXRoaW4gdGhlIHNhbWVcbiAqIHJlZ2lzdHJ5LCBtYXRjaGluZyBGYWN0b3J5Qm90J3MgZHVwbGljYXRlLWRlZmluaXRpb24gZ3VhcmQuXG4gKi9cbmNsYXNzIER1cGxpY2F0ZURlZmluaXRpb25FcnJvciBleHRlbmRzIEZhY3RvcnlFcnJvciB7fVxuXG4vKipcbiAqIFJhaXNlZCB3aGVuIGEgc3RyYXRlZ3kgcmVmZXJlbmNlcyBhIGZhY3RvcnkgbmFtZSB0aGF0IHdhcyBuZXZlciByZWdpc3RlcmVkLlxuICovXG5jbGFzcyBVbmRlZmluZWRGYWN0b3J5RXJyb3IgZXh0ZW5kcyBGYWN0b3J5RXJyb3Ige31cblxuLyoqXG4gKiBSYWlzZWQgd2hlbiBhIHRyYWl0IG5hbWUgY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBmYWN0b3J5LWxvY2FsIG9yIGdsb2JhbCBzY29wZS5cbiAqL1xuY2xhc3MgVW5kZWZpbmVkVHJhaXRFcnJvciBleHRlbmRzIEZhY3RvcnlFcnJvciB7fVxuXG4vKipcbiAqIFJhaXNlZCB3aGVuIGEgc2VxdWVuY2UgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gdGhlIGZhY3RvcnktbG9jYWwgb3IgZ2xvYmFsIHNjb3BlLlxuICovXG5jbGFzcyBVbmRlZmluZWRTZXF1ZW5jZUVycm9yIGV4dGVuZHMgRmFjdG9yeUVycm9yIHt9XG5cbi8qKlxuICogUmFpc2VkIHdoZW4gYSBsYXp5IGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFub3RoZXIgYXR0cmlidXRlIHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmNsYXNzIFVuZGVmaW5lZEF0dHJpYnV0ZUVycm9yIGV4dGVuZHMgRmFjdG9yeUVycm9yIHt9XG5cbi8qKlxuICogUmFpc2VkIHdoZW4gYXR0cmlidXRlIG9yIGZhY3RvcnkvdHJhaXQgcmVzb2x1dGlvbiBmb3JtcyBhIGN5Y2xlLiBUaGUgbWVzc2FnZVxuICogYWx3YXlzIGNvbnRhaW5zIHRoZSBmdWxsIG9mZmVuZGluZyBwYXRoIHNvIHRoZSBhdXRob3IgY2FuIGJyZWFrIGl0LlxuICovXG5jbGFzcyBGYWN0b3J5Q3ljbGVFcnJvciBleHRlbmRzIEZhY3RvcnlFcnJvciB7fVxuXG4vKipcbiAqIFJhaXNlZCB3aGVuIGEgZGVmaW5pdGlvbiBpcyBzdHJ1Y3R1cmFsbHkgaW52YWxpZCBhdCBkZWNsYXJhdGlvbiB0aW1lIChiYWRcbiAqIG5hbWVzLCBvcHRpb24gc2hhcGVzLCBldmVudCBuYW1lcywgb3IgbW9kZWwgcmVmZXJlbmNlcykuXG4gKi9cbmNsYXNzIEludmFsaWREZWZpbml0aW9uRXJyb3IgZXh0ZW5kcyBGYWN0b3J5RXJyb3Ige31cblxuLyoqXG4gKiBSYWlzZWQgd2hlbiBhIGJ1aWxkL2NyZWF0ZSBzdHJhdGVneSBpcyBhc2tlZCB0byBjb25zdHJ1Y3QgYSBjbGFzcyB0aGF0IGlzIG5vdCBhXG4gKiBzdXBwb3J0ZWQsIGluaXRpYWxpemVkIFZlbG9jaW91cyBiYWNrZW5kIHJlY29yZC5cbiAqL1xuY2xhc3MgTW9kZWxDb250cmFjdEVycm9yIGV4dGVuZHMgRmFjdG9yeUVycm9yIHt9XG5cbi8qKlxuICogUmFpc2VkIHdoZW4gc2V0dXAtdGltZSBtdXRhdGlvbiAoZGVmaW5lL21vZGlmeS9yZXNldC9zZXF1ZW5jZSBzZXQvcmV3aW5kKSBpc1xuICogYXR0ZW1wdGVkIHdoaWxlIHRoZSByZWdpc3RyeSBoYXMgaW4tZmxpZ2h0IGV2YWx1YXRpb25zLlxuICovXG5jbGFzcyBSZWdpc3RyeUJ1c3lFcnJvciBleHRlbmRzIEZhY3RvcnlFcnJvciB7fVxuXG5leHBvcnQge1xuICBEdXBsaWNhdGVEZWZpbml0aW9uRXJyb3IsXG4gIEZhY3RvcnlDeWNsZUVycm9yLFxuICBGYWN0b3J5RXJyb3IsXG4gIEludmFsaWREZWZpbml0aW9uRXJyb3IsXG4gIE1vZGVsQ29udHJhY3RFcnJvcixcbiAgUmVnaXN0cnlCdXN5RXJyb3IsXG4gIFVuZGVmaW5lZEF0dHJpYnV0ZUVycm9yLFxuICBVbmRlZmluZWRGYWN0b3J5RXJyb3IsXG4gIFVuZGVmaW5lZFNlcXVlbmNlRXJyb3IsXG4gIFVuZGVmaW5lZFRyYWl0RXJyb3Jcbn1cbiJdfQ==