@pipeline-builder/pipeline-data 3.4.97 → 3.4.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/crud-service.js +8 -1
- package/lib/api/query-builders.js +16 -7
- package/lib/api/reporting-service.d.ts +22 -10
- package/lib/api/reporting-service.js +62 -24
- package/lib/database/postgres-connection.d.ts +29 -1
- package/lib/database/postgres-connection.js +49 -3
- package/lib/database/tenancy.js +22 -1
- package/package.json +2 -2
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
2
2
|
import { Pool, type PoolClient } from 'pg';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the pg TLS/SSL config from an explicit option or the environment,
|
|
5
|
+
* following the same env-tunable pattern as the pool sizing above.
|
|
6
|
+
*
|
|
7
|
+
* Precedence:
|
|
8
|
+
* 1. An explicit `options.ssl` (constructor arg) always wins — including an
|
|
9
|
+
* explicit `false` to force plaintext.
|
|
10
|
+
* 2. `DB_SSL` (`true`/`1` on, `false`/`0` off) or Postgres' standard
|
|
11
|
+
* `PGSSLMODE` (`disable` = off, any other mode = on).
|
|
12
|
+
* 3. Default: ON in production (RDS connections must be encrypted in transit),
|
|
13
|
+
* OFF everywhere else so a local Postgres without TLS keeps working.
|
|
14
|
+
*
|
|
15
|
+
* When enabled, `rejectUnauthorized` follows `DB_SSL_REJECT_UNAUTHORIZED`
|
|
16
|
+
* (default `false`): AWS RDS presents a cert signed by the RDS CA, which is not
|
|
17
|
+
* in Node's default trust store unless the CA bundle is mounted, so certificate
|
|
18
|
+
* VERIFICATION is opt-in to avoid breaking a stock RDS deploy — the channel is
|
|
19
|
+
* still ENCRYPTED. Set `DB_SSL_REJECT_UNAUTHORIZED=true` once the RDS CA bundle
|
|
20
|
+
* is wired to get full verification.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSslConfig(explicit?: ConnectionOptions['ssl']): boolean | {
|
|
23
|
+
rejectUnauthorized: boolean;
|
|
24
|
+
};
|
|
3
25
|
/**
|
|
4
26
|
* Database connection statistics for monitoring
|
|
5
27
|
*/
|
|
@@ -94,7 +116,13 @@ export declare class Connection {
|
|
|
94
116
|
*/
|
|
95
117
|
getStats(): ConnectionStats;
|
|
96
118
|
/**
|
|
97
|
-
* Executes a database transaction
|
|
119
|
+
* Executes a database transaction.
|
|
120
|
+
*
|
|
121
|
+
* DEAD PATH — no production callers. Every real transaction goes through
|
|
122
|
+
* `withTenantTx` (tenancy.ts), which now sets `statement_timeout` alongside
|
|
123
|
+
* the RLS GUCs, so THIS wrapper's `SET LOCAL statement_timeout` guard is no
|
|
124
|
+
* longer the server-side timeout mechanism. `getClient()` below is likewise
|
|
125
|
+
* caller-less. Both are safe to remove; kept for now to avoid churn.
|
|
98
126
|
*
|
|
99
127
|
* @param callback - Function to execute within the transaction
|
|
100
128
|
* @returns Result of the transaction
|
|
@@ -19,6 +19,43 @@ function parseIntEnv(value, fallback) {
|
|
|
19
19
|
}
|
|
20
20
|
/** Detect Lambda environment for pool-size tuning */
|
|
21
21
|
const isLambda = !!process.env.AWS_LAMBDA_FUNCTION_NAME;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the pg TLS/SSL config from an explicit option or the environment,
|
|
24
|
+
* following the same env-tunable pattern as the pool sizing above.
|
|
25
|
+
*
|
|
26
|
+
* Precedence:
|
|
27
|
+
* 1. An explicit `options.ssl` (constructor arg) always wins — including an
|
|
28
|
+
* explicit `false` to force plaintext.
|
|
29
|
+
* 2. `DB_SSL` (`true`/`1` on, `false`/`0` off) or Postgres' standard
|
|
30
|
+
* `PGSSLMODE` (`disable` = off, any other mode = on).
|
|
31
|
+
* 3. Default: ON in production (RDS connections must be encrypted in transit),
|
|
32
|
+
* OFF everywhere else so a local Postgres without TLS keeps working.
|
|
33
|
+
*
|
|
34
|
+
* When enabled, `rejectUnauthorized` follows `DB_SSL_REJECT_UNAUTHORIZED`
|
|
35
|
+
* (default `false`): AWS RDS presents a cert signed by the RDS CA, which is not
|
|
36
|
+
* in Node's default trust store unless the CA bundle is mounted, so certificate
|
|
37
|
+
* VERIFICATION is opt-in to avoid breaking a stock RDS deploy — the channel is
|
|
38
|
+
* still ENCRYPTED. Set `DB_SSL_REJECT_UNAUTHORIZED=true` once the RDS CA bundle
|
|
39
|
+
* is wired to get full verification.
|
|
40
|
+
*/
|
|
41
|
+
export function getSslConfig(explicit) {
|
|
42
|
+
if (explicit !== undefined)
|
|
43
|
+
return explicit;
|
|
44
|
+
const dbSsl = process.env.DB_SSL?.toLowerCase();
|
|
45
|
+
const sslMode = process.env.PGSSLMODE?.toLowerCase();
|
|
46
|
+
let enabled;
|
|
47
|
+
if (dbSsl === 'true' || dbSsl === '1')
|
|
48
|
+
enabled = true;
|
|
49
|
+
else if (dbSsl === 'false' || dbSsl === '0')
|
|
50
|
+
enabled = false;
|
|
51
|
+
else if (sslMode)
|
|
52
|
+
enabled = sslMode !== 'disable';
|
|
53
|
+
else
|
|
54
|
+
enabled = process.env.NODE_ENV === 'production';
|
|
55
|
+
if (!enabled)
|
|
56
|
+
return false;
|
|
57
|
+
return { rejectUnauthorized: process.env.DB_SSL_REJECT_UNAUTHORIZED === 'true' };
|
|
58
|
+
}
|
|
22
59
|
function getDatabaseConfig() {
|
|
23
60
|
// Lambda: small pool (each invocation is short-lived, many concurrent instances)
|
|
24
61
|
// ECS/long-running: larger pool for sustained concurrency
|
|
@@ -81,7 +118,10 @@ export class Connection {
|
|
|
81
118
|
enableAutoRetry: options.enableAutoRetry ?? true,
|
|
82
119
|
maxRetries: options.maxRetries ?? parseInt(process.env.DB_MAX_RETRIES || '3', 10),
|
|
83
120
|
retryDelay: options.retryDelay ?? parseInt(process.env.DB_RETRY_DELAY_MS || '1000', 10),
|
|
84
|
-
|
|
121
|
+
// Env-driven TLS: on-by-default in production, env-enableable elsewhere.
|
|
122
|
+
// getInstance() is normally called with no options, so this is the only
|
|
123
|
+
// place production RDS connections pick up SSL (formerly hard-coded off).
|
|
124
|
+
ssl: getSslConfig(options.ssl),
|
|
85
125
|
};
|
|
86
126
|
// Initialize retry strategy
|
|
87
127
|
this.retryStrategy = new ConnectionRetryStrategy({
|
|
@@ -173,7 +213,13 @@ export class Connection {
|
|
|
173
213
|
};
|
|
174
214
|
}
|
|
175
215
|
/**
|
|
176
|
-
* Executes a database transaction
|
|
216
|
+
* Executes a database transaction.
|
|
217
|
+
*
|
|
218
|
+
* DEAD PATH — no production callers. Every real transaction goes through
|
|
219
|
+
* `withTenantTx` (tenancy.ts), which now sets `statement_timeout` alongside
|
|
220
|
+
* the RLS GUCs, so THIS wrapper's `SET LOCAL statement_timeout` guard is no
|
|
221
|
+
* longer the server-side timeout mechanism. `getClient()` below is likewise
|
|
222
|
+
* caller-less. Both are safe to remove; kept for now to avoid churn.
|
|
177
223
|
*
|
|
178
224
|
* @param callback - Function to execute within the transaction
|
|
179
225
|
* @returns Result of the transaction
|
|
@@ -514,4 +560,4 @@ async function closeReplicaPool() {
|
|
|
514
560
|
_replica = null;
|
|
515
561
|
}
|
|
516
562
|
}
|
|
517
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wb3N0Z3Jlcy1jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQW9DLE1BQU0sSUFBSSxDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7QUFFeEM7OztHQUdHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBeUIsRUFBRSxRQUFnQjtJQUM5RCxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNsRCxDQUFDO0FBRUQscURBQXFEO0FBQ3JELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0FBRXhELFNBQVMsaUJBQWlCO0lBQ3hCLGlGQUFpRjtJQUNqRiwwREFBMEQ7SUFDMUQsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FB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QyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUcsQ0FBQztZQUFTLENBQUM7UUFDVCxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGUgfSBmcm9tICdkcml6emxlLW9ybS9ub2RlLXBvc3RncmVzJztcbmltcG9ydCB7IFBvb2wsIHR5cGUgUG9vbENvbmZpZywgdHlwZSBQb29sQ2xpZW50IH0gZnJvbSAncGcnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSB9IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2RhdGFiYXNlJyk7XG5cbi8qKlxuICogR2V0IGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqIE5vdGU6IFVzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRpcmVjdGx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBwaXBlbGluZS1jb3JlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSW50RW52KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gZmFsbGJhY2s7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkKSA/IGZhbGxiYWNrIDogcGFyc2VkO1xufVxuXG4vKiogRGV0ZWN0IExhbWJkYSBlbnZpcm9ubWVudCBmb3IgcG9vbC1zaXplIHR1bmluZyAqL1xuY29uc3QgaXNMYW1iZGEgPSAhIXByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTtcblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VDb25maWcoKSB7XG4gIC8vIExhbWJkYTogc21hbGwgcG9vbCAoZWFjaCBpbnZvY2F0aW9uIGlzIHNob3J0LWxpdmVkLCBtYW55IGNvbmN1cnJlbnQgaW5zdGFuY2VzKVxuICAvLyBFQ1MvbG9uZy1ydW5uaW5nOiBsYXJnZXIgcG9vbCBmb3Igc3VzdGFpbmVkIGNvbmN1cnJlbmN5XG4gIGNvbnN0IGRlZmF1bHRQb29sU2l6ZSA9IGlzTGFtYmRhID8gMiA6IDIwO1xuICBjb25zdCBkZWZhdWx0SWRsZVRpbWVvdXQgPSBpc0xhbWJkYSA/IDEwMDAwIDogMzAwMDA7XG5cbiAgcmV0dXJuIHtcbiAgICBob3N0OiBwcm9jZXNzLmVudi5EQl9IT1NUIHx8ICdwb3N0Z3JlcycsXG4gICAgcG9ydDogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuREJfUE9SVCwgNTQzMiksXG4gICAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LkRBVEFCQVNFIHx8ICdwaXBlbGluZV9idWlsZGVyJyxcbiAgICB1c2VyOiBwcm9jZXNzLmVudi5EQl9VU0VSIHx8ICdwb3N0Z3JlcycsXG4gICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LkRCX1BBU1NXT1JEIHx8IChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gKCgpID0+IHsgdGhyb3cgbmV3IEVycm9yKCdEQl9QQVNTV09SRCBpcyByZXF1aXJlZCBpbiBwcm9kdWN0aW9uJyk7IH0pKCkgYXMgc3RyaW5nIDogJycpLFxuICAgIG1heFBvb2xTaXplOiBwYXJzZUludEVudihwcm9jZXNzLmVudi5EUklaWkxFX01BWF9QT09MX1NJWkUsIGRlZmF1bHRQb29sU2l6ZSksXG4gICAgaWRsZVRpbWVvdXRNaWxsaXM6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRSSVpaTEVfSURMRV9USU1FT1VUX01JTExJUywgZGVmYXVsdElkbGVUaW1lb3V0KSxcbiAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuRFJJWlpMRV9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTLCA1MDAwKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEYXRhYmFzZSBjb25uZWN0aW9uIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uU3RhdHMge1xuICB0b3RhbENvdW50OiBudW1iZXI7XG4gIGlkbGVDb3VudDogbnVtYmVyO1xuICB3YWl0aW5nQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25PcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdG8gZW5hYmxlIGNvbm5lY3Rpb24gbG9nZ2luZyAqL1xuICBlbmFibGVMb2dnaW5nPzogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IHJldHJ5IGZhaWxlZCBjb25uZWN0aW9ucyAqL1xuICBlbmFibGVBdXRvUmV0cnk/OiBib29sZWFuO1xuXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9uIHJldHJ5IGF0dGVtcHRzICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG5cbiAgLyoqIERlbGF5IGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMgaW4gbWlsbGlzZWNvbmRzICovXG4gIHJldHJ5RGVsYXk/OiBudW1iZXI7XG5cbiAgLyoqIFNTTCBjb25maWd1cmF0aW9uICovXG4gIHNzbD86IGJvb2xlYW4gfCB7IHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbiB9O1xufVxuXG4vKipcbiAqIFNpbmdsZXRvbiBkYXRhYmFzZSBjb25uZWN0aW9uIGNsYXNzLlxuICogTWFuYWdlcyBQb3N0Z3JlU1FMIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgRHJpenpsZSBPUk0gaW5zdGFuY2UuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFNpbmdsZXRvbiBwYXR0ZXJuIGZvciBzaW5nbGUgY29ubmVjdGlvbiBwb29sXG4gKiAtIEF1dG9tYXRpYyBjb25uZWN0aW9uIHJldHJ5IHdpdGggYmFja29mZlxuICogLSBDb25uZWN0aW9uIGhlYWx0aCBtb25pdG9yaW5nXG4gKiAtIEdyYWNlZnVsIHNodXRkb3duIGhhbmRsaW5nXG4gKiAtIENvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmdcbiAqIC0gQ29ubmVjdGlvbiBzdGF0aXN0aWNzIHRyYWNraW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGNvbnN0IGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG4gKiBjb25zdCBwbHVnaW5zID0gYXdhaXQgY29ubmVjdGlvbi5kYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5wbHVnaW4pO1xuICpcbiAqIC8vIER1cmluZyBzaHV0ZG93blxuICogYXdhaXQgY29ubmVjdGlvbi5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogRHJpenpsZSBPUk0gZGF0YWJhc2UgaW5zdGFuY2Ugd2l0aCBzY2hlbWFcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYjogUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwb29sOiBQb29sO1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPENvbm5lY3Rpb25PcHRpb25zPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXRyeVN0cmF0ZWd5OiBDb25uZWN0aW9uUmV0cnlTdHJhdGVneTtcbiAgcHJpdmF0ZSBpc1NodXR0aW5nRG93biA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXG4gICAqIEluaXRpYWxpemVzIFBvc3RncmVTUUwgY29ubmVjdGlvbiBwb29sIGFuZCBEcml6emxlIE9STSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgY29ubmVjdGlvblxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgZGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gZmFpbHMgYWZ0ZXIgYWxsIHJldHJpZXNcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3Iob3B0aW9uczogQ29ubmVjdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGVuYWJsZUxvZ2dpbmc6IG9wdGlvbnMuZW5hYmxlTG9nZ2luZyA/PyB0cnVlLFxuICAgICAgZW5hYmxlQXV0b1JldHJ5OiBvcHRpb25zLmVuYWJsZUF1dG9SZXRyeSA/PyB0cnVlLFxuICAgICAgbWF4UmV0cmllczogb3B0aW9ucy5tYXhSZXRyaWVzID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkRCX01BWF9SRVRSSUVTIHx8ICczJywgMTApLFxuICAgICAgcmV0cnlEZWxheTogb3B0aW9ucy5yZXRyeURlbGF5ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkRCX1JFVFJZX0RFTEFZX01TIHx8ICcxMDAwJywgMTApLFxuICAgICAgc3NsOiBvcHRpb25zLnNzbCA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSByZXRyeSBzdHJhdGVneVxuICAgIHRoaXMucmV0cnlTdHJhdGVneSA9IG5ldyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSh7XG4gICAgICBtYXhSZXRyaWVzOiB0aGlzLm9wdGlvbnMubWF4UmV0cmllcyxcbiAgICAgIGJhc2VEZWxheTogdGhpcy5vcHRpb25zLnJldHJ5RGVsYXksXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gZ2V0RGF0YWJhc2VDb25maWcoKTtcblxuICAgICAgY29uc3QgcG9vbENvbmZpZzogUG9vbENvbmZpZyA9IHtcbiAgICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICAgIHBvcnQ6IGNvbmZpZy5wb3J0LFxuICAgICAgICBkYXRhYmFzZTogY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICB1c2VyOiBjb25maWcudXNlcixcbiAgICAgICAgcGFzc3dvcmQ6IGNvbmZpZy5wYXNzd29yZCxcbiAgICAgICAgbWF4OiBjb25maWcubWF4UG9vbFNpemUsXG4gICAgICAgIGlkbGVUaW1lb3V0TWlsbGlzOiBjb25maWcuaWRsZVRpbWVvdXRNaWxsaXMsXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBjb25maWcuY29ubmVjdGlvblRpbWVvdXRNaWxsaXMsXG4gICAgICAgIHNzbDogdGhpcy5vcHRpb25zLnNzbCxcbiAgICAgICAgYWxsb3dFeGl0T25JZGxlOiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5wb29sID0gbmV3IFBvb2wocG9vbENvbmZpZyk7XG4gICAgICB0aGlzLnNldHVwRXZlbnRIYW5kbGVycygpO1xuXG4gICAgICB0aGlzLmRiID0gZHJpenpsZSh0aGlzLnBvb2wsIHsgc2NoZW1hIH0pO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIHRoaXMubG9nQ29ubmVjdGlvbkNvbmZpZyhwb29sQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkYXRhYmFzZSBjb25uZWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcy5cbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBpZiBvbmUgZG9lc24ndCBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChvbmx5IHVzZWQgb24gZmlyc3QgY2FsbClcbiAgICogQHJldHVybnMgVGhlIHNpbmdsZXRvbiBDb25uZWN0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKG9wdGlvbnM/OiBDb25uZWN0aW9uT3B0aW9ucyk6IENvbm5lY3Rpb24ge1xuICAgIGlmICghQ29ubmVjdGlvbi5pbnN0YW5jZSkge1xuICAgICAgQ29ubmVjdGlvbi5pbnN0YW5jZSA9IG5ldyBDb25uZWN0aW9uKG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gQ29ubmVjdGlvbi5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHJlY29uZmlndXJpbmcgdGhlIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbG9zZUV4aXN0aW5nIC0gV2hldGhlciB0byBjbG9zZSBleGlzdGluZyBjb25uZWN0aW9uIGJlZm9yZSByZXNldFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyByZXNldChjbG9zZUV4aXN0aW5nOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChDb25uZWN0aW9uLmluc3RhbmNlICYmIGNsb3NlRXhpc3RpbmcpIHtcbiAgICAgIGF3YWl0IENvbm5lY3Rpb24uaW5zdGFuY2UuY2xvc2UoKTtcbiAgICB9XG4gICAgQ29ubmVjdGlvbi5pbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGVzdHMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgY29ubmVjdGlvbiBpcyBoZWFsdGh5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdGVzdENvbm5lY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMucG9vbC5jb25uZWN0KCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkoJ1NFTEVDVCAxJyk7XG4gICAgICBjbGllbnQucmVsZWFzZSgpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdCBzdWNjZXNzZnVsJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQucm93cy5sZW5ndGggPiAwO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0RhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbm5lY3Rpb24gcG9vbCBzdGF0aXN0aWNzXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgY29ubmVjdGlvbiBwb29sIHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0cygpOiBDb25uZWN0aW9uU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbENvdW50OiB0aGlzLnBvb2wudG90YWxDb3VudCxcbiAgICAgIGlkbGVDb3VudDogdGhpcy5wb29sLmlkbGVDb3VudCxcbiAgICAgIHdhaXRpbmdDb3VudDogdGhpcy5wb29sLndhaXRpbmdDb3VudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIFJlc3VsdCBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLnRyYW5zYWN0aW9uKGFzeW5jICh0eCkgPT4ge1xuICAgKiAgIGF3YWl0IHR4Lmluc2VydChzY2hlbWEucGx1Z2luKS52YWx1ZXMoeyAuLi4gfSk7XG4gICAqICAgYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5tZXRhZGF0YSkudmFsdWVzKHsgLi4uIH0pO1xuICAgKiAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zYWN0aW9uPFQ+KFxuICAgIGNhbGxiYWNrOiBQYXJhbWV0ZXJzPHR5cGVvZiB0aGlzLmRiLnRyYW5zYWN0aW9uPlswXSxcbiAgICB0aW1lb3V0TXM6IG51bWJlciA9IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRCX1RSQU5TQUNUSU9OX1RJTUVPVVRfTVMsIDMwMDAwKSxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgICAvLyBXcmFwIGNhbGxiYWNrIHRvIHNldCBQb3N0Z3JlU1FMIHN0YXRlbWVudF90aW1lb3V0IGFzIGEgc2VydmVyLXNpZGUgZ3VhcmQuXG4gICAgLy8gVGhlIFByb21pc2UucmFjZSB0aW1lb3V0IGJlbG93IGhhbmRsZXMgdGhlIEpTIHNpZGUsIGJ1dCBzdGF0ZW1lbnRfdGltZW91dFxuICAgIC8vIGVuc3VyZXMgdGhlIERCIGl0c2VsZiBjYW5jZWxzIGxvbmctcnVubmluZyBxdWVyaWVzIGlmIHRoZSBKUyB0aW1lb3V0IGZpcmVzXG4gICAgLy8gYnV0IHRoZSBjb25uZWN0aW9uIGlzbid0IGNsZWFuZWQgdXAuXG4gICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPSBhc3luYyAodHgpID0+IHtcbiAgICAgIC8vIGBTRVQgTE9DQUwgc3RhdGVtZW50X3RpbWVvdXQgPSAke259YCBwYXJhbWV0ZXJpemVzIHRvIGA9ICQxYCwgd2hpY2hcbiAgICAgIC8vIFBvc3RncmVzIHJlamVjdHMgZm9yIFNFVCDigJQgdXNlIHNldF9jb25maWcgKGFjY2VwdHMgYSBib3VuZCB2YWx1ZSwgaXNfbG9jYWxcbiAgICAgIC8vID0gdHJ1ZSDih5IgdHJhbnNhY3Rpb24tc2NvcGVkKSwgbWF0Y2hpbmcgdGVuYW5jeS50cy5cbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoc3FsYFNFTEVDVCBzZXRfY29uZmlnKCdzdGF0ZW1lbnRfdGltZW91dCcsICR7U3RyaW5nKHRpbWVvdXRNcyl9LCB0cnVlKWApO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHR4KTtcbiAgICB9O1xuICAgIGNvbnN0IHR4UHJvbWlzZSA9IHRoaXMuZGIudHJhbnNhY3Rpb24od3JhcHBlZENhbGxiYWNrKSBhcyBQcm9taXNlPFQ+O1xuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGBUcmFuc2FjdGlvbiB0aW1lb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCkpLCB0aW1lb3V0TXMpO1xuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFt0eFByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lciEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlcyBhIGNsaWVudCBmcm9tIHRoZSBwb29sIGZvciBtYW51YWwgcXVlcnkgZXhlY3V0aW9uXG4gICAqIFJlbWVtYmVyIHRvIHJlbGVhc2UgdGhlIGNsaWVudCB3aGVuIGRvbmVcbiAgICpcbiAgICogQHJldHVybnMgUG9zdGdyZVNRTCBjbGllbnQgZnJvbSB0aGUgcG9vbFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0Q2xpZW50KCk7XG4gICAqIHRyeSB7XG4gICAqICAgYXdhaXQgY2xpZW50LnF1ZXJ5KCdCRUdJTicpO1xuICAgKiAgIGF3YWl0IGNsaWVudC5xdWVyeSgnSU5TRVJUIElOVE8gLi4uJyk7XG4gICAqICAgYXdhaXQgY2xpZW50LnF1ZXJ5KCdDT01NSVQnKTtcbiAgICogfSBmaW5hbGx5IHtcbiAgICogICBjbGllbnQucmVsZWFzZSgpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENsaWVudCgpOiBQcm9taXNlPFBvb2xDbGllbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbCBncmFjZWZ1bGx5LlxuICAgKiBTaG91bGQgYmUgY2FsbGVkIGR1cmluZyBhcHBsaWNhdGlvbiBzaHV0ZG93bi5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgLSBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgY29ubmVjdGlvbnMgdG8gY2xvc2UgKG1zKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBwb29sIGlzIGNsb3NlZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsb3NlKHRpbWVvdXQ6IG51bWJlciA9IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRCX0NMT1NFX1RJTUVPVVRfTVMsIDUwMDApKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNTaHV0dGluZ0Rvd24pIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDb25uZWN0aW9uIGlzIGFscmVhZHkgc2h1dHRpbmcgZG93bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNTaHV0dGluZ0Rvd24gPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuaW5mbygnQ2xvc2luZyBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wuLi4nKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmdldFN0YXRzKCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBQb29sIHN0YXRzIC0gVG90YWw6ICR7c3RhdHMudG90YWxDb3VudH0sIElkbGU6ICR7c3RhdHMuaWRsZUNvdW50fSwgV2FpdGluZzogJHtzdGF0cy53YWl0aW5nQ291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBhIHRpbWVvdXQgZm9yIGdyYWNlZnVsIHNodXRkb3duXG4gICAgICBjb25zdCBjbG9zZVByb21pc2UgPSB0aGlzLnBvb2wuZW5kKCk7XG4gICAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignQ29ubmVjdGlvbiBjbG9zZSB0aW1lb3V0JykpLCB0aW1lb3V0KSxcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UucmFjZShbY2xvc2VQcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gY2xvc2VkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNsb3NpbmcgZGF0YWJhc2UgY29ubmVjdGlvbjonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1NodXR0aW5nRG93biA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc2h1dHRpbmcgZG93blxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGNvbm5lY3Rpb24gaXMgaW4gc2h1dGRvd24gc3RhdGVcbiAgICovXG4gIHB1YmxpYyBpc0Nsb3NpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNTaHV0dGluZ0Rvd247XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNvbm5lY3Rpb24gcG9vbFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcignVW5leHBlY3RlZCBlcnJvciBvbiBpZGxlIGNsaWVudDonLCBlcnIpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUF1dG9SZXRyeSAmJiB0aGlzLnJldHJ5U3RyYXRlZ3kuZ2V0QXR0ZW1wdHMoKSA8IHRoaXMub3B0aW9ucy5tYXhSZXRyaWVzKSB7XG4gICAgICAgIHZvaWQgdGhpcy5yZXRyeVN0cmF0ZWd5LmhhbmRsZUNvbm5lY3Rpb25FcnJvcihlcnIsICgpID0+IHRoaXMudGVzdENvbm5lY3Rpb24oKSkuY2F0Y2goKHJldHJ5RXJyKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdDb25uZWN0aW9uIHJldHJ5IGVycm9yOicsIHJldHJ5RXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnBvb2wub24oJ2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICB0aGlzLnJldHJ5U3RyYXRlZ3kucmVzZXQoKTsgLy8gUmVzZXQgb24gc3VjY2Vzc2Z1bCBjb25uZWN0aW9uXG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ05ldyBkYXRhYmFzZSBjb25uZWN0aW9uIGVzdGFibGlzaGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnBvb2wub24oJ3JlbW92ZScsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NsaWVudCByZW1vdmVkIGZyb20gcG9vbCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIChzYW5pdGl6ZWQpXG4gICAqL1xuICBwcml2YXRlIGxvZ0Nvbm5lY3Rpb25Db25maWcoY29uZmlnOiBQb29sQ29uZmlnKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIENvbmZpZ3VyYXRpb246Jywge1xuICAgICAgaG9zdDogYCR7Y29uZmlnLmhvc3R9OiR7Y29uZmlnLnBvcnR9YCxcbiAgICAgIGRhdGFiYXNlOiBjb25maWcuZGF0YWJhc2UsXG4gICAgICB1c2VyOiBjb25maWcudXNlcixcbiAgICAgIG1heFBvb2xTaXplOiBjb25maWcubWF4LFxuICAgICAgaWRsZVRpbWVvdXRNczogY29uZmlnLmlkbGVUaW1lb3V0TWlsbGlzLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXRNczogY29uZmlnLmNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzLFxuICAgICAgc3NsOiBjb25maWcuc3NsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFNpbmdsZXRvbiBkYXRhYmFzZSBpbnN0YW5jZSBmb3IgdXNlIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBkYiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogLy8gU2VsZWN0IHF1ZXJpZXNcbiAqIGNvbnN0IHBsdWdpbnMgPSBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5wbHVnaW4pO1xuICpcbiAqIC8vIEluc2VydCBxdWVyaWVzXG4gKiBhd2FpdCBkYi5pbnNlcnQoc2NoZW1hLnBsdWdpbikudmFsdWVzKHsgbmFtZTogJ215LXBsdWdpbicgfSk7XG4gKlxuICogLy8gVHJhbnNhY3Rpb25zXG4gKiBhd2FpdCBkYi50cmFuc2FjdGlvbihhc3luYyAodHgpID0+IHtcbiAqICAgYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5wbHVnaW4pLnZhbHVlcyh7IC4uLiB9KTtcbiAqICAgYXdhaXQgdHgudXBkYXRlKHNjaGVtYS5wbHVnaW4pLnNldCh7IC4uLiB9KTtcbiAqIH0pO1xuICogYGBgXG4gKi9cblxuLy8gTGF6eSBpbml0aWFsaXphdGlvbiB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiBvbiBtb2R1bGUgbG9hZFxubGV0IF9kYkluc3RhbmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIEdldCB0aGUgZGF0YWJhc2UgaW5zdGFuY2Ugd2l0aCBsYXp5IGluaXRpYWxpemF0aW9uXG4gKiBUaGlzIGF2b2lkcyB0aGUgcmFjZSBjb25kaXRpb24gd2hlcmUgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYmVmb3JlIGVudmlyb25tZW50IGlzIGNvbmZpZ3VyZWRcbiAqL1xuZnVuY3Rpb24gZ2V0RGJJbnN0YW5jZSgpOiBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPiB7XG4gIGlmICghX2RiSW5zdGFuY2UpIHtcbiAgICBfZGJJbnN0YW5jZSA9IENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKS5kYjtcbiAgfVxuICByZXR1cm4gX2RiSW5zdGFuY2U7XG59XG5cbi8qKlxuICogUHJveHktYmFzZWQgbGF6eSBkYXRhYmFzZSBpbnN0YW5jZVxuICogVGhlIGFjdHVhbCBjb25uZWN0aW9uIGlzIG9ubHkgY3JlYXRlZCB3aGVuIGZpcnN0IGFjY2Vzc2VkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGRiIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiAvLyBDb25uZWN0aW9uIGlzIGNyZWF0ZWQgaGVyZSBvbiBmaXJzdCB1c2UsIG5vdCBvbiBpbXBvcnRcbiAqIGNvbnN0IHBsdWdpbnMgPSBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5wbHVnaW4pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBkYiA9IG5ldyBQcm94eSh7fSBhcyBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPiwge1xuICBnZXQoXywgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXREYkluc3RhbmNlKCk7XG4gICAgY29uc3QgdmFsdWUgPSBpbnN0YW5jZVtwcm9wIGFzIGtleW9mIHR5cGVvZiBpbnN0YW5jZV07XG4gICAgLy8gQmluZCBtZXRob2RzIHRvIHRoZSBpbnN0YW5jZSB0byBwcmVzZXJ2ZSAndGhpcycgY29udGV4dFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGluc3RhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxufSk7XG5cbi8qKlxuICogR2V0cyB0aGUgQ29ubmVjdGlvbiBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgb3BlcmF0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBnZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiBjb25zdCBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvbigpO1xuICogY29uc3Qgc3RhdHMgPSBjb25uZWN0aW9uLmdldFN0YXRzKCk7XG4gKiBjb25zb2xlLmxvZyhgQWN0aXZlIGNvbm5lY3Rpb25zOiAke3N0YXRzLnRvdGFsQ291bnR9YCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbm5lY3Rpb24oKTogQ29ubmVjdGlvbiB7XG4gIHJldHVybiBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG59XG5cbi8qKlxuICogQ2xvc2VzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uXG4gKiBTaG91bGQgYmUgY2FsbGVkIGR1cmluZyBhcHBsaWNhdGlvbiBzaHV0ZG93blxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjbG9zZUNvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBhc3luYyAoKSA9PiB7XG4gKiAgIGF3YWl0IGNsb3NlQ29ubmVjdGlvbigpO1xuICogICBwcm9jZXNzLmV4aXQoMCk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2VDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICBhd2FpdCBjb25uZWN0aW9uLmNsb3NlKCk7XG4gIGF3YWl0IGNsb3NlUmVwbGljYVBvb2woKTsgLy8gdGVhciBkb3duIHRoZSByZWFkLXJlcGxpY2EgcG9vbCB0b28gKHNlcnZpY2VzIG9ubHkgY2FsbCB0aGlzKVxuICBfZGJJbnN0YW5jZSA9IG51bGw7IC8vIFJlc2V0IGxhenkgaW5zdGFuY2Vcbn1cblxuLyoqXG4gKiBUZXN0cyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICpcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIGNvbm5lY3Rpb24gaXMgaGVhbHRoeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyB0ZXN0Q29ubmVjdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogaWYgKGF3YWl0IHRlc3RDb25uZWN0aW9uKCkpIHtcbiAqICAgY29uc29sZS5sb2coJ0RhdGFiYXNlIGlzIHJlYWR5Jyk7XG4gKiB9IGVsc2Uge1xuICogICBjb25zb2xlLmVycm9yKCdEYXRhYmFzZSBjb25uZWN0aW9uIGZhaWxlZCcpO1xuICogICBwcm9jZXNzLmV4aXQoMSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICByZXR1cm4gY29ubmVjdGlvbi50ZXN0Q29ubmVjdGlvbigpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gZXhwbGljaXRseVxuICogQ2FsbCB0aGlzIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwIGFmdGVyIGVudmlyb25tZW50IGlzIGNvbmZpZ3VyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgaW5pdGlhbGl6ZURhdGFiYXNlIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gKiAgIC8vIExvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZpcnN0XG4gKiAgIGRvdGVudi5jb25maWcoKTtcbiAqXG4gKiAgIC8vIFRoZW4gaW5pdGlhbGl6ZSBkYXRhYmFzZVxuICogICBhd2FpdCBpbml0aWFsaXplRGF0YWJhc2UoKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZURhdGFiYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICBjb25zdCBoZWFsdGh5ID0gYXdhaXQgY29ubmVjdGlvbi50ZXN0Q29ubmVjdGlvbigpO1xuICBpZiAoIWhlYWx0aHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFiYXNlIGNvbm5lY3Rpb24gZmFpbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbicpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVhZC1yZXBsaWNhIHByaW1pdGl2ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gT3B0LWluIHJlYWQtb25seSBjbGllbnQuIFBvaW50ZWQgYXQgYSBQb3N0Z3JlcyByZXBsaWNhIHZpYSBgREJfUkVQTElDQV9IT1NUYFxuLy8gLyBgREJfUkVQTElDQV9QT1JUYCAob3RoZXIgREJfKiB2YXJzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgcHJpbWFyeSkuIFdoZW5cbi8vIGBEQl9SRVBMSUNBX0hPU1RgIGlzIHVuc2V0LCBgZGJSZXBsaWNhYCByZXNvbHZlcyB0byB0aGUgcHJpbWFyeSBgZGJgIHNvXG4vLyBleGlzdGluZyBjYWxsZXJzIHN0YXkgY29ycmVjdCBvbiBzaW5nbGUtaW5zdGFuY2UgZGVwbG95cy5cbi8vXG4vLyBVc2FnZSBwYXR0ZXJuOiByb3V0ZSByZWFkLW9ubHkgcXVlcmllcyAobGlzdCBlbmRwb2ludHMsIGRhc2hib2FyZHMsXG4vLyBhbmFseXRpY3MpIHRocm91Z2ggYGRiUmVwbGljYWAgdG8gb2ZmbG9hZCB0aGUgcHJpbWFyeS4gV3JpdGVzIGFuZFxuLy8gdHJhbnNhY3Rpb25zIE1VU1Qgc3RheSBvbiBgZGJgIOKAlCByZXBsaWNhIGxhZyB3b3VsZCBvdGhlcndpc2UgcHJvZHVjZVxuLy8gcmVhZC1hZnRlci13cml0ZSBzdXJwcmlzZXMuXG4vL1xuLy8gVGhpcyBpcyBhIHByaW1pdGl2ZSBvbmx5IOKAlCBubyBzZXJ2aWNlIGNvZGUgaGFzIGJlZW4gbWlncmF0ZWQgdG8gdXNlIGl0LlxuLy8gQ2FsbGVycyBvcHQgaW4gZXhwbGljaXRseTsgdGhlIG1pZ3JhdGlvbiBpcyBhIHBlci1xdWVyeSBkZWNpc2lvbiwgbm90IGFcbi8vIGJsYW5rZXQgc3dpdGNoIChyZXBsaWNhIGxhZyByaXNrcyB2YXJ5IGJ5IGNhbGwgc2l0ZSkuXG5cbmludGVyZmFjZSBSZXBsaWNhUG9vbCB7XG4gIHBvb2w6IFBvb2w7XG4gIGRiOiBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPjtcbn1cblxubGV0IF9yZXBsaWNhOiBSZXBsaWNhUG9vbCB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRSZXBsaWNhQ29uZmlnKCk6IFBvb2xDb25maWcgfCBudWxsIHtcbiAgY29uc3QgcmVwbGljYUhvc3QgPSBwcm9jZXNzLmVudi5EQl9SRVBMSUNBX0hPU1Q7XG4gIGlmICghcmVwbGljYUhvc3QpIHJldHVybiBudWxsO1xuICBjb25zdCBjZmcgPSBnZXREYXRhYmFzZUNvbmZpZygpO1xuICByZXR1cm4ge1xuICAgIGhvc3Q6IHJlcGxpY2FIb3N0LFxuICAgIHBvcnQ6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRCX1JFUExJQ0FfUE9SVCwgY2ZnLnBvcnQpLFxuICAgIGRhdGFiYXNlOiBjZmcuZGF0YWJhc2UsXG4gICAgdXNlcjogY2ZnLnVzZXIsXG4gICAgcGFzc3dvcmQ6IGNmZy5wYXNzd29yZCxcbiAgICBtYXg6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRCX1JFUExJQ0FfTUFYX1BPT0wsIGNmZy5tYXhQb29sU2l6ZSksXG4gICAgaWRsZVRpbWVvdXRNaWxsaXM6IGNmZy5pZGxlVGltZW91dE1pbGxpcyxcbiAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogY2ZnLmNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzLFxuICAgIGFsbG93RXhpdE9uSWRsZTogdHJ1ZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVwbGljYVBvb2woKTogUmVwbGljYVBvb2wgfCBudWxsIHtcbiAgaWYgKF9yZXBsaWNhKSByZXR1cm4gX3JlcGxpY2E7XG4gIGNvbnN0IGNmZyA9IGdldFJlcGxpY2FDb25maWcoKTtcbiAgaWYgKCFjZmcpIHJldHVybiBudWxsO1xuICBjb25zdCBwb29sID0gbmV3IFBvb2woY2ZnKTtcbiAgcG9vbC5vbignZXJyb3InLCAoZXJyKSA9PiBsb2dnZXIuZXJyb3IoJ1JlcGxpY2EgcG9vbCBlcnJvcicsIHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pKTtcbiAgX3JlcGxpY2EgPSB7IHBvb2wsIGRiOiBkcml6emxlKHBvb2wsIHsgc2NoZW1hIH0pIH07XG4gIGxvZ2dlci5pbmZvKCdSZWFkIHJlcGxpY2EgcG9vbCBpbml0aWFsaXplZCcsIHsgaG9zdDogY2ZnLmhvc3QsIHBvcnQ6IGNmZy5wb3J0IH0pO1xuICByZXR1cm4gX3JlcGxpY2E7XG59XG5cbi8qKlxuICogUHJveHkgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVhZC1yZXBsaWNhIGBkYmAgd2hlbiBgREJfUkVQTElDQV9IT1NUYCBpc1xuICogc2V0LCBhbmQgdG8gdGhlIHByaW1hcnkgYGRiYCBvdGhlcndpc2UuIFVzZSBmb3IgcmVhZC1vbmx5IHF1ZXJpZXMgdGhhdFxuICogdG9sZXJhdGUgcmVwbGljYSBsYWcgKHR5cGljYWxseSB0ZW5zIG9mIG1zKS4gV3JpdGVzIGFuZCB0cmFuc2FjdGlvbnNcbiAqIE1VU1Qgc3RheSBvbiB0aGUgcHJpbWFyeSBgZGJgLlxuICpcbiAqIFNhbWUgbGF6eS1pbml0aWFsaXphdGlvbiBwYXR0ZXJuIGFzIGBkYmAg4oCUIHRoZSByZXBsaWNhIHBvb2wgaXMgYnVpbHQgb25cbiAqIGZpcnN0IHVzZSwgbm90IG9uIG1vZHVsZSBpbXBvcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBkYlJlcGxpY2EgPSBuZXcgUHJveHkoe30gYXMgUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZT4sIHtcbiAgZ2V0KF8sIHByb3A6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgIGNvbnN0IHJlcGxpY2EgPSBnZXRSZXBsaWNhUG9vbCgpO1xuICAgIGNvbnN0IHRhcmdldCA9IHJlcGxpY2EgPyByZXBsaWNhLmRiIDogZ2V0RGJJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIHRhcmdldF07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlLmJpbmQodGFyZ2V0KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG59KTtcblxuLyoqIENsb3NlIHRoZSByZXBsaWNhIHBvb2wuIENhbGxlZCBmcm9tIGBjbG9zZUNvbm5lY3Rpb24oKWAgc28gc2VydmljZVxuICogIHNodXRkb3duIGhhbmRsZXJzIGRvbid0IGhhdmUgdG8ga25vdyBhYm91dCBib3RoIHBvb2xzIHNlcGFyYXRlbHkuICovXG5hc3luYyBmdW5jdGlvbiBjbG9zZVJlcGxpY2FQb29sKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIV9yZXBsaWNhKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgX3JlcGxpY2EucG9vbC5lbmQoKTtcbiAgICBsb2dnZXIuaW5mbygnUmVhZCByZXBsaWNhIHBvb2wgY2xvc2VkJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xvc2luZyByZXBsaWNhIHBvb2wnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgX3JlcGxpY2EgPSBudWxsO1xuICB9XG59XG4iXX0=
|
|
563
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wb3N0Z3Jlcy1jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQW9DLE1BQU0sSUFBSSxDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7QUFFeEM7OztHQUdHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBeUIsRUFBRSxRQUFnQjtJQUM5RCxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNsRCxDQUFDO0FBRUQscURBQXFEO0FBQ3JELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0FBRXhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFFBQW1DO0lBQzlELElBQUksUUFBUSxLQUFLLFNBQVM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUU1QyxN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Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBZ0MsRUFBRTtJQUNuRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQXFCO1FBQzFCLE1BQU0sT0FBTyxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQTJCLENBQUMsQ0FBQztRQUNsRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVU7WUFBRSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUg7d0VBQ3dFO0FBQ3hFLEtBQUssVUFBVSxnQkFBZ0I7SUFDN0IsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPO0lBQ3RCLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUcsQ0FBQztZQUFTLENBQUM7UUFDVCxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGUgfSBmcm9tICdkcml6emxlLW9ybS9ub2RlLXBvc3RncmVzJztcbmltcG9ydCB7IFBvb2wsIHR5cGUgUG9vbENvbmZpZywgdHlwZSBQb29sQ2xpZW50IH0gZnJvbSAncGcnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSB9IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2RhdGFiYXNlJyk7XG5cbi8qKlxuICogR2V0IGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqIE5vdGU6IFVzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRpcmVjdGx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBwaXBlbGluZS1jb3JlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSW50RW52KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gZmFsbGJhY2s7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkKSA/IGZhbGxiYWNrIDogcGFyc2VkO1xufVxuXG4vKiogRGV0ZWN0IExhbWJkYSBlbnZpcm9ubWVudCBmb3IgcG9vbC1zaXplIHR1bmluZyAqL1xuY29uc3QgaXNMYW1iZGEgPSAhIXByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBwZyBUTFMvU1NMIGNvbmZpZyBmcm9tIGFuIGV4cGxpY2l0IG9wdGlvbiBvciB0aGUgZW52aXJvbm1lbnQsXG4gKiBmb2xsb3dpbmcgdGhlIHNhbWUgZW52LXR1bmFibGUgcGF0dGVybiBhcyB0aGUgcG9vbCBzaXppbmcgYWJvdmUuXG4gKlxuICogUHJlY2VkZW5jZTpcbiAqICAgMS4gQW4gZXhwbGljaXQgYG9wdGlvbnMuc3NsYCAoY29uc3RydWN0b3IgYXJnKSBhbHdheXMgd2lucyDigJQgaW5jbHVkaW5nIGFuXG4gKiAgICAgIGV4cGxpY2l0IGBmYWxzZWAgdG8gZm9yY2UgcGxhaW50ZXh0LlxuICogICAyLiBgREJfU1NMYCAoYHRydWVgL2AxYCBvbiwgYGZhbHNlYC9gMGAgb2ZmKSBvciBQb3N0Z3Jlcycgc3RhbmRhcmRcbiAqICAgICAgYFBHU1NMTU9ERWAgKGBkaXNhYmxlYCA9IG9mZiwgYW55IG90aGVyIG1vZGUgPSBvbikuXG4gKiAgIDMuIERlZmF1bHQ6IE9OIGluIHByb2R1Y3Rpb24gKFJEUyBjb25uZWN0aW9ucyBtdXN0IGJlIGVuY3J5cHRlZCBpbiB0cmFuc2l0KSxcbiAqICAgICAgT0ZGIGV2ZXJ5d2hlcmUgZWxzZSBzbyBhIGxvY2FsIFBvc3RncmVzIHdpdGhvdXQgVExTIGtlZXBzIHdvcmtpbmcuXG4gKlxuICogV2hlbiBlbmFibGVkLCBgcmVqZWN0VW5hdXRob3JpemVkYCBmb2xsb3dzIGBEQl9TU0xfUkVKRUNUX1VOQVVUSE9SSVpFRGBcbiAqIChkZWZhdWx0IGBmYWxzZWApOiBBV1MgUkRTIHByZXNlbnRzIGEgY2VydCBzaWduZWQgYnkgdGhlIFJEUyBDQSwgd2hpY2ggaXMgbm90XG4gKiBpbiBOb2RlJ3MgZGVmYXVsdCB0cnVzdCBzdG9yZSB1bmxlc3MgdGhlIENBIGJ1bmRsZSBpcyBtb3VudGVkLCBzbyBjZXJ0aWZpY2F0ZVxuICogVkVSSUZJQ0FUSU9OIGlzIG9wdC1pbiB0byBhdm9pZCBicmVha2luZyBhIHN0b2NrIFJEUyBkZXBsb3kg4oCUIHRoZSBjaGFubmVsIGlzXG4gKiBzdGlsbCBFTkNSWVBURUQuIFNldCBgREJfU1NMX1JFSkVDVF9VTkFVVEhPUklaRUQ9dHJ1ZWAgb25jZSB0aGUgUkRTIENBIGJ1bmRsZVxuICogaXMgd2lyZWQgdG8gZ2V0IGZ1bGwgdmVyaWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3NsQ29uZmlnKGV4cGxpY2l0PzogQ29ubmVjdGlvbk9wdGlvbnNbJ3NzbCddKTogYm9vbGVhbiB8IHsgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuIH0ge1xuICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGV4cGxpY2l0O1xuXG4gIGNvbnN0IGRiU3NsID0gcHJvY2Vzcy5lbnYuREJfU1NMPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzc2xNb2RlID0gcHJvY2Vzcy5lbnYuUEdTU0xNT0RFPy50b0xvd2VyQ2FzZSgpO1xuXG4gIGxldCBlbmFibGVkOiBib29sZWFuO1xuICBpZiAoZGJTc2wgPT09ICd0cnVlJyB8fCBkYlNzbCA9PT0gJzEnKSBlbmFibGVkID0gdHJ1ZTtcbiAgZWxzZSBpZiAoZGJTc2wgPT09ICdmYWxzZScgfHwgZGJTc2wgPT09ICcwJykgZW5hYmxlZCA9IGZhbHNlO1xuICBlbHNlIGlmIChzc2xNb2RlKSBlbmFibGVkID0gc3NsTW9kZSAhPT0gJ2Rpc2FibGUnO1xuICBlbHNlIGVuYWJsZWQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuXG4gIGlmICghZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4geyByZWplY3RVbmF1dGhvcml6ZWQ6IHByb2Nlc3MuZW52LkRCX1NTTF9SRUpFQ1RfVU5BVVRIT1JJWkVEID09PSAndHJ1ZScgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VDb25maWcoKSB7XG4gIC8vIExhbWJkYTogc21hbGwgcG9vbCAoZWFjaCBpbnZvY2F0aW9uIGlzIHNob3J0LWxpdmVkLCBtYW55IGNvbmN1cnJlbnQgaW5zdGFuY2VzKVxuICAvLyBFQ1MvbG9uZy1ydW5uaW5nOiBsYXJnZXIgcG9vbCBmb3Igc3VzdGFpbmVkIGNvbmN1cnJlbmN5XG4gIGNvbnN0IGRlZmF1bHRQb29sU2l6ZSA9IGlzTGFtYmRhID8gMiA6IDIwO1xuICBjb25zdCBkZWZhdWx0SWRsZVRpbWVvdXQgPSBpc0xhbWJkYSA/IDEwMDAwIDogMzAwMDA7XG5cbiAgcmV0dXJuIHtcbiAgICBob3N0OiBwcm9jZXNzLmVudi5EQl9IT1NUIHx8ICdwb3N0Z3JlcycsXG4gICAgcG9ydDogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuREJfUE9SVCwgNTQzMiksXG4gICAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LkRBVEFCQVNFIHx8ICdwaXBlbGluZV9idWlsZGVyJyxcbiAgICB1c2VyOiBwcm9jZXNzLmVudi5EQl9VU0VSIHx8ICdwb3N0Z3JlcycsXG4gICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LkRCX1BBU1NXT1JEIHx8IChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gKCgpID0+IHsgdGhyb3cgbmV3IEVycm9yKCdEQl9QQVNTV09SRCBpcyByZXF1aXJlZCBpbiBwcm9kdWN0aW9uJyk7IH0pKCkgYXMgc3RyaW5nIDogJycpLFxuICAgIG1heFBvb2xTaXplOiBwYXJzZUludEVudihwcm9jZXNzLmVudi5EUklaWkxFX01BWF9QT09MX1NJWkUsIGRlZmF1bHRQb29sU2l6ZSksXG4gICAgaWRsZVRpbWVvdXRNaWxsaXM6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRSSVpaTEVfSURMRV9USU1FT1VUX01JTExJUywgZGVmYXVsdElkbGVUaW1lb3V0KSxcbiAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuRFJJWlpMRV9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTLCA1MDAwKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEYXRhYmFzZSBjb25uZWN0aW9uIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uU3RhdHMge1xuICB0b3RhbENvdW50OiBudW1iZXI7XG4gIGlkbGVDb3VudDogbnVtYmVyO1xuICB3YWl0aW5nQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25PcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdG8gZW5hYmxlIGNvbm5lY3Rpb24gbG9nZ2luZyAqL1xuICBlbmFibGVMb2dnaW5nPzogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IHJldHJ5IGZhaWxlZCBjb25uZWN0aW9ucyAqL1xuICBlbmFibGVBdXRvUmV0cnk/OiBib29sZWFuO1xuXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9uIHJldHJ5IGF0dGVtcHRzICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG5cbiAgLyoqIERlbGF5IGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMgaW4gbWlsbGlzZWNvbmRzICovXG4gIHJldHJ5RGVsYXk/OiBudW1iZXI7XG5cbiAgLyoqIFNTTCBjb25maWd1cmF0aW9uICovXG4gIHNzbD86IGJvb2xlYW4gfCB7IHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbiB9O1xufVxuXG4vKipcbiAqIFNpbmdsZXRvbiBkYXRhYmFzZSBjb25uZWN0aW9uIGNsYXNzLlxuICogTWFuYWdlcyBQb3N0Z3JlU1FMIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgRHJpenpsZSBPUk0gaW5zdGFuY2UuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFNpbmdsZXRvbiBwYXR0ZXJuIGZvciBzaW5nbGUgY29ubmVjdGlvbiBwb29sXG4gKiAtIEF1dG9tYXRpYyBjb25uZWN0aW9uIHJldHJ5IHdpdGggYmFja29mZlxuICogLSBDb25uZWN0aW9uIGhlYWx0aCBtb25pdG9yaW5nXG4gKiAtIEdyYWNlZnVsIHNodXRkb3duIGhhbmRsaW5nXG4gKiAtIENvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmdcbiAqIC0gQ29ubmVjdGlvbiBzdGF0aXN0aWNzIHRyYWNraW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGNvbnN0IGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG4gKiBjb25zdCBwbHVnaW5zID0gYXdhaXQgY29ubmVjdGlvbi5kYi5zZWxlY3QoKS5mcm9tKHNjaGVtYS5wbHVnaW4pO1xuICpcbiAqIC8vIER1cmluZyBzaHV0ZG93blxuICogYXdhaXQgY29ubmVjdGlvbi5jbG9zZSgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogRHJpenpsZSBPUk0gZGF0YWJhc2UgaW5zdGFuY2Ugd2l0aCBzY2hlbWFcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYjogUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwb29sOiBQb29sO1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPENvbm5lY3Rpb25PcHRpb25zPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXRyeVN0cmF0ZWd5OiBDb25uZWN0aW9uUmV0cnlTdHJhdGVneTtcbiAgcHJpdmF0ZSBpc1NodXR0aW5nRG93biA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXG4gICAqIEluaXRpYWxpemVzIFBvc3RncmVTUUwgY29ubmVjdGlvbiBwb29sIGFuZCBEcml6emxlIE9STSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgY29ubmVjdGlvblxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgZGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gZmFpbHMgYWZ0ZXIgYWxsIHJldHJpZXNcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3Iob3B0aW9uczogQ29ubmVjdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGVuYWJsZUxvZ2dpbmc6IG9wdGlvbnMuZW5hYmxlTG9nZ2luZyA/PyB0cnVlLFxuICAgICAgZW5hYmxlQXV0b1JldHJ5OiBvcHRpb25zLmVuYWJsZUF1dG9SZXRyeSA/PyB0cnVlLFxuICAgICAgbWF4UmV0cmllczogb3B0aW9ucy5tYXhSZXRyaWVzID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkRCX01BWF9SRVRSSUVTIHx8ICczJywgMTApLFxuICAgICAgcmV0cnlEZWxheTogb3B0aW9ucy5yZXRyeURlbGF5ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkRCX1JFVFJZX0RFTEFZX01TIHx8ICcxMDAwJywgMTApLFxuICAgICAgLy8gRW52LWRyaXZlbiBUTFM6IG9uLWJ5LWRlZmF1bHQgaW4gcHJvZHVjdGlvbiwgZW52LWVuYWJsZWFibGUgZWxzZXdoZXJlLlxuICAgICAgLy8gZ2V0SW5zdGFuY2UoKSBpcyBub3JtYWxseSBjYWxsZWQgd2l0aCBubyBvcHRpb25zLCBzbyB0aGlzIGlzIHRoZSBvbmx5XG4gICAgICAvLyBwbGFjZSBwcm9kdWN0aW9uIFJEUyBjb25uZWN0aW9ucyBwaWNrIHVwIFNTTCAoZm9ybWVybHkgaGFyZC1jb2RlZCBvZmYpLlxuICAgICAgc3NsOiBnZXRTc2xDb25maWcob3B0aW9ucy5zc2wpLFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIHJldHJ5IHN0cmF0ZWd5XG4gICAgdGhpcy5yZXRyeVN0cmF0ZWd5ID0gbmV3IENvbm5lY3Rpb25SZXRyeVN0cmF0ZWd5KHtcbiAgICAgIG1heFJldHJpZXM6IHRoaXMub3B0aW9ucy5tYXhSZXRyaWVzLFxuICAgICAgYmFzZURlbGF5OiB0aGlzLm9wdGlvbnMucmV0cnlEZWxheSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSBnZXREYXRhYmFzZUNvbmZpZygpO1xuXG4gICAgICBjb25zdCBwb29sQ29uZmlnOiBQb29sQ29uZmlnID0ge1xuICAgICAgICBob3N0OiBjb25maWcuaG9zdCxcbiAgICAgICAgcG9ydDogY29uZmlnLnBvcnQsXG4gICAgICAgIGRhdGFiYXNlOiBjb25maWcuZGF0YWJhc2UsXG4gICAgICAgIHVzZXI6IGNvbmZpZy51c2VyLFxuICAgICAgICBwYXNzd29yZDogY29uZmlnLnBhc3N3b3JkLFxuICAgICAgICBtYXg6IGNvbmZpZy5tYXhQb29sU2l6ZSxcbiAgICAgICAgaWRsZVRpbWVvdXRNaWxsaXM6IGNvbmZpZy5pZGxlVGltZW91dE1pbGxpcyxcbiAgICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IGNvbmZpZy5jb25uZWN0aW9uVGltZW91dE1pbGxpcyxcbiAgICAgICAgc3NsOiB0aGlzLm9wdGlvbnMuc3NsLFxuICAgICAgICBhbGxvd0V4aXRPbklkbGU6IHRydWUsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnBvb2wgPSBuZXcgUG9vbChwb29sQ29uZmlnKTtcbiAgICAgIHRoaXMuc2V0dXBFdmVudEhhbmRsZXJzKCk7XG5cbiAgICAgIHRoaXMuZGIgPSBkcml6emxlKHRoaXMucG9vbCwgeyBzY2hlbWEgfSk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgdGhpcy5sb2dDb25uZWN0aW9uQ29uZmlnKHBvb2xDb25maWcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIGRhdGFiYXNlIGNvbm5lY3Rpb246JywgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhYmFzZSBpbml0aWFsaXphdGlvbiBmYWlsZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDb25uZWN0aW9uIGNsYXNzLlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGlmIG9uZSBkb2Vzbid0IGV4aXN0LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gKG9ubHkgdXNlZCBvbiBmaXJzdCBjYWxsKVxuICAgKiBAcmV0dXJucyBUaGUgc2luZ2xldG9uIENvbm5lY3Rpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2Uob3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zKTogQ29ubmVjdGlvbiB7XG4gICAgaWYgKCFDb25uZWN0aW9uLmluc3RhbmNlKSB7XG4gICAgICBDb25uZWN0aW9uLmluc3RhbmNlID0gbmV3IENvbm5lY3Rpb24ob3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBDb25uZWN0aW9uLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLlxuICAgKiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3IgcmVjb25maWd1cmluZyB0aGUgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNsb3NlRXhpc3RpbmcgLSBXaGV0aGVyIHRvIGNsb3NlIGV4aXN0aW5nIGNvbm5lY3Rpb24gYmVmb3JlIHJlc2V0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIHJlc2V0KGNsb3NlRXhpc3Rpbmc6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKENvbm5lY3Rpb24uaW5zdGFuY2UgJiYgY2xvc2VFeGlzdGluZykge1xuICAgICAgYXdhaXQgQ29ubmVjdGlvbi5pbnN0YW5jZS5jbG9zZSgpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uLmluc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGhlYWx0aHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyB0ZXN0Q29ubmVjdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeSgnU0VMRUNUIDEnKTtcbiAgICAgIGNsaWVudC5yZWxlYXNlKCk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiB0ZXN0IHN1Y2Nlc3NmdWwnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzLmxlbmd0aCA+IDA7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRGF0YWJhc2UgY29ubmVjdGlvbiB0ZXN0IGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY29ubmVjdGlvbiBwb29sIHN0YXRpc3RpY3NcbiAgICpcbiAgICogQHJldHVybnMgQ3VycmVudCBjb25uZWN0aW9uIHBvb2wgc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGdldFN0YXRzKCk6IENvbm5lY3Rpb25TdGF0cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsQ291bnQ6IHRoaXMucG9vbC50b3RhbENvdW50LFxuICAgICAgaWRsZUNvdW50OiB0aGlzLnBvb2wuaWRsZUNvdW50LFxuICAgICAgd2FpdGluZ0NvdW50OiB0aGlzLnBvb2wud2FpdGluZ0NvdW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogREVBRCBQQVRIIOKAlCBubyBwcm9kdWN0aW9uIGNhbGxlcnMuIEV2ZXJ5IHJlYWwgdHJhbnNhY3Rpb24gZ29lcyB0aHJvdWdoXG4gICAqIGB3aXRoVGVuYW50VHhgICh0ZW5hbmN5LnRzKSwgd2hpY2ggbm93IHNldHMgYHN0YXRlbWVudF90aW1lb3V0YCBhbG9uZ3NpZGVcbiAgICogdGhlIFJMUyBHVUNzLCBzbyBUSElTIHdyYXBwZXIncyBgU0VUIExPQ0FMIHN0YXRlbWVudF90aW1lb3V0YCBndWFyZCBpcyBub1xuICAgKiBsb25nZXIgdGhlIHNlcnZlci1zaWRlIHRpbWVvdXQgbWVjaGFuaXNtLiBgZ2V0Q2xpZW50KClgIGJlbG93IGlzIGxpa2V3aXNlXG4gICAqIGNhbGxlci1sZXNzLiBCb3RoIGFyZSBzYWZlIHRvIHJlbW92ZTsga2VwdCBmb3Igbm93IHRvIGF2b2lkIGNodXJuLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBleGVjdXRlIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbm5lY3Rpb24udHJhbnNhY3Rpb24oYXN5bmMgKHR4KSA9PiB7XG4gICAqICAgYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5wbHVnaW4pLnZhbHVlcyh7IC4uLiB9KTtcbiAgICogICBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLm1ldGFkYXRhKS52YWx1ZXMoeyAuLi4gfSk7XG4gICAqICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdHJhbnNhY3Rpb248VD4oXG4gICAgY2FsbGJhY2s6IFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMuZGIudHJhbnNhY3Rpb24+WzBdLFxuICAgIHRpbWVvdXRNczogbnVtYmVyID0gcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuREJfVFJBTlNBQ1RJT05fVElNRU9VVF9NUywgMzAwMDApLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICAgIC8vIFdyYXAgY2FsbGJhY2sgdG8gc2V0IFBvc3RncmVTUUwgc3RhdGVtZW50X3RpbWVvdXQgYXMgYSBzZXJ2ZXItc2lkZSBndWFyZC5cbiAgICAvLyBUaGUgUHJvbWlzZS5yYWNlIHRpbWVvdXQgYmVsb3cgaGFuZGxlcyB0aGUgSlMgc2lkZSwgYnV0IHN0YXRlbWVudF90aW1lb3V0XG4gICAgLy8gZW5zdXJlcyB0aGUgREIgaXRzZWxmIGNhbmNlbHMgbG9uZy1ydW5uaW5nIHF1ZXJpZXMgaWYgdGhlIEpTIHRpbWVvdXQgZmlyZXNcbiAgICAvLyBidXQgdGhlIGNvbm5lY3Rpb24gaXNuJ3QgY2xlYW5lZCB1cC5cbiAgICBjb25zdCB3cmFwcGVkQ2FsbGJhY2s6IHR5cGVvZiBjYWxsYmFjayA9IGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gYFNFVCBMT0NBTCBzdGF0ZW1lbnRfdGltZW91dCA9ICR7bn1gIHBhcmFtZXRlcml6ZXMgdG8gYD0gJDFgLCB3aGljaFxuICAgICAgLy8gUG9zdGdyZXMgcmVqZWN0cyBmb3IgU0VUIOKAlCB1c2Ugc2V0X2NvbmZpZyAoYWNjZXB0cyBhIGJvdW5kIHZhbHVlLCBpc19sb2NhbFxuICAgICAgLy8gPSB0cnVlIOKHkiB0cmFuc2FjdGlvbi1zY29wZWQpLCBtYXRjaGluZyB0ZW5hbmN5LnRzLlxuICAgICAgYXdhaXQgdHguZXhlY3V0ZShzcWxgU0VMRUNUIHNldF9jb25maWcoJ3N0YXRlbWVudF90aW1lb3V0JywgJHtTdHJpbmcodGltZW91dE1zKX0sIHRydWUpYCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodHgpO1xuICAgIH07XG4gICAgY29uc3QgdHhQcm9taXNlID0gdGhpcy5kYi50cmFuc2FjdGlvbih3cmFwcGVkQ2FsbGJhY2spIGFzIFByb21pc2U8VD47XG4gICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT4ge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IoYFRyYW5zYWN0aW9uIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgKSksIHRpbWVvdXRNcyk7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW3R4UHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyISk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmVzIGEgY2xpZW50IGZyb20gdGhlIHBvb2wgZm9yIG1hbnVhbCBxdWVyeSBleGVjdXRpb25cbiAgICogUmVtZW1iZXIgdG8gcmVsZWFzZSB0aGUgY2xpZW50IHdoZW4gZG9uZVxuICAgKlxuICAgKiBAcmV0dXJucyBQb3N0Z3JlU1FMIGNsaWVudCBmcm9tIHRoZSBwb29sXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2xpZW50ID0gYXdhaXQgY29ubmVjdGlvbi5nZXRDbGllbnQoKTtcbiAgICogdHJ5IHtcbiAgICogICBhd2FpdCBjbGllbnQucXVlcnkoJ0JFR0lOJyk7XG4gICAqICAgYXdhaXQgY2xpZW50LnF1ZXJ5KCdJTlNFUlQgSU5UTyAuLi4nKTtcbiAgICogICBhd2FpdCBjbGllbnQucXVlcnkoJ0NPTU1JVCcpO1xuICAgKiB9IGZpbmFsbHkge1xuICAgKiAgIGNsaWVudC5yZWxlYXNlKCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2xpZW50KCk6IFByb21pc2U8UG9vbENsaWVudD4ge1xuICAgIHJldHVybiB0aGlzLnBvb2wuY29ubmVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIGdyYWNlZnVsbHkuXG4gICAqIFNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHNodXRkb3duLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZW91dCAtIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBjb25uZWN0aW9ucyB0byBjbG9zZSAobXMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHBvb2wgaXMgY2xvc2VkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xvc2UodGltZW91dDogbnVtYmVyID0gcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuREJfQ0xPU0VfVElNRU9VVF9NUywgNTAwMCkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1NodXR0aW5nRG93bikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Nvbm5lY3Rpb24gaXMgYWxyZWFkeSBzaHV0dGluZyBkb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1NodXR0aW5nRG93biA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDbG9zaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbC4uLicpO1xuICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuZ2V0U3RhdHMoKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFBvb2wgc3RhdHMgLSBUb3RhbDogJHtzdGF0cy50b3RhbENvdW50fSwgSWRsZTogJHtzdGF0cy5pZGxlQ291bnR9LCBXYWl0aW5nOiAke3N0YXRzLndhaXRpbmdDb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGEgdGltZW91dCBmb3IgZ3JhY2VmdWwgc2h1dGRvd25cbiAgICAgIGNvbnN0IGNsb3NlUHJvbWlzZSA9IHRoaXMucG9vbC5lbmQoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlIHRpbWVvdXQnKSksIHRpbWVvdXQpLFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtjbG9zZVByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBjbG9zZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xvc2luZyBkYXRhYmFzZSBjb25uZWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU2h1dHRpbmdEb3duID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29ubmVjdGlvbiBpcyBzaHV0dGluZyBkb3duXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgY29ubmVjdGlvbiBpcyBpbiBzaHV0ZG93biBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGlzQ2xvc2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1NodXR0aW5nRG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY29ubmVjdGlvbiBwb29sXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICB0aGlzLnBvb2wub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKCdVbmV4cGVjdGVkIGVycm9yIG9uIGlkbGUgY2xpZW50OicsIGVycik7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlQXV0b1JldHJ5ICYmIHRoaXMucmV0cnlTdHJhdGVneS5nZXRBdHRlbXB0cygpIDwgdGhpcy5vcHRpb25zLm1heFJldHJpZXMpIHtcbiAgICAgICAgdm9pZCB0aGlzLnJldHJ5U3RyYXRlZ3kuaGFuZGxlQ29ubmVjdGlvbkVycm9yKGVyciwgKCkgPT4gdGhpcy50ZXN0Q29ubmVjdGlvbigpKS5jYXRjaCgocmV0cnlFcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Nvbm5lY3Rpb24gcmV0cnkgZXJyb3I6JywgcmV0cnlFcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucG9vbC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMucmV0cnlTdHJhdGVneS5yZXNldCgpOyAvLyBSZXNldCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb25cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnTmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucG9vbC5vbigncmVtb3ZlJywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2xpZW50IHJlbW92ZWQgZnJvbSBwb29sJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gKHNhbml0aXplZClcbiAgICovXG4gIHByaXZhdGUgbG9nQ29ubmVjdGlvbkNvbmZpZyhjb25maWc6IFBvb2xDb25maWcpOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgQ29uZmlndXJhdGlvbjonLCB7XG4gICAgICBob3N0OiBgJHtjb25maWcuaG9zdH06JHtjb25maWcucG9ydH1gLFxuICAgICAgZGF0YWJhc2U6IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgIHVzZXI6IGNvbmZpZy51c2VyLFxuICAgICAgbWF4UG9vbFNpemU6IGNvbmZpZy5tYXgsXG4gICAgICBpZGxlVGltZW91dE1zOiBjb25maWcuaWRsZVRpbWVvdXRNaWxsaXMsXG4gICAgICBjb25uZWN0aW9uVGltZW91dE1zOiBjb25maWcuY29ubmVjdGlvblRpbWVvdXRNaWxsaXMsXG4gICAgICBzc2w6IGNvbmZpZy5zc2wgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2luZ2xldG9uIGRhdGFiYXNlIGluc3RhbmNlIGZvciB1c2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGRiIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiAvLyBTZWxlY3QgcXVlcmllc1xuICogY29uc3QgcGx1Z2lucyA9IGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbik7XG4gKlxuICogLy8gSW5zZXJ0IHF1ZXJpZXNcbiAqIGF3YWl0IGRiLmluc2VydChzY2hlbWEucGx1Z2luKS52YWx1ZXMoeyBuYW1lOiAnbXktcGx1Z2luJyB9KTtcbiAqXG4gKiAvLyBUcmFuc2FjdGlvbnNcbiAqIGF3YWl0IGRiLnRyYW5zYWN0aW9uKGFzeW5jICh0eCkgPT4ge1xuICogICBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBsdWdpbikudmFsdWVzKHsgLi4uIH0pO1xuICogICBhd2FpdCB0eC51cGRhdGUoc2NoZW1hLnBsdWdpbikuc2V0KHsgLi4uIH0pO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuXG4vLyBMYXp5IGluaXRpYWxpemF0aW9uIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIG9uIG1vZHVsZSBsb2FkXG5sZXQgX2RiSW5zdGFuY2U6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+IHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhYmFzZSBpbnN0YW5jZSB3aXRoIGxhenkgaW5pdGlhbGl6YXRpb25cbiAqIFRoaXMgYXZvaWRzIHRoZSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbW9kdWxlIGlzIGxvYWRlZCBiZWZvcmUgZW52aXJvbm1lbnQgaXMgY29uZmlndXJlZFxuICovXG5mdW5jdGlvbiBnZXREYkluc3RhbmNlKCk6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+IHtcbiAgaWYgKCFfZGJJbnN0YW5jZSkge1xuICAgIF9kYkluc3RhbmNlID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpLmRiO1xuICB9XG4gIHJldHVybiBfZGJJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBQcm94eS1iYXNlZCBsYXp5IGRhdGFiYXNlIGluc3RhbmNlXG4gKiBUaGUgYWN0dWFsIGNvbm5lY3Rpb24gaXMgb25seSBjcmVhdGVkIHdoZW4gZmlyc3QgYWNjZXNzZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgZGIgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIC8vIENvbm5lY3Rpb24gaXMgY3JlYXRlZCBoZXJlIG9uIGZpcnN0IHVzZSwgbm90IG9uIGltcG9ydFxuICogY29uc3QgcGx1Z2lucyA9IGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGRiID0gbmV3IFByb3h5KHt9IGFzIFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+LCB7XG4gIGdldChfLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldERiSW5zdGFuY2UoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGluc3RhbmNlW3Byb3AgYXMga2V5b2YgdHlwZW9mIGluc3RhbmNlXTtcbiAgICAvLyBCaW5kIG1ldGhvZHMgdG8gdGhlIGluc3RhbmNlIHRvIHByZXNlcnZlICd0aGlzJyBjb250ZXh0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoaW5zdGFuY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBHZXRzIHRoZSBDb25uZWN0aW9uIGluc3RhbmNlIGZvciBhZHZhbmNlZCBvcGVyYXRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGdldENvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGNvbnN0IGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7XG4gKiBjb25zdCBzdGF0cyA9IGNvbm5lY3Rpb24uZ2V0U3RhdHMoKTtcbiAqIGNvbnNvbGUubG9nKGBBY3RpdmUgY29ubmVjdGlvbnM6ICR7c3RhdHMudG90YWxDb3VudH1gKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29ubmVjdGlvbigpOiBDb25uZWN0aW9uIHtcbiAgcmV0dXJuIENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKTtcbn1cblxuLyoqXG4gKiBDbG9zZXMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAqIFNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHNodXRkb3duXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNsb3NlQ29ubmVjdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogcHJvY2Vzcy5vbignU0lHVEVSTScsIGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgY2xvc2VDb25uZWN0aW9uKCk7XG4gKiAgIHByb2Nlc3MuZXhpdCgwKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9zZUNvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG4gIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgYXdhaXQgY2xvc2VSZXBsaWNhUG9vbCgpOyAvLyB0ZWFyIGRvd24gdGhlIHJlYWQtcmVwbGljYSBwb29sIHRvbyAoc2VydmljZXMgb25seSBjYWxsIHRoaXMpXG4gIF9kYkluc3RhbmNlID0gbnVsbDsgLy8gUmVzZXQgbGF6eSBpbnN0YW5jZVxufVxuXG4vKipcbiAqIFRlc3RzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uXG4gKlxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgY29ubmVjdGlvbiBpcyBoZWFsdGh5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHRlc3RDb25uZWN0aW9uIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiBpZiAoYXdhaXQgdGVzdENvbm5lY3Rpb24oKSkge1xuICogICBjb25zb2xlLmxvZygnRGF0YWJhc2UgaXMgcmVhZHknKTtcbiAqIH0gZWxzZSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoJ0RhdGFiYXNlIGNvbm5lY3Rpb24gZmFpbGVkJyk7XG4gKiAgIHByb2Nlc3MuZXhpdCgxKTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbm5lY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG4gIHJldHVybiBjb25uZWN0aW9uLnRlc3RDb25uZWN0aW9uKCk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBleHBsaWNpdGx5XG4gKiBDYWxsIHRoaXMgZHVyaW5nIGFwcGxpY2F0aW9uIHN0YXJ0dXAgYWZ0ZXIgZW52aXJvbm1lbnQgaXMgY29uZmlndXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBpbml0aWFsaXplRGF0YWJhc2UgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZmlyc3RcbiAqICAgZG90ZW52LmNvbmZpZygpO1xuICpcbiAqICAgLy8gVGhlbiBpbml0aWFsaXplIGRhdGFiYXNlXG4gKiAgIGF3YWl0IGluaXRpYWxpemVEYXRhYmFzZSgpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRGF0YWJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG4gIGNvbnN0IGhlYWx0aHkgPSBhd2FpdCBjb25uZWN0aW9uLnRlc3RDb25uZWN0aW9uKCk7XG4gIGlmICghaGVhbHRoeSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGF0YWJhc2UgY29ubmVjdGlvbiBmYWlsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uJyk7XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWFkLXJlcGxpY2EgcHJpbWl0aXZlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBPcHQtaW4gcmVhZC1vbmx5IGNsaWVudC4gUG9pbnRlZCBhdCBhIFBvc3RncmVzIHJlcGxpY2EgdmlhIGBEQl9SRVBMSUNBX0hPU1RgXG4vLyAvIGBEQl9SRVBMSUNBX1BPUlRgIChvdGhlciBEQl8qIHZhcnMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBwcmltYXJ5KS4gV2hlblxuLy8gYERCX1JFUExJQ0FfSE9TVGAgaXMgdW5zZXQsIGBkYlJlcGxpY2FgIHJlc29sdmVzIHRvIHRoZSBwcmltYXJ5IGBkYmAgc29cbi8vIGV4aXN0aW5nIGNhbGxlcnMgc3RheSBjb3JyZWN0IG9uIHNpbmdsZS1pbnN0YW5jZSBkZXBsb3lzLlxuLy9cbi8vIFVzYWdlIHBhdHRlcm46IHJvdXRlIHJlYWQtb25seSBxdWVyaWVzIChsaXN0IGVuZHBvaW50cywgZGFzaGJvYXJkcyxcbi8vIGFuYWx5dGljcykgdGhyb3VnaCBgZGJSZXBsaWNhYCB0byBvZmZsb2FkIHRoZSBwcmltYXJ5LiBXcml0ZXMgYW5kXG4vLyB0cmFuc2FjdGlvbnMgTVVTVCBzdGF5IG9uIGBkYmAg4oCUIHJlcGxpY2EgbGFnIHdvdWxkIG90aGVyd2lzZSBwcm9kdWNlXG4vLyByZWFkLWFmdGVyLXdyaXRlIHN1cnByaXNlcy5cbi8vXG4vLyBUaGlzIGlzIGEgcHJpbWl0aXZlIG9ubHkg4oCUIG5vIHNlcnZpY2UgY29kZSBoYXMgYmVlbiBtaWdyYXRlZCB0byB1c2UgaXQuXG4vLyBDYWxsZXJzIG9wdCBpbiBleHBsaWNpdGx5OyB0aGUgbWlncmF0aW9uIGlzIGEgcGVyLXF1ZXJ5IGRlY2lzaW9uLCBub3QgYVxuLy8gYmxhbmtldCBzd2l0Y2ggKHJlcGxpY2EgbGFnIHJpc2tzIHZhcnkgYnkgY2FsbCBzaXRlKS5cblxuaW50ZXJmYWNlIFJlcGxpY2FQb29sIHtcbiAgcG9vbDogUG9vbDtcbiAgZGI6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+O1xufVxuXG5sZXQgX3JlcGxpY2E6IFJlcGxpY2FQb29sIHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGdldFJlcGxpY2FDb25maWcoKTogUG9vbENvbmZpZyB8IG51bGwge1xuICBjb25zdCByZXBsaWNhSG9zdCA9IHByb2Nlc3MuZW52LkRCX1JFUExJQ0FfSE9TVDtcbiAgaWYgKCFyZXBsaWNhSG9zdCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGNmZyA9IGdldERhdGFiYXNlQ29uZmlnKCk7XG4gIHJldHVybiB7XG4gICAgaG9zdDogcmVwbGljYUhvc3QsXG4gICAgcG9ydDogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuREJfUkVQTElDQV9QT1JULCBjZmcucG9ydCksXG4gICAgZGF0YWJhc2U6IGNmZy5kYXRhYmFzZSxcbiAgICB1c2VyOiBjZmcudXNlcixcbiAgICBwYXNzd29yZDogY2ZnLnBhc3N3b3JkLFxuICAgIG1heDogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuREJfUkVQTElDQV9NQVhfUE9PTCwgY2ZnLm1heFBvb2xTaXplKSxcbiAgICBpZGxlVGltZW91dE1pbGxpczogY2ZnLmlkbGVUaW1lb3V0TWlsbGlzLFxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBjZmcuY29ubmVjdGlvblRpbWVvdXRNaWxsaXMsXG4gICAgYWxsb3dFeGl0T25JZGxlOiB0cnVlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZXBsaWNhUG9vbCgpOiBSZXBsaWNhUG9vbCB8IG51bGwge1xuICBpZiAoX3JlcGxpY2EpIHJldHVybiBfcmVwbGljYTtcbiAgY29uc3QgY2ZnID0gZ2V0UmVwbGljYUNvbmZpZygpO1xuICBpZiAoIWNmZykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHBvb2wgPSBuZXcgUG9vbChjZmcpO1xuICBwb29sLm9uKCdlcnJvcicsIChlcnIpID0+IGxvZ2dlci5lcnJvcignUmVwbGljYSBwb29sIGVycm9yJywgeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSkpO1xuICBfcmVwbGljYSA9IHsgcG9vbCwgZGI6IGRyaXp6bGUocG9vbCwgeyBzY2hlbWEgfSkgfTtcbiAgbG9nZ2VyLmluZm8oJ1JlYWQgcmVwbGljYSBwb29sIGluaXRpYWxpemVkJywgeyBob3N0OiBjZmcuaG9zdCwgcG9ydDogY2ZnLnBvcnQgfSk7XG4gIHJldHVybiBfcmVwbGljYTtcbn1cblxuLyoqXG4gKiBQcm94eSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWFkLXJlcGxpY2EgYGRiYCB3aGVuIGBEQl9SRVBMSUNBX0hPU1RgIGlzXG4gKiBzZXQsIGFuZCB0byB0aGUgcHJpbWFyeSBgZGJgIG90aGVyd2lzZS4gVXNlIGZvciByZWFkLW9ubHkgcXVlcmllcyB0aGF0XG4gKiB0b2xlcmF0ZSByZXBsaWNhIGxhZyAodHlwaWNhbGx5IHRlbnMgb2YgbXMpLiBXcml0ZXMgYW5kIHRyYW5zYWN0aW9uc1xuICogTVVTVCBzdGF5IG9uIHRoZSBwcmltYXJ5IGBkYmAuXG4gKlxuICogU2FtZSBsYXp5LWluaXRpYWxpemF0aW9uIHBhdHRlcm4gYXMgYGRiYCDigJQgdGhlIHJlcGxpY2EgcG9vbCBpcyBidWlsdCBvblxuICogZmlyc3QgdXNlLCBub3Qgb24gbW9kdWxlIGltcG9ydC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRiUmVwbGljYSA9IG5ldyBQcm94eSh7fSBhcyBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPiwge1xuICBnZXQoXywgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgY29uc3QgcmVwbGljYSA9IGdldFJlcGxpY2FQb29sKCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gcmVwbGljYSA/IHJlcGxpY2EuZGIgOiBnZXREYkluc3RhbmNlKCk7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXRbcHJvcCBhcyBrZXlvZiB0eXBlb2YgdGFyZ2V0XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdmFsdWUuYmluZCh0YXJnZXQpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbn0pO1xuXG4vKiogQ2xvc2UgdGhlIHJlcGxpY2EgcG9vbC4gQ2FsbGVkIGZyb20gYGNsb3NlQ29ubmVjdGlvbigpYCBzbyBzZXJ2aWNlXG4gKiAgc2h1dGRvd24gaGFuZGxlcnMgZG9uJ3QgaGF2ZSB0byBrbm93IGFib3V0IGJvdGggcG9vbHMgc2VwYXJhdGVseS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNsb3NlUmVwbGljYVBvb2woKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghX3JlcGxpY2EpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBfcmVwbGljYS5wb29sLmVuZCgpO1xuICAgIGxvZ2dlci5pbmZvKCdSZWFkIHJlcGxpY2EgcG9vbCBjbG9zZWQnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdFcnJvciBjbG9zaW5nIHJlcGxpY2EgcG9vbCcsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfcmVwbGljYSA9IG51bGw7XG4gIH1cbn1cbiJdfQ==
|
package/lib/database/tenancy.js
CHANGED
|
@@ -45,6 +45,19 @@ function getContextMode() {
|
|
|
45
45
|
// No explicit override: fail-fast in production, warn everywhere else.
|
|
46
46
|
return process.env.NODE_ENV === 'production' ? 'strict' : 'warn';
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Per-statement server-side timeout (ms) applied INSIDE every `withTenantTx`
|
|
50
|
+
* transaction, next to the RLS GUCs. `withTenantTx` is the real query path for
|
|
51
|
+
* all RLS/CRUD reads and writes, so this is where the DB-side guard belongs (the
|
|
52
|
+
* old `Connection.transaction` wrapper that set it is dead — see
|
|
53
|
+
* postgres-connection.ts). Bounds a runaway query so it can't hold a pooled
|
|
54
|
+
* connection open indefinitely. Env-configurable via `DB_STATEMENT_TIMEOUT_MS`
|
|
55
|
+
* (default 30s); set to `0` to disable the timeout.
|
|
56
|
+
*/
|
|
57
|
+
function getStatementTimeoutMs() {
|
|
58
|
+
const raw = parseInt(process.env.DB_STATEMENT_TIMEOUT_MS ?? '', 10);
|
|
59
|
+
return Number.isFinite(raw) && raw >= 0 ? raw : 30000;
|
|
60
|
+
}
|
|
48
61
|
/**
|
|
49
62
|
* Per-request tenant context. Populated by Express middleware once the JWT
|
|
50
63
|
* is validated; consumed by `withTenantTx` and any helper that needs to
|
|
@@ -127,13 +140,21 @@ export async function withTenantTx(fn) {
|
|
|
127
140
|
}
|
|
128
141
|
const orgId = ctx?.orgId ?? '';
|
|
129
142
|
const isSuperAdmin = ctx?.isSuperAdmin ? 'true' : 'false';
|
|
143
|
+
const statementTimeoutMs = getStatementTimeoutMs();
|
|
130
144
|
return db.transaction(async (tx) => {
|
|
131
145
|
// SET LOCAL via set_config() so the values are transaction-scoped (auto-
|
|
132
146
|
// released on COMMIT/ROLLBACK). The driver binds the values as parameters,
|
|
133
147
|
// so a hostile org_id can't break out of the GUC syntax.
|
|
134
148
|
await tx.execute(sql `SELECT set_config('app.org_id', ${orgId}, true)`);
|
|
135
149
|
await tx.execute(sql `SELECT set_config('app.is_sysadmin', ${isSuperAdmin}, true)`);
|
|
150
|
+
// Server-side statement timeout on the REAL query path (transaction-scoped,
|
|
151
|
+
// same set_config(is_local=true) mechanism as the RLS GUCs). `SET LOCAL
|
|
152
|
+
// statement_timeout = $1` is rejected by Postgres, so set_config with a bound
|
|
153
|
+
// value is used. A bare number is milliseconds. Skipped when disabled (0).
|
|
154
|
+
if (statementTimeoutMs > 0) {
|
|
155
|
+
await tx.execute(sql `SELECT set_config('statement_timeout', ${String(statementTimeoutMs)}, true)`);
|
|
156
|
+
}
|
|
136
157
|
return fn(tx);
|
|
137
158
|
});
|
|
138
159
|
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW5jeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS90ZW5hbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBZTlDLFNBQVMsY0FBYztJQUNyQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3hELElBQUksR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDdkUsdUVBQXVFO0lBQ3ZFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNuRSxDQUFDO0FBZUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGlCQUFpQixFQUFpQixDQUFDO0FBRXBFOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFJLEdBQWtCLEVBQUUsRUFBVztJQUNyRSxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRDswRUFDMEU7QUFDMUUsTUFBTSxVQUFVLGdCQUFnQjtJQUM5QixPQUFPLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxNQUFNLElBQUksS0FBSyxDQUNiLDRFQUE0RTtjQUMxRSx3RUFBd0UsQ0FDM0UsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FDaEMsRUFBMkU7SUFFM0UsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRXJDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxtRUFBbUU7UUFDbkUsNkJBQTZCO1FBQzdCLE1BQU0sSUFBSSxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQ2IsdUVBQXVFO2tCQUNyRSx3RUFBd0U7a0JBQ3hFLCtDQUErQyxDQUNsRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLHNFQUFzRTtZQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLG9FQUFvRSxFQUFFO2dCQUNoRixLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxLQUFLO2FBQ2pELENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDL0IsTUFBTSxZQUFZLEdBQUcsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFFMUQsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNqQyx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLHlEQUF5RDtRQUN6RCxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBLG1DQUFtQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUEsd0NBQXdDLFlBQVksU0FBUyxDQUFDLENBQUM7UUFDbkYsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGVuYW50LWNvbnRleHQgcGx1bWJpbmcgZm9yIFBvc3RncmVzIHJvdy1sZXZlbCBzZWN1cml0eS5cbiAqXG4gKiBCYWNrZ3JvdW5kOiBwb3N0Z3Jlcy1pbml0LnNxbCBpbnN0YWxscyBSTFMgcG9saWNpZXMgb24gZXZlcnkgdXNlci1kYXRhXG4gKiB0YWJsZSB0aGF0IGNvbnN1bHQgdHdvIHNlc3Npb24gR1VDcyDigJQgYGFwcC5vcmdfaWRgIGFuZCBgYXBwLmlzX3N5c2FkbWluYC5cbiAqIFRvZGF5IHRoZSB0YWJsZXMgYXJlIGluIG93bmVyLWJ5cGFzcyBtb2RlICh0aGUgY29ubmVjdGlvbiB1c2VyIG93bnMgdGhlbSxcbiAqIFBvc3RncmVzIGxldHMgb3duZXJzIHNraXAgUkxTKSwgc28gdGhlIHBvbGljaWVzIGRvbid0IGFjdHVhbGx5IGVuZm9yY2UuXG4gKiBPbmNlIHdlIGZsaXAgYSB0YWJsZSB0byBgRk9SQ0UgUk9XIExFVkVMIFNFQ1VSSVRZYCwgZXZlcnkgcXVlcnkgYWdhaW5zdFxuICogaXQgbXVzdCBydW4gaW5zaWRlIGEgdHJhbnNhY3Rpb24gdGhhdCBoYXMgU0VUIExPQ0FMJ2QgYm90aCBHVUNzIOKAlCBvciBpdFxuICogcmV0dXJucyB6ZXJvIHJvd3MgZm9yIG5vbi1zeXNhZG1pbnMgKGFuZCBtYXkgZmFpbCB0byB3cml0ZSBmb3IgYW55IGNhbGxlcikuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgdGhlIHNlYW0uXG4gKlxuICogICAxLiBgdGVuYW50Q29udGV4dGAgKEFzeW5jTG9jYWxTdG9yYWdlKSBjYXJyaWVzIGB7b3JnSWQsIGlzU3VwZXJBZG1pbn1gXG4gKiAgICAgIGRvd24gdGhlIGNhbGwgY2hhaW4gd2l0aG91dCBwcm9wLWRyaWxsaW5nLiBTZXQgb25jZSBhdCB0aGUgcmVxdWVzdFxuICogICAgICBib3VuZGFyeTsgcmVhZGFibGUgZnJvbSBhbnl3aGVyZS5cbiAqXG4gKiAgIDIuIGB3aXRoVGVuYW50VHgoZm4pYCBvcGVucyBhIHRyYW5zYWN0aW9uLCBTRVQgTE9DQUwncyBib3RoIEdVQ3MgZnJvbVxuICogICAgICB0aGUgc3Vycm91bmRpbmcgY29udGV4dCwgdGhlbiBpbnZva2VzIGBmbih0eClgLiBTZXJ2aWNlcyBtaWdyYXRlIG9uZVxuICogICAgICBhdCBhIHRpbWUgYnkgd3JhcHBpbmcgdGhlaXIgZXhpc3RpbmcgZHJpenpsZSBjYWxscyBpbiB0aGlzIGhlbHBlciDigJRcbiAqICAgICAgYGRiLnNlbGVjdCgpLmZyb20oLi4uKWAgYmVjb21lcyBgd2l0aFRlbmFudFR4KHR4ID0+IHR4LnNlbGVjdCgpLmZyb20oLi4uKSlgLlxuICpcbiAqICAgMy4gYHJ1bldpdGhUZW5hbnRDb250ZXh0KGN0eCwgZm4pYCBpcyB0aGUgRXhwcmVzcy1taWRkbGV3YXJlLXNpZGVcbiAqICAgICAgYm9va2VuZCB0aGF0IGVzdGFibGlzaGVzIHRoZSBBc3luY0xvY2FsU3RvcmFnZSBzY29wZSBmb3IgdGhlIHJlcXVlc3QuXG4gKlxuICogTWlncmF0aW9uIG9yZGVyIChzZWUgZG9jcy9wbGFucy9mLTEtMC1ybHMtZW5mb3JjZW1lbnQubWQpOlxuICogICAtIEZpcnN0IGFkb3B0ZXJzOiBuZXdseS13cml0dGVuIHNlcnZpY2VzIChkYXNoYm9hcmQsIGFsZXJ0LWRlc3RpbmF0aW9uKVxuICogICAgIHdoZXJlIHRoZSBjaGFuZ2UgaXMgbWVjaGFuaWNhbC5cbiAqICAgLSBUaGVuIGhpZ2gtd3JpdGUgc2VydmljZXMgKHBsdWdpbiwgcGlwZWxpbmUpLiBTb2FrIGVhY2ggb25lIGJlZm9yZVxuICogICAgIGZsaXBwaW5nIHRoZSB1bmRlcmx5aW5nIHRhYmxlIHRvIEZPUkNFLlxuICogICAtIGFkbWluX2F1ZGl0X2xvZyB1c2VzIGEgc3lzYWRtaW4tb25seSBwb2xpY3kg4oCUIHN5c2FkbWluIHBhdGhzIG11c3RcbiAqICAgICBhbHNvIHNldCBgYXBwLmlzX3N5c2FkbWluID0gJ3RydWUnYCBvciB0aGV5J2xsIGxvc2UgYWNjZXNzIHRvIGl0LlxuICovXG5cbmltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBkYiB9IGZyb20gJy4vcG9zdGdyZXMtY29ubmVjdGlvbi5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigndGVuYW50LWNvbnRleHQnKTtcblxuLyoqXG4gKiBCZWhhdmlvciB3aGVuIGB3aXRoVGVuYW50VHhgIGlzIGludm9rZWQgb3V0c2lkZSBhbnkgYHJ1bldpdGhUZW5hbnRDb250ZXh0YFxuICogc2NvcGUuIFRoZSBlZmZlY3RpdmUgZGVmYXVsdCBpcyBmYWlsLWZhc3QgKCdzdHJpY3QnKSBpbiBwcm9kdWN0aW9uIHNvIGFcbiAqIG1pc3NpbmcgdGVuYW50IHNjb3BlIHN1cmZhY2VzIGF0IHRoZSBiYWQgY2FsbCBzaXRlIGluc3RlYWQgb2Ygc2lsZW50bHlcbiAqIHJ1bm5pbmcgd2l0aCBlbXB0eSBSTFMgR1VDczsgb3V0c2lkZSBwcm9kdWN0aW9uIGl0IGRlZmF1bHRzIHRvICd3YXJuJyBzb1xuICogdW4tYXVkaXRlZCBkZXYvdGVzdCBwYXRocyBrZWVwIHdvcmtpbmcgYnV0IGxvZyBhbiBhY3Rpb25hYmxlIHRyYWNlLiBBblxuICogZXhwbGljaXQgUkxTX0NPTlRFWFRfTU9ERSBlbnYgb3ZlcnJpZGUgYWx3YXlzIHdpbnMuXG4gKlxuICogJ3NpbGVudCcgaXMga2VwdCBmb3IgdGVzdHMgYW5kIHNjcmlwdHMgdGhhdCBpbnRlbnRpb25hbGx5IGVudGVyIHRoZSBEQlxuICogd2l0aG91dCBjb250ZXh0IChlLmcuIGludGVncmF0aW9uIHRlc3Qgc2V0dXAgdGhhdCBydW5zIGFzIHRoZSBjb25uZWN0aW9uXG4gKiBvd25lciBiZWZvcmUgYW55IHRlbmFudCBpcyBwcm92aXNpb25lZCkuXG4gKi9cbnR5cGUgQ29udGV4dE1vZGUgPSAnc2lsZW50JyB8ICd3YXJuJyB8ICdzdHJpY3QnO1xuZnVuY3Rpb24gZ2V0Q29udGV4dE1vZGUoKTogQ29udGV4dE1vZGUge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5STFNfQ09OVEVYVF9NT0RFPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAocmF3ID09PSAnc2lsZW50JyB8fCByYXcgPT09ICd3YXJuJyB8fCByYXcgPT09ICdzdHJpY3QnKSByZXR1cm4gcmF3O1xuICAvLyBObyBleHBsaWNpdCBvdmVycmlkZTogZmFpbC1mYXN0IGluIHByb2R1Y3Rpb24sIHdhcm4gZXZlcnl3aGVyZSBlbHNlLlxuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyA/ICdzdHJpY3QnIDogJ3dhcm4nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbmFudENvbnRleHQge1xuICAvKiogQ2FsbGVyJ3Mgb3JnLiBVbmRlZmluZWQgZm9yIHVuLWF1dGhlbnRpY2F0ZWQgLyBzeXN0ZW0gam9icy4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIGNhbGxlciBpcyBhIHN5c2FkbWluIChzeXN0ZW0tb3JnIGFkbWluKS4gQnlwYXNzZXMgUkxTXG4gICAqICBwb2xpY2llcyB2aWEgdGhlIHN5c2FkbWluLWJ5cGFzcyBicmFuY2ggaW4gYGN1cnJlbnRfaXNfc3lzYWRtaW4oKWAuICovXG4gIGlzU3VwZXJBZG1pbjogYm9vbGVhbjtcbiAgLyoqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHRoZSBjYWxsZXIncyBhY3RpdmUtb3JnIHBhcmVudCAocHJlc2VudCBvbmx5IHdoZW4gdGhlXG4gICAqICBhY3RpdmUgb3JnIGlzIGEgdGVhbSkuIE5vdCB1c2VkIGZvciBSTFM7IGNhcnJpZWQgc28gZG93bnN0cmVhbSBzaWRlLWVmZmVjdHNcbiAgICogIChlLmcuIGVudGl0eS1ldmVudCBjb21wbGlhbmNlIGV2YWwpIGNhbiBob25vciBwYXJlbnQgYHByb3BhZ2F0ZVRvQ2hpbGRyZW5gXG4gICAqICBydWxlcyB3aXRob3V0IGEgcmVxdWVzdCBpbiBzY29wZS4gKi9cbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGVyLXJlcXVlc3QgdGVuYW50IGNvbnRleHQuIFBvcHVsYXRlZCBieSBFeHByZXNzIG1pZGRsZXdhcmUgb25jZSB0aGUgSldUXG4gKiBpcyB2YWxpZGF0ZWQ7IGNvbnN1bWVkIGJ5IGB3aXRoVGVuYW50VHhgIGFuZCBhbnkgaGVscGVyIHRoYXQgbmVlZHMgdG9cbiAqIGtub3cgXCJ3aG8gaXMgdGhlIGNhbGxlclwiIHdpdGhvdXQgcmUtZGVyaXZpbmcgZnJvbSB0aGUgcmVxdWVzdCBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCB0ZW5hbnRDb250ZXh0ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFRlbmFudENvbnRleHQ+KCk7XG5cbi8qKlxuICogUnVuIGBmbmAgaW5zaWRlIHRoZSBnaXZlbiB0ZW5hbnQgc2NvcGUuIFRoZSBBc3luY0xvY2FsU3RvcmFnZSBzY29wZVxuICogc3Vydml2ZXMgYWNyb3NzIGFzeW5jIGJvdW5kYXJpZXMgKFByb21pc2VzLCBzZXRUaW1lb3V0LCBldGMuKSwgc28gYW55XG4gKiBgd2l0aFRlbmFudFR4YCBjYWxsIGluc2lkZSBgZm5gIOKAlCBkaXJlY3RseSBvciB0aHJvdWdoIGFueSBkZXB0aCBvZlxuICogYXN5bmMgaGVscGVycyDigJQgcGlja3MgdXAgYGN0eGAuXG4gKlxuICogV3JhcCBgbmV4dCgpYCBmcm9tIGFuIEV4cHJlc3MgbWlkZGxld2FyZSB0byBlc3RhYmxpc2ggcGVyLXJlcXVlc3Qgc2NvcGU6XG4gKlxuICogICAgIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gKiAgICAgICBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW4gfSwgKCkgPT4gbmV4dCgpKTtcbiAqICAgICB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhUZW5hbnRDb250ZXh0PFQ+KGN0eDogVGVuYW50Q29udGV4dCwgZm46ICgpID0+IFQpOiBUIHtcbiAgcmV0dXJuIHRlbmFudENvbnRleHQucnVuKGN0eCwgZm4pO1xufVxuXG4vKiogUmVhZCB0aGUgY3VycmVudCB0ZW5hbnQgY29udGV4dC4gUmV0dXJucyB1bmRlZmluZWQgb3V0c2lkZSBhblxuICogIGBydW5XaXRoVGVuYW50Q29udGV4dGAgc2NvcGUgKGUuZy4gYmFja2dyb3VuZCB3b3JrZXJzLCBtaWdyYXRpb25zKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5hbnRDb250ZXh0KCk6IFRlbmFudENvbnRleHQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGVuYW50Q29udGV4dC5nZXRTdG9yZSgpO1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSBjdXJyZW50IGNvZGUgaXMgcnVubmluZyBpbnNpZGUgYSB0ZW5hbnQgc2NvcGUuIENhbGxlcnNcbiAqIHRoYXQgbGVnaXRpbWF0ZWx5IG5lZWQgdG8gcmVmdXNlIHRvIG9wZXJhdGUgd2l0aG91dCBvbmUgKGUuZy4gaGFuZGxlcnNcbiAqIHRoYXQgdG91Y2ggRk9SQ0UnZCBSTFMgdGFibGVzKSBjYW4gdXNlIHRoaXMgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoZVxuICogZG93bnN0cmVhbSBcInBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3IgdG8gc3VyZmFjZSB0aGUgYnVnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVRlbmFudENvbnRleHQoKTogVGVuYW50Q29udGV4dCB7XG4gIGNvbnN0IGN0eCA9IHRlbmFudENvbnRleHQuZ2V0U3RvcmUoKTtcbiAgaWYgKCFjdHgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAncmVxdWlyZVRlbmFudENvbnRleHQ6IG5vIHRlbmFudCBzY29wZSBhY3RpdmUuIFdyYXAgeW91ciBoYW5kbGVyL3dvcmtlciBpbiAnXG4gICAgICArICdydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW4gfSwgLi4uKSBiZWZvcmUgYW55IERCIGNhbGwuJyxcbiAgICApO1xuICB9XG4gIHJldHVybiBjdHg7XG59XG5cbi8qKlxuICogT3BlbiBhIHRyYW5zYWN0aW9uIHdpdGggUkxTIEdVQ3MgU0VUIExPQ0FMIGZyb20gdGhlIGN1cnJlbnRcbiAqIEFzeW5jTG9jYWxTdG9yYWdlIHRlbmFudCBjb250ZXh0LCB0aGVuIGludm9rZSBgZm4odHgpYC5cbiAqXG4gKiAtIFdoZW4gY2FsbGVkIG91dHNpZGUgYSB0ZW5hbnQgc2NvcGUgKGUuZy4gZnJvbSBhIGJhY2tncm91bmQgam9iIHRoYXRcbiAqICAgZG9lc24ndCBoYXZlIGEgY2FsbGVyIGlkZW50aXR5KSwgdGhlIHRyYW5zYWN0aW9uIGlzIG9wZW5lZCB3aXRoIGJvdGhcbiAqICAgR1VDcyBjbGVhcmVkIOKAlCBSTFMgcG9saWNpZXMgd2lsbCByZXR1cm4gemVybyByb3dzIG9uIEZPUkNFJ2QgdGFibGVzLlxuICogICBDYWxsZXJzIHRoYXQgbmVlZCBhIHN5c2FkbWluLWVxdWl2YWxlbnQgc2NvcGUgc2hvdWxkIHdyYXAgdGhlbXNlbHZlcyBpblxuICogICBgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwg4oCmKWAgZXhwbGljaXRseS5cbiAqXG4gKiAtIFVzZXMgYHNldF9jb25maWcoa2V5LCB2YWx1ZSwgdHJ1ZSlgICh0aGUgYm9vbGVhbiA9IGBpc19sb2NhbGAsIGkuZS5cbiAqICAgdHJhbnNhY3Rpb24tc2NvcGVkKS4gRXF1aXZhbGVudCB0byBgU0VUIExPQ0FMYCBidXQgdGFrZXMgdGhlIHZhbHVlIGFzXG4gKiAgIGEgcGFyYW1ldGVyLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQg4oCUIERyaXp6bGUncyBgc3FsYCB0ZW1wbGF0ZSBiaW5kcyB0aGVcbiAqICAgdmFsdWUgc2FmZWx5IHNvIGFuIGF0dGFja2VyLWNvbnRyb2xsZWQgYG9yZ0lkYCBjYW4ndCBlc2NhcGUgdGhlIHF1b3RpbmcuXG4gKlxuICogLSBSZXR1cm5zIHdoYXRldmVyIGBmbmAgcmV0dXJuczsgdGhyb3dzIHdoYXRldmVyIGBmbmAgdGhyb3dzIChEcml6emxlXG4gKiAgIGhhbmRsZXMgdGhlIENPTU1JVC9ST0xMQkFDSyBmb3IgdXMpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFRlbmFudFR4PFQ+KFxuICBmbjogKHR4OiBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8dHlwZW9mIGRiLnRyYW5zYWN0aW9uPlswXT5bMF0pID0+IFByb21pc2U8VD4sXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgY3R4ID0gdGVuYW50Q29udGV4dC5nZXRTdG9yZSgpO1xuXG4gIGlmICghY3R4KSB7XG4gICAgLy8gU3VyZmFjZSB0aGUgYnVnIGluc3RlYWQgb2Ygc2lsZW50bHkgU0VUJ2luZyBlbXB0eSBHVUNzLiBUaGUgZGVmYXVsdFxuICAgIC8vIG1vZGUgKCd3YXJuJykgbG9ncyBhbiBhY3Rpb25hYmxlIHRyYWNlIHNvIHRoZSBiYWQgY2FsbCBzaXRlIGlzIGVhc3lcbiAgICAvLyB0byBmaW5kOyBwcm9kdWN0aW9uIGRlcGxveW1lbnRzIHRoYXQgaGF2ZSBmaW5pc2hlZCB0aGUgYXVkaXQgY2FuIHNldFxuICAgIC8vIFJMU19DT05URVhUX01PREU9c3RyaWN0IHRvIGZhaWwtZmFzdCBhdCB0aGUgY2FsbCBzaXRlIChiZXR0ZXIgc3RhY2tcbiAgICAvLyB0cmFjZSB0aGFuIHRoZSBQb3N0Z3JlcyBcInBlcm1pc3Npb24gZGVuaWVkXCIgdGhhdCB3b3VsZCBvdGhlcndpc2VcbiAgICAvLyBzdXJmYWNlIGZyb20gRk9SQ0UnZCBSTFMpLlxuICAgIGNvbnN0IG1vZGUgPSBnZXRDb250ZXh0TW9kZSgpO1xuICAgIGlmIChtb2RlID09PSAnc3RyaWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnd2l0aFRlbmFudFR4IGNhbGxlZCBvdXRzaWRlIGEgdGVuYW50IHNjb3BlLiBXcmFwIHlvdXIgaGFuZGxlci93b3JrZXIgJ1xuICAgICAgICArICdpbiBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW4gfSwgLi4uKSBiZWZvcmUgaW52b2tpbmcgJ1xuICAgICAgICArICdhbnkgc2VydmljZSB0aGF0IHRvdWNoZXMgUkxTLWVuZm9yY2VkIHRhYmxlcy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09ICd3YXJuJykge1xuICAgICAgLy8gSW5jbHVkZSBhIHN5bnRoZXRpYyBzdGFjayBzbyB0aGUgb2ZmZW5kaW5nIGNhbGwgc2l0ZSBpcyBpbiB0aGUgbG9nLlxuICAgICAgbG9nZ2VyLndhcm4oJ3dpdGhUZW5hbnRUeCBjYWxsZWQgb3V0c2lkZSBhIHRlbmFudCBzY29wZTsgUkxTIEdVQ3Mgd2lsbCBiZSBlbXB0eScsIHtcbiAgICAgICAgc3RhY2s6IG5ldyBFcnJvcigndGVuYW50LWNvbnRleHQgbWlzc2luZycpLnN0YWNrLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JnSWQgPSBjdHg/Lm9yZ0lkID8/ICcnO1xuICBjb25zdCBpc1N1cGVyQWRtaW4gPSBjdHg/LmlzU3VwZXJBZG1pbiA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgcmV0dXJuIGRiLnRyYW5zYWN0aW9uKGFzeW5jICh0eCkgPT4ge1xuICAgIC8vIFNFVCBMT0NBTCB2aWEgc2V0X2NvbmZpZygpIHNvIHRoZSB2YWx1ZXMgYXJlIHRyYW5zYWN0aW9uLXNjb3BlZCAoYXV0by1cbiAgICAvLyByZWxlYXNlZCBvbiBDT01NSVQvUk9MTEJBQ0spLiBUaGUgZHJpdmVyIGJpbmRzIHRoZSB2YWx1ZXMgYXMgcGFyYW1ldGVycyxcbiAgICAvLyBzbyBhIGhvc3RpbGUgb3JnX2lkIGNhbid0IGJyZWFrIG91dCBvZiB0aGUgR1VDIHN5bnRheC5cbiAgICBhd2FpdCB0eC5leGVjdXRlKHNxbGBTRUxFQ1Qgc2V0X2NvbmZpZygnYXBwLm9yZ19pZCcsICR7b3JnSWR9LCB0cnVlKWApO1xuICAgIGF3YWl0IHR4LmV4ZWN1dGUoc3FsYFNFTEVDVCBzZXRfY29uZmlnKCdhcHAuaXNfc3lzYWRtaW4nLCAke2lzU3VwZXJBZG1pbn0sIHRydWUpYCk7XG4gICAgcmV0dXJuIGZuKHR4KTtcbiAgfSk7XG59XG4iXX0=
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW5jeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS90ZW5hbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBZTlDLFNBQVMsY0FBYztJQUNyQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3hELElBQUksR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDdkUsdUVBQXVFO0lBQ3ZFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNuRSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLHFCQUFxQjtJQUM1QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3hELENBQUM7QUFlRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksaUJBQWlCLEVBQWlCLENBQUM7QUFFcEU7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUksR0FBa0IsRUFBRSxFQUFXO0lBQ3JFLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVEOzBFQUMwRTtBQUMxRSxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE9BQU8sYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE1BQU0sSUFBSSxLQUFLLENBQ2IsNEVBQTRFO2NBQzFFLHdFQUF3RSxDQUMzRSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxFQUEyRTtJQUUzRSxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7SUFFckMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1Qsc0VBQXNFO1FBQ3RFLHNFQUFzRTtRQUN0RSx1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSw2QkFBNkI7UUFDN0IsTUFBTSxJQUFJLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYix1RUFBdUU7a0JBQ3JFLHdFQUF3RTtrQkFDeEUsK0NBQStDLENBQ2xELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDcEIsc0VBQXNFO1lBQ3RFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLEVBQUU7Z0JBQ2hGLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEtBQUs7YUFDakQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUMvQixNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUUxRCxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixFQUFFLENBQUM7SUFFbkQsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNqQyx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLHlEQUF5RDtRQUN6RCxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBLG1DQUFtQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUEsd0NBQXdDLFlBQVksU0FBUyxDQUFDLENBQUM7UUFDbkYsNEVBQTRFO1FBQzVFLHdFQUF3RTtRQUN4RSw4RUFBOEU7UUFDOUUsMkVBQTJFO1FBQzNFLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQSwwQ0FBMEMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUZW5hbnQtY29udGV4dCBwbHVtYmluZyBmb3IgUG9zdGdyZXMgcm93LWxldmVsIHNlY3VyaXR5LlxuICpcbiAqIEJhY2tncm91bmQ6IHBvc3RncmVzLWluaXQuc3FsIGluc3RhbGxzIFJMUyBwb2xpY2llcyBvbiBldmVyeSB1c2VyLWRhdGFcbiAqIHRhYmxlIHRoYXQgY29uc3VsdCB0d28gc2Vzc2lvbiBHVUNzIOKAlCBgYXBwLm9yZ19pZGAgYW5kIGBhcHAuaXNfc3lzYWRtaW5gLlxuICogVG9kYXkgdGhlIHRhYmxlcyBhcmUgaW4gb3duZXItYnlwYXNzIG1vZGUgKHRoZSBjb25uZWN0aW9uIHVzZXIgb3ducyB0aGVtLFxuICogUG9zdGdyZXMgbGV0cyBvd25lcnMgc2tpcCBSTFMpLCBzbyB0aGUgcG9saWNpZXMgZG9uJ3QgYWN0dWFsbHkgZW5mb3JjZS5cbiAqIE9uY2Ugd2UgZmxpcCBhIHRhYmxlIHRvIGBGT1JDRSBST1cgTEVWRUwgU0VDVVJJVFlgLCBldmVyeSBxdWVyeSBhZ2FpbnN0XG4gKiBpdCBtdXN0IHJ1biBpbnNpZGUgYSB0cmFuc2FjdGlvbiB0aGF0IGhhcyBTRVQgTE9DQUwnZCBib3RoIEdVQ3Mg4oCUIG9yIGl0XG4gKiByZXR1cm5zIHplcm8gcm93cyBmb3Igbm9uLXN5c2FkbWlucyAoYW5kIG1heSBmYWlsIHRvIHdyaXRlIGZvciBhbnkgY2FsbGVyKS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgc2VhbS5cbiAqXG4gKiAgIDEuIGB0ZW5hbnRDb250ZXh0YCAoQXN5bmNMb2NhbFN0b3JhZ2UpIGNhcnJpZXMgYHtvcmdJZCwgaXNTdXBlckFkbWlufWBcbiAqICAgICAgZG93biB0aGUgY2FsbCBjaGFpbiB3aXRob3V0IHByb3AtZHJpbGxpbmcuIFNldCBvbmNlIGF0IHRoZSByZXF1ZXN0XG4gKiAgICAgIGJvdW5kYXJ5OyByZWFkYWJsZSBmcm9tIGFueXdoZXJlLlxuICpcbiAqICAgMi4gYHdpdGhUZW5hbnRUeChmbilgIG9wZW5zIGEgdHJhbnNhY3Rpb24sIFNFVCBMT0NBTCdzIGJvdGggR1VDcyBmcm9tXG4gKiAgICAgIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0LCB0aGVuIGludm9rZXMgYGZuKHR4KWAuIFNlcnZpY2VzIG1pZ3JhdGUgb25lXG4gKiAgICAgIGF0IGEgdGltZSBieSB3cmFwcGluZyB0aGVpciBleGlzdGluZyBkcml6emxlIGNhbGxzIGluIHRoaXMgaGVscGVyIOKAlFxuICogICAgICBgZGIuc2VsZWN0KCkuZnJvbSguLi4pYCBiZWNvbWVzIGB3aXRoVGVuYW50VHgodHggPT4gdHguc2VsZWN0KCkuZnJvbSguLi4pKWAuXG4gKlxuICogICAzLiBgcnVuV2l0aFRlbmFudENvbnRleHQoY3R4LCBmbilgIGlzIHRoZSBFeHByZXNzLW1pZGRsZXdhcmUtc2lkZVxuICogICAgICBib29rZW5kIHRoYXQgZXN0YWJsaXNoZXMgdGhlIEFzeW5jTG9jYWxTdG9yYWdlIHNjb3BlIGZvciB0aGUgcmVxdWVzdC5cbiAqXG4gKiBNaWdyYXRpb24gb3JkZXIgKHNlZSBkb2NzL3BsYW5zL2YtMS0wLXJscy1lbmZvcmNlbWVudC5tZCk6XG4gKiAgIC0gRmlyc3QgYWRvcHRlcnM6IG5ld2x5LXdyaXR0ZW4gc2VydmljZXMgKGRhc2hib2FyZCwgYWxlcnQtZGVzdGluYXRpb24pXG4gKiAgICAgd2hlcmUgdGhlIGNoYW5nZSBpcyBtZWNoYW5pY2FsLlxuICogICAtIFRoZW4gaGlnaC13cml0ZSBzZXJ2aWNlcyAocGx1Z2luLCBwaXBlbGluZSkuIFNvYWsgZWFjaCBvbmUgYmVmb3JlXG4gKiAgICAgZmxpcHBpbmcgdGhlIHVuZGVybHlpbmcgdGFibGUgdG8gRk9SQ0UuXG4gKiAgIC0gYWRtaW5fYXVkaXRfbG9nIHVzZXMgYSBzeXNhZG1pbi1vbmx5IHBvbGljeSDigJQgc3lzYWRtaW4gcGF0aHMgbXVzdFxuICogICAgIGFsc28gc2V0IGBhcHAuaXNfc3lzYWRtaW4gPSAndHJ1ZSdgIG9yIHRoZXknbGwgbG9zZSBhY2Nlc3MgdG8gaXQuXG4gKi9cblxuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRiIH0gZnJvbSAnLi9wb3N0Z3Jlcy1jb25uZWN0aW9uLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCd0ZW5hbnQtY29udGV4dCcpO1xuXG4vKipcbiAqIEJlaGF2aW9yIHdoZW4gYHdpdGhUZW5hbnRUeGAgaXMgaW52b2tlZCBvdXRzaWRlIGFueSBgcnVuV2l0aFRlbmFudENvbnRleHRgXG4gKiBzY29wZS4gVGhlIGVmZmVjdGl2ZSBkZWZhdWx0IGlzIGZhaWwtZmFzdCAoJ3N0cmljdCcpIGluIHByb2R1Y3Rpb24gc28gYVxuICogbWlzc2luZyB0ZW5hbnQgc2NvcGUgc3VyZmFjZXMgYXQgdGhlIGJhZCBjYWxsIHNpdGUgaW5zdGVhZCBvZiBzaWxlbnRseVxuICogcnVubmluZyB3aXRoIGVtcHR5IFJMUyBHVUNzOyBvdXRzaWRlIHByb2R1Y3Rpb24gaXQgZGVmYXVsdHMgdG8gJ3dhcm4nIHNvXG4gKiB1bi1hdWRpdGVkIGRldi90ZXN0IHBhdGhzIGtlZXAgd29ya2luZyBidXQgbG9nIGFuIGFjdGlvbmFibGUgdHJhY2UuIEFuXG4gKiBleHBsaWNpdCBSTFNfQ09OVEVYVF9NT0RFIGVudiBvdmVycmlkZSBhbHdheXMgd2lucy5cbiAqXG4gKiAnc2lsZW50JyBpcyBrZXB0IGZvciB0ZXN0cyBhbmQgc2NyaXB0cyB0aGF0IGludGVudGlvbmFsbHkgZW50ZXIgdGhlIERCXG4gKiB3aXRob3V0IGNvbnRleHQgKGUuZy4gaW50ZWdyYXRpb24gdGVzdCBzZXR1cCB0aGF0IHJ1bnMgYXMgdGhlIGNvbm5lY3Rpb25cbiAqIG93bmVyIGJlZm9yZSBhbnkgdGVuYW50IGlzIHByb3Zpc2lvbmVkKS5cbiAqL1xudHlwZSBDb250ZXh0TW9kZSA9ICdzaWxlbnQnIHwgJ3dhcm4nIHwgJ3N0cmljdCc7XG5mdW5jdGlvbiBnZXRDb250ZXh0TW9kZSgpOiBDb250ZXh0TW9kZSB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LlJMU19DT05URVhUX01PREU/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChyYXcgPT09ICdzaWxlbnQnIHx8IHJhdyA9PT0gJ3dhcm4nIHx8IHJhdyA9PT0gJ3N0cmljdCcpIHJldHVybiByYXc7XG4gIC8vIE5vIGV4cGxpY2l0IG92ZXJyaWRlOiBmYWlsLWZhc3QgaW4gcHJvZHVjdGlvbiwgd2FybiBldmVyeXdoZXJlIGVsc2UuXG4gIHJldHVybiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gJ3N0cmljdCcgOiAnd2Fybic7XG59XG5cbi8qKlxuICogUGVyLXN0YXRlbWVudCBzZXJ2ZXItc2lkZSB0aW1lb3V0IChtcykgYXBwbGllZCBJTlNJREUgZXZlcnkgYHdpdGhUZW5hbnRUeGBcbiAqIHRyYW5zYWN0aW9uLCBuZXh0IHRvIHRoZSBSTFMgR1VDcy4gYHdpdGhUZW5hbnRUeGAgaXMgdGhlIHJlYWwgcXVlcnkgcGF0aCBmb3JcbiAqIGFsbCBSTFMvQ1JVRCByZWFkcyBhbmQgd3JpdGVzLCBzbyB0aGlzIGlzIHdoZXJlIHRoZSBEQi1zaWRlIGd1YXJkIGJlbG9uZ3MgKHRoZVxuICogb2xkIGBDb25uZWN0aW9uLnRyYW5zYWN0aW9uYCB3cmFwcGVyIHRoYXQgc2V0IGl0IGlzIGRlYWQg4oCUIHNlZVxuICogcG9zdGdyZXMtY29ubmVjdGlvbi50cykuIEJvdW5kcyBhIHJ1bmF3YXkgcXVlcnkgc28gaXQgY2FuJ3QgaG9sZCBhIHBvb2xlZFxuICogY29ubmVjdGlvbiBvcGVuIGluZGVmaW5pdGVseS4gRW52LWNvbmZpZ3VyYWJsZSB2aWEgYERCX1NUQVRFTUVOVF9USU1FT1VUX01TYFxuICogKGRlZmF1bHQgMzBzKTsgc2V0IHRvIGAwYCB0byBkaXNhYmxlIHRoZSB0aW1lb3V0LlxuICovXG5mdW5jdGlvbiBnZXRTdGF0ZW1lbnRUaW1lb3V0TXMoKTogbnVtYmVyIHtcbiAgY29uc3QgcmF3ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuREJfU1RBVEVNRU5UX1RJTUVPVVRfTVMgPz8gJycsIDEwKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShyYXcpICYmIHJhdyA+PSAwID8gcmF3IDogMzAwMDA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVuYW50Q29udGV4dCB7XG4gIC8qKiBDYWxsZXIncyBvcmcuIFVuZGVmaW5lZCBmb3IgdW4tYXV0aGVudGljYXRlZCAvIHN5c3RlbSBqb2JzLiAqL1xuICBvcmdJZD86IHN0cmluZztcbiAgLyoqIFRydWUgd2hlbiB0aGUgY2FsbGVyIGlzIGEgc3lzYWRtaW4gKHN5c3RlbS1vcmcgYWRtaW4pLiBCeXBhc3NlcyBSTFNcbiAgICogIHBvbGljaWVzIHZpYSB0aGUgc3lzYWRtaW4tYnlwYXNzIGJyYW5jaCBpbiBgY3VycmVudF9pc19zeXNhZG1pbigpYC4gKi9cbiAgaXNTdXBlckFkbWluOiBib29sZWFuO1xuICAvKiogT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogdGhlIGNhbGxlcidzIGFjdGl2ZS1vcmcgcGFyZW50IChwcmVzZW50IG9ubHkgd2hlbiB0aGVcbiAgICogIGFjdGl2ZSBvcmcgaXMgYSB0ZWFtKS4gTm90IHVzZWQgZm9yIFJMUzsgY2FycmllZCBzbyBkb3duc3RyZWFtIHNpZGUtZWZmZWN0c1xuICAgKiAgKGUuZy4gZW50aXR5LWV2ZW50IGNvbXBsaWFuY2UgZXZhbCkgY2FuIGhvbm9yIHBhcmVudCBgcHJvcGFnYXRlVG9DaGlsZHJlbmBcbiAgICogIHJ1bGVzIHdpdGhvdXQgYSByZXF1ZXN0IGluIHNjb3BlLiAqL1xuICBwYXJlbnRPcmdJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXItcmVxdWVzdCB0ZW5hbnQgY29udGV4dC4gUG9wdWxhdGVkIGJ5IEV4cHJlc3MgbWlkZGxld2FyZSBvbmNlIHRoZSBKV1RcbiAqIGlzIHZhbGlkYXRlZDsgY29uc3VtZWQgYnkgYHdpdGhUZW5hbnRUeGAgYW5kIGFueSBoZWxwZXIgdGhhdCBuZWVkcyB0b1xuICoga25vdyBcIndobyBpcyB0aGUgY2FsbGVyXCIgd2l0aG91dCByZS1kZXJpdmluZyBmcm9tIHRoZSByZXF1ZXN0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRlbmFudENvbnRleHQgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VGVuYW50Q29udGV4dD4oKTtcblxuLyoqXG4gKiBSdW4gYGZuYCBpbnNpZGUgdGhlIGdpdmVuIHRlbmFudCBzY29wZS4gVGhlIEFzeW5jTG9jYWxTdG9yYWdlIHNjb3BlXG4gKiBzdXJ2aXZlcyBhY3Jvc3MgYXN5bmMgYm91bmRhcmllcyAoUHJvbWlzZXMsIHNldFRpbWVvdXQsIGV0Yy4pLCBzbyBhbnlcbiAqIGB3aXRoVGVuYW50VHhgIGNhbGwgaW5zaWRlIGBmbmAg4oCUIGRpcmVjdGx5IG9yIHRocm91Z2ggYW55IGRlcHRoIG9mXG4gKiBhc3luYyBoZWxwZXJzIOKAlCBwaWNrcyB1cCBgY3R4YC5cbiAqXG4gKiBXcmFwIGBuZXh0KClgIGZyb20gYW4gRXhwcmVzcyBtaWRkbGV3YXJlIHRvIGVzdGFibGlzaCBwZXItcmVxdWVzdCBzY29wZTpcbiAqXG4gKiAgICAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAqICAgICAgIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbiB9LCAoKSA9PiBuZXh0KCkpO1xuICogICAgIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFRlbmFudENvbnRleHQ8VD4oY3R4OiBUZW5hbnRDb250ZXh0LCBmbjogKCkgPT4gVCk6IFQge1xuICByZXR1cm4gdGVuYW50Q29udGV4dC5ydW4oY3R4LCBmbik7XG59XG5cbi8qKiBSZWFkIHRoZSBjdXJyZW50IHRlbmFudCBjb250ZXh0LiBSZXR1cm5zIHVuZGVmaW5lZCBvdXRzaWRlIGFuXG4gKiAgYHJ1bldpdGhUZW5hbnRDb250ZXh0YCBzY29wZSAoZS5nLiBiYWNrZ3JvdW5kIHdvcmtlcnMsIG1pZ3JhdGlvbnMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbmFudENvbnRleHQoKTogVGVuYW50Q29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0ZW5hbnRDb250ZXh0LmdldFN0b3JlKCk7XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpcyBydW5uaW5nIGluc2lkZSBhIHRlbmFudCBzY29wZS4gQ2FsbGVyc1xuICogdGhhdCBsZWdpdGltYXRlbHkgbmVlZCB0byByZWZ1c2UgdG8gb3BlcmF0ZSB3aXRob3V0IG9uZSAoZS5nLiBoYW5kbGVyc1xuICogdGhhdCB0b3VjaCBGT1JDRSdkIFJMUyB0YWJsZXMpIGNhbiB1c2UgdGhpcyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlXG4gKiBkb3duc3RyZWFtIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB0byBzdXJmYWNlIHRoZSBidWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlVGVuYW50Q29udGV4dCgpOiBUZW5hbnRDb250ZXh0IHtcbiAgY29uc3QgY3R4ID0gdGVuYW50Q29udGV4dC5nZXRTdG9yZSgpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdyZXF1aXJlVGVuYW50Q29udGV4dDogbm8gdGVuYW50IHNjb3BlIGFjdGl2ZS4gV3JhcCB5b3VyIGhhbmRsZXIvd29ya2VyIGluICdcbiAgICAgICsgJ3J1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbiB9LCAuLi4pIGJlZm9yZSBhbnkgREIgY2FsbC4nLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGN0eDtcbn1cblxuLyoqXG4gKiBPcGVuIGEgdHJhbnNhY3Rpb24gd2l0aCBSTFMgR1VDcyBTRVQgTE9DQUwgZnJvbSB0aGUgY3VycmVudFxuICogQXN5bmNMb2NhbFN0b3JhZ2UgdGVuYW50IGNvbnRleHQsIHRoZW4gaW52b2tlIGBmbih0eClgLlxuICpcbiAqIC0gV2hlbiBjYWxsZWQgb3V0c2lkZSBhIHRlbmFudCBzY29wZSAoZS5nLiBmcm9tIGEgYmFja2dyb3VuZCBqb2IgdGhhdFxuICogICBkb2Vzbid0IGhhdmUgYSBjYWxsZXIgaWRlbnRpdHkpLCB0aGUgdHJhbnNhY3Rpb24gaXMgb3BlbmVkIHdpdGggYm90aFxuICogICBHVUNzIGNsZWFyZWQg4oCUIFJMUyBwb2xpY2llcyB3aWxsIHJldHVybiB6ZXJvIHJvd3Mgb24gRk9SQ0UnZCB0YWJsZXMuXG4gKiAgIENhbGxlcnMgdGhhdCBuZWVkIGEgc3lzYWRtaW4tZXF1aXZhbGVudCBzY29wZSBzaG91bGQgd3JhcCB0aGVtc2VsdmVzIGluXG4gKiAgIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCDigKYpYCBleHBsaWNpdGx5LlxuICpcbiAqIC0gVXNlcyBgc2V0X2NvbmZpZyhrZXksIHZhbHVlLCB0cnVlKWAgKHRoZSBib29sZWFuID0gYGlzX2xvY2FsYCwgaS5lLlxuICogICB0cmFuc2FjdGlvbi1zY29wZWQpLiBFcXVpdmFsZW50IHRvIGBTRVQgTE9DQUxgIGJ1dCB0YWtlcyB0aGUgdmFsdWUgYXNcbiAqICAgYSBwYXJhbWV0ZXIsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudCDigJQgRHJpenpsZSdzIGBzcWxgIHRlbXBsYXRlIGJpbmRzIHRoZVxuICogICB2YWx1ZSBzYWZlbHkgc28gYW4gYXR0YWNrZXItY29udHJvbGxlZCBgb3JnSWRgIGNhbid0IGVzY2FwZSB0aGUgcXVvdGluZy5cbiAqXG4gKiAtIFJldHVybnMgd2hhdGV2ZXIgYGZuYCByZXR1cm5zOyB0aHJvd3Mgd2hhdGV2ZXIgYGZuYCB0aHJvd3MgKERyaXp6bGVcbiAqICAgaGFuZGxlcyB0aGUgQ09NTUlUL1JPTExCQUNLIGZvciB1cykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoVGVuYW50VHg8VD4oXG4gIGZuOiAodHg6IFBhcmFtZXRlcnM8UGFyYW1ldGVyczx0eXBlb2YgZGIudHJhbnNhY3Rpb24+WzBdPlswXSkgPT4gUHJvbWlzZTxUPixcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBjdHggPSB0ZW5hbnRDb250ZXh0LmdldFN0b3JlKCk7XG5cbiAgaWYgKCFjdHgpIHtcbiAgICAvLyBTdXJmYWNlIHRoZSBidWcgaW5zdGVhZCBvZiBzaWxlbnRseSBTRVQnaW5nIGVtcHR5IEdVQ3MuIFRoZSBkZWZhdWx0XG4gICAgLy8gbW9kZSAoJ3dhcm4nKSBsb2dzIGFuIGFjdGlvbmFibGUgdHJhY2Ugc28gdGhlIGJhZCBjYWxsIHNpdGUgaXMgZWFzeVxuICAgIC8vIHRvIGZpbmQ7IHByb2R1Y3Rpb24gZGVwbG95bWVudHMgdGhhdCBoYXZlIGZpbmlzaGVkIHRoZSBhdWRpdCBjYW4gc2V0XG4gICAgLy8gUkxTX0NPTlRFWFRfTU9ERT1zdHJpY3QgdG8gZmFpbC1mYXN0IGF0IHRoZSBjYWxsIHNpdGUgKGJldHRlciBzdGFja1xuICAgIC8vIHRyYWNlIHRoYW4gdGhlIFBvc3RncmVzIFwicGVybWlzc2lvbiBkZW5pZWRcIiB0aGF0IHdvdWxkIG90aGVyd2lzZVxuICAgIC8vIHN1cmZhY2UgZnJvbSBGT1JDRSdkIFJMUykuXG4gICAgY29uc3QgbW9kZSA9IGdldENvbnRleHRNb2RlKCk7XG4gICAgaWYgKG1vZGUgPT09ICdzdHJpY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd3aXRoVGVuYW50VHggY2FsbGVkIG91dHNpZGUgYSB0ZW5hbnQgc2NvcGUuIFdyYXAgeW91ciBoYW5kbGVyL3dvcmtlciAnXG4gICAgICAgICsgJ2luIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbiB9LCAuLi4pIGJlZm9yZSBpbnZva2luZyAnXG4gICAgICAgICsgJ2FueSBzZXJ2aWNlIHRoYXQgdG91Y2hlcyBSTFMtZW5mb3JjZWQgdGFibGVzLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobW9kZSA9PT0gJ3dhcm4nKSB7XG4gICAgICAvLyBJbmNsdWRlIGEgc3ludGhldGljIHN0YWNrIHNvIHRoZSBvZmZlbmRpbmcgY2FsbCBzaXRlIGlzIGluIHRoZSBsb2cuXG4gICAgICBsb2dnZXIud2Fybignd2l0aFRlbmFudFR4IGNhbGxlZCBvdXRzaWRlIGEgdGVuYW50IHNjb3BlOyBSTFMgR1VDcyB3aWxsIGJlIGVtcHR5Jywge1xuICAgICAgICBzdGFjazogbmV3IEVycm9yKCd0ZW5hbnQtY29udGV4dCBtaXNzaW5nJykuc3RhY2ssXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcmdJZCA9IGN0eD8ub3JnSWQgPz8gJyc7XG4gIGNvbnN0IGlzU3VwZXJBZG1pbiA9IGN0eD8uaXNTdXBlckFkbWluID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICBjb25zdCBzdGF0ZW1lbnRUaW1lb3V0TXMgPSBnZXRTdGF0ZW1lbnRUaW1lb3V0TXMoKTtcblxuICByZXR1cm4gZGIudHJhbnNhY3Rpb24oYXN5bmMgKHR4KSA9PiB7XG4gICAgLy8gU0VUIExPQ0FMIHZpYSBzZXRfY29uZmlnKCkgc28gdGhlIHZhbHVlcyBhcmUgdHJhbnNhY3Rpb24tc2NvcGVkIChhdXRvLVxuICAgIC8vIHJlbGVhc2VkIG9uIENPTU1JVC9ST0xMQkFDSykuIFRoZSBkcml2ZXIgYmluZHMgdGhlIHZhbHVlcyBhcyBwYXJhbWV0ZXJzLFxuICAgIC8vIHNvIGEgaG9zdGlsZSBvcmdfaWQgY2FuJ3QgYnJlYWsgb3V0IG9mIHRoZSBHVUMgc3ludGF4LlxuICAgIGF3YWl0IHR4LmV4ZWN1dGUoc3FsYFNFTEVDVCBzZXRfY29uZmlnKCdhcHAub3JnX2lkJywgJHtvcmdJZH0sIHRydWUpYCk7XG4gICAgYXdhaXQgdHguZXhlY3V0ZShzcWxgU0VMRUNUIHNldF9jb25maWcoJ2FwcC5pc19zeXNhZG1pbicsICR7aXNTdXBlckFkbWlufSwgdHJ1ZSlgKTtcbiAgICAvLyBTZXJ2ZXItc2lkZSBzdGF0ZW1lbnQgdGltZW91dCBvbiB0aGUgUkVBTCBxdWVyeSBwYXRoICh0cmFuc2FjdGlvbi1zY29wZWQsXG4gICAgLy8gc2FtZSBzZXRfY29uZmlnKGlzX2xvY2FsPXRydWUpIG1lY2hhbmlzbSBhcyB0aGUgUkxTIEdVQ3MpLiBgU0VUIExPQ0FMXG4gICAgLy8gc3RhdGVtZW50X3RpbWVvdXQgPSAkMWAgaXMgcmVqZWN0ZWQgYnkgUG9zdGdyZXMsIHNvIHNldF9jb25maWcgd2l0aCBhIGJvdW5kXG4gICAgLy8gdmFsdWUgaXMgdXNlZC4gQSBiYXJlIG51bWJlciBpcyBtaWxsaXNlY29uZHMuIFNraXBwZWQgd2hlbiBkaXNhYmxlZCAoMCkuXG4gICAgaWYgKHN0YXRlbWVudFRpbWVvdXRNcyA+IDApIHtcbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoc3FsYFNFTEVDVCBzZXRfY29uZmlnKCdzdGF0ZW1lbnRfdGltZW91dCcsICR7U3RyaW5nKHN0YXRlbWVudFRpbWVvdXRNcyl9LCB0cnVlKWApO1xuICAgIH1cbiAgICByZXR1cm4gZm4odHgpO1xuICB9KTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"drizzle-orm": "0.45.2",
|
|
26
26
|
"pg": "8.22.0",
|
|
27
|
-
"@pipeline-builder/api-core": "3.4.
|
|
27
|
+
"@pipeline-builder/api-core": "3.4.95"
|
|
28
28
|
},
|
|
29
29
|
"keywords": [
|
|
30
30
|
"ci-cd",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"access": "public",
|
|
81
81
|
"registry": "https://registry.npmjs.org/"
|
|
82
82
|
},
|
|
83
|
-
"version": "3.4.
|
|
83
|
+
"version": "3.4.98",
|
|
84
84
|
"bugs": {
|
|
85
85
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
86
86
|
},
|