velocious 1.0.597 → 1.0.598

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.
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Default maximum number of cache-busted factory definition import attempts a
3
+ * single Node process may perform. Chosen conservatively from the
4
+ * `factory-esm-reload-retention` benchmark evidence: each cache-busted import
5
+ * retains roughly 6 KB of heap in Node's ESM module map, so the default bounds
6
+ * retained definition modules to a few tens of MB before the owning process
7
+ * must be recycled. This module is intentionally Node-only; browser-safe factory
8
+ * code must never import it.
9
+ */
10
+ export declare const DEFAULT_DEFINITION_RELOAD_BUDGET = 4096;
11
+ /**
12
+ * Rejected when code tries to configure the process-global reload budget more
13
+ * than once or after any valid cache-busted import reservation was attempted.
14
+ * Retained ESM modules and their accounting live for the process lifetime, so
15
+ * changing the budget can never begin a new in-process policy epoch.
16
+ */
17
+ export declare class DefinitionReloadConfigurationError extends Error {
18
+ budget: number;
19
+ configured: boolean;
20
+ current: number;
21
+ requestedBudget: number;
22
+ /**
23
+ * Creates the error.
24
+ * @param {object} args - Details.
25
+ * @param {number} args.current - Cache-busted imports already reserved.
26
+ * @param {number} args.budget - Active process-global import budget.
27
+ * @param {number} args.requestedBudget - Rejected replacement budget.
28
+ * @param {boolean} args.configured - Whether an explicit budget was already configured.
29
+ */
30
+ constructor({ budget, configured, current, requestedBudget }: {
31
+ current: number;
32
+ budget: number;
33
+ requestedBudget: number;
34
+ configured: boolean;
35
+ });
36
+ }
37
+ /**
38
+ * Rejected when a reload would push the process over its cache-busted import
39
+ * budget. The rejection happens synchronously before any registry reset or
40
+ * import, so the currently loaded registry stays usable. Node never evicts
41
+ * retained ESM module instances, so only recycling/restarting the owning Node
42
+ * process reclaims the memory and refreshes edited dependency modules.
43
+ */
44
+ export declare class DefinitionRecycleRequiredError extends Error {
45
+ current: number;
46
+ budget: number;
47
+ requested: number;
48
+ /**
49
+ * Creates the error.
50
+ * @param {object} args - Details.
51
+ * @param {number} args.current - Cache-busted import attempts already reserved in this process.
52
+ * @param {number} args.budget - Process-global import budget.
53
+ * @param {number} args.requested - Import attempts the rejected reload needed.
54
+ */
55
+ constructor({ current, budget, requested }: {
56
+ current: number;
57
+ budget: number;
58
+ requested: number;
59
+ });
60
+ }
61
+ /**
62
+ * Returns the process-global cache-busted import budget.
63
+ * @returns {number} - The budget.
64
+ */
65
+ export declare function getDefinitionReloadBudget(): number;
66
+ /**
67
+ * Reads the cache-busted import attempts reserved so far in this process,
68
+ * across every registry and target. Combined with {@link getDefinitionReloadBudget}
69
+ * this is the deterministic process-global census for the recycle policy.
70
+ * @returns {number} - Reserved count.
71
+ */
72
+ export declare function peekDefinitionReloadBudget(): number;
73
+ /**
74
+ * Configures the one process-global import budget exactly once and only before
75
+ * the first valid reservation attempt. There is exactly one budget for the whole
76
+ * process, so no combination of registries or targets can create independent
77
+ * budgets that defeat the global limit. Retained-import accounting is never
78
+ * reset in-process.
79
+ * @param {number} budget - New budget.
80
+ * @returns {void}
81
+ */
82
+ export declare function setDefinitionReloadBudget(budget: number): void;
83
+ /**
84
+ * Preflights and reserves a whole reload batch synchronously. Malformed counts
85
+ * are rejected before configuration is sealed or accounting changes. Every valid
86
+ * request, including zero and a rejected over-budget request, seals configuration
87
+ * before capacity is evaluated. Throws {@link DefinitionRecycleRequiredError}
88
+ * when the requested batch would push the process over its budget. The check and
89
+ * reservation run in one synchronous step, so concurrent reloads cannot race past
90
+ * the budget. The reservation is deliberately conservative: it covers every
91
+ * import attempt in the batch, so a mid-batch import failure still counts its
92
+ * attempts as retained modules.
93
+ * @param {number} requested - Cache-busted import attempts the reload will perform.
94
+ * @returns {void}
95
+ */
96
+ export declare function reserveDefinitionReloadBudget(requested: number): void;
97
+ //# sourceMappingURL=definition-reload-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition-reload-policy.d.ts","sourceRoot":"","sources":["../../../../../src/testing/factory/node/definition-reload-policy.js"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,OAAO,CAAA;AAEpD;;;;;GAKG;AACH,qBAAa,kCAAmC,SAAQ,KAAK;IAgBpD,MAAM;IACN,UAAU;IACV,OAAO;IACP,eAAe;IAlBtB;;;;;;;OAOG;IACH,YAAY,EAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAC,EALvD;QAAqB,OAAO,EAApB,MAAM,CACd;QAAqB,MAAM,EAAnB,MAAM,CACd;QAAqB,eAAe,EAA5B,MAAM,CACd;QAAsB,UAAU,EAAxB,OAAO,CACjB;KACyD,EAWzD;CACF;AAED;;;;;;GAMG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;IAWhD,OAAO;IACP,MAAM;IACN,SAAS;IAZhB;;;;;;OAMG;IACH,YAAY,EAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAC,EAJrC;QAAqB,OAAO,EAApB,MAAM,CACd;QAAqB,MAAM,EAAnB,MAAM,CACd;QAAqB,SAAS,EAAtB,MAAM,CAChB;KACuC,EAMvC;CACF;AAcD;;;GAGG;AACH,wBAAgB,yBAAyB,IAF5B,MAAM,CAIlB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAF7B,MAAM,CAIlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAHrC,MAGqC,GAFnC,IAAI,CAkBhB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAH5C,MAG4C,GAF1C,IAAI,CAchB"}
@@ -0,0 +1,133 @@
1
+ // @ts-check
2
+ /**
3
+ * Default maximum number of cache-busted factory definition import attempts a
4
+ * single Node process may perform. Chosen conservatively from the
5
+ * `factory-esm-reload-retention` benchmark evidence: each cache-busted import
6
+ * retains roughly 6 KB of heap in Node's ESM module map, so the default bounds
7
+ * retained definition modules to a few tens of MB before the owning process
8
+ * must be recycled. This module is intentionally Node-only; browser-safe factory
9
+ * code must never import it.
10
+ */
11
+ export const DEFAULT_DEFINITION_RELOAD_BUDGET = 4096;
12
+ /**
13
+ * Rejected when code tries to configure the process-global reload budget more
14
+ * than once or after any valid cache-busted import reservation was attempted.
15
+ * Retained ESM modules and their accounting live for the process lifetime, so
16
+ * changing the budget can never begin a new in-process policy epoch.
17
+ */
18
+ export class DefinitionReloadConfigurationError extends Error {
19
+ /**
20
+ * Creates the error.
21
+ * @param {object} args - Details.
22
+ * @param {number} args.current - Cache-busted imports already reserved.
23
+ * @param {number} args.budget - Active process-global import budget.
24
+ * @param {number} args.requestedBudget - Rejected replacement budget.
25
+ * @param {boolean} args.configured - Whether an explicit budget was already configured.
26
+ */
27
+ constructor({ budget, configured, current, requestedBudget }) {
28
+ const reason = configured
29
+ ? "the process-global definition reload budget was already configured"
30
+ : "a definition reload reservation was already attempted";
31
+ super(`Cannot configure definition reload budget to ${requestedBudget}: ${reason} (current=${current}, budget=${budget}). Configuration is allowed exactly once before the first reservation; only process exit resets retained-module accounting.`);
32
+ this.name = "DefinitionReloadConfigurationError";
33
+ this.budget = budget;
34
+ this.configured = configured;
35
+ this.current = current;
36
+ this.requestedBudget = requestedBudget;
37
+ }
38
+ }
39
+ /**
40
+ * Rejected when a reload would push the process over its cache-busted import
41
+ * budget. The rejection happens synchronously before any registry reset or
42
+ * import, so the currently loaded registry stays usable. Node never evicts
43
+ * retained ESM module instances, so only recycling/restarting the owning Node
44
+ * process reclaims the memory and refreshes edited dependency modules.
45
+ */
46
+ export class DefinitionRecycleRequiredError extends Error {
47
+ /**
48
+ * Creates the error.
49
+ * @param {object} args - Details.
50
+ * @param {number} args.current - Cache-busted import attempts already reserved in this process.
51
+ * @param {number} args.budget - Process-global import budget.
52
+ * @param {number} args.requested - Import attempts the rejected reload needed.
53
+ */
54
+ constructor({ current, budget, requested }) {
55
+ super(`Factory definition reload import budget exhausted (current=${current}, budget=${budget}, requested=${requested}). Recycle or restart the owning Node process: every reload imports a fresh cache-busted module instance and Node never evicts them, so process recycling is the only reclamation boundary.`);
56
+ this.name = "DefinitionRecycleRequiredError";
57
+ this.current = current;
58
+ this.budget = budget;
59
+ this.requested = requested;
60
+ }
61
+ }
62
+ /** @type {number} - The single process-global import budget. */
63
+ let importBudget = DEFAULT_DEFINITION_RELOAD_BUDGET;
64
+ /** @type {number} - Cache-busted import attempts reserved so far across every registry and target. */
65
+ let reservedImports = 0;
66
+ /** @type {boolean} - Whether the process-global budget was explicitly configured. */
67
+ let budgetConfigured = false;
68
+ /** @type {boolean} - Whether any valid complete reload batch reservation was attempted. */
69
+ let reservationStarted = false;
70
+ /**
71
+ * Returns the process-global cache-busted import budget.
72
+ * @returns {number} - The budget.
73
+ */
74
+ export function getDefinitionReloadBudget() {
75
+ return importBudget;
76
+ }
77
+ /**
78
+ * Reads the cache-busted import attempts reserved so far in this process,
79
+ * across every registry and target. Combined with {@link getDefinitionReloadBudget}
80
+ * this is the deterministic process-global census for the recycle policy.
81
+ * @returns {number} - Reserved count.
82
+ */
83
+ export function peekDefinitionReloadBudget() {
84
+ return reservedImports;
85
+ }
86
+ /**
87
+ * Configures the one process-global import budget exactly once and only before
88
+ * the first valid reservation attempt. There is exactly one budget for the whole
89
+ * process, so no combination of registries or targets can create independent
90
+ * budgets that defeat the global limit. Retained-import accounting is never
91
+ * reset in-process.
92
+ * @param {number} budget - New budget.
93
+ * @returns {void}
94
+ */
95
+ export function setDefinitionReloadBudget(budget) {
96
+ if (!Number.isInteger(budget) || budget < 1) {
97
+ throw new TypeError(`Definition reload budget must be a positive integer, got ${JSON.stringify(budget)}`);
98
+ }
99
+ if (budgetConfigured || reservationStarted) {
100
+ throw new DefinitionReloadConfigurationError({
101
+ budget: importBudget,
102
+ configured: budgetConfigured,
103
+ current: reservedImports,
104
+ requestedBudget: budget
105
+ });
106
+ }
107
+ importBudget = budget;
108
+ budgetConfigured = true;
109
+ }
110
+ /**
111
+ * Preflights and reserves a whole reload batch synchronously. Malformed counts
112
+ * are rejected before configuration is sealed or accounting changes. Every valid
113
+ * request, including zero and a rejected over-budget request, seals configuration
114
+ * before capacity is evaluated. Throws {@link DefinitionRecycleRequiredError}
115
+ * when the requested batch would push the process over its budget. The check and
116
+ * reservation run in one synchronous step, so concurrent reloads cannot race past
117
+ * the budget. The reservation is deliberately conservative: it covers every
118
+ * import attempt in the batch, so a mid-batch import failure still counts its
119
+ * attempts as retained modules.
120
+ * @param {number} requested - Cache-busted import attempts the reload will perform.
121
+ * @returns {void}
122
+ */
123
+ export function reserveDefinitionReloadBudget(requested) {
124
+ if (!Number.isInteger(requested) || requested < 0) {
125
+ throw new TypeError(`Definition reload reservation must be a non-negative integer, got ${typeof requested} ${String(requested)}`);
126
+ }
127
+ reservationStarted = true;
128
+ if (reservedImports + requested > importBudget) {
129
+ throw new DefinitionRecycleRequiredError({ current: reservedImports, budget: importBudget, requested });
130
+ }
131
+ reservedImports += requested;
132
+ }
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1yZWxvYWQtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZmFjdG9yeS9ub2RlL2RlZmluaXRpb24tcmVsb2FkLXBvbGljeS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLENBQUE7QUFFcEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sa0NBQW1DLFNBQVEsS0FBSztJQUMzRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxVQUFVO1lBQ3ZCLENBQUMsQ0FBQyxvRUFBb0U7WUFDdEUsQ0FBQyxDQUFDLHVEQUF1RCxDQUFBO1FBRTNELEtBQUssQ0FBQyxnREFBZ0QsZUFBZSxLQUFLLE1BQU0sYUFBYSxPQUFPLFlBQVksTUFBTSw2SEFBNkgsQ0FBQyxDQUFBO1FBQ3BQLElBQUksQ0FBQyxJQUFJLEdBQUcsb0NBQW9DLENBQUE7UUFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7SUFDeEMsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLDhCQUErQixTQUFRLEtBQUs7SUFDdkQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO1FBQ3RDLEtBQUssQ0FBQyw4REFBOEQsT0FBTyxZQUFZLE1BQU0sZUFBZSxTQUFTLDZMQUE2TCxDQUFDLENBQUE7UUFDblQsSUFBSSxDQUFDLElBQUksR0FBRyxnQ0FBZ0MsQ0FBQTtRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUM1QixDQUFDO0NBQ0Y7QUFFRCxnRUFBZ0U7QUFDaEUsSUFBSSxZQUFZLEdBQUcsZ0NBQWdDLENBQUE7QUFFbkQsc0dBQXNHO0FBQ3RHLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQTtBQUV2QixxRkFBcUY7QUFDckYsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7QUFFNUIsMkZBQTJGO0FBQzNGLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFBO0FBRTlCOzs7R0FHRztBQUNILE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsT0FBTyxZQUFZLENBQUE7QUFDckIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQjtJQUN4QyxPQUFPLGVBQWUsQ0FBQTtBQUN4QixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsTUFBTTtJQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyw0REFBNEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDM0csQ0FBQztJQUVELElBQUksZ0JBQWdCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksa0NBQWtDLENBQUM7WUFDM0MsTUFBTSxFQUFFLFlBQVk7WUFDcEIsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixlQUFlLEVBQUUsTUFBTTtTQUN4QixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsWUFBWSxHQUFHLE1BQU0sQ0FBQTtJQUNyQixnQkFBZ0IsR0FBRyxJQUFJLENBQUE7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxTQUFTO0lBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksU0FBUyxDQUFDLHFFQUFxRSxPQUFPLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25JLENBQUM7SUFFRCxrQkFBa0IsR0FBRyxJQUFJLENBQUE7SUFFekIsSUFBSSxlQUFlLEdBQUcsU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSw4QkFBOEIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZHLENBQUM7SUFFRCxlQUFlLElBQUksU0FBUyxDQUFBO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGNhY2hlLWJ1c3RlZCBmYWN0b3J5IGRlZmluaXRpb24gaW1wb3J0IGF0dGVtcHRzIGFcbiAqIHNpbmdsZSBOb2RlIHByb2Nlc3MgbWF5IHBlcmZvcm0uIENob3NlbiBjb25zZXJ2YXRpdmVseSBmcm9tIHRoZVxuICogYGZhY3RvcnktZXNtLXJlbG9hZC1yZXRlbnRpb25gIGJlbmNobWFyayBldmlkZW5jZTogZWFjaCBjYWNoZS1idXN0ZWQgaW1wb3J0XG4gKiByZXRhaW5zIHJvdWdobHkgNiBLQiBvZiBoZWFwIGluIE5vZGUncyBFU00gbW9kdWxlIG1hcCwgc28gdGhlIGRlZmF1bHQgYm91bmRzXG4gKiByZXRhaW5lZCBkZWZpbml0aW9uIG1vZHVsZXMgdG8gYSBmZXcgdGVucyBvZiBNQiBiZWZvcmUgdGhlIG93bmluZyBwcm9jZXNzXG4gKiBtdXN0IGJlIHJlY3ljbGVkLiBUaGlzIG1vZHVsZSBpcyBpbnRlbnRpb25hbGx5IE5vZGUtb25seTsgYnJvd3Nlci1zYWZlIGZhY3RvcnlcbiAqIGNvZGUgbXVzdCBuZXZlciBpbXBvcnQgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RFRklOSVRJT05fUkVMT0FEX0JVREdFVCA9IDQwOTZcblxuLyoqXG4gKiBSZWplY3RlZCB3aGVuIGNvZGUgdHJpZXMgdG8gY29uZmlndXJlIHRoZSBwcm9jZXNzLWdsb2JhbCByZWxvYWQgYnVkZ2V0IG1vcmVcbiAqIHRoYW4gb25jZSBvciBhZnRlciBhbnkgdmFsaWQgY2FjaGUtYnVzdGVkIGltcG9ydCByZXNlcnZhdGlvbiB3YXMgYXR0ZW1wdGVkLlxuICogUmV0YWluZWQgRVNNIG1vZHVsZXMgYW5kIHRoZWlyIGFjY291bnRpbmcgbGl2ZSBmb3IgdGhlIHByb2Nlc3MgbGlmZXRpbWUsIHNvXG4gKiBjaGFuZ2luZyB0aGUgYnVkZ2V0IGNhbiBuZXZlciBiZWdpbiBhIG5ldyBpbi1wcm9jZXNzIHBvbGljeSBlcG9jaC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlZmluaXRpb25SZWxvYWRDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBEZXRhaWxzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jdXJyZW50IC0gQ2FjaGUtYnVzdGVkIGltcG9ydHMgYWxyZWFkeSByZXNlcnZlZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYnVkZ2V0IC0gQWN0aXZlIHByb2Nlc3MtZ2xvYmFsIGltcG9ydCBidWRnZXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLnJlcXVlc3RlZEJ1ZGdldCAtIFJlamVjdGVkIHJlcGxhY2VtZW50IGJ1ZGdldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhcmdzLmNvbmZpZ3VyZWQgLSBXaGV0aGVyIGFuIGV4cGxpY2l0IGJ1ZGdldCB3YXMgYWxyZWFkeSBjb25maWd1cmVkLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2J1ZGdldCwgY29uZmlndXJlZCwgY3VycmVudCwgcmVxdWVzdGVkQnVkZ2V0fSkge1xuICAgIGNvbnN0IHJlYXNvbiA9IGNvbmZpZ3VyZWRcbiAgICAgID8gXCJ0aGUgcHJvY2Vzcy1nbG9iYWwgZGVmaW5pdGlvbiByZWxvYWQgYnVkZ2V0IHdhcyBhbHJlYWR5IGNvbmZpZ3VyZWRcIlxuICAgICAgOiBcImEgZGVmaW5pdGlvbiByZWxvYWQgcmVzZXJ2YXRpb24gd2FzIGFscmVhZHkgYXR0ZW1wdGVkXCJcblxuICAgIHN1cGVyKGBDYW5ub3QgY29uZmlndXJlIGRlZmluaXRpb24gcmVsb2FkIGJ1ZGdldCB0byAke3JlcXVlc3RlZEJ1ZGdldH06ICR7cmVhc29ufSAoY3VycmVudD0ke2N1cnJlbnR9LCBidWRnZXQ9JHtidWRnZXR9KS4gQ29uZmlndXJhdGlvbiBpcyBhbGxvd2VkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpcnN0IHJlc2VydmF0aW9uOyBvbmx5IHByb2Nlc3MgZXhpdCByZXNldHMgcmV0YWluZWQtbW9kdWxlIGFjY291bnRpbmcuYClcbiAgICB0aGlzLm5hbWUgPSBcIkRlZmluaXRpb25SZWxvYWRDb25maWd1cmF0aW9uRXJyb3JcIlxuICAgIHRoaXMuYnVkZ2V0ID0gYnVkZ2V0XG4gICAgdGhpcy5jb25maWd1cmVkID0gY29uZmlndXJlZFxuICAgIHRoaXMuY3VycmVudCA9IGN1cnJlbnRcbiAgICB0aGlzLnJlcXVlc3RlZEJ1ZGdldCA9IHJlcXVlc3RlZEJ1ZGdldFxuICB9XG59XG5cbi8qKlxuICogUmVqZWN0ZWQgd2hlbiBhIHJlbG9hZCB3b3VsZCBwdXNoIHRoZSBwcm9jZXNzIG92ZXIgaXRzIGNhY2hlLWJ1c3RlZCBpbXBvcnRcbiAqIGJ1ZGdldC4gVGhlIHJlamVjdGlvbiBoYXBwZW5zIHN5bmNocm9ub3VzbHkgYmVmb3JlIGFueSByZWdpc3RyeSByZXNldCBvclxuICogaW1wb3J0LCBzbyB0aGUgY3VycmVudGx5IGxvYWRlZCByZWdpc3RyeSBzdGF5cyB1c2FibGUuIE5vZGUgbmV2ZXIgZXZpY3RzXG4gKiByZXRhaW5lZCBFU00gbW9kdWxlIGluc3RhbmNlcywgc28gb25seSByZWN5Y2xpbmcvcmVzdGFydGluZyB0aGUgb3duaW5nIE5vZGVcbiAqIHByb2Nlc3MgcmVjbGFpbXMgdGhlIG1lbW9yeSBhbmQgcmVmcmVzaGVzIGVkaXRlZCBkZXBlbmRlbmN5IG1vZHVsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZpbml0aW9uUmVjeWNsZVJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBEZXRhaWxzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jdXJyZW50IC0gQ2FjaGUtYnVzdGVkIGltcG9ydCBhdHRlbXB0cyBhbHJlYWR5IHJlc2VydmVkIGluIHRoaXMgcHJvY2Vzcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYnVkZ2V0IC0gUHJvY2Vzcy1nbG9iYWwgaW1wb3J0IGJ1ZGdldC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MucmVxdWVzdGVkIC0gSW1wb3J0IGF0dGVtcHRzIHRoZSByZWplY3RlZCByZWxvYWQgbmVlZGVkLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2N1cnJlbnQsIGJ1ZGdldCwgcmVxdWVzdGVkfSkge1xuICAgIHN1cGVyKGBGYWN0b3J5IGRlZmluaXRpb24gcmVsb2FkIGltcG9ydCBidWRnZXQgZXhoYXVzdGVkIChjdXJyZW50PSR7Y3VycmVudH0sIGJ1ZGdldD0ke2J1ZGdldH0sIHJlcXVlc3RlZD0ke3JlcXVlc3RlZH0pLiBSZWN5Y2xlIG9yIHJlc3RhcnQgdGhlIG93bmluZyBOb2RlIHByb2Nlc3M6IGV2ZXJ5IHJlbG9hZCBpbXBvcnRzIGEgZnJlc2ggY2FjaGUtYnVzdGVkIG1vZHVsZSBpbnN0YW5jZSBhbmQgTm9kZSBuZXZlciBldmljdHMgdGhlbSwgc28gcHJvY2VzcyByZWN5Y2xpbmcgaXMgdGhlIG9ubHkgcmVjbGFtYXRpb24gYm91bmRhcnkuYClcbiAgICB0aGlzLm5hbWUgPSBcIkRlZmluaXRpb25SZWN5Y2xlUmVxdWlyZWRFcnJvclwiXG4gICAgdGhpcy5jdXJyZW50ID0gY3VycmVudFxuICAgIHRoaXMuYnVkZ2V0ID0gYnVkZ2V0XG4gICAgdGhpcy5yZXF1ZXN0ZWQgPSByZXF1ZXN0ZWRcbiAgfVxufVxuXG4vKiogQHR5cGUge251bWJlcn0gLSBUaGUgc2luZ2xlIHByb2Nlc3MtZ2xvYmFsIGltcG9ydCBidWRnZXQuICovXG5sZXQgaW1wb3J0QnVkZ2V0ID0gREVGQVVMVF9ERUZJTklUSU9OX1JFTE9BRF9CVURHRVRcblxuLyoqIEB0eXBlIHtudW1iZXJ9IC0gQ2FjaGUtYnVzdGVkIGltcG9ydCBhdHRlbXB0cyByZXNlcnZlZCBzbyBmYXIgYWNyb3NzIGV2ZXJ5IHJlZ2lzdHJ5IGFuZCB0YXJnZXQuICovXG5sZXQgcmVzZXJ2ZWRJbXBvcnRzID0gMFxuXG4vKiogQHR5cGUge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcHJvY2Vzcy1nbG9iYWwgYnVkZ2V0IHdhcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQuICovXG5sZXQgYnVkZ2V0Q29uZmlndXJlZCA9IGZhbHNlXG5cbi8qKiBAdHlwZSB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFueSB2YWxpZCBjb21wbGV0ZSByZWxvYWQgYmF0Y2ggcmVzZXJ2YXRpb24gd2FzIGF0dGVtcHRlZC4gKi9cbmxldCByZXNlcnZhdGlvblN0YXJ0ZWQgPSBmYWxzZVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHByb2Nlc3MtZ2xvYmFsIGNhY2hlLWJ1c3RlZCBpbXBvcnQgYnVkZ2V0LlxuICogQHJldHVybnMge251bWJlcn0gLSBUaGUgYnVkZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5pdGlvblJlbG9hZEJ1ZGdldCgpIHtcbiAgcmV0dXJuIGltcG9ydEJ1ZGdldFxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjYWNoZS1idXN0ZWQgaW1wb3J0IGF0dGVtcHRzIHJlc2VydmVkIHNvIGZhciBpbiB0aGlzIHByb2Nlc3MsXG4gKiBhY3Jvc3MgZXZlcnkgcmVnaXN0cnkgYW5kIHRhcmdldC4gQ29tYmluZWQgd2l0aCB7QGxpbmsgZ2V0RGVmaW5pdGlvblJlbG9hZEJ1ZGdldH1cbiAqIHRoaXMgaXMgdGhlIGRldGVybWluaXN0aWMgcHJvY2Vzcy1nbG9iYWwgY2Vuc3VzIGZvciB0aGUgcmVjeWNsZSBwb2xpY3kuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFJlc2VydmVkIGNvdW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGVla0RlZmluaXRpb25SZWxvYWRCdWRnZXQoKSB7XG4gIHJldHVybiByZXNlcnZlZEltcG9ydHNcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBvbmUgcHJvY2Vzcy1nbG9iYWwgaW1wb3J0IGJ1ZGdldCBleGFjdGx5IG9uY2UgYW5kIG9ubHkgYmVmb3JlXG4gKiB0aGUgZmlyc3QgdmFsaWQgcmVzZXJ2YXRpb24gYXR0ZW1wdC4gVGhlcmUgaXMgZXhhY3RseSBvbmUgYnVkZ2V0IGZvciB0aGUgd2hvbGVcbiAqIHByb2Nlc3MsIHNvIG5vIGNvbWJpbmF0aW9uIG9mIHJlZ2lzdHJpZXMgb3IgdGFyZ2V0cyBjYW4gY3JlYXRlIGluZGVwZW5kZW50XG4gKiBidWRnZXRzIHRoYXQgZGVmZWF0IHRoZSBnbG9iYWwgbGltaXQuIFJldGFpbmVkLWltcG9ydCBhY2NvdW50aW5nIGlzIG5ldmVyXG4gKiByZXNldCBpbi1wcm9jZXNzLlxuICogQHBhcmFtIHtudW1iZXJ9IGJ1ZGdldCAtIE5ldyBidWRnZXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmluaXRpb25SZWxvYWRCdWRnZXQoYnVkZ2V0KSB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihidWRnZXQpIHx8IGJ1ZGdldCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBEZWZpbml0aW9uIHJlbG9hZCBidWRnZXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGdvdCAke0pTT04uc3RyaW5naWZ5KGJ1ZGdldCl9YClcbiAgfVxuXG4gIGlmIChidWRnZXRDb25maWd1cmVkIHx8IHJlc2VydmF0aW9uU3RhcnRlZCkge1xuICAgIHRocm93IG5ldyBEZWZpbml0aW9uUmVsb2FkQ29uZmlndXJhdGlvbkVycm9yKHtcbiAgICAgIGJ1ZGdldDogaW1wb3J0QnVkZ2V0LFxuICAgICAgY29uZmlndXJlZDogYnVkZ2V0Q29uZmlndXJlZCxcbiAgICAgIGN1cnJlbnQ6IHJlc2VydmVkSW1wb3J0cyxcbiAgICAgIHJlcXVlc3RlZEJ1ZGdldDogYnVkZ2V0XG4gICAgfSlcbiAgfVxuXG4gIGltcG9ydEJ1ZGdldCA9IGJ1ZGdldFxuICBidWRnZXRDb25maWd1cmVkID0gdHJ1ZVxufVxuXG4vKipcbiAqIFByZWZsaWdodHMgYW5kIHJlc2VydmVzIGEgd2hvbGUgcmVsb2FkIGJhdGNoIHN5bmNocm9ub3VzbHkuIE1hbGZvcm1lZCBjb3VudHNcbiAqIGFyZSByZWplY3RlZCBiZWZvcmUgY29uZmlndXJhdGlvbiBpcyBzZWFsZWQgb3IgYWNjb3VudGluZyBjaGFuZ2VzLiBFdmVyeSB2YWxpZFxuICogcmVxdWVzdCwgaW5jbHVkaW5nIHplcm8gYW5kIGEgcmVqZWN0ZWQgb3Zlci1idWRnZXQgcmVxdWVzdCwgc2VhbHMgY29uZmlndXJhdGlvblxuICogYmVmb3JlIGNhcGFjaXR5IGlzIGV2YWx1YXRlZC4gVGhyb3dzIHtAbGluayBEZWZpbml0aW9uUmVjeWNsZVJlcXVpcmVkRXJyb3J9XG4gKiB3aGVuIHRoZSByZXF1ZXN0ZWQgYmF0Y2ggd291bGQgcHVzaCB0aGUgcHJvY2VzcyBvdmVyIGl0cyBidWRnZXQuIFRoZSBjaGVjayBhbmRcbiAqIHJlc2VydmF0aW9uIHJ1biBpbiBvbmUgc3luY2hyb25vdXMgc3RlcCwgc28gY29uY3VycmVudCByZWxvYWRzIGNhbm5vdCByYWNlIHBhc3RcbiAqIHRoZSBidWRnZXQuIFRoZSByZXNlcnZhdGlvbiBpcyBkZWxpYmVyYXRlbHkgY29uc2VydmF0aXZlOiBpdCBjb3ZlcnMgZXZlcnlcbiAqIGltcG9ydCBhdHRlbXB0IGluIHRoZSBiYXRjaCwgc28gYSBtaWQtYmF0Y2ggaW1wb3J0IGZhaWx1cmUgc3RpbGwgY291bnRzIGl0c1xuICogYXR0ZW1wdHMgYXMgcmV0YWluZWQgbW9kdWxlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXF1ZXN0ZWQgLSBDYWNoZS1idXN0ZWQgaW1wb3J0IGF0dGVtcHRzIHRoZSByZWxvYWQgd2lsbCBwZXJmb3JtLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNlcnZlRGVmaW5pdGlvblJlbG9hZEJ1ZGdldChyZXF1ZXN0ZWQpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJlcXVlc3RlZCkgfHwgcmVxdWVzdGVkIDwgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYERlZmluaXRpb24gcmVsb2FkIHJlc2VydmF0aW9uIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7dHlwZW9mIHJlcXVlc3RlZH0gJHtTdHJpbmcocmVxdWVzdGVkKX1gKVxuICB9XG5cbiAgcmVzZXJ2YXRpb25TdGFydGVkID0gdHJ1ZVxuXG4gIGlmIChyZXNlcnZlZEltcG9ydHMgKyByZXF1ZXN0ZWQgPiBpbXBvcnRCdWRnZXQpIHtcbiAgICB0aHJvdyBuZXcgRGVmaW5pdGlvblJlY3ljbGVSZXF1aXJlZEVycm9yKHtjdXJyZW50OiByZXNlcnZlZEltcG9ydHMsIGJ1ZGdldDogaW1wb3J0QnVkZ2V0LCByZXF1ZXN0ZWR9KVxuICB9XG5cbiAgcmVzZXJ2ZWRJbXBvcnRzICs9IHJlcXVlc3RlZFxufVxuIl19
@@ -15,7 +15,10 @@ export declare function loadDefinitions(registry: import("../factory-registry.js
15
15
  /**
16
16
  * Fully reloads definitions: resets the registry (dropping every factory, trait,
17
17
  * sequence, callback and default) and re-imports the target files with cache
18
- * busting so edited definitions take effect.
18
+ * busting so edited definitions take effect. The resolved batch is preflighted
19
+ * against the process-global import budget before the reset, and a
20
+ * `DefinitionRecycleRequiredError` is raised before any mutation when the batch
21
+ * would exceed the budget.
19
22
  * @param {import("../factory-registry.js").default} registry - Registry to reload.
20
23
  * @param {string | string[]} target - File path, directory, or list of paths.
21
24
  * @returns {Promise<string[]>} - The reloaded file paths, in load order.
@@ -1 +1 @@
1
- {"version":3,"file":"load-definitions.d.ts","sourceRoot":"","sources":["../../../../../src/testing/factory/node/load-definitions.js"],"names":[],"mappings":"AAwDA;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EALnC,OAAO,wBAAwB,EAAE,OAKE,EAAE,MAAM,EAJ3C,MAAM,GAAG,MAAM,EAI4B,EAAE,EAAC,MAAc,EAAC,AAHrE,CACA,EADQ;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAGiD,GAFhE,OAAO,CAAC,MAAM,EAAE,CAAC,CAuB7B;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAJrC,OAAO,wBAAwB,EAAE,OAII,EAAE,MAAM,EAH7C,MAAM,GAAG,MAAM,EAG8B,GAF3C,OAAO,CAAC,MAAM,EAAE,CAAC,CAM7B"}
1
+ {"version":3,"file":"load-definitions.d.ts","sourceRoot":"","sources":["../../../../../src/testing/factory/node/load-definitions.js"],"names":[],"mappings":"AAyDA;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EALnC,OAAO,wBAAwB,EAAE,OAKE,EAAE,MAAM,EAJ3C,MAAM,GAAG,MAAM,EAI4B,EAAE,EAAC,MAAc,EAAC,AAHrE,CACA,EADQ;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAGiD,GAFhE,OAAO,CAAC,MAAM,EAAE,CAAC,CAM7B;AAuCD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAJrC,OAAO,wBAAwB,EAAE,OAII,EAAE,MAAM,EAH7C,MAAM,GAAG,MAAM,EAG8B,GAF3C,OAAO,CAAC,MAAM,EAAE,CAAC,CAM7B"}
@@ -2,6 +2,7 @@
2
2
  import { pathToFileURL } from "node:url";
3
3
  import { readdir, stat } from "node:fs/promises";
4
4
  import path from "node:path";
5
+ import { reserveDefinitionReloadBudget } from "./definition-reload-policy.js";
5
6
  /**
6
7
  * Monotonic cache-busting counter shared by reloads. Kept module-local so a reload
7
8
  * imports a fresh module instance rather than the cached one.
@@ -58,6 +59,25 @@ async function resolveFiles(target) {
58
59
  */
59
60
  export async function loadDefinitions(registry, target, { reload = false } = {}) {
60
61
  const files = await resolveFiles(target);
62
+ return await loadResolvedDefinitionFiles({ files, registry, reload });
63
+ }
64
+ /**
65
+ * Loads definition files that have already been resolved into a deterministic
66
+ * sorted list. When `reload` is set, the whole batch is preflighted and reserved
67
+ * against the process-global import budget before any registry reset or import
68
+ * attempt, so a rejected reload never mutates the registry.
69
+ * @param {object} args - Options object.
70
+ * @param {string[]} args.files - Resolved, sorted definition file paths.
71
+ * @param {import("../factory-registry.js").default} args.registry - Registry to define into.
72
+ * @param {boolean} args.reload - Whether to cache-bust the imports.
73
+ * @param {boolean} [args.reset] - Whether to reset the registry first.
74
+ * @returns {Promise<string[]>} - The loaded file paths, in load order.
75
+ */
76
+ async function loadResolvedDefinitionFiles({ files, registry, reload, reset = false }) {
77
+ if (reload)
78
+ reserveDefinitionReloadBudget(files.length);
79
+ if (reset)
80
+ registry.reset();
61
81
  for (const file of files) {
62
82
  let href = pathToFileURL(file).href;
63
83
  if (reload) {
@@ -75,13 +95,16 @@ export async function loadDefinitions(registry, target, { reload = false } = {})
75
95
  /**
76
96
  * Fully reloads definitions: resets the registry (dropping every factory, trait,
77
97
  * sequence, callback and default) and re-imports the target files with cache
78
- * busting so edited definitions take effect.
98
+ * busting so edited definitions take effect. The resolved batch is preflighted
99
+ * against the process-global import budget before the reset, and a
100
+ * `DefinitionRecycleRequiredError` is raised before any mutation when the batch
101
+ * would exceed the budget.
79
102
  * @param {import("../factory-registry.js").default} registry - Registry to reload.
80
103
  * @param {string | string[]} target - File path, directory, or list of paths.
81
104
  * @returns {Promise<string[]>} - The reloaded file paths, in load order.
82
105
  */
83
106
  export async function reloadDefinitions(registry, target) {
84
- registry.reset();
85
- return await loadDefinitions(registry, target, { reload: true });
107
+ const files = await resolveFiles(target);
108
+ return await loadResolvedDefinitionFiles({ files, registry, reload: true, reset: true });
86
109
  }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1kZWZpbml0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy90ZXN0aW5nL2ZhY3Rvcnkvbm9kZS9sb2FkLWRlZmluaXRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sVUFBVSxDQUFBO0FBQ3RDLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDOUMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBRTVCOzs7O0dBSUc7QUFDSCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckI7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsU0FBUztJQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUMvRCx1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVqRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDdEQsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsWUFBWSxDQUFDLE1BQU07SUFDaEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNyQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUVsQyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7UUFBRSxPQUFPLE1BQU0scUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFckUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ25CLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUMsR0FBRyxFQUFFO0lBQzNFLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXhDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUVuQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsYUFBYSxJQUFJLENBQUMsQ0FBQTtZQUNsQixJQUFJLElBQUksa0JBQWtCLGFBQWEsRUFBRSxDQUFBO1FBQzNDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVqQyxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixJQUFJLG9EQUFvRCxDQUFDLENBQUE7UUFDdEcsQ0FBQztRQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNO0lBQ3RELFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUVoQixPQUFPLE1BQU0sZUFBZSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtBQUNoRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7cGF0aFRvRmlsZVVSTH0gZnJvbSBcIm5vZGU6dXJsXCJcbmltcG9ydCB7cmVhZGRpciwgc3RhdH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5cbi8qKlxuICogTW9ub3RvbmljIGNhY2hlLWJ1c3RpbmcgY291bnRlciBzaGFyZWQgYnkgcmVsb2Fkcy4gS2VwdCBtb2R1bGUtbG9jYWwgc28gYSByZWxvYWRcbiAqIGltcG9ydHMgYSBmcmVzaCBtb2R1bGUgaW5zdGFuY2UgcmF0aGVyIHRoYW4gdGhlIGNhY2hlZCBvbmUuXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5sZXQgcmVsb2FkQ291bnRlciA9IDBcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb2xsZWN0cyBgLmpzYCBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSBpbiBhIGRldGVybWluaXN0aWNcbiAqIChsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQpIG9yZGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIERpcmVjdG9yeSB0byBzY2FuLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFNvcnRlZCBhYnNvbHV0ZSBmaWxlIHBhdGhzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0RGlyZWN0b3J5RmlsZXMoZGlyZWN0b3J5KSB7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwge3dpdGhGaWxlVHlwZXM6IHRydWV9KVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBmaWxlcyA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBbLi4uZW50cmllc10uc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0Lm5hbWUgPCByaWdodC5uYW1lID8gLTEgOiAxKSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpXG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZmlsZXMucHVzaCguLi5hd2FpdCBjb2xsZWN0RGlyZWN0b3J5RmlsZXMoZnVsbFBhdGgpKVxuICAgIH0gZWxzZSBpZiAoZW50cnkubmFtZS5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgICAgZmlsZXMucHVzaChmdWxsUGF0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGxvYWQgdGFyZ2V0IChhIHNpbmdsZSBmaWxlLCBhIGRpcmVjdG9yeSwgb3IgYW4gZXhwbGljaXQgbGlzdCkgaW50byBhXG4gKiBkZXRlcm1pbmlzdGljLCBkZS1kdXBsaWNhdGVkIGxpc3Qgb2YgYWJzb2x1dGUgZGVmaW5pdGlvbiBmaWxlIHBhdGhzLlxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gdGFyZ2V0IC0gRmlsZSBwYXRoLCBkaXJlY3RvcnksIG9yIGxpc3Qgb2YgcGF0aHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gU29ydGVkLCBkZS1kdXBsaWNhdGVkIGFic29sdXRlIGZpbGUgcGF0aHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGaWxlcyh0YXJnZXQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh0YXJnZXQubWFwKChlbnRyeSkgPT4gcGF0aC5yZXNvbHZlKGVudHJ5KSkpXS5zb3J0KClcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHRhcmdldClcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHJlc29sdmVkKVxuXG4gIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gYXdhaXQgY29sbGVjdERpcmVjdG9yeUZpbGVzKHJlc29sdmVkKVxuXG4gIHJldHVybiBbcmVzb2x2ZWRdXG59XG5cbi8qKlxuICogTG9hZHMgVmVsb2Npb3VzIGZhY3RvcnkgZGVmaW5pdGlvbiBmaWxlcyAoTm9kZSBvbmx5KS4gRWFjaCBmaWxlIG11c3RcbiAqIGRlZmF1bHQtZXhwb3J0IGEgYChyZWdpc3RyeSkgPT4gdm9pZGAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGludG8gdGhlIHJlZ2lzdHJ5LlxuICogRmlsZXMgbG9hZCBpbiBkZXRlcm1pbmlzdGljIHBhdGggb3JkZXIuIFRoaXMgbW9kdWxlIGlzIGludGVudGlvbmFsbHkgTm9kZS1vbmx5XG4gKiAoZmlsZXN5c3RlbSArIGR5bmFtaWMgaW1wb3J0KSBhbmQgbXVzdCBuZXZlciBiZSBpbXBvcnRlZCBmcm9tIGJyb3dzZXIvTWV0cm9cbiAqIGJ1bmRsZXM7IGltcG9ydCB0aGUgYnJvd3Nlci1zYWZlIGNvcmUgZnJvbSBgLi4vaW5kZXguanNgIHRoZXJlIGluc3RlYWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBSZWdpc3RyeSB0byBkZWZpbmUgaW50by5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW119IHRhcmdldCAtIEZpbGUgcGF0aCwgZGlyZWN0b3J5LCBvciBsaXN0IG9mIHBhdGhzLlxuICogQHBhcmFtIHt7cmVsb2FkPzogYm9vbGVhbn19IFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGhlIGxvYWRlZCBmaWxlIHBhdGhzLCBpbiBsb2FkIG9yZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERlZmluaXRpb25zKHJlZ2lzdHJ5LCB0YXJnZXQsIHtyZWxvYWQgPSBmYWxzZX0gPSB7fSkge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlc29sdmVGaWxlcyh0YXJnZXQpXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgbGV0IGhyZWYgPSBwYXRoVG9GaWxlVVJMKGZpbGUpLmhyZWZcblxuICAgIGlmIChyZWxvYWQpIHtcbiAgICAgIHJlbG9hZENvdW50ZXIgKz0gMVxuICAgICAgaHJlZiArPSBgP2ZhY3RvcnlSZWxvYWQ9JHtyZWxvYWRDb3VudGVyfWBcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoaHJlZilcblxuICAgIGlmICh0eXBlb2YgbW9kdWxlLmRlZmF1bHQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWN0b3J5IGRlZmluaXRpb24gZmlsZSAke2ZpbGV9IG11c3QgZGVmYXVsdC1leHBvcnQgYSAocmVnaXN0cnkpID0+IHZvaWQgZnVuY3Rpb25gKVxuICAgIH1cblxuICAgIG1vZHVsZS5kZWZhdWx0KHJlZ2lzdHJ5KVxuICB9XG5cbiAgcmV0dXJuIGZpbGVzXG59XG5cbi8qKlxuICogRnVsbHkgcmVsb2FkcyBkZWZpbml0aW9uczogcmVzZXRzIHRoZSByZWdpc3RyeSAoZHJvcHBpbmcgZXZlcnkgZmFjdG9yeSwgdHJhaXQsXG4gKiBzZXF1ZW5jZSwgY2FsbGJhY2sgYW5kIGRlZmF1bHQpIGFuZCByZS1pbXBvcnRzIHRoZSB0YXJnZXQgZmlsZXMgd2l0aCBjYWNoZVxuICogYnVzdGluZyBzbyBlZGl0ZWQgZGVmaW5pdGlvbnMgdGFrZSBlZmZlY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBSZWdpc3RyeSB0byByZWxvYWQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSB0YXJnZXQgLSBGaWxlIHBhdGgsIGRpcmVjdG9yeSwgb3IgbGlzdCBvZiBwYXRocy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBUaGUgcmVsb2FkZWQgZmlsZSBwYXRocywgaW4gbG9hZCBvcmRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbG9hZERlZmluaXRpb25zKHJlZ2lzdHJ5LCB0YXJnZXQpIHtcbiAgcmVnaXN0cnkucmVzZXQoKVxuXG4gIHJldHVybiBhd2FpdCBsb2FkRGVmaW5pdGlvbnMocmVnaXN0cnksIHRhcmdldCwge3JlbG9hZDogdHJ1ZX0pXG59XG4iXX0=
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1kZWZpbml0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy90ZXN0aW5nL2ZhY3Rvcnkvbm9kZS9sb2FkLWRlZmluaXRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDaEQsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBRTdFOzs7O0dBSUc7QUFDSCxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFFckI7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQUMsU0FBUztJQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtJQUMvRCx1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVqRCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxN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QUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiXG5pbXBvcnQgeyByZWFkZGlyLCBzdGF0IH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyByZXNlcnZlRGVmaW5pdGlvblJlbG9hZEJ1ZGdldCB9IGZyb20gXCIuL2RlZmluaXRpb24tcmVsb2FkLXBvbGljeS5qc1wiXG5cbi8qKlxuICogTW9ub3RvbmljIGNhY2hlLWJ1c3RpbmcgY291bnRlciBzaGFyZWQgYnkgcmVsb2Fkcy4gS2VwdCBtb2R1bGUtbG9jYWwgc28gYSByZWxvYWRcbiAqIGltcG9ydHMgYSBmcmVzaCBtb2R1bGUgaW5zdGFuY2UgcmF0aGVyIHRoYW4gdGhlIGNhY2hlZCBvbmUuXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5sZXQgcmVsb2FkQ291bnRlciA9IDBcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb2xsZWN0cyBgLmpzYCBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSBpbiBhIGRldGVybWluaXN0aWNcbiAqIChsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQpIG9yZGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdG9yeSAtIERpcmVjdG9yeSB0byBzY2FuLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFNvcnRlZCBhYnNvbHV0ZSBmaWxlIHBhdGhzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0RGlyZWN0b3J5RmlsZXMoZGlyZWN0b3J5KSB7XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwge3dpdGhGaWxlVHlwZXM6IHRydWV9KVxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBmaWxlcyA9IFtdXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBbLi4uZW50cmllc10uc29ydCgobGVmdCwgcmlnaHQpID0+IChsZWZ0Lm5hbWUgPCByaWdodC5uYW1lID8gLTEgOiAxKSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpXG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZmlsZXMucHVzaCguLi5hd2FpdCBjb2xsZWN0RGlyZWN0b3J5RmlsZXMoZnVsbFBhdGgpKVxuICAgIH0gZWxzZSBpZiAoZW50cnkubmFtZS5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgICAgZmlsZXMucHVzaChmdWxsUGF0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsZXNcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGxvYWQgdGFyZ2V0IChhIHNpbmdsZSBmaWxlLCBhIGRpcmVjdG9yeSwgb3IgYW4gZXhwbGljaXQgbGlzdCkgaW50byBhXG4gKiBkZXRlcm1pbmlzdGljLCBkZS1kdXBsaWNhdGVkIGxpc3Qgb2YgYWJzb2x1dGUgZGVmaW5pdGlvbiBmaWxlIHBhdGhzLlxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gdGFyZ2V0IC0gRmlsZSBwYXRoLCBkaXJlY3RvcnksIG9yIGxpc3Qgb2YgcGF0aHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gU29ydGVkLCBkZS1kdXBsaWNhdGVkIGFic29sdXRlIGZpbGUgcGF0aHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGaWxlcyh0YXJnZXQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh0YXJnZXQubWFwKChlbnRyeSkgPT4gcGF0aC5yZXNvbHZlKGVudHJ5KSkpXS5zb3J0KClcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHRhcmdldClcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHJlc29sdmVkKVxuXG4gIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gYXdhaXQgY29sbGVjdERpcmVjdG9yeUZpbGVzKHJlc29sdmVkKVxuXG4gIHJldHVybiBbcmVzb2x2ZWRdXG59XG5cbi8qKlxuICogTG9hZHMgVmVsb2Npb3VzIGZhY3RvcnkgZGVmaW5pdGlvbiBmaWxlcyAoTm9kZSBvbmx5KS4gRWFjaCBmaWxlIG11c3RcbiAqIGRlZmF1bHQtZXhwb3J0IGEgYChyZWdpc3RyeSkgPT4gdm9pZGAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGludG8gdGhlIHJlZ2lzdHJ5LlxuICogRmlsZXMgbG9hZCBpbiBkZXRlcm1pbmlzdGljIHBhdGggb3JkZXIuIFRoaXMgbW9kdWxlIGlzIGludGVudGlvbmFsbHkgTm9kZS1vbmx5XG4gKiAoZmlsZXN5c3RlbSArIGR5bmFtaWMgaW1wb3J0KSBhbmQgbXVzdCBuZXZlciBiZSBpbXBvcnRlZCBmcm9tIGJyb3dzZXIvTWV0cm9cbiAqIGJ1bmRsZXM7IGltcG9ydCB0aGUgYnJvd3Nlci1zYWZlIGNvcmUgZnJvbSBgLi4vaW5kZXguanNgIHRoZXJlIGluc3RlYWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBSZWdpc3RyeSB0byBkZWZpbmUgaW50by5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW119IHRhcmdldCAtIEZpbGUgcGF0aCwgZGlyZWN0b3J5LCBvciBsaXN0IG9mIHBhdGhzLlxuICogQHBhcmFtIHt7cmVsb2FkPzogYm9vbGVhbn19IFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGhlIGxvYWRlZCBmaWxlIHBhdGhzLCBpbiBsb2FkIG9yZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERlZmluaXRpb25zKHJlZ2lzdHJ5LCB0YXJnZXQsIHtyZWxvYWQgPSBmYWxzZX0gPSB7fSkge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlc29sdmVGaWxlcyh0YXJnZXQpXG5cbiAgcmV0dXJuIGF3YWl0IGxvYWRSZXNvbHZlZERlZmluaXRpb25GaWxlcyh7ZmlsZXMsIHJlZ2lzdHJ5LCByZWxvYWR9KVxufVxuXG4vKipcbiAqIExvYWRzIGRlZmluaXRpb24gZmlsZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBpbnRvIGEgZGV0ZXJtaW5pc3RpY1xuICogc29ydGVkIGxpc3QuIFdoZW4gYHJlbG9hZGAgaXMgc2V0LCB0aGUgd2hvbGUgYmF0Y2ggaXMgcHJlZmxpZ2h0ZWQgYW5kIHJlc2VydmVkXG4gKiBhZ2FpbnN0IHRoZSBwcm9jZXNzLWdsb2JhbCBpbXBvcnQgYnVkZ2V0IGJlZm9yZSBhbnkgcmVnaXN0cnkgcmVzZXQgb3IgaW1wb3J0XG4gKiBhdHRlbXB0LCBzbyBhIHJlamVjdGVkIHJlbG9hZCBuZXZlciBtdXRhdGVzIHRoZSByZWdpc3RyeS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLmZpbGVzIC0gUmVzb2x2ZWQsIHNvcnRlZCBkZWZpbml0aW9uIGZpbGUgcGF0aHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gYXJncy5yZWdpc3RyeSAtIFJlZ2lzdHJ5IHRvIGRlZmluZSBpbnRvLlxuICogQHBhcmFtIHtib29sZWFufSBhcmdzLnJlbG9hZCAtIFdoZXRoZXIgdG8gY2FjaGUtYnVzdCB0aGUgaW1wb3J0cy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MucmVzZXRdIC0gV2hldGhlciB0byByZXNldCB0aGUgcmVnaXN0cnkgZmlyc3QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGhlIGxvYWRlZCBmaWxlIHBhdGhzLCBpbiBsb2FkIG9yZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkUmVzb2x2ZWREZWZpbml0aW9uRmlsZXMoe2ZpbGVzLCByZWdpc3RyeSwgcmVsb2FkLCByZXNldCA9IGZhbHNlfSkge1xuICBpZiAocmVsb2FkKSByZXNlcnZlRGVmaW5pdGlvblJlbG9hZEJ1ZGdldChmaWxlcy5sZW5ndGgpXG5cbiAgaWYgKHJlc2V0KSByZWdpc3RyeS5yZXNldCgpXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgbGV0IGhyZWYgPSBwYXRoVG9GaWxlVVJMKGZpbGUpLmhyZWZcblxuICAgIGlmIChyZWxvYWQpIHtcbiAgICAgIHJlbG9hZENvdW50ZXIgKz0gMVxuICAgICAgaHJlZiArPSBgP2ZhY3RvcnlSZWxvYWQ9JHtyZWxvYWRDb3VudGVyfWBcbiAgICB9XG5cbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoaHJlZilcblxuICAgIGlmICh0eXBlb2YgbW9kdWxlLmRlZmF1bHQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWN0b3J5IGRlZmluaXRpb24gZmlsZSAke2ZpbGV9IG11c3QgZGVmYXVsdC1leHBvcnQgYSAocmVnaXN0cnkpID0+IHZvaWQgZnVuY3Rpb25gKVxuICAgIH1cblxuICAgIG1vZHVsZS5kZWZhdWx0KHJlZ2lzdHJ5KVxuICB9XG5cbiAgcmV0dXJuIGZpbGVzXG59XG5cbi8qKlxuICogRnVsbHkgcmVsb2FkcyBkZWZpbml0aW9uczogcmVzZXRzIHRoZSByZWdpc3RyeSAoZHJvcHBpbmcgZXZlcnkgZmFjdG9yeSwgdHJhaXQsXG4gKiBzZXF1ZW5jZSwgY2FsbGJhY2sgYW5kIGRlZmF1bHQpIGFuZCByZS1pbXBvcnRzIHRoZSB0YXJnZXQgZmlsZXMgd2l0aCBjYWNoZVxuICogYnVzdGluZyBzbyBlZGl0ZWQgZGVmaW5pdGlvbnMgdGFrZSBlZmZlY3QuIFRoZSByZXNvbHZlZCBiYXRjaCBpcyBwcmVmbGlnaHRlZFxuICogYWdhaW5zdCB0aGUgcHJvY2Vzcy1nbG9iYWwgaW1wb3J0IGJ1ZGdldCBiZWZvcmUgdGhlIHJlc2V0LCBhbmQgYVxuICogYERlZmluaXRpb25SZWN5Y2xlUmVxdWlyZWRFcnJvcmAgaXMgcmFpc2VkIGJlZm9yZSBhbnkgbXV0YXRpb24gd2hlbiB0aGUgYmF0Y2hcbiAqIHdvdWxkIGV4Y2VlZCB0aGUgYnVkZ2V0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9mYWN0b3J5LXJlZ2lzdHJ5LmpzXCIpLmRlZmF1bHR9IHJlZ2lzdHJ5IC0gUmVnaXN0cnkgdG8gcmVsb2FkLlxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gdGFyZ2V0IC0gRmlsZSBwYXRoLCBkaXJlY3RvcnksIG9yIGxpc3Qgb2YgcGF0aHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGhlIHJlbG9hZGVkIGZpbGUgcGF0aHMsIGluIGxvYWQgb3JkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWREZWZpbml0aW9ucyhyZWdpc3RyeSwgdGFyZ2V0KSB7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVzb2x2ZUZpbGVzKHRhcmdldClcblxuICByZXR1cm4gYXdhaXQgbG9hZFJlc29sdmVkRGVmaW5pdGlvbkZpbGVzKHtmaWxlcywgcmVnaXN0cnksIHJlbG9hZDogdHJ1ZSwgcmVzZXQ6IHRydWV9KVxufVxuIl19