@pipeline-builder/api-server 4.4.3 → 4.4.4
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/ai-call-reservation.d.ts +95 -0
- package/lib/api/ai-call-reservation.js +121 -0
- package/lib/api/app-factory.js +13 -5
- package/lib/api/check-quota.d.ts +47 -3
- package/lib/api/check-quota.js +203 -49
- package/lib/api/idempotency-middleware.d.ts +22 -0
- package/lib/api/idempotency-middleware.js +75 -23
- package/lib/api/index.d.ts +3 -2
- package/lib/api/index.js +4 -3
- package/lib/api/meter-quota.d.ts +42 -5
- package/lib/api/meter-quota.js +63 -11
- package/lib/api/metrics.d.ts +9 -0
- package/lib/api/metrics.js +14 -1
- package/lib/api/quota-reservation.d.ts +42 -3
- package/lib/api/quota-reservation.js +46 -19
- package/lib/api/server.js +5 -2
- package/lib/testing/exports.json +13 -0
- package/package.json +6 -5
package/lib/api/metrics.js
CHANGED
|
@@ -293,6 +293,9 @@ export function createMetricHelpers(registry) {
|
|
|
293
293
|
}
|
|
294
294
|
gauge.set(labels, value);
|
|
295
295
|
},
|
|
296
|
+
resetGauge(name) {
|
|
297
|
+
gauges.get(name)?.reset();
|
|
298
|
+
},
|
|
296
299
|
};
|
|
297
300
|
}
|
|
298
301
|
/** This service's own helpers, over the shared module-level registry. */
|
|
@@ -345,10 +348,20 @@ export function observe(name, labels, value) {
|
|
|
345
348
|
export function setGauge(name, labels, value) {
|
|
346
349
|
businessMetrics.setGauge(name, labels, value);
|
|
347
350
|
}
|
|
351
|
+
/**
|
|
352
|
+
* Drop EVERY series of a business gauge. For a gauge that describes a SET — one
|
|
353
|
+
* series per configured entry — and is re-published whole: without the reset, a
|
|
354
|
+
* series for an entry that has since been deleted keeps its last value forever,
|
|
355
|
+
* and an alert on it keeps firing for something that no longer exists. Call it
|
|
356
|
+
* immediately before re-setting the current set. A gauge never set is a no-op.
|
|
357
|
+
*/
|
|
358
|
+
export function resetGauge(name) {
|
|
359
|
+
businessMetrics.resetGauge(name);
|
|
360
|
+
}
|
|
348
361
|
function humanizeName(metricName) {
|
|
349
362
|
// `plugin_builds_total` → "Plugin builds total"
|
|
350
363
|
return metricName
|
|
351
364
|
.replace(/_/g, ' ')
|
|
352
365
|
.replace(/^./, (c) => c.toUpperCase());
|
|
353
366
|
}
|
|
354
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUE2QixDQUFDLFdBQVcsQ0FBQztBQUU3RixpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUVoQyxxQ0FBcUM7QUFDckMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFckQsa0ZBQWtGO0FBQ2xGLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsUUFBa0I7SUFDNUQsT0FBTyxJQUFJLEtBQUssQ0FBQztRQUNmLElBQUksRUFBRSw4QkFBOEI7UUFDcEMsSUFBSSxFQUFFLGtLQUFrSztRQUN4SyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQVU7UUFDL0IsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3JCLE9BQU87WUFDTCxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksb0JBQW9CLEVBQUUsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxD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UyxZQUFZLENBQUMsVUFBa0I7SUFDdEMsZ0RBQWdEO0lBQ2hELE9BQU8sVUFBVTtTQUNkLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcHJldmlvdXNTZWNyZXRTdGF0ZXMsIFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgY29sbGVjdERlZmF1bHRNZXRyaWNzLCBDb3VudGVyLCBIaXN0b2dyYW0sIEdhdWdlIH0gZnJvbSAncHJvbS1jbGllbnQnO1xuXG5jb25zdCBTRVJWSUNFX05BTUUgPSAoQ29uZmlnLmdldEFueSgnb2JzZXJ2YWJpbGl0eScpIGFzIHsgc2VydmljZU5hbWU6IHN0cmluZyB9KS5zZXJ2aWNlTmFtZTtcblxuLyoqIFNoYXJlZCBQcm9tZXRoZXVzIHJlZ2lzdHJ5ICovXG5jb25zdCByZWdpc3RlciA9IG5ldyBSZWdpc3RyeSgpO1xuXG4vLyBTZXQgZGVmYXVsdCBsYWJlbHMgZm9yIGFsbCBtZXRyaWNzXG5yZWdpc3Rlci5zZXREZWZhdWx0TGFiZWxzKHsgc2VydmljZTogU0VSVklDRV9OQU1FIH0pO1xuXG4vLyBDb2xsZWN0IGRlZmF1bHQgTm9kZS5qcyBwcm9jZXNzIG1ldHJpY3MgKENQVSwgbWVtb3J5LCBoZWFwLCBldmVudCBsb29wIGxhZywgR0MpXG5jb2xsZWN0RGVmYXVsdE1ldHJpY3MoeyByZWdpc3RlciB9KTtcblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgYHNlY3JldF9yb3RhdGlvbl9wcmV2aW91c19zZXR7c2VjcmV0fWAgZ2F1Z2Ugb24gYHJlZ2lzdHJ5YDogMVxuICogd2hpbGUgYSBzZWNyZXQncyBgKl9QUkVWSU9VU2Agcm90YXRpb24gdmFsdWUgaXMgc3RpbGwgc2V0LCAwIG90aGVyd2lzZS4gVGhlXG4gKiB2YWx1ZSBpcyByZWFkIGZyb20gYXBpLWNvcmUncyBwcm9iZSByZWdpc3RyeSBhdCBzY3JhcGUgdGltZSwgc28gaXQgYWx3YXlzXG4gKiByZWZsZWN0cyB0aGUgbGl2ZSBwcm9jZXNzLiBFeHBvcnRlZCBzbyBwbGF0Zm9ybSAob3duIHJlZ2lzdHJ5KSBleHBvc2VzIHRoZVxuICogaWRlbnRpY2FsIHNlcmllczsgdGhlIGBTZWNyZXRSb3RhdGlvblByZXZpb3VzTGluZ2VyaW5nYCBhbGVydCBrZXlzIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTZWNyZXRSb3RhdGlvbkdhdWdlKHJlZ2lzdHJ5OiBSZWdpc3RyeSk6IEdhdWdlPCdzZWNyZXQnPiB7XG4gIHJldHVybiBuZXcgR2F1Z2Uoe1xuICAgIG5hbWU6IFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSxcbiAgICBoZWxwOiAnMSB3aGlsZSBhIHNlY3JldCByb3RhdGlvbiBwcmV2aW91cyB2YWx1ZSAoZS5nLiBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVMpIG9yIGEgcmV0aXJpbmcgc2lnbmluZyBrZXkgaXMgc3RpbGwgYWNjZXB0ZWQ7IHNlZSBkb2NzL3J1bmJvb2tzL3NlY3JldC1yb3RhdGlvbi5tZCcsXG4gICAgbGFiZWxOYW1lczogWydzZWNyZXQnXSBhcyBjb25zdCxcbiAgICByZWdpc3RlcnM6IFtyZWdpc3RyeV0sXG4gICAgY29sbGVjdCgpIHtcbiAgICAgIGZvciAoY29uc3QgeyBzZWNyZXQsIHByZXZpb3VzU2V0IH0gb2YgcHJldmlvdXNTZWNyZXRTdGF0ZXMoKSkge1xuICAgICAgICB0aGlzLnNldCh7IHNlY3JldCB9LCBwcmV2aW91c1NldCA/IDEgOiAwKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxucmVnaXN0ZXJTZWNyZXRSb3RhdGlvbkdhdWdlKHJlZ2lzdGVyKTtcblxuLyoqIEhUVFAgcmVxdWVzdCBkdXJhdGlvbiBoaXN0b2dyYW0gKHNlY29uZHMpICovXG5jb25zdCBodHRwUmVxdWVzdER1cmF0aW9uID0gbmV3IEhpc3RvZ3JhbSh7XG4gIG5hbWU6ICdodHRwX3JlcXVlc3RfZHVyYXRpb25fc2Vjb25kcycsXG4gIGhlbHA6ICdEdXJhdGlvbiBvZiBIVFRQIHJlcXVlc3RzIGluIHNlY29uZHMnLFxuICBsYWJlbE5hbWVzOiBbJ21ldGhvZCcsICdyb3V0ZScsICdzdGF0dXNfY29kZSddIGFzIGNvbnN0LFxuICBidWNrZXRzOiBbMC4wMDUsIDAuMDEsIDAuMDI1LCAwLjA1LCAwLjEsIDAuMjUsIDAuNSwgMSwgMi41LCA1LCAxMF0sXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKiogSFRUUCByZXF1ZXN0IGNvdW50ZXIgKi9cbmNvbnN0IGh0dHBSZXF1ZXN0c1RvdGFsID0gbmV3IENvdW50ZXIoe1xuICBuYW1lOiAnaHR0cF9yZXF1ZXN0c190b3RhbCcsXG4gIGhlbHA6ICdUb3RhbCBudW1iZXIgb2YgSFRUUCByZXF1ZXN0cycsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJ10gYXMgY29uc3QsXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKipcbiAqIFBlci1vcmcgSFRUUCByZXF1ZXN0IGNvdW50ZXIg4oCUIFNBTVBMRUQgdG8ga2VlcCBQcm9tZXRoZXVzIGNhcmRpbmFsaXR5XG4gKiB1bmRlciBjb250cm9sLiBDYXJkaW5hbGl0eSBvZiBgb3JnX2lkICogbWV0aG9kICogcm91dGUgKiBzdGF0dXNfY29kZWBcbiAqIGdyb3dzIG11bHRpcGxpY2F0aXZlbHk7IHdpdGggTiBvcmdzICogNTAgcm91dGVzICogNSBzdGF0dXNfY29kZXMgdGhhdCdzXG4gKiAyNTDDl04gc2VyaWVzLiBXZSBzYW1wbGUgMS1pbi1OIHJlcXVlc3RzIChjb25maWd1cmFibGUgdmlhXG4gKiBgSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURWAsIGRlZmF1bHQgMCA9IG9mZikuXG4gKlxuICogT3BlcmF0b3JzIGFuc3dlciBcIndoYXQncyBvcmcgWCdzIHA5OT9cIiB2aWEgc2VwYXJhdGUgcGVyLW9yZyBoaXN0b2dyYW1zXG4gKiBzY3JhcGVkIGF0IGEgbG93ZXIgcmF0ZSwgT1IgdmlhIExva2kgTG9nUUwgcXVlcmllcyBhZ2FpbnN0IHRoZVxuICogdW5zYW1wbGVkIGFjY2Vzcy1sb2cgc3RyZWFtLiBUaGlzIGNvdW50ZXIgaXMgdGhlIGZhc3QtcGF0aCBcIm5vaXN5XG4gKiBuZWlnaGJvciBkZXRlY3Rpb25cIiDigJQgb3BlcmF0b3JzIGFsZXJ0IHdoZW4gb25lIG9yZydzIHJlcXVlc3QgcmF0ZVxuICogZGV2aWF0ZXMgZnJvbSB0aGUgZmxlZXQgbWVkaWFuLlxuICpcbiAqIE5PVCBhIGhpc3RvZ3JhbTogaGlzdG9ncmFtIGxhYmVsIGNhcmRpbmFsaXR5IGlzIGV2ZW4gbW9yZSBzZW5zaXRpdmVcbiAqIChlYWNoIGJ1Y2tldCBpcyBhIHNlcGFyYXRlIHNlcmllcykuIElmIHBlci1vcmcgbGF0ZW5jeSBwZXJjZW50aWxlcyBhcmVcbiAqIG5lZWRlZCBsYXRlciwgYWRkIGEgc2VwYXJhdGUgaGlzdG9ncmFtIHdpdGggYSBjb2Fyc2VyIGJ1Y2tldCBzZXQgYW5kXG4gKiBsb3dlciBzYW1wbGUgcmF0ZS5cbiAqL1xuY29uc3QgaHR0cFJlcXVlc3RzQnlPcmdUb3RhbCA9IG5ldyBDb3VudGVyKHtcbiAgbmFtZTogJ2h0dHBfcmVxdWVzdHNfYnlfb3JnX3RvdGFsJyxcbiAgaGVscDogJ1NhbXBsZWQgcGVyLW9yZyBIVFRQIHJlcXVlc3QgY291bnQgKHNhbXBsZSByYXRlIHZpYSBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFKScsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJywgJ29yZ19pZCddIGFzIGNvbnN0LFxuICByZWdpc3RlcnM6IFtyZWdpc3Rlcl0sXG59KTtcblxuLyoqXG4gKiBTYW1wbGUgcmF0ZSBmb3IgdGhlIHBlci1vcmcgY291bnRlci4gMS4wID0gZXZlcnkgcmVxdWVzdCwgMC4wID0gZGlzYWJsZWQuXG4gKiBQYXJzZWQgb25jZSBhdCBtb2R1bGUgbG9hZCDigJQgb3BlcmF0b3JzIHR1bmUgYnkgcmVzdGFydGluZyB0aGUgc2VydmljZS5cbiAqXG4gKiBEZWZhdWx0cyB0byAwIChPRkYpLiBgb3JnX2lkYCBpcyBhbiBVTkJPVU5ERUQsIHRlbmFudC1pZGVudGlmeWluZyBsYWJlbCBhbmRcbiAqIHByb20tY2xpZW50IGNvdW50ZXJzIG5ldmVyIGV4cGlyZSwgc28gYXQgMS4wIGV2ZXJ5IHNlcnZpY2UgYWNjdW11bGF0ZXMgYVxuICogc2VyaWVzIHBlciAob3JnIMOXIHJvdXRlIMOXIHN0YXR1cykgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLCBhbmQgYC9tZXRyaWNzYCDigJRcbiAqIHdoaWNoIGlzIG5vdCBhdXRoLWdhdGVkIOKAlCBlbnVtZXJhdGVzIGV2ZXJ5IHRlbmFudCBpZCBhbG9uZyB3aXRoIGl0cyByZXF1ZXN0XG4gKiB2b2x1bWUgYW5kIGVycm9yIHJhdGUgdG8gYW55b25lIHdobyBjYW4gcmVhY2ggdGhlIHBvcnQuXG4gKlxuICogVHVybiBpdCBvbiBkZWxpYmVyYXRlbHkgKGFuZCBpZGVhbGx5IHdpdGggYSBzYW1wbGUgcmF0ZSB3ZWxsIHVuZGVyIDEuMCwgcGx1c1xuICogYE1FVFJJQ1NfU0NSQVBFX1RPS0VOYCBzZXQpIHdoZW4geW91IGFjdHVhbGx5IHdhbnQgcGVyLW9yZyBub2lzeS1uZWlnaGJvdXJcbiAqIGRldGVjdGlvbiBmcm9tIG1ldHJpY3MgcmF0aGVyIHRoYW4gZnJvbSB0aGUgYWNjZXNzLWxvZyBzdHJlYW0uXG4gKi9cbmNvbnN0IE9SR19TQU1QTEVfUkFURSA9ICgoKSA9PiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LkhUVFBfTUVUUklDU19PUkdfU0FNUExFX1JBVEU7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gMDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdChyYXcpO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZCkgfHwgcGFyc2VkIDwgMCB8fCBwYXJzZWQgPiAxKSByZXR1cm4gMDtcbiAgcmV0dXJuIHBhcnNlZDtcbn0pKCk7XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIEV4cHJlc3Mgcm91dGUgcGF0aCB0byBwcmV2ZW50IGxhYmVsIGNhcmRpbmFsaXR5IGV4cGxvc2lvbi5cbiAqXG4gKiBVc2VzIEV4cHJlc3MncyBtYXRjaGVkIHJvdXRlIHBhdHRlcm4gKGUuZy4gYC9wbHVnaW5zLzppZGApIHdoZW4gYXZhaWxhYmxlLFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBwYXRoIHdpdGggVVVJRC9udW1lcmljIHNlZ21lbnRzIHJlcGxhY2VkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSb3V0ZShyZXE6IFJlcXVlc3QpOiBzdHJpbmcge1xuICAvLyBQcmVmZXIgRXhwcmVzcyBtYXRjaGVkIHJvdXRlIHBhdHRlcm5cbiAgaWYgKHJlcS5yb3V0ZT8ucGF0aCkge1xuICAgIHJldHVybiByZXEuYmFzZVVybCArIHJlcS5yb3V0ZS5wYXRoO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHJlcGxhY2UgVVVJRHMgYW5kIG51bWVyaWMgSURzIHdpdGggOmlkXG4gIHJldHVybiByZXEucGF0aFxuICAgIC5yZXBsYWNlKC9bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0vZ2ksICc6aWQnKVxuICAgIC5yZXBsYWNlKC9cXC9cXGQrKD89XFwvfCQpL2csICcvOmlkJyk7XG59XG5cbi8qKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlIHRoYXQgcmVjb3JkcyByZXF1ZXN0IGR1cmF0aW9uIGFuZCBjb3VudC5cbiAqXG4gKiBNdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHJvdXRlIGhhbmRsZXJzIHNvIGByZXMub24oJ2ZpbmlzaCcpYCBmaXJlc1xuICogYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIHNlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNzTWlkZGxld2FyZSgpIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIC8vIE5PVEU6IG5vIC9tZXRyaWNzIG9yIC9oZWFsdGggc2tpcCBuZWVkZWQgaGVyZSDigJQgYm90aCBlbmRwb2ludHMgYXJlXG4gICAgLy8gcmVnaXN0ZXJlZCBpbiBhcHAtZmFjdG9yeSBCRUZPUkUgdGhpcyBtaWRkbGV3YXJlIChjcmVhdGVIZWFsdGhSb3V0ZXIgYW5kXG4gICAgLy8gYXBwLmdldCgnL21ldHJpY3MnKSBib3RoIHRlcm1pbmF0ZSB0aGUgcmVzcG9uc2UpLCBzbyBuZWl0aGVyIGV2ZXIgcmVhY2hlc1xuICAgIC8vIHRoaXMgaGFuZGxlci5cbiAgICBjb25zdCBlbmQgPSBodHRwUmVxdWVzdER1cmF0aW9uLnN0YXJ0VGltZXIoKTtcblxuICAgIHJlcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm91dGUgPSBub3JtYWxpemVSb3V0ZShyZXEpO1xuICAgICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBzdGF0dXNfY29kZTogU3RyaW5nKHJlcy5zdGF0dXNDb2RlKSxcbiAgICAgIH07XG5cbiAgICAgIGVuZChsYWJlbHMpO1xuICAgICAgaHR0cFJlcXVlc3RzVG90YWwuaW5jKGxhYmVscyk7XG5cbiAgICAgIC8vIFBlci1vcmcgc2FtcGxlZCBjb3VudGVyLiBTa2lwIHdoZW46XG4gICAgICAvLyAgIC0gbm8gb3JnIGNvbnRleHQgb24gdGhlIHJlcXVlc3QgKGFub255bW91cyAvIGhlYWx0aCBlbmRwb2ludHMpXG4gICAgICAvLyAgIC0gc2FtcGxlIHJhdGUgaXMgMCAoZGlzYWJsZWQpXG4gICAgICAvLyAgIC0gZGljZSByb2xsIGZhaWxzXG4gICAgICAvLyBVc2luZyBNYXRoLnJhbmRvbSBmb3IgdGhlIHNhbXBsZXIg4oCUIGZvciB1bmJpYXNlZCBsb3ctcmF0ZSBzYW1wbGluZ1xuICAgICAgLy8gYSBkZXRlcm1pbmlzdGljIHBlci1yZXF1ZXN0IGhhc2ggd291bGQgYmUgbW9yZSB1bmlmb3JtLCBidXQgYXQgdGhlXG4gICAgICAvLyBkZWZhdWx0IHJhdGUgb2YgMS4wIGV2ZXJ5IHJlcXVlc3QgbGFuZHMgc28gdGhpcyBpcyBmaW5lLlxuICAgICAgY29uc3Qgb3JnSWQgPSByZXEudXNlcj8ub3JnYW5pemF0aW9uSWQ7XG4gICAgICBpZiAob3JnSWQgJiYgT1JHX1NBTVBMRV9SQVRFID4gMCAmJiBNYXRoLnJhbmRvbSgpIDwgT1JHX1NBTVBMRV9SQVRFKSB7XG4gICAgICAgIGh0dHBSZXF1ZXN0c0J5T3JnVG90YWwuaW5jKHsgLi4ubGFiZWxzLCBvcmdfaWQ6IG9yZ0lkIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIEV4cHJlc3MgaGFuZGxlciB0aGF0IHJldHVybnMgUHJvbWV0aGV1cyBtZXRyaWNzIGluIHRleHQgZXhwb3NpdGlvbiBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNzSGFuZGxlcigpIHtcbiAgcmV0dXJuIGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmVzLnNldCgnQ29udGVudC1UeXBlJywgcmVnaXN0ZXIuY29udGVudFR5cGUpO1xuICAgIHJlcy5lbmQoYXdhaXQgcmVnaXN0ZXIubWV0cmljcygpKTtcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdXNpbmVzcyAvIGRvbWFpbiBtZXRyaWNzXG4vL1xuLy8gU2VydmljZXMgc2hvdWxkIGVtaXQgY291bnRlcnMgZm9yIHRoZSB0aGluZ3Mgb3BlcmF0b3JzIGFjdHVhbGx5IGNhcmUgYWJvdXRcbi8vIChwaXBlbGluZXMgZ2VuZXJhdGVkLCBwbHVnaW4gYnVpbGRzIGNvbXBsZXRlZCwgY29tcGxpYW5jZSB2aW9sYXRpb25zLFxuLy8gQUkgdG9rZW5zIGNvbnN1bWVkKSDigJQgbm90IGp1c3QgSFRUUCB0cmFmZmljLiBUaGUgaGVscGVycyBiZWxvdyByZWdpc3RlclxuLy8gY291bnRlcnMgbGF6aWx5IG9uIHRoZSBzaGFyZWQgcmVnaXN0cnkgc28gbXVsdGlwbGUgc2VydmljZXMgY2FuIGNhbGxcbi8vIGBpbmNDb3VudGVyKCdwbHVnaW5fYnVpbGRzX3RvdGFsJywgeyBzdGF0dXM6ICdjb21wbGV0ZWQnIH0pYCB3aXRob3V0XG4vLyB3b3JyeWluZyBhYm91dCBkb3VibGUtcmVnaXN0cmF0aW9uLlxuLy9cbi8vIE5hbWluZyBjb252ZW50aW9uOiBgPGRvbWFpbj5fPG5vdW4+X3RvdGFsYCBmb3IgY291bnRlcnMsIGBfc2Vjb25kc2AgZm9yXG4vLyBoaXN0b2dyYW1zIOKAlCBtYXRjaGVzIFByb21ldGhldXMgYmVzdC1wcmFjdGljZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJ1Y2tldCBkaXN0cmlidXRpb25zIGZvciBoaXN0b2dyYW1zIHdob3NlIG9ic2VydmF0aW9ucyBhcmUgbm93aGVyZSBuZWFyIHRoZVxuICogc3ViLXNlY29uZC10by1taW51dGVzIGRlZmF1bHQuXG4gKlxuICogVEhJUyBUQUJMRSBFWElTVFMgQkVDQVVTRSBUSEUgREVGQVVMVCBTSUxFTlRMWSBCUkVBS1MgQUxFUlRTLiBUaGUgZGVmYXVsdCBzZXRcbiAqIGJlbG93IGVuZHMgYXQgYSAzMDAtc2Vjb25kIGJ1Y2tldCwgYW5kIGBoaXN0b2dyYW1fcXVhbnRpbGVgIGNhbm5vdCBpbnRlcnBvbGF0ZVxuICogcGFzdCB0aGUgbGFzdCBGSU5JVEUgYm91bmRhcnkg4oCUIGV2ZXJ5dGhpbmcgYWJvdmUgaXQgbGFuZHMgaW4gYCtJbmZgIGFuZCB0aGVcbiAqIHF1YW50aWxlIHJlYWRzIGJhY2sgYXMgMzAwIGZvcmV2ZXIuIEFuIGFsZXJ0IG9mIHRoZSBmb3JtIGA+IDMwMGAgb24gc3VjaCBhXG4gKiBoaXN0b2dyYW0gY2FuIHRoZXJlZm9yZSBuZXZlciBmaXJlLCBhbmQgYSBwOTAgcGFuZWwgZmxhdC1saW5lcyBhdCBmaXZlXG4gKiBtaW51dGVzIGhvd2V2ZXIgYmFkIHRoaW5ncyBnZXQuIE5vdGhpbmcgZXJyb3JzLCBub3RoaW5nIGlzIG1pc3NpbmcgZnJvbSB0aGVcbiAqIHNjcmFwZSwgYW5kIHRoZSBkYXNoYm9hcmQgbG9va3MgaGVhbHRoeTogdGhlIG9ubHkgc3ltcHRvbSBpcyBhbiBhbGVydCB0aGF0XG4gKiBzdGF5cyBxdWlldCB0aHJvdWdoIGFuIG91dGFnZS4gYHN1cHBvcnRfZmlyc3RfcmVzcG9uc2Vfc2Vjb25kc2AgbWVhc3VyZXMgaG91cnNcbiAqIHRvIGRheXMgYW5kIGhhZCBhIHRocmVzaG9sZCBvZiB0d2VsdmUgaG91cnMgc2l0dGluZyBhYm92ZSBhIGNlaWxpbmcgb2YgZml2ZVxuICogbWludXRlcy5cbiAqXG4gKiBTbyBhIGhpc3RvZ3JhbSB3aG9zZSBuYXR1cmFsIHJhbmdlIGlzIG1pbnV0ZXMtdG8tZGF5cyBkZWNsYXJlcyBpdHMgYnVja2V0c1xuICogaGVyZSwgYW5kIEFMRVJUIFRIUkVTSE9MRFMgQVJFIFBVVCBPTiBCT1VOREFSSUVTOiBhIHRocmVzaG9sZCBpbnNpZGUgYSB3aWRlXG4gKiBidWNrZXQgaXMgc2VydmVkIGJ5IGxpbmVhciBpbnRlcnBvbGF0aW9uIGFjcm9zcyB0aGF0IGJ1Y2tldCwgd2hpY2ggaXMgYSBndWVzcyxcbiAqIHdoaWxlIGEgdGhyZXNob2xkIE9OIGEgYm91bmRhcnkgaXMgZXhhY3QuIEZvciBzdXBwb3J0IHRoYXQgbWVhbnMgNmggKHRoZSBhbGVydClcbiAqIGFuZCA4aCAodGhlIHNvbGQgdGFyZ2V0KSBhcmUgYm90aCBib3VuZGFyaWVzLCAyNGggaXMgdGhlIG9wZXJhdGlvbmFsIGd1YXJkXG4gKiBmcm9tIHRoZSBzdGFuZGFyZC9wcmlvcml0eSBydWxlLCBhbmQgOTZoIGNvdmVycyB0aGUgbG9uZ2VzdCBsZWdpdGltYXRlIHdhaXQgYVxuICogYnVzaW5lc3MtZGF5IHRhcmdldCBhbGxvd3Mg4oCUIGEgcHJpb3JpdHkgY2FzZSByYWlzZWQgYXQgMTc6MDEgb24gYSBGcmlkYXkuXG4gKlxuICogQWRkIGEgbWV0cmljIGhlcmUgd2hlbiBpdHMgb2JzZXJ2YXRpb25zIGNhbiBleGNlZWQgZml2ZSBtaW51dGVzLiBUaGUgdGFibGUgaXNcbiAqIHJlYWQgb24gRklSU1QgVVNFIG9mIGVhY2ggbmFtZSBieSBgY3JlYXRlTWV0cmljSGVscGVyc2AsIHNvIGJvdGggcmVnaXN0cmllc1xuICogKGFwaS1zZXJ2ZXIncyBhbmQgcGxhdGZvcm0ncyBvd24pIGdldCB0aGUgc2FtZSBkaXN0cmlidXRpb24sIHdoaWNoIGlzIHRoZVxuICogZHJpZnQgdGhlIGZhY3RvcnkgZXhpc3RzIHRvIHByZXZlbnQuXG4gKi9cbmNvbnN0IEhJU1RPR1JBTV9CVUNLRVRTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBudW1iZXJbXT4+ID0ge1xuICAvLyAxNW0sIDFoLCAyaCwgNGgsIDZoLCA4aCwgMTJoLCAyNGgsIDQ4aCwgOTZoLlxuICBzdXBwb3J0X2ZpcnN0X3Jlc3BvbnNlX3NlY29uZHM6IFs5MDAsIDM2MDAsIDcyMDAsIDE0NDAwLCAyMTYwMCwgMjg4MDAsIDQzMjAwLCA4NjQwMCwgMTcyODAwLCAzNDU2MDBdLFxuICAvLyBTdWJtaXNzaW9uLXRvLWRlY2lzaW9uIGxhdGVuY3kgaXMgYSBodW1hbiByZXZpZXcgcXVldWU6IGhvdXJzIHRvIGRheXMuXG4gIC8vIDE1bSwgMWgsIDRoLCAxMmgsIDFkLCAyZCwgNGQsIDdkLCAxNGQuXG4gIGVjb3N5c3RlbV9kZWNpc2lvbl9sYXRlbmN5X3NlY29uZHM6IFs5MDAsIDM2MDAsIDE0NDAwLCA0MzIwMCwgODY0MDAsIDE3MjgwMCwgMzQ1NjAwLCA2MDQ4MDAsIDEyMDk2MDBdLFxuICAvLyBRdWV1ZSB3YWl0LiBgUGx1Z2luUXVldWVQcm9jZXNzaW5nU2xvd2AgYXNzZXJ0cyBwOTUgPiAzMDAsIHdoaWNoIHRoZSBkZWZhdWx0XG4gIC8vIGNlaWxpbmcgb2YgMzAwIG1hZGUgdW5maXJlYWJsZTsgMzAwIGlzIGEgYm91bmRhcnkgaGVyZSBzbyB0aGUgY29tcGFyaXNvbiBpc1xuICAvLyBleGFjdCByYXRoZXIgdGhhbiBpbnRlcnBvbGF0ZWQuXG4gIHBsdWdpbl9qb2Jfd2FpdF9zZWNvbmRzOiBbMSwgNSwgMTUsIDMwLCA2MCwgMTIwLCAzMDAsIDYwMCwgMTgwMCwgMzYwMF0sXG4gIC8vIEEgY29udGFpbmVyIGJ1aWxkLiBNaW51dGVzIG5vcm1hbGx5LCBmYXIgbG9uZ2VyIGZvciBhIGNvbGQgYmFzZSBpbWFnZS5cbiAgcGx1Z2luX2J1aWxkX2R1cmF0aW9uX3NlY29uZHM6IFsxMCwgMzAsIDYwLCAxMjAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAzNjAwXSxcbiAgLy8gQSBmdWxsIGltYWdlIHNjYW4sIHdoaWNoIHJvdXRpbmVseSBwYXNzZXMgZml2ZSBtaW51dGVzIG9uIGEgbGFyZ2UgaW1hZ2UuXG4gIHBsdWdpbl92dWxuX3NjYW5fZHVyYXRpb25fc2Vjb25kczogWzEsIDUsIDE1LCAzMCwgNjAsIDEyMCwgMzAwLCA2MDAsIDEyMDBdLFxuICAvLyBUaW1lIGZyb20gYW4gaW5jaWRlbnQgYmVpbmcgcmFpc2VkIHRvIGEgaHVtYW4gYWNrbm93bGVkZ2luZyBpdC4gVGhlIGRlZmF1bHRcbiAgLy8gYnVja2V0cyBlbmQgYXQgMzAwcywgYW5kIGBoaXN0b2dyYW1fcXVhbnRpbGVgIGNhbm5vdCBpbnRlcnBvbGF0ZSBwYXN0IHRoZVxuICAvLyBsYXN0IGZpbml0ZSBib3VuZGFyeSDigJQgc28gd2l0aCB0aGVtLCBhbnkgdGhyZXNob2xkIGFib3ZlIGZpdmUgbWludXRlcyBjb3VsZFxuICAvLyBuZXZlciBmaXJlLCB3aGljaCBpcyBldmVyeSB0aHJlc2hvbGQgd29ydGggc2V0dGluZyBoZXJlLiBCb3VuZGFyaWVzIGF0IDFtLFxuICAvLyAybSwgNW0sIDEwbSwgMTVtLCAzMG0sIDFoLCAyaCwgNGg6IDE1bSBpcyBleGFjdCBiZWNhdXNlIHRoYXQgaXMgdGhlXG4gIC8vIGVzY2FsYXRpb24gZGVsYXkgdGhlIGFsZXJ0IGNvbXBhcmVzIGFnYWluc3QsIGFuZCB0aGUgcmFuZ2UgcmVhY2hlcyA0aCBzbyBhXG4gIC8vIHBhZ2Ugbm9ib2R5IGV2ZXIgcGlja2VkIHVwIGlzIHN0aWxsIGNvdW50ZWQgcmF0aGVyIHRoYW4gY2xpcHBlZC5cbiAgb25jYWxsX3BhZ2VfYWNrX3NlY29uZHM6IFs2MCwgMTIwLCAzMDAsIDYwMCwgOTAwLCAxODAwLCAzNjAwLCA3MjAwLCAxNDQwMF0sXG4gIC8vIENTQVQsIDEtNS4gTm90IGEgZHVyYXRpb24gYXQgYWxsLCBhbmQgbGlzdGVkIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbiBhc1xuICAvLyB0aGUgb3RoZXJzOiB0aGUgZGVmYXVsdCBidWNrZXRzIGFyZSBzdWItc2Vjb25kLCBzbyBldmVyeSByYXRpbmcgd291bGQgbGFuZFxuICAvLyBpbiB0aGUgc2FtZSBidWNrZXQgYW5kIHRoZSBxdWFudGlsZSB3b3VsZCBiZSBtZWFuaW5nbGVzcy4gT25lIGJvdW5kYXJ5IHBlclxuICAvLyBwb3NzaWJsZSBzY29yZSBtYWtlcyBgX3N1bSAvIF9jb3VudGAgYW4gZXhhY3QgYXZlcmFnZSBhbmQgZWFjaCBidWNrZXQgYVxuICAvLyByZWFsIGNvdW50LiBJdCByaWRlcyB0aGUgaGlzdG9ncmFtIHJhdGhlciB0aGFuIGEgY291bnRlci1wZXItc2NvcmUgc28gdGhlXG4gIC8vIGF2ZXJhZ2UgbmVlZHMgbm8gUHJvbVFMIGFyaXRobWV0aWMgb3ZlciBmaXZlIHNlcmllcy5cbiAgc3VwcG9ydF9zYXRpc2ZhY3Rpb246IFsxLCAyLCAzLCA0LCA1XSxcbn07XG5cbi8qKiBUaGUgbGF6eSBidXNpbmVzcy1tZXRyaWMgaGVscGVycywgYm91bmQgdG8gb25lIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNIZWxwZXJzIHtcbiAgaW5jQ291bnRlcihuYW1lOiBzdHJpbmcsIGxhYmVscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHZhbHVlPzogbnVtYmVyKTogdm9pZDtcbiAgb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQ7XG4gIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcbn1cblxuLyoqXG4gKiBCdWlsZCBgaW5jQ291bnRlcmAgLyBgb2JzZXJ2ZWAgLyBgc2V0R2F1Z2VgIG92ZXIgYSBjYWxsZXItc3VwcGxpZWQgcmVnaXN0cnkuXG4gKlxuICogVEhFIG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGF6eSBjb3VudGVyL2hpc3RvZ3JhbS9nYXVnZSBtYXBzLiBhcGktc2VydmVyJ3NcbiAqIG93biBleHBvcnRzIGJlbG93IGFyZSB0aGlzIGZhY3Rvcnkgb3ZlciBpdHMgbW9kdWxlLWxldmVsIGByZWdpc3RlcmA7IHRoZVxuICogcGxhdGZvcm0gc2VydmljZSDigJQgd2hpY2ggcnVucyBpdHMgb3duIEV4cHJlc3Mgc2V0dXAgaW5zdGVhZCBvZiBgY3JlYXRlQXBwYCxcbiAqIGFuZCB0aGVyZWZvcmUgb3ducyBhIGRpZmZlcmVudCByZWdpc3RyeSDigJQgYnVpbGRzIHRoZSBpZGVudGljYWwgaGVscGVycyBvdmVyXG4gKiBpdHMgb3duLiBXaXRob3V0IHRoZSBmYWN0b3J5IHRoZSB0d28gZHJpZnQ6IHRoZXkgZGlmZmVyIHRvZGF5IG9ubHkgaW4gdGhlXG4gKiBoaXN0b2dyYW0gYnVja2V0cywgd2hpY2ggaXMgZXhhY3RseSB0aGUga2luZCBvZiBkaWZmZXJlbmNlIG5vYm9keSBub3RpY2VzXG4gKiB1bnRpbCBhIGRhc2hib2FyZCByZWFkcyB3cm9uZyBvbiBvbmUgc2VydmljZS5cbiAqXG4gKiBgcmVnaXN0cnlgIG1heSBiZSBhIHRodW5rLCBmb3IgYSByZWdpc3RyeSB0aGF0IGlzIGluamVjdGVkIGFmdGVyIG1vZHVsZSBsb2FkXG4gKiAocGxhdGZvcm0gd2lyZXMgaXRzIG93biBvbiBhcHAgYm9vdCkuIFRoZSB0aHVuayBpcyBjYWxsZWQgb24gdGhlIEZJUlNUIHVzZSBvZlxuICogZWFjaCBtZXRyaWMgbmFtZSwgbmV2ZXIgYXQgaW1wb3J0IHRpbWUsIHNvIGJ1aWxkaW5nIHRoZSBoZWxwZXJzIGhhcyBubyBzaWRlXG4gKiBlZmZlY3Qgb2YgaXRzIG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1ldHJpY0hlbHBlcnMocmVnaXN0cnk6IFJlZ2lzdHJ5IHwgKCgpID0+IFJlZ2lzdHJ5KSk6IE1ldHJpY0hlbHBlcnMge1xuICBjb25zdCByZWdpc3RyeU9mID0gKCk6IFJlZ2lzdHJ5ID0+ICh0eXBlb2YgcmVnaXN0cnkgPT09ICdmdW5jdGlvbicgPyByZWdpc3RyeSgpIDogcmVnaXN0cnkpO1xuICBjb25zdCBjb3VudGVycyA9IG5ldyBNYXA8c3RyaW5nLCBDb3VudGVyPHN0cmluZz4+KCk7XG4gIGNvbnN0IGhpc3RvZ3JhbXMgPSBuZXcgTWFwPHN0cmluZywgSGlzdG9ncmFtPHN0cmluZz4+KCk7XG4gIGNvbnN0IGdhdWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBHYXVnZTxzdHJpbmc+PigpO1xuXG4gIHJldHVybiB7XG4gICAgaW5jQ291bnRlcihuYW1lLCBsYWJlbHMgPSB7fSwgdmFsdWUgPSAxKSB7XG4gICAgICBsZXQgY291bnRlciA9IGNvdW50ZXJzLmdldChuYW1lKTtcbiAgICAgIGlmICghY291bnRlcikge1xuICAgICAgICBjb3VudGVyID0gbmV3IENvdW50ZXIoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaGVscDogaHVtYW5pemVOYW1lKG5hbWUpLFxuICAgICAgICAgIGxhYmVsTmFtZXM6IE9iamVjdC5rZXlzKGxhYmVscyksXG4gICAgICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0cnlPZigpXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvdW50ZXJzLnNldChuYW1lLCBjb3VudGVyKTtcbiAgICAgIH1cbiAgICAgIGNvdW50ZXIuaW5jKGxhYmVscywgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBvYnNlcnZlKG5hbWUsIGxhYmVscywgdmFsdWUpIHtcbiAgICAgIGxldCBoaXN0ID0gaGlzdG9ncmFtcy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWhpc3QpIHtcbiAgICAgICAgaGlzdCA9IG5ldyBIaXN0b2dyYW0oe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaGVscDogaHVtYW5pemVOYW1lKG5hbWUpLFxuICAgICAgICAgIGxhYmVsTmFtZXM6IE9iamVjdC5rZXlzKGxhYmVscyksXG4gICAgICAgICAgLy8gRGVmYXVsdCBidWNrZXRzIHRhcmdldCBzdWItc2Vjb25kIHRocm91Z2ggc2V2ZXJhbC1taW51dGVcbiAgICAgICAgICAvLyBvYnNlcnZhdGlvbnMuIEFueXRoaW5nIHRoYXQgY2FuIGV4Y2VlZCBmaXZlIG1pbnV0ZXMgTVVTVCBkZWNsYXJlIGl0c1xuICAgICAgICAgIC8vIG93biBkaXN0cmlidXRpb24gaW4gYEhJU1RPR1JBTV9CVUNLRVRTYCBhYm92ZSDigJQgcGFzdCB0aGUgbGFzdCBmaW5pdGVcbiAgICAgICAgICAvLyBib3VuZGFyeSBhIHF1YW50aWxlIHJlYWRzIGJhY2sgYXMgdGhhdCBib3VuZGFyeSwgc28gYSB0aHJlc2hvbGRcbiAgICAgICAgICAvLyBiZXlvbmQgaXQgbmV2ZXIgZmlyZXMuXG4gICAgICAgICAgYnVja2V0czogWy4uLihISVNUT0dSQU1fQlVDS0VUU1tuYW1lXSA/PyBbMC4wNSwgMC4xLCAwLjI1LCAwLjUsIDEsIDIuNSwgNSwgMTAsIDMwLCA2MCwgMTIwLCAzMDBdKV0sXG4gICAgICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0cnlPZigpXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGhpc3RvZ3JhbXMuc2V0KG5hbWUsIGhpc3QpO1xuICAgICAgfVxuICAgICAgaGlzdC5vYnNlcnZlKGxhYmVscywgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBzZXRHYXVnZShuYW1lLCBsYWJlbHMsIHZhbHVlKSB7XG4gICAgICBsZXQgZ2F1Z2UgPSBnYXVnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCFnYXVnZSkge1xuICAgICAgICBnYXVnZSA9IG5ldyBHYXVnZSh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgICAgICByZWdpc3RlcnM6IFtyZWdpc3RyeU9mKCldLFxuICAgICAgICB9KTtcbiAgICAgICAgZ2F1Z2VzLnNldChuYW1lLCBnYXVnZSk7XG4gICAgICB9XG4gICAgICBnYXVnZS5zZXQobGFiZWxzLCB2YWx1ZSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIFRoaXMgc2VydmljZSdzIG93biBoZWxwZXJzLCBvdmVyIHRoZSBzaGFyZWQgbW9kdWxlLWxldmVsIHJlZ2lzdHJ5LiAqL1xuY29uc3QgYnVzaW5lc3NNZXRyaWNzID0gY3JlYXRlTWV0cmljSGVscGVycyhyZWdpc3Rlcik7XG5cbi8qKlxuICogSW5jcmVtZW50IGEgYnVzaW5lc3MgY291bnRlciwgY3JlYXRpbmcgaXQgb24gZmlyc3QgdXNlLlxuICpcbiAqIEV2ZXJ5IGV4YW1wbGUgYmVsb3cgaXMgYSBjYWxsIHRoYXQgRVhJU1RTLCB3aXRoIHRoZSBsYWJlbHMgaXQgcmVhbGx5IHBhc3Nlcy4gVGhhdCBpc1xuICogZGVsaWJlcmF0ZTogYW4gaW52ZW50ZWQgZXhhbXBsZSByZWFkcyBhcyBhbiBpbnZlbnRvcnkgb2Ygd2hhdCB0aGUgc3lzdGVtIG1lYXN1cmVzLCBhbmRcbiAqIGEgbWV0cmljcyBzdXJ2ZXkgbGF0ZXIgY291bnRlZCB0aHJlZSBuYW1lcyBmcm9tIHRoaXMgYmxvY2sg4oCUIGBwaXBlbGluZXNfZ2VuZXJhdGVkX3RvdGFsYCxcbiAqIGBxdW90YV90aHJlc2hvbGRfY3Jvc3NlZF90b3RhbGAsIGBjb21wbGlhbmNlX3Zpb2xhdGlvbnNfZm91bmRfdG90YWxgIOKAlCBhcyBsaXZlIG1ldHJpY3NcbiAqIG1pc3NpbmcgYSBkYXNoYm9hcmQgcGFuZWwuIE5vdGhpbmcgZW1pdHRlZCBhbnkgb2YgdGhlbS4gSWxsdXN0cmF0aXZlIG5hbWVzIGluIGEgZG9jc3RyaW5nXG4gKiBhYm91dCBtZXRyaWMgbmFtaW5nIGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHJlYWwgb25lcywgc28gdGhlcmUgYXJlIG5vbmUgaGVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW5jQ291bnRlcigncGx1Z2luX2J1aWxkc190b3RhbCcsIHsgc3RhdHVzOiAnc3VjY2VzcycsIG9yZ19pZDogb3JnSWQgfSk7XG4gKiBpbmNDb3VudGVyKCdjb21wbGlhbmNlX3NjYW5zX3RvdGFsJywgeyBvdXRjb21lOiAnc3RhcnRlZCcgfSk7XG4gKiBpbmNDb3VudGVyKCdwbHVnaW5fdnVsbl9maW5kaW5nc190b3RhbCcsIHsgdHJpZ2dlciwgc2V2ZXJpdHkgfSwgY291bnQpO1xuICogaW5jQ291bnRlcignYWlfdG9rZW5zX3RvdGFsJywgeyByb3V0ZTogJ2FnZW50Jywga2luZDogJ2lucHV0JyB9LCBpbnB1dFRva2Vucyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY0NvdW50ZXIobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSwgdmFsdWUgPSAxKTogdm9pZCB7XG4gIGJ1c2luZXNzTWV0cmljcy5pbmNDb3VudGVyKG5hbWUsIGxhYmVscywgdmFsdWUpO1xufVxuXG4vKipcbiAqIFJlY29yZCBhbiBvYnNlcnZhdGlvbiBvbiBhIGJ1c2luZXNzIGhpc3RvZ3JhbSwgY3JlYXRpbmcgaXQgb24gZmlyc3QgdXNlLlxuICogVXNlIGZvciBkdXJhdGlvbnMsIHNpemVzLCBhbnl0aGluZyB3aGVyZSBwZXJjZW50aWxlcyBtYXR0ZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG9ic2VydmUoJ2FpX2dlbmVyYXRpb25fZHVyYXRpb25fc2Vjb25kcycsIHsgcm91dGUsIHByb3ZpZGVyOiBwcm92aWRlckxhYmVsIH0sIGR1cmF0aW9uU2VjKTtcbiAqIG9ic2VydmUoJ3BsdWdpbl9idWlsZF9kdXJhdGlvbl9zZWNvbmRzJywgeyBvcmdfaWQ6IG9yZ0lkIH0sIGR1cmF0aW9uU2VjKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBidXNpbmVzc01ldHJpY3Mub2JzZXJ2ZShuYW1lLCBsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGEgYnVzaW5lc3MgZ2F1Z2UsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gVXNlIGZvclxuICogcG9pbnQtaW4tdGltZSBvYnNlcnZhdGlvbnMgc2FtcGxlZCBieSBhIHNjcmFwZXIg4oCUIHF1ZXVlIGRlcHRoLCBhY3RpdmVcbiAqIGNvbm5lY3Rpb24gY291bnRzLCBpbi1mbGlnaHQgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ3dhaXRpbmcnIH0sIDEyKTtcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ2FjdGl2ZScgfSwgMyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGJ1c2luZXNzTWV0cmljcy5zZXRHYXVnZShuYW1lLCBsYWJlbHMsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaHVtYW5pemVOYW1lKG1ldHJpY05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGBwbHVnaW5fYnVpbGRzX3RvdGFsYCDihpIgXCJQbHVnaW4gYnVpbGRzIHRvdGFsXCJcbiAgcmV0dXJuIG1ldHJpY05hbWVcbiAgICAucmVwbGFjZSgvXy9nLCAnICcpXG4gICAgLnJlcGxhY2UoL14uLywgKGMpID0+IGMudG9VcHBlckNhc2UoKSk7XG59XG4iXX0=
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUE2QixDQUFDLFdBQVcsQ0FBQztBQUU3RixpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUVoQyxxQ0FBcUM7QUFDckMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFckQsa0ZBQWtGO0FBQ2xGLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsUUFBa0I7SUFDNUQsT0FBTyxJQUFJLEtBQUssQ0FBQztRQUNmLElBQUksRUFBRSw4QkFBOEI7UUFDcEMsSUFBSSxFQUFFLGtLQUFrSztRQUN4SyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQVU7UUFDL0IsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3JCLE9BQU87WUFDTCxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksb0JBQW9CLEVBQUUsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxD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LEtBQWE7SUFDbEYsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDckMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsVUFBa0I7SUFDdEMsZ0RBQWdEO0lBQ2hELE9BQU8sVUFBVTtTQUNkLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcHJldmlvdXNTZWNyZXRTdGF0ZXMsIFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBSZWdpc3RyeSwgY29sbGVjdERlZmF1bHRNZXRyaWNzLCBDb3VudGVyLCBIaXN0b2dyYW0sIEdhdWdlIH0gZnJvbSAncHJvbS1jbGllbnQnO1xuXG5jb25zdCBTRVJWSUNFX05BTUUgPSAoQ29uZmlnLmdldEFueSgnb2JzZXJ2YWJpbGl0eScpIGFzIHsgc2VydmljZU5hbWU6IHN0cmluZyB9KS5zZXJ2aWNlTmFtZTtcblxuLyoqIFNoYXJlZCBQcm9tZXRoZXVzIHJlZ2lzdHJ5ICovXG5jb25zdCByZWdpc3RlciA9IG5ldyBSZWdpc3RyeSgpO1xuXG4vLyBTZXQgZGVmYXVsdCBsYWJlbHMgZm9yIGFsbCBtZXRyaWNzXG5yZWdpc3Rlci5zZXREZWZhdWx0TGFiZWxzKHsgc2VydmljZTogU0VSVklDRV9OQU1FIH0pO1xuXG4vLyBDb2xsZWN0IGRlZmF1bHQgTm9kZS5qcyBwcm9jZXNzIG1ldHJpY3MgKENQVSwgbWVtb3J5LCBoZWFwLCBldmVudCBsb29wIGxhZywgR0MpXG5jb2xsZWN0RGVmYXVsdE1ldHJpY3MoeyByZWdpc3RlciB9KTtcblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgYHNlY3JldF9yb3RhdGlvbl9wcmV2aW91c19zZXR7c2VjcmV0fWAgZ2F1Z2Ugb24gYHJlZ2lzdHJ5YDogMVxuICogd2hpbGUgYSBzZWNyZXQncyBgKl9QUkVWSU9VU2Agcm90YXRpb24gdmFsdWUgaXMgc3RpbGwgc2V0LCAwIG90aGVyd2lzZS4gVGhlXG4gKiB2YWx1ZSBpcyByZWFkIGZyb20gYXBpLWNvcmUncyBwcm9iZSByZWdpc3RyeSBhdCBzY3JhcGUgdGltZSwgc28gaXQgYWx3YXlzXG4gKiByZWZsZWN0cyB0aGUgbGl2ZSBwcm9jZXNzLiBFeHBvcnRlZCBzbyBwbGF0Zm9ybSAob3duIHJlZ2lzdHJ5KSBleHBvc2VzIHRoZVxuICogaWRlbnRpY2FsIHNlcmllczsgdGhlIGBTZWNyZXRSb3RhdGlvblByZXZpb3VzTGluZ2VyaW5nYCBhbGVydCBrZXlzIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTZWNyZXRSb3RhdGlvbkdhdWdlKHJlZ2lzdHJ5OiBSZWdpc3RyeSk6IEdhdWdlPCdzZWNyZXQnPiB7XG4gIHJldHVybiBuZXcgR2F1Z2Uoe1xuICAgIG5hbWU6IFNFQ1JFVF9ST1RBVElPTl9QUkVWSU9VU19HQVVHRSxcbiAgICBoZWxwOiAnMSB3aGlsZSBhIHNlY3JldCByb3RhdGlvbiBwcmV2aW91cyB2YWx1ZSAoZS5nLiBTRUNSRVRfRU5DUllQVElPTl9LRVlfUFJFVklPVVMpIG9yIGEgcmV0aXJpbmcgc2lnbmluZyBrZXkgaXMgc3RpbGwgYWNjZXB0ZWQ7IHNlZSBkb2NzL3J1bmJvb2tzL3NlY3JldC1yb3RhdGlvbi5tZCcsXG4gICAgbGFiZWxOYW1lczogWydzZWNyZXQnXSBhcyBjb25zdCxcbiAgICByZWdpc3RlcnM6IFtyZWdpc3RyeV0sXG4gICAgY29sbGVjdCgpIHtcbiAgICAgIGZvciAoY29uc3QgeyBzZWNyZXQsIHByZXZpb3VzU2V0IH0gb2YgcHJldmlvdXNTZWNyZXRTdGF0ZXMoKSkge1xuICAgICAgICB0aGlzLnNldCh7IHNlY3JldCB9LCBwcmV2aW91c1NldCA/IDEgOiAwKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxucmVnaXN0ZXJTZWNyZXRSb3RhdGlvbkdhdWdlKHJlZ2lzdGVyKTtcblxuLyoqIEhUVFAgcmVxdWVzdCBkdXJhdGlvbiBoaXN0b2dyYW0gKHNlY29uZHMpICovXG5jb25zdCBodHRwUmVxdWVzdER1cmF0aW9uID0gbmV3IEhpc3RvZ3JhbSh7XG4gIG5hbWU6ICdodHRwX3JlcXVlc3RfZHVyYXRpb25fc2Vjb25kcycsXG4gIGhlbHA6ICdEdXJhdGlvbiBvZiBIVFRQIHJlcXVlc3RzIGluIHNlY29uZHMnLFxuICBsYWJlbE5hbWVzOiBbJ21ldGhvZCcsICdyb3V0ZScsICdzdGF0dXNfY29kZSddIGFzIGNvbnN0LFxuICBidWNrZXRzOiBbMC4wMDUsIDAuMDEsIDAuMDI1LCAwLjA1LCAwLjEsIDAuMjUsIDAuNSwgMSwgMi41LCA1LCAxMF0sXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKiogSFRUUCByZXF1ZXN0IGNvdW50ZXIgKi9cbmNvbnN0IGh0dHBSZXF1ZXN0c1RvdGFsID0gbmV3IENvdW50ZXIoe1xuICBuYW1lOiAnaHR0cF9yZXF1ZXN0c190b3RhbCcsXG4gIGhlbHA6ICdUb3RhbCBudW1iZXIgb2YgSFRUUCByZXF1ZXN0cycsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJ10gYXMgY29uc3QsXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKipcbiAqIFBlci1vcmcgSFRUUCByZXF1ZXN0IGNvdW50ZXIg4oCUIFNBTVBMRUQgdG8ga2VlcCBQcm9tZXRoZXVzIGNhcmRpbmFsaXR5XG4gKiB1bmRlciBjb250cm9sLiBDYXJkaW5hbGl0eSBvZiBgb3JnX2lkICogbWV0aG9kICogcm91dGUgKiBzdGF0dXNfY29kZWBcbiAqIGdyb3dzIG11bHRpcGxpY2F0aXZlbHk7IHdpdGggTiBvcmdzICogNTAgcm91dGVzICogNSBzdGF0dXNfY29kZXMgdGhhdCdzXG4gKiAyNTDDl04gc2VyaWVzLiBXZSBzYW1wbGUgMS1pbi1OIHJlcXVlc3RzIChjb25maWd1cmFibGUgdmlhXG4gKiBgSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURWAsIGRlZmF1bHQgMCA9IG9mZikuXG4gKlxuICogT3BlcmF0b3JzIGFuc3dlciBcIndoYXQncyBvcmcgWCdzIHA5OT9cIiB2aWEgc2VwYXJhdGUgcGVyLW9yZyBoaXN0b2dyYW1zXG4gKiBzY3JhcGVkIGF0IGEgbG93ZXIgcmF0ZSwgT1IgdmlhIExva2kgTG9nUUwgcXVlcmllcyBhZ2FpbnN0IHRoZVxuICogdW5zYW1wbGVkIGFjY2Vzcy1sb2cgc3RyZWFtLiBUaGlzIGNvdW50ZXIgaXMgdGhlIGZhc3QtcGF0aCBcIm5vaXN5XG4gKiBuZWlnaGJvciBkZXRlY3Rpb25cIiDigJQgb3BlcmF0b3JzIGFsZXJ0IHdoZW4gb25lIG9yZydzIHJlcXVlc3QgcmF0ZVxuICogZGV2aWF0ZXMgZnJvbSB0aGUgZmxlZXQgbWVkaWFuLlxuICpcbiAqIE5PVCBhIGhpc3RvZ3JhbTogaGlzdG9ncmFtIGxhYmVsIGNhcmRpbmFsaXR5IGlzIGV2ZW4gbW9yZSBzZW5zaXRpdmVcbiAqIChlYWNoIGJ1Y2tldCBpcyBhIHNlcGFyYXRlIHNlcmllcykuIElmIHBlci1vcmcgbGF0ZW5jeSBwZXJjZW50aWxlcyBhcmVcbiAqIG5lZWRlZCBsYXRlciwgYWRkIGEgc2VwYXJhdGUgaGlzdG9ncmFtIHdpdGggYSBjb2Fyc2VyIGJ1Y2tldCBzZXQgYW5kXG4gKiBsb3dlciBzYW1wbGUgcmF0ZS5cbiAqL1xuY29uc3QgaHR0cFJlcXVlc3RzQnlPcmdUb3RhbCA9IG5ldyBDb3VudGVyKHtcbiAgbmFtZTogJ2h0dHBfcmVxdWVzdHNfYnlfb3JnX3RvdGFsJyxcbiAgaGVscDogJ1NhbXBsZWQgcGVyLW9yZyBIVFRQIHJlcXVlc3QgY291bnQgKHNhbXBsZSByYXRlIHZpYSBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFKScsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJywgJ29yZ19pZCddIGFzIGNvbnN0LFxuICByZWdpc3RlcnM6IFtyZWdpc3Rlcl0sXG59KTtcblxuLyoqXG4gKiBTYW1wbGUgcmF0ZSBmb3IgdGhlIHBlci1vcmcgY291bnRlci4gMS4wID0gZXZlcnkgcmVxdWVzdCwgMC4wID0gZGlzYWJsZWQuXG4gKiBQYXJzZWQgb25jZSBhdCBtb2R1bGUgbG9hZCDigJQgb3BlcmF0b3JzIHR1bmUgYnkgcmVzdGFydGluZyB0aGUgc2VydmljZS5cbiAqXG4gKiBEZWZhdWx0cyB0byAwIChPRkYpLiBgb3JnX2lkYCBpcyBhbiBVTkJPVU5ERUQsIHRlbmFudC1pZGVudGlmeWluZyBsYWJlbCBhbmRcbiAqIHByb20tY2xpZW50IGNvdW50ZXJzIG5ldmVyIGV4cGlyZSwgc28gYXQgMS4wIGV2ZXJ5IHNlcnZpY2UgYWNjdW11bGF0ZXMgYVxuICogc2VyaWVzIHBlciAob3JnIMOXIHJvdXRlIMOXIHN0YXR1cykgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLCBhbmQgYC9tZXRyaWNzYCDigJRcbiAqIHdoaWNoIGlzIG5vdCBhdXRoLWdhdGVkIOKAlCBlbnVtZXJhdGVzIGV2ZXJ5IHRlbmFudCBpZCBhbG9uZyB3aXRoIGl0cyByZXF1ZXN0XG4gKiB2b2x1bWUgYW5kIGVycm9yIHJhdGUgdG8gYW55b25lIHdobyBjYW4gcmVhY2ggdGhlIHBvcnQuXG4gKlxuICogVHVybiBpdCBvbiBkZWxpYmVyYXRlbHkgKGFuZCBpZGVhbGx5IHdpdGggYSBzYW1wbGUgcmF0ZSB3ZWxsIHVuZGVyIDEuMCwgcGx1c1xuICogYE1FVFJJQ1NfU0NSQVBFX1RPS0VOYCBzZXQpIHdoZW4geW91IGFjdHVhbGx5IHdhbnQgcGVyLW9yZyBub2lzeS1uZWlnaGJvdXJcbiAqIGRldGVjdGlvbiBmcm9tIG1ldHJpY3MgcmF0aGVyIHRoYW4gZnJvbSB0aGUgYWNjZXNzLWxvZyBzdHJlYW0uXG4gKi9cbmNvbnN0IE9SR19TQU1QTEVfUkFURSA9ICgoKSA9PiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LkhUVFBfTUVUUklDU19PUkdfU0FNUExFX1JBVEU7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gMDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdChyYXcpO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZCkgfHwgcGFyc2VkIDwgMCB8fCBwYXJzZWQgPiAxKSByZXR1cm4gMDtcbiAgcmV0dXJuIHBhcnNlZDtcbn0pKCk7XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIEV4cHJlc3Mgcm91dGUgcGF0aCB0byBwcmV2ZW50IGxhYmVsIGNhcmRpbmFsaXR5IGV4cGxvc2lvbi5cbiAqXG4gKiBVc2VzIEV4cHJlc3MncyBtYXRjaGVkIHJvdXRlIHBhdHRlcm4gKGUuZy4gYC9wbHVnaW5zLzppZGApIHdoZW4gYXZhaWxhYmxlLFxuICogb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdGhlIHJhdyBwYXRoIHdpdGggVVVJRC9udW1lcmljIHNlZ21lbnRzIHJlcGxhY2VkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSb3V0ZShyZXE6IFJlcXVlc3QpOiBzdHJpbmcge1xuICAvLyBQcmVmZXIgRXhwcmVzcyBtYXRjaGVkIHJvdXRlIHBhdHRlcm5cbiAgaWYgKHJlcS5yb3V0ZT8ucGF0aCkge1xuICAgIHJldHVybiByZXEuYmFzZVVybCArIHJlcS5yb3V0ZS5wYXRoO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IHJlcGxhY2UgVVVJRHMgYW5kIG51bWVyaWMgSURzIHdpdGggOmlkXG4gIHJldHVybiByZXEucGF0aFxuICAgIC5yZXBsYWNlKC9bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0vZ2ksICc6aWQnKVxuICAgIC5yZXBsYWNlKC9cXC9cXGQrKD89XFwvfCQpL2csICcvOmlkJyk7XG59XG5cbi8qKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlIHRoYXQgcmVjb3JkcyByZXF1ZXN0IGR1cmF0aW9uIGFuZCBjb3VudC5cbiAqXG4gKiBNdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIHJvdXRlIGhhbmRsZXJzIHNvIGByZXMub24oJ2ZpbmlzaCcpYCBmaXJlc1xuICogYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIHNlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNzTWlkZGxld2FyZSgpIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIC8vIE5PVEU6IG5vIC9tZXRyaWNzIG9yIC9oZWFsdGggc2tpcCBuZWVkZWQgaGVyZSDigJQgYm90aCBlbmRwb2ludHMgYXJlXG4gICAgLy8gcmVnaXN0ZXJlZCBpbiBhcHAtZmFjdG9yeSBCRUZPUkUgdGhpcyBtaWRkbGV3YXJlIChjcmVhdGVIZWFsdGhSb3V0ZXIgYW5kXG4gICAgLy8gYXBwLmdldCgnL21ldHJpY3MnKSBib3RoIHRlcm1pbmF0ZSB0aGUgcmVzcG9uc2UpLCBzbyBuZWl0aGVyIGV2ZXIgcmVhY2hlc1xuICAgIC8vIHRoaXMgaGFuZGxlci5cbiAgICBjb25zdCBlbmQgPSBodHRwUmVxdWVzdER1cmF0aW9uLnN0YXJ0VGltZXIoKTtcblxuICAgIHJlcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm91dGUgPSBub3JtYWxpemVSb3V0ZShyZXEpO1xuICAgICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBzdGF0dXNfY29kZTogU3RyaW5nKHJlcy5zdGF0dXNDb2RlKSxcbiAgICAgIH07XG5cbiAgICAgIGVuZChsYWJlbHMpO1xuICAgICAgaHR0cFJlcXVlc3RzVG90YWwuaW5jKGxhYmVscyk7XG5cbiAgICAgIC8vIFBlci1vcmcgc2FtcGxlZCBjb3VudGVyLiBTa2lwIHdoZW46XG4gICAgICAvLyAgIC0gbm8gb3JnIGNvbnRleHQgb24gdGhlIHJlcXVlc3QgKGFub255bW91cyAvIGhlYWx0aCBlbmRwb2ludHMpXG4gICAgICAvLyAgIC0gc2FtcGxlIHJhdGUgaXMgMCAoZGlzYWJsZWQpXG4gICAgICAvLyAgIC0gZGljZSByb2xsIGZhaWxzXG4gICAgICAvLyBVc2luZyBNYXRoLnJhbmRvbSBmb3IgdGhlIHNhbXBsZXIg4oCUIGZvciB1bmJpYXNlZCBsb3ctcmF0ZSBzYW1wbGluZ1xuICAgICAgLy8gYSBkZXRlcm1pbmlzdGljIHBlci1yZXF1ZXN0IGhhc2ggd291bGQgYmUgbW9yZSB1bmlmb3JtLCBidXQgYXQgdGhlXG4gICAgICAvLyBkZWZhdWx0IHJhdGUgb2YgMS4wIGV2ZXJ5IHJlcXVlc3QgbGFuZHMgc28gdGhpcyBpcyBmaW5lLlxuICAgICAgY29uc3Qgb3JnSWQgPSByZXEudXNlcj8ub3JnYW5pemF0aW9uSWQ7XG4gICAgICBpZiAob3JnSWQgJiYgT1JHX1NBTVBMRV9SQVRFID4gMCAmJiBNYXRoLnJhbmRvbSgpIDwgT1JHX1NBTVBMRV9SQVRFKSB7XG4gICAgICAgIGh0dHBSZXF1ZXN0c0J5T3JnVG90YWwuaW5jKHsgLi4ubGFiZWxzLCBvcmdfaWQ6IG9yZ0lkIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIEV4cHJlc3MgaGFuZGxlciB0aGF0IHJldHVybnMgUHJvbWV0aGV1cyBtZXRyaWNzIGluIHRleHQgZXhwb3NpdGlvbiBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNzSGFuZGxlcigpIHtcbiAgcmV0dXJuIGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmVzLnNldCgnQ29udGVudC1UeXBlJywgcmVnaXN0ZXIuY29udGVudFR5cGUpO1xuICAgIHJlcy5lbmQoYXdhaXQgcmVnaXN0ZXIubWV0cmljcygpKTtcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdXNpbmVzcyAvIGRvbWFpbiBtZXRyaWNzXG4vL1xuLy8gU2VydmljZXMgc2hvdWxkIGVtaXQgY291bnRlcnMgZm9yIHRoZSB0aGluZ3Mgb3BlcmF0b3JzIGFjdHVhbGx5IGNhcmUgYWJvdXRcbi8vIChwaXBlbGluZXMgZ2VuZXJhdGVkLCBwbHVnaW4gYnVpbGRzIGNvbXBsZXRlZCwgY29tcGxpYW5jZSB2aW9sYXRpb25zLFxuLy8gQUkgdG9rZW5zIGNvbnN1bWVkKSDigJQgbm90IGp1c3QgSFRUUCB0cmFmZmljLiBUaGUgaGVscGVycyBiZWxvdyByZWdpc3RlclxuLy8gY291bnRlcnMgbGF6aWx5IG9uIHRoZSBzaGFyZWQgcmVnaXN0cnkgc28gbXVsdGlwbGUgc2VydmljZXMgY2FuIGNhbGxcbi8vIGBpbmNDb3VudGVyKCdwbHVnaW5fYnVpbGRzX3RvdGFsJywgeyBzdGF0dXM6ICdjb21wbGV0ZWQnIH0pYCB3aXRob3V0XG4vLyB3b3JyeWluZyBhYm91dCBkb3VibGUtcmVnaXN0cmF0aW9uLlxuLy9cbi8vIE5hbWluZyBjb252ZW50aW9uOiBgPGRvbWFpbj5fPG5vdW4+X3RvdGFsYCBmb3IgY291bnRlcnMsIGBfc2Vjb25kc2AgZm9yXG4vLyBoaXN0b2dyYW1zIOKAlCBtYXRjaGVzIFByb21ldGhldXMgYmVzdC1wcmFjdGljZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJ1Y2tldCBkaXN0cmlidXRpb25zIGZvciBoaXN0b2dyYW1zIHdob3NlIG9ic2VydmF0aW9ucyBhcmUgbm93aGVyZSBuZWFyIHRoZVxuICogc3ViLXNlY29uZC10by1taW51dGVzIGRlZmF1bHQuXG4gKlxuICogVEhJUyBUQUJMRSBFWElTVFMgQkVDQVVTRSBUSEUgREVGQVVMVCBTSUxFTlRMWSBCUkVBS1MgQUxFUlRTLiBUaGUgZGVmYXVsdCBzZXRcbiAqIGJlbG93IGVuZHMgYXQgYSAzMDAtc2Vjb25kIGJ1Y2tldCwgYW5kIGBoaXN0b2dyYW1fcXVhbnRpbGVgIGNhbm5vdCBpbnRlcnBvbGF0ZVxuICogcGFzdCB0aGUgbGFzdCBGSU5JVEUgYm91bmRhcnkg4oCUIGV2ZXJ5dGhpbmcgYWJvdmUgaXQgbGFuZHMgaW4gYCtJbmZgIGFuZCB0aGVcbiAqIHF1YW50aWxlIHJlYWRzIGJhY2sgYXMgMzAwIGZvcmV2ZXIuIEFuIGFsZXJ0IG9mIHRoZSBmb3JtIGA+IDMwMGAgb24gc3VjaCBhXG4gKiBoaXN0b2dyYW0gY2FuIHRoZXJlZm9yZSBuZXZlciBmaXJlLCBhbmQgYSBwOTAgcGFuZWwgZmxhdC1saW5lcyBhdCBmaXZlXG4gKiBtaW51dGVzIGhvd2V2ZXIgYmFkIHRoaW5ncyBnZXQuIE5vdGhpbmcgZXJyb3JzLCBub3RoaW5nIGlzIG1pc3NpbmcgZnJvbSB0aGVcbiAqIHNjcmFwZSwgYW5kIHRoZSBkYXNoYm9hcmQgbG9va3MgaGVhbHRoeTogdGhlIG9ubHkgc3ltcHRvbSBpcyBhbiBhbGVydCB0aGF0XG4gKiBzdGF5cyBxdWlldCB0aHJvdWdoIGFuIG91dGFnZS4gYHN1cHBvcnRfZmlyc3RfcmVzcG9uc2Vfc2Vjb25kc2AgbWVhc3VyZXMgaG91cnNcbiAqIHRvIGRheXMgYW5kIGhhZCBhIHRocmVzaG9sZCBvZiB0d2VsdmUgaG91cnMgc2l0dGluZyBhYm92ZSBhIGNlaWxpbmcgb2YgZml2ZVxuICogbWludXRlcy5cbiAqXG4gKiBTbyBhIGhpc3RvZ3JhbSB3aG9zZSBuYXR1cmFsIHJhbmdlIGlzIG1pbnV0ZXMtdG8tZGF5cyBkZWNsYXJlcyBpdHMgYnVja2V0c1xuICogaGVyZSwgYW5kIEFMRVJUIFRIUkVTSE9MRFMgQVJFIFBVVCBPTiBCT1VOREFSSUVTOiBhIHRocmVzaG9sZCBpbnNpZGUgYSB3aWRlXG4gKiBidWNrZXQgaXMgc2VydmVkIGJ5IGxpbmVhciBpbnRlcnBvbGF0aW9uIGFjcm9zcyB0aGF0IGJ1Y2tldCwgd2hpY2ggaXMgYSBndWVzcyxcbiAqIHdoaWxlIGEgdGhyZXNob2xkIE9OIGEgYm91bmRhcnkgaXMgZXhhY3QuIEZvciBzdXBwb3J0IHRoYXQgbWVhbnMgNmggKHRoZSBhbGVydClcbiAqIGFuZCA4aCAodGhlIHNvbGQgdGFyZ2V0KSBhcmUgYm90aCBib3VuZGFyaWVzLCAyNGggaXMgdGhlIG9wZXJhdGlvbmFsIGd1YXJkXG4gKiBmcm9tIHRoZSBzdGFuZGFyZC9wcmlvcml0eSBydWxlLCBhbmQgOTZoIGNvdmVycyB0aGUgbG9uZ2VzdCBsZWdpdGltYXRlIHdhaXQgYVxuICogYnVzaW5lc3MtZGF5IHRhcmdldCBhbGxvd3Mg4oCUIGEgcHJpb3JpdHkgY2FzZSByYWlzZWQgYXQgMTc6MDEgb24gYSBGcmlkYXkuXG4gKlxuICogQWRkIGEgbWV0cmljIGhlcmUgd2hlbiBpdHMgb2JzZXJ2YXRpb25zIGNhbiBleGNlZWQgZml2ZSBtaW51dGVzLiBUaGUgdGFibGUgaXNcbiAqIHJlYWQgb24gRklSU1QgVVNFIG9mIGVhY2ggbmFtZSBieSBgY3JlYXRlTWV0cmljSGVscGVyc2AsIHNvIGJvdGggcmVnaXN0cmllc1xuICogKGFwaS1zZXJ2ZXIncyBhbmQgcGxhdGZvcm0ncyBvd24pIGdldCB0aGUgc2FtZSBkaXN0cmlidXRpb24sIHdoaWNoIGlzIHRoZVxuICogZHJpZnQgdGhlIGZhY3RvcnkgZXhpc3RzIHRvIHByZXZlbnQuXG4gKi9cbmNvbnN0IEhJU1RPR1JBTV9CVUNLRVRTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBudW1iZXJbXT4+ID0ge1xuICAvLyAxNW0sIDFoLCAyaCwgNGgsIDZoLCA4aCwgMTJoLCAyNGgsIDQ4aCwgOTZoLlxuICBzdXBwb3J0X2ZpcnN0X3Jlc3BvbnNlX3NlY29uZHM6IFs5MDAsIDM2MDAsIDcyMDAsIDE0NDAwLCAyMTYwMCwgMjg4MDAsIDQzMjAwLCA4NjQwMCwgMTcyODAwLCAzNDU2MDBdLFxuICAvLyBTdWJtaXNzaW9uLXRvLWRlY2lzaW9uIGxhdGVuY3kgaXMgYSBodW1hbiByZXZpZXcgcXVldWU6IGhvdXJzIHRvIGRheXMuXG4gIC8vIDE1bSwgMWgsIDRoLCAxMmgsIDFkLCAyZCwgNGQsIDdkLCAxNGQuXG4gIGVjb3N5c3RlbV9kZWNpc2lvbl9sYXRlbmN5X3NlY29uZHM6IFs5MDAsIDM2MDAsIDE0NDAwLCA0MzIwMCwgODY0MDAsIDE3MjgwMCwgMzQ1NjAwLCA2MDQ4MDAsIDEyMDk2MDBdLFxuICAvLyBRdWV1ZSB3YWl0LiBgUGx1Z2luUXVldWVQcm9jZXNzaW5nU2xvd2AgYXNzZXJ0cyBwOTUgPiAzMDAsIHdoaWNoIHRoZSBkZWZhdWx0XG4gIC8vIGNlaWxpbmcgb2YgMzAwIG1hZGUgdW5maXJlYWJsZTsgMzAwIGlzIGEgYm91bmRhcnkgaGVyZSBzbyB0aGUgY29tcGFyaXNvbiBpc1xuICAvLyBleGFjdCByYXRoZXIgdGhhbiBpbnRlcnBvbGF0ZWQuXG4gIHBsdWdpbl9qb2Jfd2FpdF9zZWNvbmRzOiBbMSwgNSwgMTUsIDMwLCA2MCwgMTIwLCAzMDAsIDYwMCwgMTgwMCwgMzYwMF0sXG4gIC8vIEEgY29udGFpbmVyIGJ1aWxkLiBNaW51dGVzIG5vcm1hbGx5LCBmYXIgbG9uZ2VyIGZvciBhIGNvbGQgYmFzZSBpbWFnZS5cbiAgcGx1Z2luX2J1aWxkX2R1cmF0aW9uX3NlY29uZHM6IFsxMCwgMzAsIDYwLCAxMjAsIDMwMCwgNjAwLCAxMjAwLCAxODAwLCAzNjAwXSxcbiAgLy8gQSBmdWxsIGltYWdlIHNjYW4sIHdoaWNoIHJvdXRpbmVseSBwYXNzZXMgZml2ZSBtaW51dGVzIG9uIGEgbGFyZ2UgaW1hZ2UuXG4gIHBsdWdpbl92dWxuX3NjYW5fZHVyYXRpb25fc2Vjb25kczogWzEsIDUsIDE1LCAzMCwgNjAsIDEyMCwgMzAwLCA2MDAsIDEyMDBdLFxuICAvLyBUaW1lIGZyb20gYW4gaW5jaWRlbnQgYmVpbmcgcmFpc2VkIHRvIGEgaHVtYW4gYWNrbm93bGVkZ2luZyBpdC4gVGhlIGRlZmF1bHRcbiAgLy8gYnVja2V0cyBlbmQgYXQgMzAwcywgYW5kIGBoaXN0b2dyYW1fcXVhbnRpbGVgIGNhbm5vdCBpbnRlcnBvbGF0ZSBwYXN0IHRoZVxuICAvLyBsYXN0IGZpbml0ZSBib3VuZGFyeSDigJQgc28gd2l0aCB0aGVtLCBhbnkgdGhyZXNob2xkIGFib3ZlIGZpdmUgbWludXRlcyBjb3VsZFxuICAvLyBuZXZlciBmaXJlLCB3aGljaCBpcyBldmVyeSB0aHJlc2hvbGQgd29ydGggc2V0dGluZyBoZXJlLiBCb3VuZGFyaWVzIGF0IDFtLFxuICAvLyAybSwgNW0sIDEwbSwgMTVtLCAzMG0sIDFoLCAyaCwgNGg6IDE1bSBpcyBleGFjdCBiZWNhdXNlIHRoYXQgaXMgdGhlXG4gIC8vIGVzY2FsYXRpb24gZGVsYXkgdGhlIGFsZXJ0IGNvbXBhcmVzIGFnYWluc3QsIGFuZCB0aGUgcmFuZ2UgcmVhY2hlcyA0aCBzbyBhXG4gIC8vIHBhZ2Ugbm9ib2R5IGV2ZXIgcGlja2VkIHVwIGlzIHN0aWxsIGNvdW50ZWQgcmF0aGVyIHRoYW4gY2xpcHBlZC5cbiAgb25jYWxsX3BhZ2VfYWNrX3NlY29uZHM6IFs2MCwgMTIwLCAzMDAsIDYwMCwgOTAwLCAxODAwLCAzNjAwLCA3MjAwLCAxNDQwMF0sXG4gIC8vIENTQVQsIDEtNS4gTm90IGEgZHVyYXRpb24gYXQgYWxsLCBhbmQgbGlzdGVkIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbiBhc1xuICAvLyB0aGUgb3RoZXJzOiB0aGUgZGVmYXVsdCBidWNrZXRzIGFyZSBzdWItc2Vjb25kLCBzbyBldmVyeSByYXRpbmcgd291bGQgbGFuZFxuICAvLyBpbiB0aGUgc2FtZSBidWNrZXQgYW5kIHRoZSBxdWFudGlsZSB3b3VsZCBiZSBtZWFuaW5nbGVzcy4gT25lIGJvdW5kYXJ5IHBlclxuICAvLyBwb3NzaWJsZSBzY29yZSBtYWtlcyBgX3N1bSAvIF9jb3VudGAgYW4gZXhhY3QgYXZlcmFnZSBhbmQgZWFjaCBidWNrZXQgYVxuICAvLyByZWFsIGNvdW50LiBJdCByaWRlcyB0aGUgaGlzdG9ncmFtIHJhdGhlciB0aGFuIGEgY291bnRlci1wZXItc2NvcmUgc28gdGhlXG4gIC8vIGF2ZXJhZ2UgbmVlZHMgbm8gUHJvbVFMIGFyaXRobWV0aWMgb3ZlciBmaXZlIHNlcmllcy5cbiAgc3VwcG9ydF9zYXRpc2ZhY3Rpb246IFsxLCAyLCAzLCA0LCA1XSxcbn07XG5cbi8qKiBUaGUgbGF6eSBidXNpbmVzcy1tZXRyaWMgaGVscGVycywgYm91bmQgdG8gb25lIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRyaWNIZWxwZXJzIHtcbiAgaW5jQ291bnRlcihuYW1lOiBzdHJpbmcsIGxhYmVscz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHZhbHVlPzogbnVtYmVyKTogdm9pZDtcbiAgb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQ7XG4gIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZDtcbiAgcmVzZXRHYXVnZShuYW1lOiBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIEJ1aWxkIGBpbmNDb3VudGVyYCAvIGBvYnNlcnZlYCAvIGBzZXRHYXVnZWAgb3ZlciBhIGNhbGxlci1zdXBwbGllZCByZWdpc3RyeS5cbiAqXG4gKiBUSEUgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsYXp5IGNvdW50ZXIvaGlzdG9ncmFtL2dhdWdlIG1hcHMuIGFwaS1zZXJ2ZXInc1xuICogb3duIGV4cG9ydHMgYmVsb3cgYXJlIHRoaXMgZmFjdG9yeSBvdmVyIGl0cyBtb2R1bGUtbGV2ZWwgYHJlZ2lzdGVyYDsgdGhlXG4gKiBwbGF0Zm9ybSBzZXJ2aWNlIOKAlCB3aGljaCBydW5zIGl0cyBvd24gRXhwcmVzcyBzZXR1cCBpbnN0ZWFkIG9mIGBjcmVhdGVBcHBgLFxuICogYW5kIHRoZXJlZm9yZSBvd25zIGEgZGlmZmVyZW50IHJlZ2lzdHJ5IOKAlCBidWlsZHMgdGhlIGlkZW50aWNhbCBoZWxwZXJzIG92ZXJcbiAqIGl0cyBvd24uIFdpdGhvdXQgdGhlIGZhY3RvcnkgdGhlIHR3byBkcmlmdDogdGhleSBkaWZmZXIgdG9kYXkgb25seSBpbiB0aGVcbiAqIGhpc3RvZ3JhbSBidWNrZXRzLCB3aGljaCBpcyBleGFjdGx5IHRoZSBraW5kIG9mIGRpZmZlcmVuY2Ugbm9ib2R5IG5vdGljZXNcbiAqIHVudGlsIGEgZGFzaGJvYXJkIHJlYWRzIHdyb25nIG9uIG9uZSBzZXJ2aWNlLlxuICpcbiAqIGByZWdpc3RyeWAgbWF5IGJlIGEgdGh1bmssIGZvciBhIHJlZ2lzdHJ5IHRoYXQgaXMgaW5qZWN0ZWQgYWZ0ZXIgbW9kdWxlIGxvYWRcbiAqIChwbGF0Zm9ybSB3aXJlcyBpdHMgb3duIG9uIGFwcCBib290KS4gVGhlIHRodW5rIGlzIGNhbGxlZCBvbiB0aGUgRklSU1QgdXNlIG9mXG4gKiBlYWNoIG1ldHJpYyBuYW1lLCBuZXZlciBhdCBpbXBvcnQgdGltZSwgc28gYnVpbGRpbmcgdGhlIGhlbHBlcnMgaGFzIG5vIHNpZGVcbiAqIGVmZmVjdCBvZiBpdHMgb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0cmljSGVscGVycyhyZWdpc3RyeTogUmVnaXN0cnkgfCAoKCkgPT4gUmVnaXN0cnkpKTogTWV0cmljSGVscGVycyB7XG4gIGNvbnN0IHJlZ2lzdHJ5T2YgPSAoKTogUmVnaXN0cnkgPT4gKHR5cGVvZiByZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IHJlZ2lzdHJ5KCkgOiByZWdpc3RyeSk7XG4gIGNvbnN0IGNvdW50ZXJzID0gbmV3IE1hcDxzdHJpbmcsIENvdW50ZXI8c3RyaW5nPj4oKTtcbiAgY29uc3QgaGlzdG9ncmFtcyA9IG5ldyBNYXA8c3RyaW5nLCBIaXN0b2dyYW08c3RyaW5nPj4oKTtcbiAgY29uc3QgZ2F1Z2VzID0gbmV3IE1hcDxzdHJpbmcsIEdhdWdlPHN0cmluZz4+KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbmNDb3VudGVyKG5hbWUsIGxhYmVscyA9IHt9LCB2YWx1ZSA9IDEpIHtcbiAgICAgIGxldCBjb3VudGVyID0gY291bnRlcnMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICAgIGNvdW50ZXIgPSBuZXcgQ291bnRlcih7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgICAgICByZWdpc3RlcnM6IFtyZWdpc3RyeU9mKCldLFxuICAgICAgICB9KTtcbiAgICAgICAgY291bnRlcnMuc2V0KG5hbWUsIGNvdW50ZXIpO1xuICAgICAgfVxuICAgICAgY291bnRlci5pbmMobGFiZWxzLCB2YWx1ZSk7XG4gICAgfSxcblxuICAgIG9ic2VydmUobmFtZSwgbGFiZWxzLCB2YWx1ZSkge1xuICAgICAgbGV0IGhpc3QgPSBoaXN0b2dyYW1zLmdldChuYW1lKTtcbiAgICAgIGlmICghaGlzdCkge1xuICAgICAgICBoaXN0ID0gbmV3IEhpc3RvZ3JhbSh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgICAgICAvLyBEZWZhdWx0IGJ1Y2tldHMgdGFyZ2V0IHN1Yi1zZWNvbmQgdGhyb3VnaCBzZXZlcmFsLW1pbnV0ZVxuICAgICAgICAgIC8vIG9ic2VydmF0aW9ucy4gQW55dGhpbmcgdGhhdCBjYW4gZXhjZWVkIGZpdmUgbWludXRlcyBNVVNUIGRlY2xhcmUgaXRzXG4gICAgICAgICAgLy8gb3duIGRpc3RyaWJ1dGlvbiBpbiBgSElTVE9HUkFNX0JVQ0tFVFNgIGFib3ZlIOKAlCBwYXN0IHRoZSBsYXN0IGZpbml0ZVxuICAgICAgICAgIC8vIGJvdW5kYXJ5IGEgcXVhbnRpbGUgcmVhZHMgYmFjayBhcyB0aGF0IGJvdW5kYXJ5LCBzbyBhIHRocmVzaG9sZFxuICAgICAgICAgIC8vIGJleW9uZCBpdCBuZXZlciBmaXJlcy5cbiAgICAgICAgICBidWNrZXRzOiBbLi4uKEhJU1RPR1JBTV9CVUNLRVRTW25hbWVdID8/IFswLjA1LCAwLjEsIDAuMjUsIDAuNSwgMSwgMi41LCA1LCAxMCwgMzAsIDYwLCAxMjAsIDMwMF0pXSxcbiAgICAgICAgICByZWdpc3RlcnM6IFtyZWdpc3RyeU9mKCldLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9ncmFtcy5zZXQobmFtZSwgaGlzdCk7XG4gICAgICB9XG4gICAgICBoaXN0Lm9ic2VydmUobGFiZWxzLCB2YWx1ZSk7XG4gICAgfSxcblxuICAgIHNldEdhdWdlKG5hbWUsIGxhYmVscywgdmFsdWUpIHtcbiAgICAgIGxldCBnYXVnZSA9IGdhdWdlcy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWdhdWdlKSB7XG4gICAgICAgIGdhdWdlID0gbmV3IEdhdWdlKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGhlbHA6IGh1bWFuaXplTmFtZShuYW1lKSxcbiAgICAgICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdHJ5T2YoKV0sXG4gICAgICAgIH0pO1xuICAgICAgICBnYXVnZXMuc2V0KG5hbWUsIGdhdWdlKTtcbiAgICAgIH1cbiAgICAgIGdhdWdlLnNldChsYWJlbHMsIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgcmVzZXRHYXVnZShuYW1lKSB7XG4gICAgICBnYXVnZXMuZ2V0KG5hbWUpPy5yZXNldCgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKiBUaGlzIHNlcnZpY2UncyBvd24gaGVscGVycywgb3ZlciB0aGUgc2hhcmVkIG1vZHVsZS1sZXZlbCByZWdpc3RyeS4gKi9cbmNvbnN0IGJ1c2luZXNzTWV0cmljcyA9IGNyZWF0ZU1ldHJpY0hlbHBlcnMocmVnaXN0ZXIpO1xuXG4vKipcbiAqIEluY3JlbWVudCBhIGJ1c2luZXNzIGNvdW50ZXIsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS5cbiAqXG4gKiBFdmVyeSBleGFtcGxlIGJlbG93IGlzIGEgY2FsbCB0aGF0IEVYSVNUUywgd2l0aCB0aGUgbGFiZWxzIGl0IHJlYWxseSBwYXNzZXMuIFRoYXQgaXNcbiAqIGRlbGliZXJhdGU6IGFuIGludmVudGVkIGV4YW1wbGUgcmVhZHMgYXMgYW4gaW52ZW50b3J5IG9mIHdoYXQgdGhlIHN5c3RlbSBtZWFzdXJlcywgYW5kXG4gKiBhIG1ldHJpY3Mgc3VydmV5IGxhdGVyIGNvdW50ZWQgdGhyZWUgbmFtZXMgZnJvbSB0aGlzIGJsb2NrIOKAlCBgcGlwZWxpbmVzX2dlbmVyYXRlZF90b3RhbGAsXG4gKiBgcXVvdGFfdGhyZXNob2xkX2Nyb3NzZWRfdG90YWxgLCBgY29tcGxpYW5jZV92aW9sYXRpb25zX2ZvdW5kX3RvdGFsYCDigJQgYXMgbGl2ZSBtZXRyaWNzXG4gKiBtaXNzaW5nIGEgZGFzaGJvYXJkIHBhbmVsLiBOb3RoaW5nIGVtaXR0ZWQgYW55IG9mIHRoZW0uIElsbHVzdHJhdGl2ZSBuYW1lcyBpbiBhIGRvY3N0cmluZ1xuICogYWJvdXQgbWV0cmljIG5hbWluZyBhcmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSByZWFsIG9uZXMsIHNvIHRoZXJlIGFyZSBub25lIGhlcmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ3N1Y2Nlc3MnLCBvcmdfaWQ6IG9yZ0lkIH0pO1xuICogaW5jQ291bnRlcignY29tcGxpYW5jZV9zY2Fuc190b3RhbCcsIHsgb3V0Y29tZTogJ3N0YXJ0ZWQnIH0pO1xuICogaW5jQ291bnRlcigncGx1Z2luX3Z1bG5fZmluZGluZ3NfdG90YWwnLCB7IHRyaWdnZXIsIHNldmVyaXR5IH0sIGNvdW50KTtcbiAqIGluY0NvdW50ZXIoJ2FpX3Rva2Vuc190b3RhbCcsIHsgcm91dGU6ICdhZ2VudCcsIGtpbmQ6ICdpbnB1dCcgfSwgaW5wdXRUb2tlbnMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNDb3VudGVyKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sIHZhbHVlID0gMSk6IHZvaWQge1xuICBidXNpbmVzc01ldHJpY3MuaW5jQ291bnRlcihuYW1lLCBsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYW4gb2JzZXJ2YXRpb24gb24gYSBidXNpbmVzcyBoaXN0b2dyYW0sIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS5cbiAqIFVzZSBmb3IgZHVyYXRpb25zLCBzaXplcywgYW55dGhpbmcgd2hlcmUgcGVyY2VudGlsZXMgbWF0dGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBvYnNlcnZlKCdhaV9nZW5lcmF0aW9uX2R1cmF0aW9uX3NlY29uZHMnLCB7IHJvdXRlLCBwcm92aWRlcjogcHJvdmlkZXJMYWJlbCB9LCBkdXJhdGlvblNlYyk7XG4gKiBvYnNlcnZlKCdwbHVnaW5fYnVpbGRfZHVyYXRpb25fc2Vjb25kcycsIHsgb3JnX2lkOiBvcmdJZCB9LCBkdXJhdGlvblNlYyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmUobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgYnVzaW5lc3NNZXRyaWNzLm9ic2VydmUobmFtZSwgbGFiZWxzLCB2YWx1ZSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBhIGJ1c2luZXNzIGdhdWdlLCBjcmVhdGluZyBpdCBvbiBmaXJzdCB1c2UuIFVzZSBmb3JcbiAqIHBvaW50LWluLXRpbWUgb2JzZXJ2YXRpb25zIHNhbXBsZWQgYnkgYSBzY3JhcGVyIOKAlCBxdWV1ZSBkZXB0aCwgYWN0aXZlXG4gKiBjb25uZWN0aW9uIGNvdW50cywgaW4tZmxpZ2h0IHJlcXVlc3RzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBzZXRHYXVnZSgncGx1Z2luX3F1ZXVlX2pvYnMnLCB7IHF1ZXVlOiAncGx1Z2luLWJ1aWxkJywgc3RhdGU6ICd3YWl0aW5nJyB9LCAxMik7XG4gKiBzZXRHYXVnZSgncGx1Z2luX3F1ZXVlX2pvYnMnLCB7IHF1ZXVlOiAncGx1Z2luLWJ1aWxkJywgc3RhdGU6ICdhY3RpdmUnIH0sIDMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRHYXVnZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBidXNpbmVzc01ldHJpY3Muc2V0R2F1Z2UobmFtZSwgbGFiZWxzLCB2YWx1ZSk7XG59XG5cbi8qKlxuICogRHJvcCBFVkVSWSBzZXJpZXMgb2YgYSBidXNpbmVzcyBnYXVnZS4gRm9yIGEgZ2F1Z2UgdGhhdCBkZXNjcmliZXMgYSBTRVQg4oCUIG9uZVxuICogc2VyaWVzIHBlciBjb25maWd1cmVkIGVudHJ5IOKAlCBhbmQgaXMgcmUtcHVibGlzaGVkIHdob2xlOiB3aXRob3V0IHRoZSByZXNldCwgYVxuICogc2VyaWVzIGZvciBhbiBlbnRyeSB0aGF0IGhhcyBzaW5jZSBiZWVuIGRlbGV0ZWQga2VlcHMgaXRzIGxhc3QgdmFsdWUgZm9yZXZlcixcbiAqIGFuZCBhbiBhbGVydCBvbiBpdCBrZWVwcyBmaXJpbmcgZm9yIHNvbWV0aGluZyB0aGF0IG5vIGxvbmdlciBleGlzdHMuIENhbGwgaXRcbiAqIGltbWVkaWF0ZWx5IGJlZm9yZSByZS1zZXR0aW5nIHRoZSBjdXJyZW50IHNldC4gQSBnYXVnZSBuZXZlciBzZXQgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0R2F1Z2UobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGJ1c2luZXNzTWV0cmljcy5yZXNldEdhdWdlKG5hbWUpO1xufVxuXG5mdW5jdGlvbiBodW1hbml6ZU5hbWUobWV0cmljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gYHBsdWdpbl9idWlsZHNfdG90YWxgIOKGkiBcIlBsdWdpbiBidWlsZHMgdG90YWxcIlxuICByZXR1cm4gbWV0cmljTmFtZVxuICAgIC5yZXBsYWNlKC9fL2csICcgJylcbiAgICAucmVwbGFjZSgvXi4vLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbn1cbiJdfQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type QuotaReserveResult, type QuotaService, type QuotaType } from '@pipeline-builder/api-core';
|
|
1
|
+
import { type QuotaReserveResult, type QuotaService, type QuotaType, type QuotaUsageAttribution } from '@pipeline-builder/api-core';
|
|
2
2
|
import type { Response } from 'express';
|
|
3
3
|
/** The reserved quota slot, handed to the guarded body. */
|
|
4
4
|
export interface QuotaSlot {
|
|
@@ -10,13 +10,27 @@ export interface QuotaSlot {
|
|
|
10
10
|
* responding). From here on a failure KEEPS the slot — the cost was incurred.
|
|
11
11
|
*/
|
|
12
12
|
markConsumed(): void;
|
|
13
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Give the slot back now. Idempotent: refunds at most once — and a NO-OP once
|
|
15
|
+
* {@link markConsumed} was called. A paid provider round-trip is never refunded,
|
|
16
|
+
* whatever path (a client abort, a later failure, an empty answer) asks for it
|
|
17
|
+
* afterwards; callers no longer need to guard `refund()` with their own
|
|
18
|
+
* "was the provider contacted" flag.
|
|
19
|
+
*/
|
|
14
20
|
refund(): void;
|
|
15
21
|
}
|
|
16
22
|
export interface QuotaReservationOptions {
|
|
17
23
|
quotaService: QuotaService;
|
|
18
24
|
orgId: string;
|
|
19
25
|
type: QuotaType;
|
|
26
|
+
/** Units to reserve (default 1) — e.g. an AI model's weight. Refunds give back the same amount. */
|
|
27
|
+
amount?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Usage-ledger attribution for the reserve AND its refund. Defaults to the
|
|
30
|
+
* ambient request context (principal + request id, no route) — pass it
|
|
31
|
+
* explicitly to record the route, the feature and the model.
|
|
32
|
+
*/
|
|
33
|
+
attribution?: QuotaUsageAttribution;
|
|
20
34
|
/** Signer of the quota service token. Defaults to this process (`SERVICE_NAME`). */
|
|
21
35
|
serviceName?: string;
|
|
22
36
|
logWarn: (message: string, data?: unknown) => void;
|
|
@@ -35,12 +49,37 @@ export type QuotaReservationOutcome<T> = {
|
|
|
35
49
|
status: 'failed';
|
|
36
50
|
error: unknown;
|
|
37
51
|
};
|
|
52
|
+
/** What {@link reserveQuotaSlot} hands back: a live slot, or the denial. */
|
|
53
|
+
export type QuotaSlotReservation = {
|
|
54
|
+
status: 'denied';
|
|
55
|
+
reservation: QuotaReserveResult;
|
|
56
|
+
} | {
|
|
57
|
+
status: 'reserved';
|
|
58
|
+
slot: QuotaSlot;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Reserve one slot (of `amount` units) and return its handle, WITHOUT running
|
|
62
|
+
* anything. The primitive under {@link withQuotaReservation}, for a caller whose
|
|
63
|
+
* gated work does not fit one callback — e.g. a tool inside an agent turn that
|
|
64
|
+
* settles its own slot. The caller owns settlement: `markConsumed()` once the
|
|
65
|
+
* resource is spent, `refund()` on every path that fails before that.
|
|
66
|
+
*
|
|
67
|
+
* Denied → `{ status: 'denied' }`, answered on `res` when given.
|
|
68
|
+
*/
|
|
69
|
+
export declare function reserveQuotaSlot(opts: QuotaReservationOptions): Promise<QuotaSlotReservation>;
|
|
70
|
+
/**
|
|
71
|
+
* Run `body` against a reserved slot and settle it by ONE rule: keep it once
|
|
72
|
+
* the resource was consumed; refund it if the body fails first. Shared by
|
|
73
|
+
* {@link withQuotaReservation} and api-server's AI reservation.
|
|
74
|
+
*/
|
|
75
|
+
export declare function runWithSlot<T, S extends QuotaSlot>(slot: S, body: (slot: S) => Promise<T>, onError?: (error: unknown) => void | Promise<void>): Promise<QuotaReservationOutcome<T>>;
|
|
38
76
|
/**
|
|
39
77
|
* Reserve one quota slot, run `body`, and settle the slot by ONE rule:
|
|
40
78
|
* keep it once the resource was consumed; refund it if the body fails first.
|
|
41
79
|
*
|
|
42
80
|
* - Denied → `{ status: 'denied' }` (answered on `res` when given); `body` never runs.
|
|
43
|
-
* - `body` resolves → the slot is kept (unless `body` called `slot.refund()`
|
|
81
|
+
* - `body` resolves → the slot is kept (unless `body` called `slot.refund()`
|
|
82
|
+
* BEFORE marking it consumed — a refund after `markConsumed()` is ignored).
|
|
44
83
|
* - `body` throws → refunded unless consumed — marked via `slot.markConsumed()`
|
|
45
84
|
* or signalled by the error itself carrying `providerContacted === true`
|
|
46
85
|
* (an AI round-trip that completed but produced nothing usable). The error is
|
|
@@ -2,25 +2,22 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { decrementQuota, getServiceAuthHeader, reserveQuota, sendQuotaReserveDenied, serviceIdentity, } from '@pipeline-builder/api-core';
|
|
4
4
|
/**
|
|
5
|
-
* Reserve one
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - `body` throws → refunded unless consumed — marked via `slot.markConsumed()`
|
|
11
|
-
* or signalled by the error itself carrying `providerContacted === true`
|
|
12
|
-
* (an AI round-trip that completed but produced nothing usable). The error is
|
|
13
|
-
* then passed to `onError`, or rethrown when there is none.
|
|
5
|
+
* Reserve one slot (of `amount` units) and return its handle, WITHOUT running
|
|
6
|
+
* anything. The primitive under {@link withQuotaReservation}, for a caller whose
|
|
7
|
+
* gated work does not fit one callback — e.g. a tool inside an agent turn that
|
|
8
|
+
* settles its own slot. The caller owns settlement: `markConsumed()` once the
|
|
9
|
+
* resource is spent, `refund()` on every path that fails before that.
|
|
14
10
|
*
|
|
15
|
-
*
|
|
16
|
-
* end-user bearer: the quota increment endpoint rejects user principals.
|
|
11
|
+
* Denied → `{ status: 'denied' }`, answered on `res` when given.
|
|
17
12
|
*/
|
|
18
|
-
export async function
|
|
19
|
-
const { quotaService, orgId, type, logWarn } = opts;
|
|
13
|
+
export async function reserveQuotaSlot(opts) {
|
|
14
|
+
const { quotaService, orgId, type, logWarn, attribution } = opts;
|
|
15
|
+
const amount = opts.amount ?? 1;
|
|
20
16
|
const serviceAuth = getServiceAuthHeader({ serviceName: opts.serviceName ?? serviceIdentity(), orgId, role: 'member' });
|
|
21
17
|
// Reserve atomically BEFORE any work: two concurrent requests at the limit
|
|
22
|
-
// can't both pass.
|
|
23
|
-
|
|
18
|
+
// can't both pass. Attribution defaults to the ambient request context
|
|
19
|
+
// (principal + request id) inside the quota client.
|
|
20
|
+
const reservation = await reserveQuota(quotaService, orgId, type, serviceAuth, amount, attribution);
|
|
24
21
|
if (reservation.exceeded) {
|
|
25
22
|
if (opts.res)
|
|
26
23
|
sendQuotaReserveDenied(opts.res, type, reservation);
|
|
@@ -33,19 +30,28 @@ export async function withQuotaReservation(opts, body, onError) {
|
|
|
33
30
|
reservation,
|
|
34
31
|
markConsumed: () => { consumed = true; },
|
|
35
32
|
refund: () => {
|
|
36
|
-
if (refunded)
|
|
33
|
+
if (refunded || consumed)
|
|
37
34
|
return;
|
|
38
35
|
refunded = true;
|
|
39
36
|
// The reserved resetAt keeps a period rollover from being double-charged.
|
|
40
|
-
decrementQuota(quotaService, orgId, type, serviceAuth, logWarn,
|
|
37
|
+
decrementQuota(quotaService, orgId, type, serviceAuth, logWarn, amount, reservation.quota.resetAt, attribution);
|
|
41
38
|
},
|
|
42
39
|
};
|
|
40
|
+
return { status: 'reserved', slot };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Run `body` against a reserved slot and settle it by ONE rule: keep it once
|
|
44
|
+
* the resource was consumed; refund it if the body fails first. Shared by
|
|
45
|
+
* {@link withQuotaReservation} and api-server's AI reservation.
|
|
46
|
+
*/
|
|
47
|
+
export async function runWithSlot(slot, body, onError) {
|
|
43
48
|
try {
|
|
44
49
|
return { status: 'done', value: await body(slot) };
|
|
45
50
|
}
|
|
46
51
|
catch (error) {
|
|
52
|
+
// `refund()` is itself a no-op once the slot was marked consumed.
|
|
47
53
|
const errorSaysConsumed = error?.providerContacted === true;
|
|
48
|
-
if (!
|
|
54
|
+
if (!errorSaysConsumed)
|
|
49
55
|
slot.refund();
|
|
50
56
|
if (!onError)
|
|
51
57
|
throw error;
|
|
@@ -53,4 +59,25 @@ export async function withQuotaReservation(opts, body, onError) {
|
|
|
53
59
|
return { status: 'failed', error };
|
|
54
60
|
}
|
|
55
61
|
}
|
|
56
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Reserve one quota slot, run `body`, and settle the slot by ONE rule:
|
|
64
|
+
* keep it once the resource was consumed; refund it if the body fails first.
|
|
65
|
+
*
|
|
66
|
+
* - Denied → `{ status: 'denied' }` (answered on `res` when given); `body` never runs.
|
|
67
|
+
* - `body` resolves → the slot is kept (unless `body` called `slot.refund()`
|
|
68
|
+
* BEFORE marking it consumed — a refund after `markConsumed()` is ignored).
|
|
69
|
+
* - `body` throws → refunded unless consumed — marked via `slot.markConsumed()`
|
|
70
|
+
* or signalled by the error itself carrying `providerContacted === true`
|
|
71
|
+
* (an AI round-trip that completed but produced nothing usable). The error is
|
|
72
|
+
* then passed to `onError`, or rethrown when there is none.
|
|
73
|
+
*
|
|
74
|
+
* The reserve and refund authenticate with a minted service token, never the
|
|
75
|
+
* end-user bearer: the quota increment endpoint rejects user principals.
|
|
76
|
+
*/
|
|
77
|
+
export async function withQuotaReservation(opts, body, onError) {
|
|
78
|
+
const reserved = await reserveQuotaSlot(opts);
|
|
79
|
+
if (reserved.status === 'denied')
|
|
80
|
+
return reserved;
|
|
81
|
+
return runWithSlot(reserved.slot, body, onError);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtcmVzZXJ2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3F1b3RhLXJlc2VydmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUNMLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixlQUFlLEdBS2hCLE1BQU0sNEJBQTRCLENBQUM7QUFxRHBDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxJQUE2QjtJQUNsRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztJQUNoQyxNQUFNLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUV4SCwyRUFBMkU7SUFDM0UsdUVBQXVFO0lBQ3ZFLG9EQUFvRDtJQUNwRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFlBQVksQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BHLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUc7WUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixNQUFNLElBQUksR0FBYztRQUN0QixXQUFXO1FBQ1gsV0FBVztRQUNYLFlBQVksRUFBRSxHQUFHLEVBQUUsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLEVBQUUsR0FBRyxFQUFFO1lBQ1gsSUFBSSxRQUFRLElBQUksUUFBUTtnQkFBRSxPQUFPO1lBQ2pDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsMEVBQTBFO1lBQzFFLGNBQWMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNsSCxDQUFDO0tBQ0YsQ0FBQztJQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLElBQU8sRUFDUCxJQUE2QixFQUM3QixPQUFrRDtJQUVsRCxJQUFJLENBQUM7UUFDSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGtFQUFrRTtRQUNsRSxNQUFNLGlCQUFpQixHQUFJLEtBQWdELEVBQUUsaUJBQWlCLEtBQUssSUFBSSxDQUFDO1FBQ3hHLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLEtBQUssQ0FBQztRQUMxQixNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsSUFBNkIsRUFDN0IsSUFBcUMsRUFDckMsT0FBa0Q7SUFFbEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ2xELE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHtcbiAgZGVjcmVtZW50UXVvdGEsXG4gIGdldFNlcnZpY2VBdXRoSGVhZGVyLFxuICByZXNlcnZlUXVvdGEsXG4gIHNlbmRRdW90YVJlc2VydmVEZW5pZWQsXG4gIHNlcnZpY2VJZGVudGl0eSxcbiAgdHlwZSBRdW90YVJlc2VydmVSZXN1bHQsXG4gIHR5cGUgUXVvdGFTZXJ2aWNlLFxuICB0eXBlIFF1b3RhVHlwZSxcbiAgdHlwZSBRdW90YVVzYWdlQXR0cmlidXRpb24sXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcblxuLyoqIFRoZSByZXNlcnZlZCBxdW90YSBzbG90LCBoYW5kZWQgdG8gdGhlIGd1YXJkZWQgYm9keS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFTbG90IHtcbiAgLyoqIE1pbnRlZCBzZXJ2aWNlIHRva2VuIHRoZSByZXNlcnZhdGlvbiB1c2VkIOKAlCByZXVzZSBpdCBmb3IgdGhlIGJvZHkncyBvd24gUzJTIGNhbGxzLiAqL1xuICByZWFkb25seSBzZXJ2aWNlQXV0aDogc3RyaW5nO1xuICByZWFkb25seSByZXNlcnZhdGlvbjogUXVvdGFSZXNlcnZlUmVzdWx0O1xuICAvKipcbiAgICogVGhlIHJlc2VydmVkIHJlc291cmNlIGhhcyBiZWVuIGNvbnN1bWVkIChlLmcuIHRoZSBBSSBwcm92aWRlciBzdGFydGVkXG4gICAqIHJlc3BvbmRpbmcpLiBGcm9tIGhlcmUgb24gYSBmYWlsdXJlIEtFRVBTIHRoZSBzbG90IOKAlCB0aGUgY29zdCB3YXMgaW5jdXJyZWQuXG4gICAqL1xuICBtYXJrQ29uc3VtZWQoKTogdm9pZDtcbiAgLyoqXG4gICAqIEdpdmUgdGhlIHNsb3QgYmFjayBub3cuIElkZW1wb3RlbnQ6IHJlZnVuZHMgYXQgbW9zdCBvbmNlIOKAlCBhbmQgYSBOTy1PUCBvbmNlXG4gICAqIHtAbGluayBtYXJrQ29uc3VtZWR9IHdhcyBjYWxsZWQuIEEgcGFpZCBwcm92aWRlciByb3VuZC10cmlwIGlzIG5ldmVyIHJlZnVuZGVkLFxuICAgKiB3aGF0ZXZlciBwYXRoIChhIGNsaWVudCBhYm9ydCwgYSBsYXRlciBmYWlsdXJlLCBhbiBlbXB0eSBhbnN3ZXIpIGFza3MgZm9yIGl0XG4gICAqIGFmdGVyd2FyZHM7IGNhbGxlcnMgbm8gbG9uZ2VyIG5lZWQgdG8gZ3VhcmQgYHJlZnVuZCgpYCB3aXRoIHRoZWlyIG93blxuICAgKiBcIndhcyB0aGUgcHJvdmlkZXIgY29udGFjdGVkXCIgZmxhZy5cbiAgICovXG4gIHJlZnVuZCgpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhUmVzZXJ2YXRpb25PcHRpb25zIHtcbiAgcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2U7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHR5cGU6IFF1b3RhVHlwZTtcbiAgLyoqIFVuaXRzIHRvIHJlc2VydmUgKGRlZmF1bHQgMSkg4oCUIGUuZy4gYW4gQUkgbW9kZWwncyB3ZWlnaHQuIFJlZnVuZHMgZ2l2ZSBiYWNrIHRoZSBzYW1lIGFtb3VudC4gKi9cbiAgYW1vdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogVXNhZ2UtbGVkZ2VyIGF0dHJpYnV0aW9uIGZvciB0aGUgcmVzZXJ2ZSBBTkQgaXRzIHJlZnVuZC4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIGFtYmllbnQgcmVxdWVzdCBjb250ZXh0IChwcmluY2lwYWwgKyByZXF1ZXN0IGlkLCBubyByb3V0ZSkg4oCUIHBhc3MgaXRcbiAgICogZXhwbGljaXRseSB0byByZWNvcmQgdGhlIHJvdXRlLCB0aGUgZmVhdHVyZSBhbmQgdGhlIG1vZGVsLlxuICAgKi9cbiAgYXR0cmlidXRpb24/OiBRdW90YVVzYWdlQXR0cmlidXRpb247XG4gIC8qKiBTaWduZXIgb2YgdGhlIHF1b3RhIHNlcnZpY2UgdG9rZW4uIERlZmF1bHRzIHRvIHRoaXMgcHJvY2VzcyAoYFNFUlZJQ0VfTkFNRWApLiAqL1xuICBzZXJ2aWNlTmFtZT86IHN0cmluZztcbiAgbG9nV2FybjogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gIC8qKiBXaGVuIHNldCwgYSBkZW5pZWQgcmVzZXJ2YXRpb24gaXMgYW5zd2VyZWQgb24gaXQgKDQyOSwgb3IgNTAzIHdoZW4gdW5jb25maXJtYWJsZSkuICovXG4gIHJlcz86IFJlc3BvbnNlO1xufVxuXG5leHBvcnQgdHlwZSBRdW90YVJlc2VydmF0aW9uT3V0Y29tZTxUPiA9XG4gIHwgeyBzdGF0dXM6ICdkZW5pZWQnOyByZXNlcnZhdGlvbjogUXVvdGFSZXNlcnZlUmVzdWx0IH1cbiAgfCB7IHN0YXR1czogJ2RvbmUnOyB2YWx1ZTogVCB9XG4gIC8qKiBPbmx5IHdpdGggYW4gYG9uRXJyb3JgIGhhbmRsZXI6IHRoZSBib2R5IHRocmV3IGFuZCB0aGUgaGFuZGxlciBhbnN3ZXJlZC4gKi9cbiAgfCB7IHN0YXR1czogJ2ZhaWxlZCc7IGVycm9yOiB1bmtub3duIH07XG5cbi8qKiBXaGF0IHtAbGluayByZXNlcnZlUXVvdGFTbG90fSBoYW5kcyBiYWNrOiBhIGxpdmUgc2xvdCwgb3IgdGhlIGRlbmlhbC4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhU2xvdFJlc2VydmF0aW9uID1cbiAgfCB7IHN0YXR1czogJ2RlbmllZCc7IHJlc2VydmF0aW9uOiBRdW90YVJlc2VydmVSZXN1bHQgfVxuICB8IHsgc3RhdHVzOiAncmVzZXJ2ZWQnOyBzbG90OiBRdW90YVNsb3QgfTtcblxuLyoqXG4gKiBSZXNlcnZlIG9uZSBzbG90IChvZiBgYW1vdW50YCB1bml0cykgYW5kIHJldHVybiBpdHMgaGFuZGxlLCBXSVRIT1VUIHJ1bm5pbmdcbiAqIGFueXRoaW5nLiBUaGUgcHJpbWl0aXZlIHVuZGVyIHtAbGluayB3aXRoUXVvdGFSZXNlcnZhdGlvbn0sIGZvciBhIGNhbGxlciB3aG9zZVxuICogZ2F0ZWQgd29yayBkb2VzIG5vdCBmaXQgb25lIGNhbGxiYWNrIOKAlCBlLmcuIGEgdG9vbCBpbnNpZGUgYW4gYWdlbnQgdHVybiB0aGF0XG4gKiBzZXR0bGVzIGl0cyBvd24gc2xvdC4gVGhlIGNhbGxlciBvd25zIHNldHRsZW1lbnQ6IGBtYXJrQ29uc3VtZWQoKWAgb25jZSB0aGVcbiAqIHJlc291cmNlIGlzIHNwZW50LCBgcmVmdW5kKClgIG9uIGV2ZXJ5IHBhdGggdGhhdCBmYWlscyBiZWZvcmUgdGhhdC5cbiAqXG4gKiBEZW5pZWQg4oaSIGB7IHN0YXR1czogJ2RlbmllZCcgfWAsIGFuc3dlcmVkIG9uIGByZXNgIHdoZW4gZ2l2ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNlcnZlUXVvdGFTbG90KG9wdHM6IFF1b3RhUmVzZXJ2YXRpb25PcHRpb25zKTogUHJvbWlzZTxRdW90YVNsb3RSZXNlcnZhdGlvbj4ge1xuICBjb25zdCB7IHF1b3RhU2VydmljZSwgb3JnSWQsIHR5cGUsIGxvZ1dhcm4sIGF0dHJpYnV0aW9uIH0gPSBvcHRzO1xuICBjb25zdCBhbW91bnQgPSBvcHRzLmFtb3VudCA/PyAxO1xuICBjb25zdCBzZXJ2aWNlQXV0aCA9IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWU6IG9wdHMuc2VydmljZU5hbWUgPz8gc2VydmljZUlkZW50aXR5KCksIG9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcblxuICAvLyBSZXNlcnZlIGF0b21pY2FsbHkgQkVGT1JFIGFueSB3b3JrOiB0d28gY29uY3VycmVudCByZXF1ZXN0cyBhdCB0aGUgbGltaXRcbiAgLy8gY2FuJ3QgYm90aCBwYXNzLiBBdHRyaWJ1dGlvbiBkZWZhdWx0cyB0byB0aGUgYW1iaWVudCByZXF1ZXN0IGNvbnRleHRcbiAgLy8gKHByaW5jaXBhbCArIHJlcXVlc3QgaWQpIGluc2lkZSB0aGUgcXVvdGEgY2xpZW50LlxuICBjb25zdCByZXNlcnZhdGlvbiA9IGF3YWl0IHJlc2VydmVRdW90YShxdW90YVNlcnZpY2UsIG9yZ0lkLCB0eXBlLCBzZXJ2aWNlQXV0aCwgYW1vdW50LCBhdHRyaWJ1dGlvbik7XG4gIGlmIChyZXNlcnZhdGlvbi5leGNlZWRlZCkge1xuICAgIGlmIChvcHRzLnJlcykgc2VuZFF1b3RhUmVzZXJ2ZURlbmllZChvcHRzLnJlcywgdHlwZSwgcmVzZXJ2YXRpb24pO1xuICAgIHJldHVybiB7IHN0YXR1czogJ2RlbmllZCcsIHJlc2VydmF0aW9uIH07XG4gIH1cblxuICBsZXQgY29uc3VtZWQgPSBmYWxzZTtcbiAgbGV0IHJlZnVuZGVkID0gZmFsc2U7XG4gIGNvbnN0IHNsb3Q6IFF1b3RhU2xvdCA9IHtcbiAgICBzZXJ2aWNlQXV0aCxcbiAgICByZXNlcnZhdGlvbixcbiAgICBtYXJrQ29uc3VtZWQ6ICgpID0+IHsgY29uc3VtZWQgPSB0cnVlOyB9LFxuICAgIHJlZnVuZDogKCkgPT4ge1xuICAgICAgaWYgKHJlZnVuZGVkIHx8IGNvbnN1bWVkKSByZXR1cm47XG4gICAgICByZWZ1bmRlZCA9IHRydWU7XG4gICAgICAvLyBUaGUgcmVzZXJ2ZWQgcmVzZXRBdCBrZWVwcyBhIHBlcmlvZCByb2xsb3ZlciBmcm9tIGJlaW5nIGRvdWJsZS1jaGFyZ2VkLlxuICAgICAgZGVjcmVtZW50UXVvdGEocXVvdGFTZXJ2aWNlLCBvcmdJZCwgdHlwZSwgc2VydmljZUF1dGgsIGxvZ1dhcm4sIGFtb3VudCwgcmVzZXJ2YXRpb24ucXVvdGEucmVzZXRBdCwgYXR0cmlidXRpb24pO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiB7IHN0YXR1czogJ3Jlc2VydmVkJywgc2xvdCB9O1xufVxuXG4vKipcbiAqIFJ1biBgYm9keWAgYWdhaW5zdCBhIHJlc2VydmVkIHNsb3QgYW5kIHNldHRsZSBpdCBieSBPTkUgcnVsZToga2VlcCBpdCBvbmNlXG4gKiB0aGUgcmVzb3VyY2Ugd2FzIGNvbnN1bWVkOyByZWZ1bmQgaXQgaWYgdGhlIGJvZHkgZmFpbHMgZmlyc3QuIFNoYXJlZCBieVxuICoge0BsaW5rIHdpdGhRdW90YVJlc2VydmF0aW9ufSBhbmQgYXBpLXNlcnZlcidzIEFJIHJlc2VydmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNsb3Q8VCwgUyBleHRlbmRzIFF1b3RhU2xvdD4oXG4gIHNsb3Q6IFMsXG4gIGJvZHk6IChzbG90OiBTKSA9PiBQcm9taXNlPFQ+LFxuICBvbkVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8UXVvdGFSZXNlcnZhdGlvbk91dGNvbWU8VD4+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBzdGF0dXM6ICdkb25lJywgdmFsdWU6IGF3YWl0IGJvZHkoc2xvdCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBgcmVmdW5kKClgIGlzIGl0c2VsZiBhIG5vLW9wIG9uY2UgdGhlIHNsb3Qgd2FzIG1hcmtlZCBjb25zdW1lZC5cbiAgICBjb25zdCBlcnJvclNheXNDb25zdW1lZCA9IChlcnJvciBhcyB7IHByb3ZpZGVyQ29udGFjdGVkPzogdW5rbm93biB9IHwgbnVsbCk/LnByb3ZpZGVyQ29udGFjdGVkID09PSB0cnVlO1xuICAgIGlmICghZXJyb3JTYXlzQ29uc3VtZWQpIHNsb3QucmVmdW5kKCk7XG4gICAgaWYgKCFvbkVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICBhd2FpdCBvbkVycm9yKGVycm9yKTtcbiAgICByZXR1cm4geyBzdGF0dXM6ICdmYWlsZWQnLCBlcnJvciB9O1xuICB9XG59XG5cbi8qKlxuICogUmVzZXJ2ZSBvbmUgcXVvdGEgc2xvdCwgcnVuIGBib2R5YCwgYW5kIHNldHRsZSB0aGUgc2xvdCBieSBPTkUgcnVsZTpcbiAqIGtlZXAgaXQgb25jZSB0aGUgcmVzb3VyY2Ugd2FzIGNvbnN1bWVkOyByZWZ1bmQgaXQgaWYgdGhlIGJvZHkgZmFpbHMgZmlyc3QuXG4gKlxuICogLSBEZW5pZWQg4oaSIGB7IHN0YXR1czogJ2RlbmllZCcgfWAgKGFuc3dlcmVkIG9uIGByZXNgIHdoZW4gZ2l2ZW4pOyBgYm9keWAgbmV2ZXIgcnVucy5cbiAqIC0gYGJvZHlgIHJlc29sdmVzIOKGkiB0aGUgc2xvdCBpcyBrZXB0ICh1bmxlc3MgYGJvZHlgIGNhbGxlZCBgc2xvdC5yZWZ1bmQoKWBcbiAqICAgQkVGT1JFIG1hcmtpbmcgaXQgY29uc3VtZWQg4oCUIGEgcmVmdW5kIGFmdGVyIGBtYXJrQ29uc3VtZWQoKWAgaXMgaWdub3JlZCkuXG4gKiAtIGBib2R5YCB0aHJvd3Mg4oaSIHJlZnVuZGVkIHVubGVzcyBjb25zdW1lZCDigJQgbWFya2VkIHZpYSBgc2xvdC5tYXJrQ29uc3VtZWQoKWBcbiAqICAgb3Igc2lnbmFsbGVkIGJ5IHRoZSBlcnJvciBpdHNlbGYgY2FycnlpbmcgYHByb3ZpZGVyQ29udGFjdGVkID09PSB0cnVlYFxuICogICAoYW4gQUkgcm91bmQtdHJpcCB0aGF0IGNvbXBsZXRlZCBidXQgcHJvZHVjZWQgbm90aGluZyB1c2FibGUpLiBUaGUgZXJyb3IgaXNcbiAqICAgdGhlbiBwYXNzZWQgdG8gYG9uRXJyb3JgLCBvciByZXRocm93biB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKlxuICogVGhlIHJlc2VydmUgYW5kIHJlZnVuZCBhdXRoZW50aWNhdGUgd2l0aCBhIG1pbnRlZCBzZXJ2aWNlIHRva2VuLCBuZXZlciB0aGVcbiAqIGVuZC11c2VyIGJlYXJlcjogdGhlIHF1b3RhIGluY3JlbWVudCBlbmRwb2ludCByZWplY3RzIHVzZXIgcHJpbmNpcGFscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhRdW90YVJlc2VydmF0aW9uPFQ+KFxuICBvcHRzOiBRdW90YVJlc2VydmF0aW9uT3B0aW9ucyxcbiAgYm9keTogKHNsb3Q6IFF1b3RhU2xvdCkgPT4gUHJvbWlzZTxUPixcbiAgb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sXG4pOiBQcm9taXNlPFF1b3RhUmVzZXJ2YXRpb25PdXRjb21lPFQ+PiB7XG4gIGNvbnN0IHJlc2VydmVkID0gYXdhaXQgcmVzZXJ2ZVF1b3RhU2xvdChvcHRzKTtcbiAgaWYgKHJlc2VydmVkLnN0YXR1cyA9PT0gJ2RlbmllZCcpIHJldHVybiByZXNlcnZlZDtcbiAgcmV0dXJuIHJ1bldpdGhTbG90KHJlc2VydmVkLnNsb3QsIGJvZHksIG9uRXJyb3IpO1xufVxuIl19
|
package/lib/api/server.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { Server } from 'http';
|
|
4
|
-
import { buildRouteTable, createLogger, errorMessage, installCrashHandlers, nextBackoffMs, resolveRedisConnection, retryForever, summarizeRouteTable, sleep, envInt } from '@pipeline-builder/api-core';
|
|
4
|
+
import { buildRouteTable, createLogger, errorMessage, flushQuotaIncrements, installCrashHandlers, nextBackoffMs, resolveRedisConnection, retryForever, summarizeRouteTable, sleep, envInt } from '@pipeline-builder/api-core';
|
|
5
5
|
import { Config } from '@pipeline-builder/pipeline-core';
|
|
6
6
|
import { getConnection, closeConnection } from '@pipeline-builder/pipeline-data';
|
|
7
7
|
import { setReady, isReady } from './readiness.js';
|
|
@@ -192,6 +192,9 @@ export async function startServer(app, options = {}) {
|
|
|
192
192
|
// Close HTTP server
|
|
193
193
|
server.close(async () => {
|
|
194
194
|
logger.info('HTTP server closed');
|
|
195
|
+
// Every in-flight request has now finished and buffered its metering unit;
|
|
196
|
+
// send them before exiting (api-core quota-increment-batcher). Never rejects.
|
|
197
|
+
await flushQuotaIncrements();
|
|
195
198
|
// Shutdown OpenTelemetry tracing
|
|
196
199
|
await shutdownTracing().catch(err => logger.error('Error shutting down tracing', { error: err }));
|
|
197
200
|
// Close database connection
|
|
@@ -258,4 +261,4 @@ export function runServer(app, options = {}) {
|
|
|
258
261
|
process.exit(1);
|
|
259
262
|
});
|
|
260
263
|
}
|
|
261
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4TSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUd0Qyw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSx5Q0FBeUM7QUFDekMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFDakMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsK0JBQStCLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFOUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsSUFBWSxFQUNaLGFBQWdELEVBQ2hELFlBQTBELEVBQzFELE9BQXNCO0lBRXRCLElB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Q0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUV4RCxPQUFPO1FBQ0wsTUFBTTtRQUNOLElBQUk7UUFDSixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQzNCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBWSxFQUFFLE9BQU8sR0FBdUIsRUFBRTtJQUN0RSw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLHdFQUF3RTtJQUN4RSwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVFLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDeEMsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLDZFQUE2RTtRQUM3RSxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO1lBQ3JDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQzFCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3hELENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFNlcnZlciB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgYnVpbGRSb3V0ZVRhYmxlLCBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgaW5zdGFsbENyYXNoSGFuZGxlcnMsIG5leHRCYWNrb2ZmTXMsIHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24sIHJldHJ5Rm9yZXZlciwgc3VtbWFyaXplUm91dGVUYWJsZSwgc2xlZXAsIGVudkludCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgZ2V0Q29ubmVjdGlvbiwgY2xvc2VDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3MgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IHNldFJlYWR5LCBpc1JlYWR5IH0gZnJvbSAnLi9yZWFkaW5lc3MuanMnO1xuaW1wb3J0IHsgc2h1dGRvd25UcmFjaW5nIH0gZnJvbSAnLi90cmFjaW5nLmpzJztcbmltcG9ydCB7IFNTRU1hbmFnZXIgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3NlcnZlcicpO1xuXG5cbi8vIERlcGVuZGVuY3ktc3VwZXJ2aXNvciBjYWRlbmNlLiBJbml0aWFsIGNvbm5lY3QgcmV0cmllcyB3aXRoIGNhcHBlZCBiYWNrb2ZmO1xuLy8gb25jZSBjb25uZWN0ZWQsIHJlLWNoZWNrcyBhdCBhIHN0ZWFkeSBpbnRlcnZhbCBzbyBhIGxhdGVyIG91dGFnZSBmbGlwcyB0aGVcbi8vIHNlcnZpY2UgTm90UmVhZHkgKGRyYWluaW5nIHRyYWZmaWMpIGFuZCBhIHJlY292ZXJ5IGZsaXBzIGl0IGJhY2sg4oCUIHdpdGhvdXRcbi8vIGV2ZXIgZXhpdGluZyAvIHJlc3RhcnRpbmcgdGhlIHByb2Nlc3MuXG5jb25zdCBSRUFEWV9SRVRSWV9CQVNFX01TID0gMTAwMDtcbmNvbnN0IFJFQURZX1JFVFJZX01BWF9NUyA9IDEwMDAwO1xuY29uc3QgUkVBRFlfTU9OSVRPUl9JTlRFUlZBTF9NUyA9IGVudkludCgnUkVBRElORVNTX01PTklUT1JfSU5URVJWQUxfTVMnLCAxNV8wMDAsIHsgbWluOiAxIH0pO1xuXG4vKipcbiAqIEVzdGFibGlzaCBhbmQgY29udGludW91c2x5IG1vbml0b3IgdGhlIHNlcnZpY2UncyBkYXRhc3RvcmUgZGVwZW5kZW5jeSxcbiAqIGZsaXBwaW5nIHJlYWRpbmVzcyBzdGF0ZSBpbnN0ZWFkIG9mIGNyYXNoLWxvb3BpbmcuXG4gKlxuICogLSBFc3RhYmxpc2ggcGhhc2U6IHJldHJ5IGBvbkJlZm9yZVN0YXJ0YCAoZS5nLiBjb25uZWN0TW9uZ28pIHdpdGggY2FwcGVkXG4gKiAgIGJhY2tvZmYgdW50aWwgaXQgc3VjY2VlZHMg4oCUIGEgY29sZCBkYXRhc3RvcmUgbXVzdCBuZXZlciBleGl0IHRoZSBwcm9jZXNzLlxuICogLSBNb25pdG9yIHBoYXNlOiBwb2xsIGB0ZXN0RGF0YWJhc2VgIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2VzczsgZmxpcFxuICogICByZWFkeS9Ob3RSZWFkeSBvbiB0cmFuc2l0aW9ucy4gV2hpbGUgTm90UmVhZHkgdGhlIHJlYWRpbmVzcyBndWFyZCA1MDNzXG4gKiAgIGJ1c2luZXNzIHRyYWZmaWMgYW5kIG9yY2hlc3RyYXRvciByZWFkaW5lc3MgcHJvYmVzIGRyYWluIHRoZSBpbnN0YW5jZS5cbiAqXG4gKiBSdW5zIGluIHRoZSBiYWNrZ3JvdW5kICh0aGUgSFRUUCBzZXJ2ZXIgaXMgYWxyZWFkeSBsaXN0ZW5pbmcpLiBTdG9wcyB3aGVuXG4gKiBgYWJvcnRlZCgpYCByZXR1cm5zIHRydWUgKGdyYWNlZnVsIHNodXRkb3duKSwgc28gaXQgbmV2ZXIga2VlcHMgYSBjbG9zaW5nXG4gKiBwcm9jZXNzIGFsaXZlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdXBlcnZpc2VEZXBlbmRlbmNpZXMoXG4gIG5hbWU6IHN0cmluZyxcbiAgb25CZWZvcmVTdGFydDogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkLFxuICB0ZXN0RGF0YWJhc2U6ICgoKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB8IGZhbHNlIHwgdW5kZWZpbmVkLFxuICBhYm9ydGVkOiAoKSA9PiBib29sZWFuLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChvbkJlZm9yZVN0YXJ0KSB7XG4gICAgYXdhaXQgcmV0cnlGb3JldmVyKG9uQmVmb3JlU3RhcnQsIHtcbiAgICAgIGJhc2VNczogUkVBRFlfUkVUUllfQkFTRV9NUyxcbiAgICAgIG1heE1zOiBSRUFEWV9SRVRSWV9NQVhfTVMsXG4gICAgICBvbkF0dGVtcHRGYWlsZWQ6IChlcnJvciwgZGVsYXlNcykgPT4gbG9nZ2VyLndhcm4oXG4gICAgICAgIGAke25hbWV9OiBkZXBlbmRlbmN5IGluaXQgZmFpbGVkLCByZXRyeWluZyBpbiAke2RlbGF5TXN9bXNgLFxuICAgICAgICB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0sXG4gICAgICApLFxuICAgICAgc2hvdWxkQ29udGludWU6ICgpID0+ICFhYm9ydGVkKCksXG4gICAgfSk7XG4gIH1cblxuICAvLyBObyBkYXRhc3RvcmUgdG8gZ2F0ZSBvbiDihpIgcmVhZHkgYXMgc29vbiBhcyB3ZSBhcmUgbGlzdGVuaW5nLlxuICBpZiAodGVzdERhdGFiYXNlID09PSBmYWxzZSkge1xuICAgIGlmIChhYm9ydGVkKCkpIHJldHVybjsgLy8gc2h1dGRvd24gYmVnYW4gd2hpbGUgd2Ugd2VyZSBpbml0aWFsaXppbmdcbiAgICBzZXRSZWFkeSh0cnVlKTtcbiAgICBsb2dnZXIuaW5mbyhgJHtuYW1lfSByZWFkeSAobm8gZGF0YXN0b3JlIGRlcGVuZGVuY3kpYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcHJvYmUgPSB0ZXN0RGF0YWJhc2UgPz8gKCgpID0+IGdldENvbm5lY3Rpb24oKS50ZXN0Q29ubmVjdGlvbigpKTtcbiAgbGV0IHdhaXREZWxheSA9IFJFQURZX1JFVFJZX0JBU0VfTVM7XG4gIHdoaWxlICghYWJvcnRlZCgpKSB7XG4gICAgbGV0IG9rID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIG9rID0gYXdhaXQgcHJvYmUoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIG9rID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQSBwcm9iZSB0aGF0IHdhcyBpbiBmbGlnaHQgd2hlbiBzaHV0ZG93biBiZWdhbiBtdXN0IG5vdCBmbGlwIHRoZVxuICAgIC8vIGRyYWluaW5nIGluc3RhbmNlIGJhY2sgdG8gcmVhZHkuXG4gICAgaWYgKGFib3J0ZWQoKSkgYnJlYWs7XG4gICAgaWYgKG9rICYmICFpc1JlYWR5KCkpIHtcbiAgICAgIHNldFJlYWR5KHRydWUpO1xuICAgICAgd2FpdERlbGF5ID0gUkVBRFlfUkVUUllfQkFTRV9NUztcbiAgICAgIGxvZ2dlci5pbmZvKGAke25hbWV9IHJlYWR5IOKAlCBkZXBlbmRlbmNpZXMgY29ubmVjdGVkYCk7XG4gICAgfSBlbHNlIGlmICghb2sgJiYgaXNSZWFkeSgpKSB7XG4gICAgICBzZXRSZWFkeShmYWxzZSk7XG4gICAgICBsb2dnZXIud2FybihgJHtuYW1lfSBkZWdyYWRlZCDigJQgZGVwZW5kZW5jeSBjaGVjayBmYWlsaW5nIChub3cgTm90UmVhZHkpYCk7XG4gICAgfVxuXG4gICAgLy8gU3RlYWR5IGNhZGVuY2Ugb25jZSByZWFkeTsgZmFzdGVyIGJhY2tvZmYgd2hpbGUgd2FpdGluZyBzbyB3ZSBmbGlwIHRvXG4gICAgLy8gcmVhZHkgcHJvbXB0bHkgd2hlbiB0aGUgZGF0YXN0b3JlIGNvbWVzIHVwLlxuICAgIGlmIChpc1JlYWR5KCkpIHtcbiAgICAgIGF3YWl0IHNsZWVwKFJFQURZX01PTklUT1JfSU5URVJWQUxfTVMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzbGVlcCh3YWl0RGVsYXkpO1xuICAgICAgd2FpdERlbGF5ID0gbmV4dEJhY2tvZmZNcyh3YWl0RGVsYXksIFJFQURZX1JFVFJZX01BWF9NUyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFNlcnZlck9wdGlvbnMge1xuICAvKiogU2VydmljZSBuYW1lIGZvciBsb2dnaW5nICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBQb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdDogZnJvbSBjb25maWcpICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBTU0UgbWFuYWdlciBmb3IgZ3JhY2VmdWwgc2h1dGRvd24gKi9cbiAgc3NlTWFuYWdlcj86IFNTRU1hbmFnZXI7XG4gIC8qKiBTaHV0ZG93biB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTUwMDApICovXG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogQ2FsbGJhY2sgYWZ0ZXIgc2VydmVyIHN0YXJ0cyAqL1xuICBvblN0YXJ0PzogKHBvcnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIGJlZm9yZSBzaHV0ZG93biAqL1xuICBvblNodXRkb3duPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1bnMgYmVmb3JlIGRhdGFiYXNlIGNoZWNrIChlLmcuLCBpbml0aWFsaXplIGV4dGVybmFsIGNvbm5lY3Rpb25zKSAqL1xuICBvbkJlZm9yZVN0YXJ0PzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEN1c3RvbSBkYXRhYmFzZSBoZWFsdGggY2hlY2ssIG9yIGZhbHNlIHRvIHNraXAuIERlZmF1bHQ6IFBvc3RncmVTUUwgdGVzdENvbm5lY3Rpb24gKi9cbiAgdGVzdERhdGFiYXNlPzogKCgpID0+IFByb21pc2U8Ym9vbGVhbj4pIHwgZmFsc2U7XG4gIC8qKiBDdXN0b20gZGF0YWJhc2UgY2xvc2UsIG9yIGZhbHNlIHRvIHNraXAuIERlZmF1bHQ6IFBvc3RncmVTUUwgY2xvc2VDb25uZWN0aW9uICovXG4gIGNsb3NlRGF0YWJhc2U/OiAoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgYSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFNlcnZlclJlc3VsdCB7XG4gIC8qKiBIVFRQIHNlcnZlciBpbnN0YW5jZSAqL1xuICBzZXJ2ZXI6IFNlcnZlcjtcbiAgLyoqIFBvcnQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24gKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gdG8gbWFudWFsbHkgdHJpZ2dlciBzaHV0ZG93biAqL1xuICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBTdGFydCBhbiBFeHByZXNzIHNlcnZlciB3aXRoIGdyYWNlZnVsIHNodXRkb3duIGhhbmRsaW5nXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBkYXRhYmFzZSBjb25uZWN0aW9uIHRlc3RpbmdcbiAqIC0gR3JhY2VmdWwgc2h1dGRvd24gb24gU0lHSU5UL1NJR1RFUk1cbiAqIC0gU1NFIGNvbm5lY3Rpb24gY2xlYW51cFxuICogLSBDb25maWd1cmFibGUgc2h1dGRvd24gdGltZW91dFxuICpcbiAqIEBwYXJhbSBhcHAgLSBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBvcHRpb25zXG4gKiBAcmV0dXJucyBTZXJ2ZXIgaW5zdGFuY2UgYW5kIGNvbnRyb2wgZnVuY3Rpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqXG4gKiBhcHAucG9zdCgnL2FwaS9yZXNvdXJjZScsIHJlcXVpcmVBdXRoLCBoYW5kbGVyKTtcbiAqXG4gKiBhd2FpdCBzdGFydFNlcnZlcihhcHAsIHtcbiAqICAgbmFtZTogJ015IE1pY3Jvc2VydmljZScsXG4gKiAgIHNzZU1hbmFnZXIsXG4gKiAgIG9uU3RhcnQ6IChwb3J0KSA9PiBjb25zb2xlLmxvZyhgTGlzdGVuaW5nIG9uICR7cG9ydH1gKSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcihcbiAgYXBwOiBFeHByZXNzLFxuICBvcHRpb25zOiBTdGFydFNlcnZlck9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8U3RhcnRTZXJ2ZXJSZXN1bHQ+IHtcbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IHtcbiAgICBuYW1lID0gJ01pY3Jvc2VydmljZScsXG4gICAgc3NlTWFuYWdlcixcbiAgICBzaHV0ZG93blRpbWVvdXRNcyA9IDE1MDAwLFxuICAgIG9uU3RhcnQsXG4gICAgb25TaHV0ZG93bixcbiAgICBvbkJlZm9yZVN0YXJ0LFxuICAgIHRlc3REYXRhYmFzZSxcbiAgICBjbG9zZURhdGFiYXNlLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyBzZXJ2ZXJDb25maWcucG9ydDtcblxuICAvLyBWYWxpZGF0ZSBhdXRoIGNvbmZpZ3VyYXRpb24gYXQgc2VydmVyIHN0YXJ0dXAgKG5vdCBkdXJpbmcgQ0RLIHN5bnRoZXNpcylcbiAgQ29uZmlnLnZhbGlkYXRlQXV0aCgpO1xuICAvLyBGYWlsIGZhc3QgaWYgdGhpcyBzZXJ2aWNlIGhhcyBubyBpbnRlcm5hbCBzaWduaW5nIGtleSBvZiBpdHMgb3duLCBvciBub1xuICAvLyBwdWJsaWMgYnVuZGxlIHRvIHZlcmlmeSBpdHMgcGVlcnMgd2l0aC4gV2l0aG91dCB0aGVtIGl0IHdvdWxkIG1pbnRcbiAgLy8gdG9rZW5zIG9uIGFuIEVQSEVNRVJBTCBpbi1wcm9jZXNzIGtleSB0aGF0IG5vIHBlZXIgYWNjZXB0cywgYW5kIHJlamVjdCBldmVyeVxuICAvLyBwZWVyJ3MgdG9rZW4g4oCUIGkuZS4gc2lsZW50bHkgbG9zZSBhbGwgc2VydmljZS10by1zZXJ2aWNlIHRyYWZmaWMuIENoZWNrZWRcbiAgLy8gSEVSRSByYXRoZXIgdGhhbiBpbiBgY3JlYXRlQXBwYCBiZWNhdXNlIGl0IGlzIGEgcHJvcGVydHkgb2YgdGhlIHJ1bm5pbmdcbiAgLy8gZGVwbG95bWVudCwgbm90IG9mIHRoZSBhcHAgb2JqZWN0OiByb3V0ZS10YWJsZSBidWlsZGVycyBhbmQgdGVzdCBzdWl0ZXNcbiAgLy8gYXNzZW1ibGUgYW4gYXBwIHdpdGhvdXQgZXZlciBzaWduaW5nIGFueXRoaW5nLlxuICBmb3IgKGNvbnN0IGVudlZhciBvZiBbJ1NFUlZJQ0VfU0lHTklOR19LRVlfRklMRScsICdTRVJWSUNFX0tFWV9CVU5ETEVfRklMRSddIGFzIGNvbnN0KSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudltlbnZWYXJdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW52VmFyfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCAoZ2VuZXJhdGUgd2l0aCBkZXBsb3kvYmluL3NlcnZpY2Utc2lnbmluZy1rZXlzLnNoKS4gU2V0IGl0IGJlZm9yZSBzdGFydGluZyB0aGUgc2VydmVyLmApO1xuICAgIH1cbiAgfVxuICAvLyBGYWlsIGZhc3Qgb24gYW4gdW51c2FibGUgUmVkaXMgY29uZmlndXJhdGlvbiAodGhyb3dzIFJlZGlzQ29uZmlnRXJyb3IpIOKAlCBhXG4gIC8vIFJlZGlzIGNsaWVudCBpcyBjcmVhdGVkIGxhemlseSBvbiBmaXJzdCB1c2UsIHNvIHdpdGhvdXQgdGhpcyBhIGJhZCBjb25maWdcbiAgLy8gd291bGQgc3VyZmFjZSBhcyByZXF1ZXN0LXRpbWUgZXJyb3JzIGluc3RlYWQgb2YgYSBmYWlsZWQgc3RhcnQuXG4gIHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24oKTtcblxuICBsb2dnZXIuaW5mbyhgU3RhcnRpbmcgJHtuYW1lfS4uLmApO1xuXG4gIC8vIE1hcmsgTm90UmVhZHkgc3luY2hyb25vdXNseSwgQkVGT1JFIHRoZSBwb3J0IG9wZW5zLCBzbyBubyByZXF1ZXN0IHNsaXBzXG4gIC8vIHRocm91Z2ggdGhlIHJlYWRpbmVzcyBndWFyZCBiZWZvcmUgdGhlIHN1cGVydmlzb3IgaGFzIHJ1bi4gVGhlIHN1cGVydmlzb3JcbiAgLy8gZmxpcHMgaXQgdHJ1ZSBvbmNlIGRlcGVuZGVuY2llcyBjb25uZWN0LlxuICBzZXRSZWFkeShmYWxzZSk7XG5cbiAgLy8gTGlzdGVuIEZJUlNULCB0aGVuIGVzdGFibGlzaCArIG1vbml0b3IgdGhlIGRhdGFzdG9yZSBpbiB0aGUgYmFja2dyb3VuZCxcbiAgLy8gcmVwb3J0aW5nIE5vdFJlYWR5IHVudGlsIGl0IGNvbm5lY3RzLiBUZXN0aW5nIHRoZSBEQiBiZWZvcmUgbGlzdGVuIGFuZFxuICAvLyBleGl0aW5nIG9uIGZhaWx1cmUgY3Jhc2gtbG9vcHMgdGhlIHdob2xlIGZsZWV0IGR1cmluZyBhIGNvbGQtREIgc3RhbXBlZGU6XG4gIC8vIHRoZSBwcm9jZXNzIG5ldmVyIG9wZW5zIGl0cyBwb3J0LCBzbyAvaGVhbHRoIChsaXZlbmVzcyksIC9yZWFkeSBhbmQgdGhlXG4gIC8vIHJlYWRpbmVzcyBndWFyZCBjYW4ndCBhbnN3ZXIgYW5kIHRoZSBvcmNoZXN0cmF0b3Igb25seSBzZWVzIGEgZGVhZCBwb2QuXG4gIC8vIE9wZW5pbmcgdGhlIHBvcnQgZmlyc3QgbWFrZXMgXCJkZXBlbmRlbmN5IGRvd25cIiBhbiBvYnNlcnZhYmxlIHN0YXRlLlxuICBjb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICBsb2dnZXIuaW5mbyhgJHtuYW1lfSBsaXN0ZW5pbmcgb24gcG9ydDogJHtwb3J0fWApO1xuICAgIGxvZ2dlci5pbmZvKGBQbGF0Zm9ybSBVUkw6ICR7c2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsfWApO1xuICAgIG9uU3RhcnQ/Lihwb3J0KTtcbiAgfSk7XG5cbiAgLy8gU2h1dGRvd24gaGFuZGxlciAoZ3VhcmRlZCBhZ2FpbnN0IGNvbmN1cnJlbnQgc2lnbmFscylcbiAgbGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuXG4gIC8vIEJhY2tncm91bmQgZGVwZW5kZW5jeSBzdXBlcnZpc29yIOKAlCBlc3RhYmxpc2hlZCArIG1vbml0b3JlZCBhZnRlciBsaXN0ZW4sXG4gIC8vIHN0b3BwZWQgb24gc2h1dGRvd24gc28gaXQgbmV2ZXIga2VlcHMgYSBjbG9zaW5nIHByb2Nlc3MgYWxpdmUuIEd1YXJkIHRoZVxuICAvLyBmbG9hdGluZyBwcm9taXNlOiBldmVyeSBleHBlY3RlZCBmYWlsdXJlIGlzIGhhbmRsZWQgaW5zaWRlLCBzbyBhIHJlamVjdGlvblxuICAvLyBoZXJlIG1lYW5zIGEgcHJvZ3JhbW1pbmcgZXJyb3Ig4oCUIGxvZyBpdCBhbmQgbGVhdmUgdGhlIHNlcnZpY2UgTm90UmVhZHlcbiAgLy8gcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBiZWNvbWUgYW4gdW5oYW5kbGVkUmVqZWN0aW9uIHRoYXQgY3Jhc2gtZXhpdHMgdGhlXG4gIC8vIHByb2Nlc3MgKHdoaWNoIHdvdWxkIGRlZmVhdCB0aGUgd2hvbGUgXCJuZXZlciBleGl0IG9uIGRlcGVuZGVuY3kgdHJvdWJsZVwiXG4gIC8vIGdvYWwpLlxuICBzdXBlcnZpc2VEZXBlbmRlbmNpZXMobmFtZSwgb25CZWZvcmVTdGFydCwgdGVzdERhdGFiYXNlLCAoKSA9PiBzaHV0dGluZ0Rvd24pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGxvZ2dlci5lcnJvcignRGVwZW5kZW5jeSBzdXBlcnZpc29yIGNyYXNoZWQ7IHNlcnZpY2Ugd2lsbCByZW1haW4gTm90UmVhZHknLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0pO1xuICB9KTtcblxuICBjb25zdCBzaHV0ZG93biA9IGFzeW5jIChzaWduYWw/OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcblxuICAgIC8vIERyYWluIEZJUlNUOiByZXBvcnQgTm90UmVhZHkgYmVmb3JlIGFueXRoaW5nIGVsc2UsIHNvIHRoZSBsb2FkIGJhbGFuY2VyIC9cbiAgICAvLyByZWFkaW5lc3MgcHJvYmUgc3RvcHMgc2VuZGluZyBuZXcgd29yayB3aGlsZSB0aGUgcmVzdCBvZiBzaHV0ZG93biBydW5zLlxuICAgIC8vIGBvblNodXRkb3duYCBjYW4gdGFrZSBzZWNvbmRzOyByZWFkaW5lc3MgbGVmdCBncmVlbiBhY3Jvc3MgaXQga2VlcHMgbmV3XG4gICAgLy8gcmVxdWVzdHMgYXJyaXZpbmcgYXQgYSBwcm9jZXNzIHRoYXQgaXMgYWxyZWFkeSB0ZWFyaW5nIGl0c2VsZiBkb3duLlxuICAgIHNldFJlYWR5KGZhbHNlKTtcblxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAke3NpZ25hbH0gcmVjZWl2ZWQsIHNodXR0aW5nIGRvd24gZ3JhY2VmdWxseS4uLmApO1xuICAgIH1cblxuICAgIC8vIEFybSB0aGUgZm9yY2UtZXhpdCBCRUZPUkUgYXdhaXRpbmcgYW55dGhpbmc6IGEgaHVuZyBvblNodXRkb3duIChhIHN0dWNrXG4gICAgLy8gcXVldWUgY2xvc2UsIGEgUmVkaXMgcXVpdCB0aGF0IG5ldmVyIGFuc3dlcnMpIHdvdWxkIG90aGVyd2lzZSBibG9jayBmb3JldmVyXG4gICAgLy8gd2l0aCB0aGUgdGltZXIgbmV2ZXIgc3RhcnRlZCwgc28gdGhlIHBvZCB3b3VsZCBpZ25vcmUgU0lHVEVSTSB1bnRpbCBTSUdLSUxMLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGb3JjZWQgc2h1dGRvd24gYWZ0ZXIgdGltZW91dCcpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0sIHNodXRkb3duVGltZW91dE1zKS51bnJlZigpO1xuXG4gICAgLy8gQ3VzdG9tIHNodXRkb3duIGNhbGxiYWNrXG4gICAgaWYgKG9uU2h1dGRvd24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9uU2h1dGRvd24oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gb25TaHV0ZG93biBjYWxsYmFjaycsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgU1NFIGNvbm5lY3Rpb25zXG4gICAgaWYgKHNzZU1hbmFnZXIpIHtcbiAgICAgIHNzZU1hbmFnZXIuc2h1dGRvd24oKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdTU0UgY29ubmVjdGlvbnMgY2xvc2VkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgSFRUUCBzZXJ2ZXJcbiAgICBzZXJ2ZXIuY2xvc2UoYXN5bmMgKCkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oJ0hUVFAgc2VydmVyIGNsb3NlZCcpO1xuXG4gICAgICAvLyBTaHV0ZG93biBPcGVuVGVsZW1ldHJ5IHRyYWNpbmdcbiAgICAgIGF3YWl0IHNodXRkb3duVHJhY2luZygpLmNhdGNoKGVyciA9PiBsb2dnZXIuZXJyb3IoJ0Vycm9yIHNodXR0aW5nIGRvd24gdHJhY2luZycsIHsgZXJyb3I6IGVyciB9KSk7XG5cbiAgICAgIC8vIENsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICAgIGlmIChjbG9zZURhdGFiYXNlICE9PSBmYWxzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChjbG9zZURhdGFiYXNlKSB7XG4gICAgICAgICAgICBhd2FpdCBjbG9zZURhdGFiYXNlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IGNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBjbG9zZWQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNsb3NpbmcgZGF0YWJhc2UnLCB7IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBSZWdpc3RlciBzaWduYWwgaGFuZGxlcnNcbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCAoKSA9PiB2b2lkIHNodXRkb3duKCdTSUdJTlQnKSk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsICgpID0+IHZvaWQgc2h1dGRvd24oJ1NJR1RFUk0nKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXJ2ZXIsXG4gICAgcG9ydCxcbiAgICBzaHV0ZG93bjogKCkgPT4gc2h1dGRvd24oKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgc2VydmVyIHN0YXJ0IHdyYXBwZXIgd2l0aCBlcnJvciBoYW5kbGluZ1xuICpcbiAqIEBwYXJhbSBhcHAgLSBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgaGFuZGxlcik7XG4gKlxuICogdm9pZCBydW5TZXJ2ZXIoYXBwLCB7IG5hbWU6ICdNeSBTZXJ2aWNlJywgc3NlTWFuYWdlciB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuU2VydmVyKGFwcDogRXhwcmVzcywgb3B0aW9uczogU3RhcnRTZXJ2ZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgLy8gUm91dGUgdGFibGUgb2YgdGhlIGZ1bGx5IGFzc2VtYmxlZCBhcHAgKHNlZSBhcGktY29yZSdzIHJvdXRlLXRhYmxlLnRzKTogdGhlXG4gIC8vIHNhbWUgaW50cm9zcGVjdGlvbiB0aGUgcGVyLXNlcnZpY2UgY292ZXJhZ2UgdGVzdCBhc3NlcnRzIG9uLCBsb2dnZWQgb25jZSBhdFxuICAvLyBib290IHNvIGFuIHVuZ2F0ZWQgb3IgdW5hdWRpdGVkIHdyaXRlIHJvdXRlIGlzIHZpc2libGUgaW4gdGhlIHJ1bm5pbmdcbiAgLy8gc2VydmljZSwgbm90IG9ubHkgaW4gQ0kuXG4gIGxvZ2dlci5pbmZvKCdSb3V0ZSB0YWJsZSBidWlsdCcsIHN1bW1hcml6ZVJvdXRlVGFibGUoYnVpbGRSb3V0ZVRhYmxlKGFwcCkpKTtcblxuICAvLyBMYXN0LXJlc29ydCBmYXVsdCBoYW5kbGVycyBmb3IgdGhlIHByb2R1Y3Rpb24gZW50cnlwb2ludDogYW4gdW5oYW5kbGVkXG4gIC8vIHJlamVjdGlvbiAvIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpcyBsb2dnZWQgKG5vdCBzaWxlbnRseSBmYXRhbCkgdGhlbiB0aGVcbiAgLy8gcHJvY2VzcyBleGl0cyBmb3IgdGhlIG9yY2hlc3RyYXRvciB0byByZXN0YXJ0LiBOby1vcCB1bmRlciBOT0RFX0VOVj10ZXN0LlxuICBpbnN0YWxsQ3Jhc2hIYW5kbGVycyhsb2dnZXIpO1xuICBzdGFydFNlcnZlcihhcHAsIG9wdGlvbnMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIC8vIHN0YXJ0U2VydmVyIG5vdyBsaXN0ZW5zLWZpcnN0IGFuZCBzdXBlcnZpc2VzIHRoZSBEQiBpbiB0aGUgYmFja2dyb3VuZCwgc29cbiAgICAvLyBpdCBvbmx5IHJlamVjdHMgb24gYSBnZW51aW5lbHkgZmF0YWwgU0VUVVAgZXJyb3IgKGludmFsaWQgYXV0aCBjb25maWcsIGFcbiAgICAvLyBmYWlsZWQgb25TdGFydCwgdGhlIHBvcnQgYWxyZWFkeSBpbiB1c2UpLiBMb2cgbWVzc2FnZSArIHN0YWNrIGV4cGxpY2l0bHk6XG4gICAgLy8gYW4gRXJyb3IgaW4gd2luc3RvbiBtZXRhZGF0YSBzZXJpYWxpemVzIHRvIGB7fWAgKG1lc3NhZ2Uvc3RhY2sgYXJlXG4gICAgLy8gbm9uLWVudW1lcmFibGUpLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgaGlkZSB0aGUgY2F1c2UgYmVoaW5kIGB7ZXJyb3I6e319YC5cbiAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBzZXJ2ZXInLCB7XG4gICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbn1cbiJdfQ==
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5TixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUd0Qyw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSx5Q0FBeUM7QUFDekMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFDakMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFDakMsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsK0JBQStCLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFOUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsSUFBWSxFQUNaLGFBQWdELEVBQ2hELFlBQTBELEVBQzFELE9BQXNCO0lBRXRCLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsTUFBTSxZQUFZLENBQUMsYUFBYSxFQUFFO1lBQ2hDLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsS0FBSyxFQUFFLGtCQUFrQjtZQUN6QixlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUM5QyxHQUFHLElBQUkseUNBQXlDLE9BQU8sSUFBSSxFQUMzRCxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDL0I7WUFDRCxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUU7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLE9BQU8sRUFBRTtZQUFFLE9BQU8sQ0FBQyw0Q0FBNEM7UUFDbkUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksa0NBQWtDLENBQUMsQ0FBQztRQUN2RCxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFlBQVksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDdkUsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLENBQUM7SUFDcEMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDbEIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsRUFBRSxHQUFHLE1BQU0sS0FBSyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDYixDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLG1DQUFtQztRQUNuQyxJQUFJLE9BQU8sRUFBRTtZQUFFLE1BQU07UUFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNmLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztZQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7YUFBTSxJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDNUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLHFEQUFxRCxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSw4Q0FBOEM7UUFDOUMsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ2QsTUFBTSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN6QyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZCLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBc0NEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLEdBQVksRUFDWixPQUFPLEdBQXVCLEVBQUU7SUFFaEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQ0osSUFBSSxHQUFHLGNBQWMsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUFHLEtBQUssRUFDekIsT0FBTyxFQUNQLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLGFBQWEsR0FDZCxHQUFHLE9BQU8sQ0FBQztJQUNaLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQztJQUUvQywyRUFBMkU7SUFDM0UsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLDBFQUEwRTtJQUMxRSxxRUFBcUU7SUFDckUsK0VBQStFO0lBQy9FLDRFQUE0RTtJQUM1RSwwRUFBMEU7SUFDMUUsMEVBQTBFO0lBQzFFLGlEQUFpRDtJQUNqRCxLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsMEJBQTBCLEVBQUUseUJBQXlCLENBQVUsRUFBRSxDQUFDO1FBQ3RGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sMEhBQTBILENBQUMsQ0FBQztRQUN2SixDQUFDO0lBQ0gsQ0FBQztJQUNELDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsa0VBQWtFO0lBQ2xFLHNCQUFzQixFQUFFLENBQUM7SUFFekIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLENBQUM7SUFFbkMsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSwyQ0FBMkM7SUFDM0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWhCLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSwwRUFBMEU7SUFDMUUsc0VBQXNFO0lBQ3RFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILHdEQUF3RDtJQUN4RCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFekIsMkVBQTJFO0lBQzNFLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsU0FBUztJQUNULHFCQUFxQixDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkRBQTZELEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5RyxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLEtBQUssRUFBRSxNQUFlLEVBQUUsRUFBRTtRQUN6QyxJQUFJLFlBQVk7WUFBRSxPQUFPO1FBQ3pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFcEIsNEVBQTRFO1FBQzVFLDBFQUEwRTtRQUMxRSwwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoQixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sd0NBQXdDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLDhFQUE4RTtRQUM5RSwrRUFBK0U7UUFDL0UsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTlCLDJCQUEyQjtRQUMzQixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDO2dCQUNILE1BQU0sVUFBVSxFQUFFLENBQUM7WUFDckIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUVsQywyRUFBMkU7WUFDM0UsOEVBQThFO1lBQzlFLE1BQU0sb0JBQW9CLEVBQUUsQ0FBQztZQUU3QixpQ0FBaUM7WUFDakMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVsRyw0QkFBNEI7WUFDNUIsSUFBSSxhQUFhLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQztvQkFDSCxJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixNQUFNLGFBQWEsRUFBRSxDQUFDO29CQUN4QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxlQUFlLEVBQUUsQ0FBQztvQkFDMUIsQ0FBQztvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7Z0JBQzVDLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsMkJBQTJCO0lBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUV4RCxPQUFPO1FBQ0wsTUFBTTtRQUNOLElBQUk7UUFDSixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQzNCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBWSxFQUFFLE9BQU8sR0FBdUIsRUFBRTtJQUN0RSw4RUFBOEU7SUFDOUUsOEVBQThFO0lBQzlFLHdFQUF3RTtJQUN4RSwyQkFBMkI7SUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVFLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDeEMsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLDZFQUE2RTtRQUM3RSxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO1lBQ3JDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQzFCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3hELENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFNlcnZlciB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgYnVpbGRSb3V0ZVRhYmxlLCBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgZmx1c2hRdW90YUluY3JlbWVudHMsIGluc3RhbGxDcmFzaEhhbmRsZXJzLCBuZXh0QmFja29mZk1zLCByZXNvbHZlUmVkaXNDb25uZWN0aW9uLCByZXRyeUZvcmV2ZXIsIHN1bW1hcml6ZVJvdXRlVGFibGUsIHNsZWVwLCBlbnZJbnQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB7IGdldENvbm5lY3Rpb24sIGNsb3NlQ29ubmVjdGlvbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHR5cGUgeyBFeHByZXNzIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBzZXRSZWFkeSwgaXNSZWFkeSB9IGZyb20gJy4vcmVhZGluZXNzLmpzJztcbmltcG9ydCB7IHNodXRkb3duVHJhY2luZyB9IGZyb20gJy4vdHJhY2luZy5qcyc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyIH0gZnJvbSAnLi4vaHR0cC9zc2UtY29ubmVjdGlvbi1tYW5hZ2VyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzZXJ2ZXInKTtcblxuXG4vLyBEZXBlbmRlbmN5LXN1cGVydmlzb3IgY2FkZW5jZS4gSW5pdGlhbCBjb25uZWN0IHJldHJpZXMgd2l0aCBjYXBwZWQgYmFja29mZjtcbi8vIG9uY2UgY29ubmVjdGVkLCByZS1jaGVja3MgYXQgYSBzdGVhZHkgaW50ZXJ2YWwgc28gYSBsYXRlciBvdXRhZ2UgZmxpcHMgdGhlXG4vLyBzZXJ2aWNlIE5vdFJlYWR5IChkcmFpbmluZyB0cmFmZmljKSBhbmQgYSByZWNvdmVyeSBmbGlwcyBpdCBiYWNrIOKAlCB3aXRob3V0XG4vLyBldmVyIGV4aXRpbmcgLyByZXN0YXJ0aW5nIHRoZSBwcm9jZXNzLlxuY29uc3QgUkVBRFlfUkVUUllfQkFTRV9NUyA9IDEwMDA7XG5jb25zdCBSRUFEWV9SRVRSWV9NQVhfTVMgPSAxMDAwMDtcbmNvbnN0IFJFQURZX01PTklUT1JfSU5URVJWQUxfTVMgPSBlbnZJbnQoJ1JFQURJTkVTU19NT05JVE9SX0lOVEVSVkFMX01TJywgMTVfMDAwLCB7IG1pbjogMSB9KTtcblxuLyoqXG4gKiBFc3RhYmxpc2ggYW5kIGNvbnRpbnVvdXNseSBtb25pdG9yIHRoZSBzZXJ2aWNlJ3MgZGF0YXN0b3JlIGRlcGVuZGVuY3ksXG4gKiBmbGlwcGluZyByZWFkaW5lc3Mgc3RhdGUgaW5zdGVhZCBvZiBjcmFzaC1sb29waW5nLlxuICpcbiAqIC0gRXN0YWJsaXNoIHBoYXNlOiByZXRyeSBgb25CZWZvcmVTdGFydGAgKGUuZy4gY29ubmVjdE1vbmdvKSB3aXRoIGNhcHBlZFxuICogICBiYWNrb2ZmIHVudGlsIGl0IHN1Y2NlZWRzIOKAlCBhIGNvbGQgZGF0YXN0b3JlIG11c3QgbmV2ZXIgZXhpdCB0aGUgcHJvY2Vzcy5cbiAqIC0gTW9uaXRvciBwaGFzZTogcG9sbCBgdGVzdERhdGFiYXNlYCBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3M7IGZsaXBcbiAqICAgcmVhZHkvTm90UmVhZHkgb24gdHJhbnNpdGlvbnMuIFdoaWxlIE5vdFJlYWR5IHRoZSByZWFkaW5lc3MgZ3VhcmQgNTAzc1xuICogICBidXNpbmVzcyB0cmFmZmljIGFuZCBvcmNoZXN0cmF0b3IgcmVhZGluZXNzIHByb2JlcyBkcmFpbiB0aGUgaW5zdGFuY2UuXG4gKlxuICogUnVucyBpbiB0aGUgYmFja2dyb3VuZCAodGhlIEhUVFAgc2VydmVyIGlzIGFscmVhZHkgbGlzdGVuaW5nKS4gU3RvcHMgd2hlblxuICogYGFib3J0ZWQoKWAgcmV0dXJucyB0cnVlIChncmFjZWZ1bCBzaHV0ZG93biksIHNvIGl0IG5ldmVyIGtlZXBzIGEgY2xvc2luZ1xuICogcHJvY2VzcyBhbGl2ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3VwZXJ2aXNlRGVwZW5kZW5jaWVzKFxuICBuYW1lOiBzdHJpbmcsXG4gIG9uQmVmb3JlU3RhcnQ6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZCxcbiAgdGVzdERhdGFiYXNlOiAoKCkgPT4gUHJvbWlzZTxib29sZWFuPikgfCBmYWxzZSB8IHVuZGVmaW5lZCxcbiAgYWJvcnRlZDogKCkgPT4gYm9vbGVhbixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAob25CZWZvcmVTdGFydCkge1xuICAgIGF3YWl0IHJldHJ5Rm9yZXZlcihvbkJlZm9yZVN0YXJ0LCB7XG4gICAgICBiYXNlTXM6IFJFQURZX1JFVFJZX0JBU0VfTVMsXG4gICAgICBtYXhNczogUkVBRFlfUkVUUllfTUFYX01TLFxuICAgICAgb25BdHRlbXB0RmFpbGVkOiAoZXJyb3IsIGRlbGF5TXMpID0+IGxvZ2dlci53YXJuKFxuICAgICAgICBgJHtuYW1lfTogZGVwZW5kZW5jeSBpbml0IGZhaWxlZCwgcmV0cnlpbmcgaW4gJHtkZWxheU1zfW1zYCxcbiAgICAgICAgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSB9LFxuICAgICAgKSxcbiAgICAgIHNob3VsZENvbnRpbnVlOiAoKSA9PiAhYWJvcnRlZCgpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gTm8gZGF0YXN0b3JlIHRvIGdhdGUgb24g4oaSIHJlYWR5IGFzIHNvb24gYXMgd2UgYXJlIGxpc3RlbmluZy5cbiAgaWYgKHRlc3REYXRhYmFzZSA9PT0gZmFsc2UpIHtcbiAgICBpZiAoYWJvcnRlZCgpKSByZXR1cm47IC8vIHNodXRkb3duIGJlZ2FuIHdoaWxlIHdlIHdlcmUgaW5pdGlhbGl6aW5nXG4gICAgc2V0UmVhZHkodHJ1ZSk7XG4gICAgbG9nZ2VyLmluZm8oYCR7bmFtZX0gcmVhZHkgKG5vIGRhdGFzdG9yZSBkZXBlbmRlbmN5KWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHByb2JlID0gdGVzdERhdGFiYXNlID8/ICgoKSA9PiBnZXRDb25uZWN0aW9uKCkudGVzdENvbm5lY3Rpb24oKSk7XG4gIGxldCB3YWl0RGVsYXkgPSBSRUFEWV9SRVRSWV9CQVNFX01TO1xuICB3aGlsZSAoIWFib3J0ZWQoKSkge1xuICAgIGxldCBvayA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBvayA9IGF3YWl0IHByb2JlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBvayA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEEgcHJvYmUgdGhhdCB3YXMgaW4gZmxpZ2h0IHdoZW4gc2h1dGRvd24gYmVnYW4gbXVzdCBub3QgZmxpcCB0aGVcbiAgICAvLyBkcmFpbmluZyBpbnN0YW5jZSBiYWNrIHRvIHJlYWR5LlxuICAgIGlmIChhYm9ydGVkKCkpIGJyZWFrO1xuICAgIGlmIChvayAmJiAhaXNSZWFkeSgpKSB7XG4gICAgICBzZXRSZWFkeSh0cnVlKTtcbiAgICAgIHdhaXREZWxheSA9IFJFQURZX1JFVFJZX0JBU0VfTVM7XG4gICAgICBsb2dnZXIuaW5mbyhgJHtuYW1lfSByZWFkeSDigJQgZGVwZW5kZW5jaWVzIGNvbm5lY3RlZGApO1xuICAgIH0gZWxzZSBpZiAoIW9rICYmIGlzUmVhZHkoKSkge1xuICAgICAgc2V0UmVhZHkoZmFsc2UpO1xuICAgICAgbG9nZ2VyLndhcm4oYCR7bmFtZX0gZGVncmFkZWQg4oCUIGRlcGVuZGVuY3kgY2hlY2sgZmFpbGluZyAobm93IE5vdFJlYWR5KWApO1xuICAgIH1cblxuICAgIC8vIFN0ZWFkeSBjYWRlbmNlIG9uY2UgcmVhZHk7IGZhc3RlciBiYWNrb2ZmIHdoaWxlIHdhaXRpbmcgc28gd2UgZmxpcCB0b1xuICAgIC8vIHJlYWR5IHByb21wdGx5IHdoZW4gdGhlIGRhdGFzdG9yZSBjb21lcyB1cC5cbiAgICBpZiAoaXNSZWFkeSgpKSB7XG4gICAgICBhd2FpdCBzbGVlcChSRUFEWV9NT05JVE9SX0lOVEVSVkFMX01TKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2xlZXAod2FpdERlbGF5KTtcbiAgICAgIHdhaXREZWxheSA9IG5leHRCYWNrb2ZmTXMod2FpdERlbGF5LCBSRUFEWV9SRVRSWV9NQVhfTVMpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgc2VydmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFNlcnZpY2UgbmFtZSBmb3IgbG9nZ2luZyAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogUG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQ6IGZyb20gY29uZmlnKSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogU1NFIG1hbmFnZXIgZm9yIGdyYWNlZnVsIHNodXRkb3duICovXG4gIHNzZU1hbmFnZXI/OiBTU0VNYW5hZ2VyO1xuICAvKiogU2h1dGRvd24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDE1MDAwKSAqL1xuICBzaHV0ZG93blRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIENhbGxiYWNrIGFmdGVyIHNlcnZlciBzdGFydHMgKi9cbiAgb25TdGFydD86IChwb3J0OiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayBiZWZvcmUgc2h1dGRvd24gKi9cbiAgb25TaHV0ZG93bj86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBSdW5zIGJlZm9yZSBkYXRhYmFzZSBjaGVjayAoZS5nLiwgaW5pdGlhbGl6ZSBleHRlcm5hbCBjb25uZWN0aW9ucykgKi9cbiAgb25CZWZvcmVTdGFydD86ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBDdXN0b20gZGF0YWJhc2UgaGVhbHRoIGNoZWNrLCBvciBmYWxzZSB0byBza2lwLiBEZWZhdWx0OiBQb3N0Z3JlU1FMIHRlc3RDb25uZWN0aW9uICovXG4gIHRlc3REYXRhYmFzZT86ICgoKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB8IGZhbHNlO1xuICAvKiogQ3VzdG9tIGRhdGFiYXNlIGNsb3NlLCBvciBmYWxzZSB0byBza2lwLiBEZWZhdWx0OiBQb3N0Z3JlU1FMIGNsb3NlQ29ubmVjdGlvbiAqL1xuICBjbG9zZURhdGFiYXNlPzogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgZmFsc2U7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHN0YXJ0aW5nIGEgc2VydmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRTZXJ2ZXJSZXN1bHQge1xuICAvKiogSFRUUCBzZXJ2ZXIgaW5zdGFuY2UgKi9cbiAgc2VydmVyOiBTZXJ2ZXI7XG4gIC8qKiBQb3J0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uICovXG4gIHBvcnQ6IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIHRvIG1hbnVhbGx5IHRyaWdnZXIgc2h1dGRvd24gKi9cbiAgc2h1dGRvd246ICgpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogU3RhcnQgYW4gRXhwcmVzcyBzZXJ2ZXIgd2l0aCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGluZ1xuICpcbiAqIEZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZGF0YWJhc2UgY29ubmVjdGlvbiB0ZXN0aW5nXG4gKiAtIEdyYWNlZnVsIHNodXRkb3duIG9uIFNJR0lOVC9TSUdURVJNXG4gKiAtIFNTRSBjb25uZWN0aW9uIGNsZWFudXBcbiAqIC0gQ29uZmlndXJhYmxlIHNodXRkb3duIHRpbWVvdXRcbiAqXG4gKiBAcGFyYW0gYXBwIC0gRXhwcmVzcyBhcHBsaWNhdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXJ2ZXIgb3B0aW9uc1xuICogQHJldHVybnMgU2VydmVyIGluc3RhbmNlIGFuZCBjb250cm9sIGZ1bmN0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB7IGFwcCwgc3NlTWFuYWdlciB9ID0gY3JlYXRlQXBwKCk7XG4gKlxuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCByZXF1aXJlQXV0aCwgaGFuZGxlcik7XG4gKlxuICogYXdhaXQgc3RhcnRTZXJ2ZXIoYXBwLCB7XG4gKiAgIG5hbWU6ICdNeSBNaWNyb3NlcnZpY2UnLFxuICogICBzc2VNYW5hZ2VyLFxuICogICBvblN0YXJ0OiAocG9ydCkgPT4gY29uc29sZS5sb2coYExpc3RlbmluZyBvbiAke3BvcnR9YCksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXIoXG4gIGFwcDogRXhwcmVzcyxcbiAgb3B0aW9uczogU3RhcnRTZXJ2ZXJPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFN0YXJ0U2VydmVyUmVzdWx0PiB7XG4gIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICBjb25zdCB7XG4gICAgbmFtZSA9ICdNaWNyb3NlcnZpY2UnLFxuICAgIHNzZU1hbmFnZXIsXG4gICAgc2h1dGRvd25UaW1lb3V0TXMgPSAxNTAwMCxcbiAgICBvblN0YXJ0LFxuICAgIG9uU2h1dGRvd24sXG4gICAgb25CZWZvcmVTdGFydCxcbiAgICB0ZXN0RGF0YWJhc2UsXG4gICAgY2xvc2VEYXRhYmFzZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgPz8gc2VydmVyQ29uZmlnLnBvcnQ7XG5cbiAgLy8gVmFsaWRhdGUgYXV0aCBjb25maWd1cmF0aW9uIGF0IHNlcnZlciBzdGFydHVwIChub3QgZHVyaW5nIENESyBzeW50aGVzaXMpXG4gIENvbmZpZy52YWxpZGF0ZUF1dGgoKTtcbiAgLy8gRmFpbCBmYXN0IGlmIHRoaXMgc2VydmljZSBoYXMgbm8gaW50ZXJuYWwgc2lnbmluZyBrZXkgb2YgaXRzIG93biwgb3Igbm9cbiAgLy8gcHVibGljIGJ1bmRsZSB0byB2ZXJpZnkgaXRzIHBlZXJzIHdpdGguIFdpdGhvdXQgdGhlbSBpdCB3b3VsZCBtaW50XG4gIC8vIHRva2VucyBvbiBhbiBFUEhFTUVSQUwgaW4tcHJvY2VzcyBrZXkgdGhhdCBubyBwZWVyIGFjY2VwdHMsIGFuZCByZWplY3QgZXZlcnlcbiAgLy8gcGVlcidzIHRva2VuIOKAlCBpLmUuIHNpbGVudGx5IGxvc2UgYWxsIHNlcnZpY2UtdG8tc2VydmljZSB0cmFmZmljLiBDaGVja2VkXG4gIC8vIEhFUkUgcmF0aGVyIHRoYW4gaW4gYGNyZWF0ZUFwcGAgYmVjYXVzZSBpdCBpcyBhIHByb3BlcnR5IG9mIHRoZSBydW5uaW5nXG4gIC8vIGRlcGxveW1lbnQsIG5vdCBvZiB0aGUgYXBwIG9iamVjdDogcm91dGUtdGFibGUgYnVpbGRlcnMgYW5kIHRlc3Qgc3VpdGVzXG4gIC8vIGFzc2VtYmxlIGFuIGFwcCB3aXRob3V0IGV2ZXIgc2lnbmluZyBhbnl0aGluZy5cbiAgZm9yIChjb25zdCBlbnZWYXIgb2YgWydTRVJWSUNFX1NJR05JTkdfS0VZX0ZJTEUnLCAnU0VSVklDRV9LRVlfQlVORExFX0ZJTEUnXSBhcyBjb25zdCkge1xuICAgIGlmICghcHJvY2Vzcy5lbnZbZW52VmFyXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudlZhcn0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQgKGdlbmVyYXRlIHdpdGggZGVwbG95L2Jpbi9zZXJ2aWNlLXNpZ25pbmcta2V5cy5zaCkuIFNldCBpdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlcnZlci5gKTtcbiAgICB9XG4gIH1cbiAgLy8gRmFpbCBmYXN0IG9uIGFuIHVudXNhYmxlIFJlZGlzIGNvbmZpZ3VyYXRpb24gKHRocm93cyBSZWRpc0NvbmZpZ0Vycm9yKSDigJQgYVxuICAvLyBSZWRpcyBjbGllbnQgaXMgY3JlYXRlZCBsYXppbHkgb24gZmlyc3QgdXNlLCBzbyB3aXRob3V0IHRoaXMgYSBiYWQgY29uZmlnXG4gIC8vIHdvdWxkIHN1cmZhY2UgYXMgcmVxdWVzdC10aW1lIGVycm9ycyBpbnN0ZWFkIG9mIGEgZmFpbGVkIHN0YXJ0LlxuICByZXNvbHZlUmVkaXNDb25uZWN0aW9uKCk7XG5cbiAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICR7bmFtZX0uLi5gKTtcblxuICAvLyBNYXJrIE5vdFJlYWR5IHN5bmNocm9ub3VzbHksIEJFRk9SRSB0aGUgcG9ydCBvcGVucywgc28gbm8gcmVxdWVzdCBzbGlwc1xuICAvLyB0aHJvdWdoIHRoZSByZWFkaW5lc3MgZ3VhcmQgYmVmb3JlIHRoZSBzdXBlcnZpc29yIGhhcyBydW4uIFRoZSBzdXBlcnZpc29yXG4gIC8vIGZsaXBzIGl0IHRydWUgb25jZSBkZXBlbmRlbmNpZXMgY29ubmVjdC5cbiAgc2V0UmVhZHkoZmFsc2UpO1xuXG4gIC8vIExpc3RlbiBGSVJTVCwgdGhlbiBlc3RhYmxpc2ggKyBtb25pdG9yIHRoZSBkYXRhc3RvcmUgaW4gdGhlIGJhY2tncm91bmQsXG4gIC8vIHJlcG9ydGluZyBOb3RSZWFkeSB1bnRpbCBpdCBjb25uZWN0cy4gVGVzdGluZyB0aGUgREIgYmVmb3JlIGxpc3RlbiBhbmRcbiAgLy8gZXhpdGluZyBvbiBmYWlsdXJlIGNyYXNoLWxvb3BzIHRoZSB3aG9sZSBmbGVldCBkdXJpbmcgYSBjb2xkLURCIHN0YW1wZWRlOlxuICAvLyB0aGUgcHJvY2VzcyBuZXZlciBvcGVucyBpdHMgcG9ydCwgc28gL2hlYWx0aCAobGl2ZW5lc3MpLCAvcmVhZHkgYW5kIHRoZVxuICAvLyByZWFkaW5lc3MgZ3VhcmQgY2FuJ3QgYW5zd2VyIGFuZCB0aGUgb3JjaGVzdHJhdG9yIG9ubHkgc2VlcyBhIGRlYWQgcG9kLlxuICAvLyBPcGVuaW5nIHRoZSBwb3J0IGZpcnN0IG1ha2VzIFwiZGVwZW5kZW5jeSBkb3duXCIgYW4gb2JzZXJ2YWJsZSBzdGF0ZS5cbiAgY29uc3Qgc2VydmVyID0gYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oYCR7bmFtZX0gbGlzdGVuaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICBsb2dnZXIuaW5mbyhgUGxhdGZvcm0gVVJMOiAke3NlcnZlckNvbmZpZy5wbGF0Zm9ybVVybH1gKTtcbiAgICBvblN0YXJ0Py4ocG9ydCk7XG4gIH0pO1xuXG4gIC8vIFNodXRkb3duIGhhbmRsZXIgKGd1YXJkZWQgYWdhaW5zdCBjb25jdXJyZW50IHNpZ25hbHMpXG4gIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcblxuICAvLyBCYWNrZ3JvdW5kIGRlcGVuZGVuY3kgc3VwZXJ2aXNvciDigJQgZXN0YWJsaXNoZWQgKyBtb25pdG9yZWQgYWZ0ZXIgbGlzdGVuLFxuICAvLyBzdG9wcGVkIG9uIHNodXRkb3duIHNvIGl0IG5ldmVyIGtlZXBzIGEgY2xvc2luZyBwcm9jZXNzIGFsaXZlLiBHdWFyZCB0aGVcbiAgLy8gZmxvYXRpbmcgcHJvbWlzZTogZXZlcnkgZXhwZWN0ZWQgZmFpbHVyZSBpcyBoYW5kbGVkIGluc2lkZSwgc28gYSByZWplY3Rpb25cbiAgLy8gaGVyZSBtZWFucyBhIHByb2dyYW1taW5nIGVycm9yIOKAlCBsb2cgaXQgYW5kIGxlYXZlIHRoZSBzZXJ2aWNlIE5vdFJlYWR5XG4gIC8vIHJhdGhlciB0aGFuIGxldHRpbmcgaXQgYmVjb21lIGFuIHVuaGFuZGxlZFJlamVjdGlvbiB0aGF0IGNyYXNoLWV4aXRzIHRoZVxuICAvLyBwcm9jZXNzICh3aGljaCB3b3VsZCBkZWZlYXQgdGhlIHdob2xlIFwibmV2ZXIgZXhpdCBvbiBkZXBlbmRlbmN5IHRyb3VibGVcIlxuICAvLyBnb2FsKS5cbiAgc3VwZXJ2aXNlRGVwZW5kZW5jaWVzKG5hbWUsIG9uQmVmb3JlU3RhcnQsIHRlc3REYXRhYmFzZSwgKCkgPT4gc2h1dHRpbmdEb3duKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBsb2dnZXIuZXJyb3IoJ0RlcGVuZGVuY3kgc3VwZXJ2aXNvciBjcmFzaGVkOyBzZXJ2aWNlIHdpbGwgcmVtYWluIE5vdFJlYWR5JywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoc2lnbmFsPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG5cbiAgICAvLyBEcmFpbiBGSVJTVDogcmVwb3J0IE5vdFJlYWR5IGJlZm9yZSBhbnl0aGluZyBlbHNlLCBzbyB0aGUgbG9hZCBiYWxhbmNlciAvXG4gICAgLy8gcmVhZGluZXNzIHByb2JlIHN0b3BzIHNlbmRpbmcgbmV3IHdvcmsgd2hpbGUgdGhlIHJlc3Qgb2Ygc2h1dGRvd24gcnVucy5cbiAgICAvLyBgb25TaHV0ZG93bmAgY2FuIHRha2Ugc2Vjb25kczsgcmVhZGluZXNzIGxlZnQgZ3JlZW4gYWNyb3NzIGl0IGtlZXBzIG5ld1xuICAgIC8vIHJlcXVlc3RzIGFycml2aW5nIGF0IGEgcHJvY2VzcyB0aGF0IGlzIGFscmVhZHkgdGVhcmluZyBpdHNlbGYgZG93bi5cbiAgICBzZXRSZWFkeShmYWxzZSk7XG5cbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgJHtzaWduYWx9IHJlY2VpdmVkLCBzaHV0dGluZyBkb3duIGdyYWNlZnVsbHkuLi5gKTtcbiAgICB9XG5cbiAgICAvLyBBcm0gdGhlIGZvcmNlLWV4aXQgQkVGT1JFIGF3YWl0aW5nIGFueXRoaW5nOiBhIGh1bmcgb25TaHV0ZG93biAoYSBzdHVja1xuICAgIC8vIHF1ZXVlIGNsb3NlLCBhIFJlZGlzIHF1aXQgdGhhdCBuZXZlciBhbnN3ZXJzKSB3b3VsZCBvdGhlcndpc2UgYmxvY2sgZm9yZXZlclxuICAgIC8vIHdpdGggdGhlIHRpbWVyIG5ldmVyIHN0YXJ0ZWQsIHNvIHRoZSBwb2Qgd291bGQgaWdub3JlIFNJR1RFUk0gdW50aWwgU0lHS0lMTC5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcignRm9yY2VkIHNodXRkb3duIGFmdGVyIHRpbWVvdXQnKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9LCBzaHV0ZG93blRpbWVvdXRNcykudW5yZWYoKTtcblxuICAgIC8vIEN1c3RvbSBzaHV0ZG93biBjYWxsYmFja1xuICAgIGlmIChvblNodXRkb3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBvblNodXRkb3duKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGluIG9uU2h1dGRvd24gY2FsbGJhY2snLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIFNTRSBjb25uZWN0aW9uc1xuICAgIGlmIChzc2VNYW5hZ2VyKSB7XG4gICAgICBzc2VNYW5hZ2VyLnNodXRkb3duKCk7XG4gICAgICBsb2dnZXIuaW5mbygnU1NFIGNvbm5lY3Rpb25zIGNsb3NlZCcpO1xuICAgIH1cblxuICAgIC8vIENsb3NlIEhUVFAgc2VydmVyXG4gICAgc2VydmVyLmNsb3NlKGFzeW5jICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKCdIVFRQIHNlcnZlciBjbG9zZWQnKTtcblxuICAgICAgLy8gRXZlcnkgaW4tZmxpZ2h0IHJlcXVlc3QgaGFzIG5vdyBmaW5pc2hlZCBhbmQgYnVmZmVyZWQgaXRzIG1ldGVyaW5nIHVuaXQ7XG4gICAgICAvLyBzZW5kIHRoZW0gYmVmb3JlIGV4aXRpbmcgKGFwaS1jb3JlIHF1b3RhLWluY3JlbWVudC1iYXRjaGVyKS4gTmV2ZXIgcmVqZWN0cy5cbiAgICAgIGF3YWl0IGZsdXNoUXVvdGFJbmNyZW1lbnRzKCk7XG5cbiAgICAgIC8vIFNodXRkb3duIE9wZW5UZWxlbWV0cnkgdHJhY2luZ1xuICAgICAgYXdhaXQgc2h1dGRvd25UcmFjaW5nKCkuY2F0Y2goZXJyID0+IGxvZ2dlci5lcnJvcignRXJyb3Igc2h1dHRpbmcgZG93biB0cmFjaW5nJywgeyBlcnJvcjogZXJyIH0pKTtcblxuICAgICAgLy8gQ2xvc2UgZGF0YWJhc2UgY29ubmVjdGlvblxuICAgICAgaWYgKGNsb3NlRGF0YWJhc2UgIT09IGZhbHNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGNsb3NlRGF0YWJhc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IGNsb3NlRGF0YWJhc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgY2xvc2VDb25uZWN0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5pbmZvKCdEYXRhYmFzZSBjb25uZWN0aW9uIGNsb3NlZCcpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xvc2luZyBkYXRhYmFzZScsIHsgZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIFJlZ2lzdGVyIHNpZ25hbCBoYW5kbGVyc1xuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsICgpID0+IHZvaWQgc2h1dGRvd24oJ1NJR0lOVCcpKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgKCkgPT4gdm9pZCBzaHV0ZG93bignU0lHVEVSTScpKTtcblxuICByZXR1cm4ge1xuICAgIHNlcnZlcixcbiAgICBwb3J0LFxuICAgIHNodXRkb3duOiAoKSA9PiBzaHV0ZG93bigpLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBzZXJ2ZXIgc3RhcnQgd3JhcHBlciB3aXRoIGVycm9yIGhhbmRsaW5nXG4gKlxuICogQHBhcmFtIGFwcCAtIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCBoYW5kbGVyKTtcbiAqXG4gKiB2b2lkIHJ1blNlcnZlcihhcHAsIHsgbmFtZTogJ015IFNlcnZpY2UnLCBzc2VNYW5hZ2VyIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5TZXJ2ZXIoYXBwOiBFeHByZXNzLCBvcHRpb25zOiBTdGFydFNlcnZlck9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAvLyBSb3V0ZSB0YWJsZSBvZiB0aGUgZnVsbHkgYXNzZW1ibGVkIGFwcCAoc2VlIGFwaS1jb3JlJ3Mgcm91dGUtdGFibGUudHMpOiB0aGVcbiAgLy8gc2FtZSBpbnRyb3NwZWN0aW9uIHRoZSBwZXItc2VydmljZSBjb3ZlcmFnZSB0ZXN0IGFzc2VydHMgb24sIGxvZ2dlZCBvbmNlIGF0XG4gIC8vIGJvb3Qgc28gYW4gdW5nYXRlZCBvciB1bmF1ZGl0ZWQgd3JpdGUgcm91dGUgaXMgdmlzaWJsZSBpbiB0aGUgcnVubmluZ1xuICAvLyBzZXJ2aWNlLCBub3Qgb25seSBpbiBDSS5cbiAgbG9nZ2VyLmluZm8oJ1JvdXRlIHRhYmxlIGJ1aWx0Jywgc3VtbWFyaXplUm91dGVUYWJsZShidWlsZFJvdXRlVGFibGUoYXBwKSkpO1xuXG4gIC8vIExhc3QtcmVzb3J0IGZhdWx0IGhhbmRsZXJzIGZvciB0aGUgcHJvZHVjdGlvbiBlbnRyeXBvaW50OiBhbiB1bmhhbmRsZWRcbiAgLy8gcmVqZWN0aW9uIC8gdW5jYXVnaHQgZXhjZXB0aW9uIGlzIGxvZ2dlZCAobm90IHNpbGVudGx5IGZhdGFsKSB0aGVuIHRoZVxuICAvLyBwcm9jZXNzIGV4aXRzIGZvciB0aGUgb3JjaGVzdHJhdG9yIHRvIHJlc3RhcnQuIE5vLW9wIHVuZGVyIE5PREVfRU5WPXRlc3QuXG4gIGluc3RhbGxDcmFzaEhhbmRsZXJzKGxvZ2dlcik7XG4gIHN0YXJ0U2VydmVyKGFwcCwgb3B0aW9ucykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgLy8gc3RhcnRTZXJ2ZXIgbm93IGxpc3RlbnMtZmlyc3QgYW5kIHN1cGVydmlzZXMgdGhlIERCIGluIHRoZSBiYWNrZ3JvdW5kLCBzb1xuICAgIC8vIGl0IG9ubHkgcmVqZWN0cyBvbiBhIGdlbnVpbmVseSBmYXRhbCBTRVRVUCBlcnJvciAoaW52YWxpZCBhdXRoIGNvbmZpZywgYVxuICAgIC8vIGZhaWxlZCBvblN0YXJ0LCB0aGUgcG9ydCBhbHJlYWR5IGluIHVzZSkuIExvZyBtZXNzYWdlICsgc3RhY2sgZXhwbGljaXRseTpcbiAgICAvLyBhbiBFcnJvciBpbiB3aW5zdG9uIG1ldGFkYXRhIHNlcmlhbGl6ZXMgdG8gYHt9YCAobWVzc2FnZS9zdGFjayBhcmVcbiAgICAvLyBub24tZW51bWVyYWJsZSksIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBoaWRlIHRoZSBjYXVzZSBiZWhpbmQgYHtlcnJvcjp7fX1gLlxuICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcicsIHtcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH0pO1xufVxuIl19
|
package/lib/testing/exports.json
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
"package": "@pipeline-builder/api-server",
|
|
3
3
|
"entries": {
|
|
4
4
|
".": {
|
|
5
|
+
"apiCallsQuota": "function",
|
|
5
6
|
"applyWritePin": "function",
|
|
6
7
|
"attachRequestContext": "function",
|
|
7
8
|
"checkQuota": "function",
|
|
9
|
+
"clearQuotaCheckCache": "function",
|
|
8
10
|
"combineHealthChecks": "function",
|
|
9
11
|
"connectMongo": "function",
|
|
10
12
|
"createApp": "function",
|
|
@@ -14,29 +16,40 @@
|
|
|
14
16
|
"createProtectedRoute": "function",
|
|
15
17
|
"createSharedRateLimitStore": "function",
|
|
16
18
|
"currentTraceId": "function",
|
|
19
|
+
"deferredCheckQuota": "function",
|
|
17
20
|
"getContext": "function",
|
|
18
21
|
"getIdempotencyStore": "function",
|
|
19
22
|
"getWritePinStore": "function",
|
|
23
|
+
"IDEMPOTENT_REPLAY_LOCAL": "value",
|
|
20
24
|
"incCounter": "function",
|
|
25
|
+
"isIdempotentReplay": "function",
|
|
21
26
|
"isReady": "function",
|
|
22
27
|
"meterQuotaOnSuccess": "function",
|
|
23
28
|
"mongoHealthCheck": "function",
|
|
24
29
|
"NO_WRITE_PIN": "value",
|
|
25
30
|
"observe": "function",
|
|
26
31
|
"postgresHealthCheck": "function",
|
|
32
|
+
"QUOTA_CHECK_CACHE_TTL_MS": "value",
|
|
33
|
+
"QUOTA_CHECK_DENIED_CACHE_MS": "value",
|
|
27
34
|
"rateLimitByOrg": "function",
|
|
28
35
|
"readinessGuard": "function",
|
|
29
36
|
"recordWriteForPin": "function",
|
|
30
37
|
"redisHealthCheck": "function",
|
|
31
38
|
"registerSecretRotationGauge": "function",
|
|
32
39
|
"registerSseTicketChannel": "function",
|
|
40
|
+
"requestPath": "function",
|
|
33
41
|
"requireOrgId": "function",
|
|
42
|
+
"reserveAiCallSlot": "function",
|
|
43
|
+
"reserveQuotaSlot": "function",
|
|
44
|
+
"resetGauge": "function",
|
|
34
45
|
"runServer": "function",
|
|
46
|
+
"runWithSlot": "function",
|
|
35
47
|
"setGauge": "function",
|
|
36
48
|
"setReady": "function",
|
|
37
49
|
"setWritePinStore": "function",
|
|
38
50
|
"SSEManager": "class",
|
|
39
51
|
"startServer": "function",
|
|
52
|
+
"withAiCallReservation": "function",
|
|
40
53
|
"withQuotaReservation": "function",
|
|
41
54
|
"withRoute": "function",
|
|
42
55
|
"withSpan": "function",
|
package/package.json
CHANGED
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"@opentelemetry/instrumentation": "0.300.0",
|
|
36
36
|
"@opentelemetry/resources": "3.0.0",
|
|
37
37
|
"@opentelemetry/sdk-node": "0.300.0",
|
|
38
|
-
"@pipeline-builder/api-core": "5.2.
|
|
39
|
-
"@pipeline-builder/pipeline-core": "4.4.
|
|
40
|
-
"@pipeline-builder/pipeline-data": "4.3.
|
|
38
|
+
"@pipeline-builder/api-core": "5.2.4",
|
|
39
|
+
"@pipeline-builder/pipeline-core": "4.4.4",
|
|
40
|
+
"@pipeline-builder/pipeline-data": "4.3.4",
|
|
41
41
|
"compression": "1.8.2",
|
|
42
42
|
"cors": "2.8.6",
|
|
43
43
|
"express": "5.3.0",
|
|
@@ -109,9 +109,10 @@
|
|
|
109
109
|
"homepage": "https://mwashburn160.github.io/pipeline-builder/",
|
|
110
110
|
"publishConfig": {
|
|
111
111
|
"access": "public",
|
|
112
|
-
"registry": "https://registry.npmjs.org/"
|
|
112
|
+
"registry": "https://registry.npmjs.org/",
|
|
113
|
+
"provenance": true
|
|
113
114
|
},
|
|
114
|
-
"version": "4.4.
|
|
115
|
+
"version": "4.4.4",
|
|
115
116
|
"bugs": {
|
|
116
117
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
117
118
|
},
|