@pipeline-builder/pipeline-data 4.1.5 → 4.1.7
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.
|
@@ -411,6 +411,27 @@ export interface IngestResult {
|
|
|
411
411
|
skipped: number;
|
|
412
412
|
unregisteredPipelineIds: string[];
|
|
413
413
|
}
|
|
414
|
+
/**
|
|
415
|
+
* One org's ingestion-health row as READ back by the Reports UI (Phase 3). The
|
|
416
|
+
* AWS events Lambda writes it; this is the shape that lets the UI tell
|
|
417
|
+
* "ingestion is healthy, there were simply no deploys in the range" apart from
|
|
418
|
+
* "we haven't heard from the ingest pipeline since X".
|
|
419
|
+
*
|
|
420
|
+
* `null` from {@link ReportingService.getIngestHealth} means the deployment has
|
|
421
|
+
* NEVER reported — not "stale". The two must not be conflated: a fresh install
|
|
422
|
+
* (or one whose forwarder was never wired up) has no heartbeat at all, and
|
|
423
|
+
* calling that "stale" would invent a regression that never happened.
|
|
424
|
+
*/
|
|
425
|
+
export interface IngestHealthStatus {
|
|
426
|
+
/** When the forwarder last posted a heartbeat (its own clock, ISO 8601). */
|
|
427
|
+
updatedAt: string;
|
|
428
|
+
/** Timestamp of the newest event it had forwarded, or null if it has seen none. */
|
|
429
|
+
lastEventAt: string | null;
|
|
430
|
+
/** Cumulative events forwarded, or null when the forwarder doesn't report it. */
|
|
431
|
+
forwarded: number | null;
|
|
432
|
+
/** Cumulative events DROPPED (non-zero ⇒ data loss upstream of the reports). */
|
|
433
|
+
dropped: number | null;
|
|
434
|
+
}
|
|
414
435
|
/**
|
|
415
436
|
* Read-only reporting service for pipeline execution and plugin inventory aggregations.
|
|
416
437
|
* Does not extend CrudService — reports are aggregate queries, not entity CRUD.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
export {};
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUHVibGljIHJlc3VsdCBzaGFwZXMgZm9yIHRoZSByZXBvcnRpbmcgc2VydmljZS5cbiAqXG4gKiBTcGxpdCBvdXQgb2YgcmVwb3J0aW5nLXNlcnZpY2UudHMgcHVyZWx5IGZvciBzaXplOiB0aGVzZSBhcmUgZGF0YSBjb250cmFjdHNcbiAqIHdpdGggbm8gYmVoYXZpb3VyLiByZXBvcnRpbmctc2VydmljZS50cyByZS1leHBvcnRzIHRoZW0sIHNvIHRoZVxuICogYEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGFgIHB1YmxpYyBzdXJmYWNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhdGlvblN0YXRzIHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1pbk1zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIHA5NU1zOiBudW1iZXI7XG4gIGV4ZWN1dGlvbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUV4ZWN1dGlvbiB7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIC8qKiBSb2xsZWQtdXAgdGVybWluYWwgc3RhdHVzOiBzdWNjZWVkZWQgfCBmYWlsZWQgfCBjYW5jZWxlZCB8IGluLXByb2dyZXNzLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBlbmRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogRmlyc3QgZmFpbGluZyBzdGFnZS9hY3Rpb24gZm9yIHRoZSBleGVjdXRpb24gKG51bGwgd2hlbiBpdCBkaWRuJ3QgZmFpbCkuICovXG4gIGZhaWxpbmdTdGFnZTogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbGluZ0FjdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFnZUZhaWx1cmUge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlQm90dGxlbmVjayB7XG4gIGlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRmFpbHVyZSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRW50cnkge1xuICBlcnJvclBhdHRlcm46IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgYWZmZWN0ZWRQaXBlbGluZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdW1tYXJ5IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgYWN0aXZlOiBudW1iZXI7XG4gIGluYWN0aXZlOiBudW1iZXI7XG4gIC8qKiBDb3VudHMgcGVyIHNoYXJpbmcgcnVuZyDigJQgb25lIGJ1Y2tldCBwZXIgYHZpc2liaWxpdHlgIHZhbHVlLiAqL1xuICBwdWJsaWM6IG51bWJlcjtcbiAgb3JnOiBudW1iZXI7XG4gIHByaXZhdGU6IG51bWJlcjtcbiAgdW5pcXVlTmFtZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiB7XG4gIHBsdWdpblR5cGU6IHN0cmluZztcbiAgY29tcHV0ZVR5cGU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uQ291bnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGhhc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGREdXJhdGlvbiB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgYnVpbGRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRGYWlsdXJlIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgRE9SQSBoZWFkbGluZSBlbnZpcm9ubWVudC4gRGVwbG95bWVudCB0byB0aGlzIGxpdGVyYWwgZW52IG5hbWUgaXMgdGhlXG4gKiBpbmR1c3RyeS1zdGFuZGFyZCBET1JBIHNpZ25hbDsgTVRUUiBpcyBtZWFzdXJlZCBwcm9kdWN0aW9uLW9ubHksIGFuZCB0aGlzXG4gKiBlbnZpcm9ubWVudCdzIGNhcmQgaXMgdGhlIHN1bW1hcnkgc2hvd24gYXQgdGhlIHRvcCBvZiB0aGUgcGFuZWwuXG4gKi9cblxuLyoqIFBlci1vcmcgcmV0ZW50aW9uIG92ZXJyaWRlIHJvdyAoUGhhc2UgNykuIEJvdGggbnVsbGFibGUg4oeSIGdsb2JhbCBkZWZhdWx0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0aW5nUmV0ZW50aW9uU2V0dGluZ3Mge1xuICBldmVudFJldGVudGlvbkRheXM6IG51bWJlciB8IG51bGw7XG4gIGRvcmFSZXRlbnRpb25EYXlzOiBudW1iZXIgfCBudWxsO1xuICBkZWZhdWx0RXZlbnRSZXRlbnRpb25EYXlzOiBudW1iZXI7XG4gIGRlZmF1bHREb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgdGhlIHJlcG9ydGluZyByZXRlbnRpb24gc3dlZXAuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMge1xuICAvKiogUm93cyBkZWxldGVkIHBlciBzdGF0ZW1lbnQgKGRlZmF1bHQgMTAwMCkuICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIE1heCBiYXRjaGVzIHBlciB0YWJsZSBwZXIgb3JnIHBlciB0aWNrIChkZWZhdWx0IDUwKTsgdGhlIHJlc3QgZGVmZXJzIHRvXG4gICAqICB0aGUgbmV4dCB0aWNrIHNvIGEgaHVnZSBiYWNrbG9nIGNhbid0IGhvbGQgbG9ja3MgdG9vIGxvbmcuICovXG4gIG1heEJhdGNoZXNQZXJUYWJsZT86IG51bWJlcjtcbiAgLyoqIEZpeGVkIFwibm93XCIgZm9yIHRoZSB3aG9sZSBzd2VlcCAoZGVmYXVsdCBgbmV3IERhdGUoKWApLiAqL1xuICBub3c/OiBEYXRlO1xufVxuXG4vKiogUGVyLXJ1biBwdXJnZSB0YWxsaWVzIChhbHNvIGxvZ2dlZCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cyB7XG4gIC8qKiBPcmdzIHN3ZXB0IHRoaXMgcnVuLiAqL1xuICBvcmdzOiBudW1iZXI7XG4gIC8qKiBTdGFuZGFyZCBgcGlwZWxpbmVfZXZlbnRzYCAoZW52aXJvbm1lbnQgSVMgTlVMTCkgcm93cyBwdXJnZWQuICovXG4gIHN0YW5kYXJkRXZlbnRzOiBudW1iZXI7XG4gIC8qKiBET1JBLXNvdXJjZSBgcGlwZWxpbmVfZXZlbnRzYCAoZW52aXJvbm1lbnQgSVMgTk9UIE5VTEwpIHJvd3MgcHVyZ2VkLiAqL1xuICBkb3JhRXZlbnRzOiBudW1iZXI7XG4gIC8qKiBgZGVwbG95bWVudF9vdXRjb21lc2Agcm93cyBwdXJnZWQuICovXG4gIGRlcGxveW1lbnRPdXRjb21lczogbnVtYmVyO1xuICAvKiogYGluY2lkZW50c2Agcm93cyBwdXJnZWQuICovXG4gIGluY2lkZW50czogbnVtYmVyO1xufVxuXG4vKipcbiAqIERPUkEgcGVyZm9ybWFuY2UgYmFuZC4gYG51bGxgID0gaW5zdWZmaWNpZW50IGRhdGEgdG8gY2xhc3NpZnkgKG5vXG4gKiBkZXBsb3ltZW50cy9mYWlsdXJlcy9sZWFkLXRpbWUgc2FtcGxlIGluIHRoZSB3aW5kb3cpLCBzbyB0aGUgVUkgc2hvd3MgYVxuICogbmV1dHJhbCBzdGF0ZSByYXRoZXIgdGhhbiBtaXNsYWJlbGluZyBhbiBlbXB0eSB3aW5kb3cgYXMgXCJsb3dcIi5cbiAqL1xuZXhwb3J0IHR5cGUgRG9yYUxldmVsID0gJ2VsaXRlJyB8ICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdycgfCBudWxsO1xuXG4vKiogT3B0aW9uYWwgc2NvcGluZyBmb3Ige0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuZ2V0RG9yYU1ldHJpY3N9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhT3B0aW9ucyB7XG4gIC8qKiBSZXN0cmljdCB0byBhIHNpbmdsZSBwaXBlbGluZSAocGVyLXBpcGVsaW5lIERPUkEpLiAqL1xuICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICAvKiogUmVzdHJpY3QgdG8gYSBzaW5nbGUgZGVwbG95IGVudmlyb25tZW50IChlbHNlIGFsbCBkZXBsb3kgZW52aXJvbm1lbnRzKS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItb3JnIGluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIHdpbmRvdyBvdmVycmlkZSAoaG91cnMpLiBXaGVuIHNldCAoYVxuICAgKiBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyKSwgdGhlIGluY2lkZW50IGNvcnJlbGF0aW9uIHVzZXMgaXQgaW5zdGVhZCBvZiB0aGVcbiAgICogZ2xvYmFsIGBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU2AuIFRoZSByb3V0ZSByZXNvbHZlcyB0aGlzIGZyb20gdGhlIG9yZydzXG4gICAqIGBkb3JhX3NldHRpbmdzYCByb3cgKHNlZSB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXRJbmNpZGVudFNldHRpbmdzfSkgYW5kXG4gICAqIHBhc3NlcyBpdCBpbjsgdW5zZXQgZmFsbHMgYmFjayB0byB0aGUgZW52IGRlZmF1bHQuXG4gICAqL1xuICBpbmNpZGVudFdpbmRvd0hvdXJzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBlci1vcmcgcmVwb3J0aW5nIHNldHRpbmdzIHN1cmZhY2VkIHRvIHRoZSBvcmctYWRtaW4gcGFuZWwuIGBpbmNpZGVudFdpbmRvd0hvdXJzYFxuICogKFBoYXNlIDViKSBpcyB0aGUgaW5jaWRlbnTihpJkZXBsb3kgY29ycmVsYXRpb24gd2luZG93OyBgZXZlbnRSZXRlbnRpb25EYXlzYCAvXG4gKiBgZG9yYVJldGVudGlvbkRheXNgIChQaGFzZSA3KSBhcmUgdGhlIHR3byByZXRlbnRpb24tc3dlZXAgd2luZG93cy4gRWFjaCBvdmVycmlkZVxuICogaXMgYG51bGxgIHdoZW4gdW5zZXQgKHRoZSBwYWlyZWQgYGRlZmF1bHQqYCBmaWVsZCBzaG93cyB0aGUgZW52IGZhbGxiYWNrIGFwcGxpZWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50U2V0dGluZ3Mge1xuICAvKiogVGhlIG9yZydzIHN0b3JlZCBjb3JyZWxhdGlvbi13aW5kb3cgb3ZlcnJpZGUgaW4gaG91cnMsIG9yIGBudWxsYCB3aGVuIHVuc2V0LiAqL1xuICBpbmNpZGVudFdpbmRvd0hvdXJzOiBudW1iZXIgfCBudWxsO1xuICAvKiogVGhlIGdsb2JhbCBlbnYgZGVmYXVsdCBhcHBsaWVkIHdoZW4gbm8gb3ZlcnJpZGUgaXMgc3RvcmVkLiAqL1xuICBkZWZhdWx0V2luZG93SG91cnM6IG51bWJlcjtcbiAgLyoqIFN0YW5kYXJkLWV2ZW50IHJldGVudGlvbiBvdmVycmlkZSBpbiBkYXlzLCBvciBgbnVsbGAgd2hlbiB1bnNldCAoUGhhc2UgNykuICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIERPUkEtc291cmNlIHJldGVudGlvbiBvdmVycmlkZSBpbiBkYXlzLCBvciBgbnVsbGAgd2hlbiB1bnNldCAoUGhhc2UgNykuICovXG4gIGRvcmFSZXRlbnRpb25EYXlzOiBudW1iZXIgfCBudWxsO1xuICAvKiogR2xvYmFsIHN0YW5kYXJkLWV2ZW50IHJldGVudGlvbiBkZWZhdWx0IGFwcGxpZWQgd2hlbiB1bnNldCAoZGF5cykuICovXG4gIGRlZmF1bHRFdmVudFJldGVudGlvbkRheXM6IG51bWJlcjtcbiAgLyoqIEdsb2JhbCBET1JBLXNvdXJjZSByZXRlbnRpb24gZGVmYXVsdCBhcHBsaWVkIHdoZW4gdW5zZXQgKGRheXMpLiAqL1xuICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqIEEgcGFydGlhbCByZXBvcnRpbmctc2V0dGluZ3Mgd3JpdGUgKFBoYXNlIDViICsgNykuIE9ubHkgcHJvdmlkZWQgZmllbGRzIGFyZVxuICogIHVwc2VydGVkOyBvbWl0dGVkIGZpZWxkcyBhcmUgbGVmdCB1bmNoYW5nZWQgKGFuIG9taXR0ZWQgcmV0ZW50aW9uIGZpZWxkIGtlZXBzXG4gKiAgaXRzIHN0b3JlZCBvdmVycmlkZSAvIHRoZSBnbG9iYWwgZGVmYXVsdCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gge1xuICBpbmNpZGVudFdpbmRvd0hvdXJzPzogbnVtYmVyO1xuICBldmVudFJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIGRvcmFSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xufVxuXG4vKiogT25lIHJvdyBvZiB0aGUgb3JnLWFkbWluIGluY2lkZW50cyBsaXN0IChyZWNlbnQgaW5jaWRlbnRzICsgZGVwbG95IGNvcnJlbGF0aW9uKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRMaXN0SXRlbSB7XG4gIGluY2lkZW50SWQ6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgc2V2ZXJpdHk6IHN0cmluZztcbiAgb3BlbmVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGNyZWF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRydWUgb25jZSB0aGUgaW5jaWRlbnQgaGFzIGEgYHJlc29sdmVkX2F0YC4gKi9cbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgY29ycmVsYXRlZCBkZXBsb3kgZXhlY3V0aW9uIGlkIChtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSBpbi13aW5kb3cpLCBvciBudWxsLiAqL1xuICBjb3JyZWxhdGVkRXhlY3V0aW9uSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGF0IGRlcGxveSdzIGNvbXBsZXRpb24gaW5zdGFudCwgb3IgbnVsbCB3aGVuIHVuY29ycmVsYXRlZC4gKi9cbiAgZGVwbG95Q29tcGxldGVkQXQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBSZXN1bHQgb2YgdGhlIHdpcmluZy10ZXN0IGRyeS1ydW4gY29ycmVsYXRpb24gKHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLnRlc3RJbmNpZGVudENvcnJlbGF0aW9ufSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VGVzdFJlc3VsdCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3ludGhldGljIGluY2lkZW50J3Mgb3BlbmVkQXQgKG5vdywgSVNPKS4gKi9cbiAgb3BlbmVkQXQ6IHN0cmluZztcbiAgLyoqIFRoZSBlZmZlY3RpdmUgY29ycmVsYXRpb24gd2luZG93IHVzZWQuICovXG4gIHdpbmRvd0hvdXJzOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIGEgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGBlbnZpcm9ubWVudGAgY29ycmVsYXRlZC4gKi9cbiAgY29ycmVsYXRlZDogYm9vbGVhbjtcbiAgLyoqIFRoZSBjb3JyZWxhdGVkIGRlcGxveSBleGVjdXRpb24gaWQsIG9yIG51bGwuICovXG4gIGV4ZWN1dGlvbklkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhhdCBkZXBsb3kncyBjb21wbGV0aW9uIGluc3RhbnQsIG9yIG51bGwuICovXG4gIGRlcGxveUNvbXBsZXRlZEF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vLyBET1JBIHBlcmZvcm1hbmNlIGJhbmRzICh0aHJlc2hvbGRzIGZyb20gdGhlIERPUkEvQWNjZWxlcmF0ZSByZXBvcnRzKS4gRWFjaFxuLy8gaGVscGVyIHJldHVybnMgYG51bGxgIHdoZW4gdGhlcmUncyBubyBzYW1wbGUgdG8gY2xhc3NpZnkuXG4vKiogRGVwbG95bWVudCBmcmVxdWVuY3kgYnkgZGVwbG95cy9kYXk6IGVsaXRlIOKJpTEvZGF5LCBoaWdoIOKJpTEvd2VlaywgbWVkaXVtIOKJpTEvbW9udGguICovXG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LCBvcmctc2NvcGVkIChzaW5nbGUtb3JnIG9yIHJvbGx1cCBzdWJ0cmVlKS5cbiAqXG4gKiBERVBMT1ktQkFTSVMg4oCUIGV2ZXJ5IG1ldHJpYyBkZXJpdmVzIGZyb20gcmVhbCBERVBMT1ktU1RBR0UgZXhlY3V0aW9ucywgaS5lLlxuICogYHBpcGVsaW5lX2V2ZW50c2Agcm93cyB3aXRoIGBldmVudF90eXBlPSdTVEFHRSdgIGFuZCBhIG5vbi1udWxsIGBlbnZpcm9ubWVudGBcbiAqICh0aGUgZm9yd2FyZGVyIHNldHMgYGVudmlyb25tZW50YCBvbmx5IGZvciB0aGUgc3RhZ2VzIGEgdXNlciBkZWNsYXJlZCBpblxuICogYHBiLmRlcGxveXNgKS4gQSBDSS1vbmx5IGJ1aWxkL3Rlc3QgcGlwZWxpbmUgd2l0aCBubyBkZXBsb3kgc3RhZ2UgcHJvZHVjZXMgTk9cbiAqIERPUkEgZGF0YSDigJQgdGhlcmUgaXMgbm8gcnVuLWJhc2VkIGZhbGxiYWNrLiBUaGUgcGFuZWwgaXMgZW1wdHkgdW50aWwgZGVwbG95ZWRcbiAqIHBpcGVsaW5lcyByZS1zeW50aCB3aXRoIHRoZSBuZXcgZGVwbG95IHRhZ3MgYW5kIHN0YXJ0IGVtaXR0aW5nIGRlcGxveSBldmVudHMuXG4gKlxuICogYHByb2R1Y3Rpb25gIGlzIHRoZSBoZWFkbGluZSBlbnZpcm9ubWVudDsgTVRUUiBpcyBtZWFzdXJlZCBwcm9kdWN0aW9uLW9ubHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU1ldHJpY3Mge1xuICAvKiogVGhlIFtmcm9tLHRvXSB3aW5kb3cgZWNob2VkIGJhY2sgKGRlcGxveSBgY29tcGxldGVkX2F0YCByYW5nZSkuICovXG4gIHdpbmRvdzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfTtcbiAgLyoqIFRoZSBzY29waW5nIGFwcGxpZWQgKGVjaG9lZCBmb3IgdGhlIFVJKTsgYG51bGxgIHdoZW4gdW5zY29wZWQuICovXG4gIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDsgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGwgfTtcbiAgLyoqIFRoZSBoZWFkbGluZSBlbnZpcm9ubWVudCBuYW1lIChgcHJvZHVjdGlvbmApLiAqL1xuICBoZWFkbGluZTogc3RyaW5nO1xuICAvKiogUGVyLWVudmlyb25tZW50IERGIC8gQ0ZSIC8gbGVhZCB0aW1lLiBTb3J0ZWQgaGVhZGxpbmUtZmlyc3QsIHRoZW4gQeKGklouICovXG4gIGVudmlyb25tZW50czogRG9yYUVudk1ldHJpY3NbXTtcbiAgLyoqXG4gICAqIE1lYW4gVGltZSBUbyBSZXN0b3JlIOKAlCBQUk9EVUNUSU9OLU9OTFksIGZyb20gYGRlcGxveW1lbnRfb3V0Y29tZXNgLlxuICAgKiBgbWVkaWFuKHJlc3RvcmVkLmF0IOKIkiBkZXBsb3llZC5jb21wbGV0ZWRfYXQpYCBvdmVyIHJlc3RvcmVkIHByb2R1Y3Rpb25cbiAgICogaW5jaWRlbnRzIChkZWx0YXMgY2xhbXBlZCDiiaUwKS4gYGluY2lkZW50c2AgY291bnRzIHByb2R1Y3Rpb24gZGVwbG95cyBtYXJrZWRcbiAgICogZmFpbGVkOyBgcmVzdG9yZWRgIGNvdW50cyB0aG9zZSB0aGF0IHJlY292ZXJlZDsgYG1lZGlhblNlY29uZHNgIGlzIG51bGwgd2hlblxuICAgKiBubyByZXN0b3JlZCBpbmNpZGVudCBoYXMgYSByZXNvbHZhYmxlIGRlcGxveSB0aW1lLlxuICAgKi9cbiAgbWVhblRpbWVUb1Jlc3RvcmU6IHtcbiAgICBpbmNpZGVudHM6IG51bWJlcjtcbiAgICByZXN0b3JlZDogbnVtYmVyO1xuICAgIG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqXG4gICAqIENvdmVyYWdlIHJlY29uY2lsaWF0aW9uIOKAlCByZWdpc3RlcmVkIHBpcGVsaW5lcyB3aXRoIG5vIG9ic2VydmVkIGRlcGxveSBpblxuICAgKiB0aGUgd2luZG93LiBBIGhpZ2ggYHdpdGhvdXREZXBsb3lzYCBjb3VudCBtZWFucyBET1JBIGlzIGJsaW5kIHRvIG1vc3Qgb2YgdGhlXG4gICAqIGZsZWV0IChwaXBlbGluZXMgdGhhdCBoYXZlbid0IHJlLXN5bnRoZWQgd2l0aCBkZXBsb3kgdGFncywgb3IgZG9uJ3QgZGVwbG95KS5cbiAgICovXG4gIGNvdmVyYWdlOiB7XG4gICAgLyoqIFBpcGVsaW5lcyBpbiB0aGUgcmVnaXN0cnkgKG9yZy1zY29wZWQpLiAqL1xuICAgIHJlZ2lzdGVyZWQ6IG51bWJlcjtcbiAgICAvKiogUmVnaXN0ZXJlZCBwaXBlbGluZXMgd2l0aCDiiaUxIGRlcGxveS1zdGFnZSBleGVjdXRpb24gaW4gdGhlIHdpbmRvdy4gKi9cbiAgICBkZXBsb3lpbmc6IG51bWJlcjtcbiAgICAvKiogcmVnaXN0ZXJlZCDiiJIgZGVwbG95aW5nIChjbGFtcGVkIOKJpTApLiAqL1xuICAgIHdpdGhvdXREZXBsb3lzOiBudW1iZXI7XG4gIH07XG59XG5cbi8qKiBQZXItZW52aXJvbm1lbnQgRE9SQSBtZXRyaWNzIChkZXBsb3ltZW50IGZyZXF1ZW5jeSwgQ0ZSLCBsZWFkIHRpbWUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhRW52TWV0cmljcyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIC8qKiBEZXBsb3ltZW50IEZyZXF1ZW5jeSDigJQgc3VjY2Vzc2Z1bCBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9ucyBmb3IgdGhpcyBlbnYuICovXG4gIGRlcGxveW1lbnRGcmVxdWVuY3k6IHtcbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIHBlckRheTogbnVtYmVyO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKlxuICAgKiBDaGFuZ2UgRmFpbHVyZSBSYXRlIOKAlCB0d28tY2xhc3M6XG4gICAqIGAoZGVwbG95VGltZUZhaWx1cmVzICsgcG9zdERlcGxveUZhaWx1cmVzKSAvIGF0dGVtcHRzYC5cbiAgICogLSBgZGVwbG95VGltZUZhaWx1cmVzYCDigJQgZGVwbG95IHN0YWdlIGByZXN1bHQ9ZmFpbGVkYCAoZnJvbSBldmVudHMpLlxuICAgKiAtIGBwb3N0RGVwbG95RmFpbHVyZXNgIOKAlCBhIHN1Y2Nlc3NmdWwgZGVwbG95IGxhdGVyIG1hcmtlZCBmYWlsZWQgaW4gcHJvZFxuICAgKiAgIChmcm9tIGBkZXBsb3ltZW50X291dGNvbWVzYCkuXG4gICAqIC0gYGF0dGVtcHRzYCDigJQgYWxsIHRlcm1pbmFsIGRlcGxveS1zdGFnZSBhdHRlbXB0cyAoc3VjY2VlZGVkICsgZmFpbGVkKS5cbiAgICovXG4gIGNoYW5nZUZhaWx1cmVSYXRlOiB7XG4gICAgcmF0ZTogbnVtYmVyO1xuICAgIGRlcGxveVRpbWVGYWlsdXJlczogbnVtYmVyO1xuICAgIHBvc3REZXBsb3lGYWlsdXJlczogbnVtYmVyO1xuICAgIGF0dGVtcHRzOiBudW1iZXI7XG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqXG4gICAqIExlYWQgVGltZSDigJQgTUVBU1VSRUQ6IGBtZWRpYW4oZGVwbG95X2NvbXBsZXRlZCDiiJIgb2xkZXN0X2NvbW1pdF90aW1lKWAgb3ZlclxuICAgKiBzdWNjZXNzZnVsIGRlcGxveXMgd2l0aCBhIHJlc29sdmFibGUgY29tbWl0IHRpbWVzdGFtcCAoZGVsdGFzIGNsYW1wZWQg4omlMCkuXG4gICAqIGBtZWRpYW5TZWNvbmRzYCBpcyBgbnVsbGAgKD0gdW5rbm93bikgd2hlbiBubyBzdWNjZXNzZnVsIGRlcGxveSBpbiB0aGlzIGVudlxuICAgKiBjYXJyaWVkIGEgYGNvbW1pdF90aW1lc3RhbXBgLiBUaGUgb2xkIG1lZGlhbi1ydW4tZHVyYXRpb24gcHJveHkgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGxlYWRUaW1lOiB7XG4gICAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95cyB3aXRoIGEgcmVzb2x2YWJsZSBjb21taXQgdGltZSAodGhlIG1lZGlhbiBzYW1wbGUpLiAqL1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgbWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xufVxuXG4vKiogT25lIGludGVydmFsIGJ1Y2tldCBvZiB0aGUgRE9SQSB0cmVuZCAoZGVwbG95IGZyZXF1ZW5jeSArIGNoYW5nZSBmYWlsdXJlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYVRyZW5kUG9pbnQge1xuICAvKiogQnVja2V0IHN0YXJ0IChEQVRFX1RSVU5DIG9mIHRoZSBkZXBsb3kgYGNvbXBsZXRlZF9hdGApLCBJU08gdGV4dC4gKi9cbiAgcGVyaW9kOiBzdHJpbmc7XG4gIC8qKiBTdWNjZXNzZnVsIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIGluIHRoZSBidWNrZXQuICovXG4gIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gIC8qKiBGYWlsZWQgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbnMgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBzdWNjZWVkZWQgKyBmYWlsZWQgaW4gdGhlIGJ1Y2tldCAoZGVwbG95IGF0dGVtcHRzKS4gKi9cbiAgdG90YWw6IG51bWJlcjtcbiAgLyoqIGZhaWxlZC90b3RhbCBhcyBhIHBlcmNlbnQgKDAgd2hlbiB0b3RhbCBpcyAwKS4gRGVwbG95LXRpbWUgQ0ZSIG9ubHkuICovXG4gIGNoYW5nZUZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuLyoqIFBlci1zdGFnZSBidWlsZC1oZWFsdGggbWV0cmljcyAoUGhhc2UgNikgZm9yIG9uZSBwaXBlbGluZSBvdmVyIGEgd2luZG93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEhlYWx0aFN0YWdlIHtcbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFRlcm1pbmFsIHN0YWdlIHJ1bnMgKHN1Y2NlZWRlZCArIGZhaWxlZCkgaW4gdGhlIHdpbmRvdy4gKi9cbiAgcnVuczogbnVtYmVyO1xuICBzdWNjZXNzZXM6IG51bWJlcjtcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIHN1Y2Nlc3NlcyAvIHJ1bnMgYXMgYSBwZXJjZW50ICgwIHdoZW4gcnVucyBpcyAwKS4gKi9cbiAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgLyoqIER1cmF0aW9uIHBlcmNlbnRpbGVzIG92ZXIgdGhlIHN0YWdlJ3MgdGVybWluYWwgcnVuczsgbnVsbCB3aGVuIG5vIGR1cmF0aW9ucy4gKi9cbiAgcDUwTXM6IG51bWJlciB8IG51bGw7XG4gIHA5ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTlNczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBQZXItcGlwZWxpbmUgYnVpbGQtaGVhbHRoIGJyZWFrZG93biAoUGhhc2UgNikuIFN0YW5kYXJkIHJlcG9ydGluZyAoTk9UXG4gKiBgYWR2YW5jZWRfcmVwb3J0aW5nYC1nYXRlZCkg4oCUIHBlci1zdGFnZSBzdWNjZXNzIHJhdGUgKyB0aW1pbmcgcGVyY2VudGlsZXMsIHdpdGhcbiAqIHRvdGFscyBzdW1tZWQgYWNyb3NzIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEhlYWx0aCB7XG4gIHN0YWdlczogQnVpbGRIZWFsdGhTdGFnZVtdO1xuICB0b3RhbHM6IHsgcnVuczogbnVtYmVyOyBmYWlsdXJlczogbnVtYmVyOyBmYWlsdXJlUmF0ZTogbnVtYmVyIH07XG59XG5cbi8qKiBQb3N0LWRlcGxveSBpbmNpZGVudCBtYXJrZXIgKFBoYXNlIDUpIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLnJlY29yZEluY2lkZW50YC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRJbnB1dCB7XG4gIGluY2lkZW50SWQ6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgb3BlbmVkQXQ6IHN0cmluZztcbiAgcmVzb2x2ZWRBdD86IHN0cmluZztcbiAgc2V2ZXJpdHk6IHN0cmluZztcbn1cblxuLyoqIEV2ZW50IHBheWxvYWQgYWNjZXB0ZWQgYnkgYFJlcG9ydGluZ1NlcnZpY2UuaW5nZXN0RXZlbnRzYC4gTWlycm9ycyB0aGUgcm91dGUncyBab2Qgc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdEV2ZW50IHtcbiAgLyoqIFN0YWJsZSBwaXBlbGluZSBpZCB0aGUgZXZlbnRzIExhbWJkYSByZWFkIGZyb20gdGhlIGBwYi5waXBlbGluZS1pZGBcbiAgICogIHRhZyAoPSB0aGUgcGxhdGZvcm0gcGlwZWxpbmVJZCkuIFRoZSByZWdpc3RyeSBqb2luIGtleS4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfCAnY29kZWJ1aWxkJyB8ICdwbHVnaW4tYnVpbGQnO1xuICBldmVudFR5cGU6ICdQSVBFTElORScgfCAnU1RBR0UnIHwgJ0FDVElPTicgfCAnQlVJTEQnO1xuICBzdGF0dXM6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ/OiBzdHJpbmc7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGZhaWx1cmUgcmVhc29uIChBY3Rpb24gZXZlbnRzKS4gKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICAvKiogU291cmNlIGNvbW1pdCBpZCBvZiB0aGUgY2hhbmdlIGJlaW5nIHNoaXBwZWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIHJlZi9icmFuY2ggKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gKi9cbiAgY29tbWl0UmVmPzogc3RyaW5nO1xuICAvKiogRGVwbG95IHRhcmdldCAoZS5nLiBcInByb2R1Y3Rpb25cIikuIEl0cyBwcmVzZW5jZSBvbiBhIFNUQUdFL0FDVElPTiBldmVudFxuICAgKiAgbWFya3MgYSByZWFsIGRlcGxveW1lbnQgKGRlcml2ZWQgc2VydmVyLXNpZGUg4oCUIHRoZXJlIGlzIG5vIGBpc0RlcGxveWApLiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgLyoqIE9sZGVzdCB1bnNoaXBwZWQgY29tbWl0IHRpbWVzdGFtcCAoSVNPIDg2MDEpIGZvciBtZWFzdXJlZCBsZWFkIHRpbWUuICovXG4gIGNvbW1pdFRpbWVzdGFtcD86IHN0cmluZztcbiAgLyoqIE51bWJlciBvZiBjb21taXRzIHNoaXBwZWQgaW4gdGhpcyBjaGFuZ2UgKOKJpTEpLiAqL1xuICBjb21taXRDb3VudD86IG51bWJlcjtcbiAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogUGVyLWV2ZW50IG1ldHJpYyBkZXNjcmlwdG9yIGVtaXR0ZWQgKHZpYSB0aGUge0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuaW5nZXN0RXZlbnRzfVxuICogYG9uTWV0cmljYCBob29rKSBmb3IgZWFjaCBSRUdJU1RFUkVEIHRlcm1pbmFsIGRlcGxveS9zdGFnZSBldmVudCwgc28gdGhlIHJvdXRlXG4gKiBsYXllciBjYW4gZmFuIHRoZW0gaW50byBQcm9tZXRoZXVzIGNvdW50ZXJzIHdpdGhvdXQgcGlwZWxpbmUtZGF0YSBpbXBvcnRpbmdcbiAqIGFwaS1zZXJ2ZXIncyBtZXRyaWNzIHJlZ2lzdHJ5LiBgcmVzdWx0YCBpcyB0aGUgdGVybWluYWwgb3V0Y29tZTsgYGVudmlyb25tZW50YFxuICogaXMgbm9uLW51bGwgb25seSBmb3IgYSBkZXBsb3ktc3RhZ2UgZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0TWV0cmljIHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBzdGFnZTogc3RyaW5nO1xuICBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzdWx0OiAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnO1xufVxuXG4vKiogQ291bnRzICsgdGhlIChwb3NzaWJseSB0cnVuY2F0ZWQpIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyB0aGUgY2FsbGVyIGNhbiBsb2cuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdFJlc3VsdCB7XG4gIGluc2VydGVkOiBudW1iZXI7XG4gIHNraXBwZWQ6IG51bWJlcjtcbiAgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHM6IHN0cmluZ1tdO1xufVxuXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgcm93IHNoYXBlcyBmb3IgdGhlIERPUkEgcXVlcmllcy4gRXhwb3J0ZWQgYmVjYXVzZSAuL2RvcmEudHMgY29uc3VtZXNcbiAqIHRoZW07IG5vdCBwYXJ0IG9mIHRoZSBwYWNrYWdlJ3MgcHVibGljIHN1cmZhY2UgKHJlcG9ydGluZy1zZXJ2aWNlLnRzXG4gKiByZS1leHBvcnRzIHRoaXMgbW9kdWxlIHdob2xlc2FsZSwgd2hpY2ggaXMgYSBkZWxpYmVyYXRlIHNpbXBsaWZpY2F0aW9uIOKAlCB0aGVzZVxuICogZGVzY3JpYmUgcXVlcnkgcmVzdWx0cywgbm90IEFQSSBjb250cmFjdHMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVJvdyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIHN0YXR1czogJ1NVQ0NFRURFRCcgfCAnRkFJTEVEJyB8IHN0cmluZztcbiAgLyoqIERlcGxveSBleGVjdXRpb24gaWQg4oCUIHRoZSBhdHRyaWJ1dGlvbiBrZXkgZm9yIGRlZHVwIGFnYWluc3Qgb3V0Y29tZXMvaW5jaWRlbnRzLiAqL1xuICBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgY29tbWl0X3RzOiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZGVwbG95IGNvbXBsZXRlZCBpbnNpZGUgW2Zyb20sdG9dLiBBYnNlbnQgKHVuZGVmaW5lZCkgaW4gdW5pdFxuICAgKiBmaXh0dXJlcyDih5IgdHJlYXRlZCBhcyBpbi13aW5kb3cuIGB0YC9gZmAgdG9sZXJhdGVkIChwZyBib29sZWFuIHRleHQgZm9ybSkuXG4gICAqL1xuICBpbl93aW5kb3c/OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFJhdyBwb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlciByb3cgKGZyb20gYGRlcGxveW1lbnRfb3V0Y29tZXNgLCBpbi13aW5kb3cpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdXRjb21lUm93IHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gIG91dGNvbWU6ICdmYWlsZWQnIHwgJ3Jlc3RvcmVkJyB8IHN0cmluZztcbiAgLyoqIEV4ZWN1dGlvbiB0aGUgdXNlciBtYXJrZWQg4oCUIGRlZHVwIGtleSBhZ2FpbnN0IGluY2lkZW50LWNvcnJlbGF0ZWQgZGVwbG95cy4gKi9cbiAgZXhlY3V0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogUHJvZHVjdGlvbiByZXN0b3JlZC1pbmNpZGVudCBwYWlyOiByZWNvdmVyeSB0aW1lICsgdGhlIGRlcGxveSdzIGNvbXBsZXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIE10dHJQYWlyUm93IHtcbiAgcmVzdG9yZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gIGRlcGxveWVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAvKiogRXhlY3V0aW9uIGlkIOKAlCBsZXRzIGluY2lkZW50IHByZWNlZGVuY2Ugb3ZlcnJpZGUgdGhlIG1hbnVhbCBvdXRjb21lIHBlciBkZXBsb3kuICovXG4gIGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSYXcgaW5jaWRlbnQgcm93IChmcm9tIGBpbmNpZGVudHNgLCBvcGVuZWQgaW4td2luZG93KS4gQ29ycmVsYXRlZCBpbiBKUyB0byB0aGVcbiAqIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGBlbnZpcm9ubWVudGAgd2l0aGluIERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTXG4gKiDihpIgYW4gYXV0b21hdGVkIHBvc3QtZGVwbG95IGZhaWx1cmUgKENGUikgKyByZWFsIHJlY292ZXJ5IHRpbWUgKE1UVFIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50Um93IHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgb3BlbmVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICByZXNvbHZlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIENvdmVyYWdlIGNvdW50czogcmVnaXN0ZXJlZCBwaXBlbGluZXMgdnMgdGhvc2UgdGhhdCBhY3R1YWxseSBkZXBsb3llZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ292ZXJhZ2VSb3cge1xuICByZWdpc3RlcmVkOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBkZXBsb3lpbmc6IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG59XG4iXX0=
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUHVibGljIHJlc3VsdCBzaGFwZXMgZm9yIHRoZSByZXBvcnRpbmcgc2VydmljZS5cbiAqXG4gKiBTcGxpdCBvdXQgb2YgcmVwb3J0aW5nLXNlcnZpY2UudHMgcHVyZWx5IGZvciBzaXplOiB0aGVzZSBhcmUgZGF0YSBjb250cmFjdHNcbiAqIHdpdGggbm8gYmVoYXZpb3VyLiByZXBvcnRpbmctc2VydmljZS50cyByZS1leHBvcnRzIHRoZW0sIHNvIHRoZVxuICogYEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGFgIHB1YmxpYyBzdXJmYWNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhdGlvblN0YXRzIHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1pbk1zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIHA5NU1zOiBudW1iZXI7XG4gIGV4ZWN1dGlvbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUV4ZWN1dGlvbiB7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIC8qKiBSb2xsZWQtdXAgdGVybWluYWwgc3RhdHVzOiBzdWNjZWVkZWQgfCBmYWlsZWQgfCBjYW5jZWxlZCB8IGluLXByb2dyZXNzLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBlbmRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogRmlyc3QgZmFpbGluZyBzdGFnZS9hY3Rpb24gZm9yIHRoZSBleGVjdXRpb24gKG51bGwgd2hlbiBpdCBkaWRuJ3QgZmFpbCkuICovXG4gIGZhaWxpbmdTdGFnZTogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbGluZ0FjdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFnZUZhaWx1cmUge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlQm90dGxlbmVjayB7XG4gIGlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRmFpbHVyZSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRW50cnkge1xuICBlcnJvclBhdHRlcm46IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgYWZmZWN0ZWRQaXBlbGluZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdW1tYXJ5IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgYWN0aXZlOiBudW1iZXI7XG4gIGluYWN0aXZlOiBudW1iZXI7XG4gIC8qKiBDb3VudHMgcGVyIHNoYXJpbmcgcnVuZyDigJQgb25lIGJ1Y2tldCBwZXIgYHZpc2liaWxpdHlgIHZhbHVlLiAqL1xuICBwdWJsaWM6IG51bWJlcjtcbiAgb3JnOiBudW1iZXI7XG4gIHByaXZhdGU6IG51bWJlcjtcbiAgdW5pcXVlTmFtZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiB7XG4gIHBsdWdpblR5cGU6IHN0cmluZztcbiAgY29tcHV0ZVR5cGU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uQ291bnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGhhc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGREdXJhdGlvbiB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgYnVpbGRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRGYWlsdXJlIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgRE9SQSBoZWFkbGluZSBlbnZpcm9ubWVudC4gRGVwbG95bWVudCB0byB0aGlzIGxpdGVyYWwgZW52IG5hbWUgaXMgdGhlXG4gKiBpbmR1c3RyeS1zdGFuZGFyZCBET1JBIHNpZ25hbDsgTVRUUiBpcyBtZWFzdXJlZCBwcm9kdWN0aW9uLW9ubHksIGFuZCB0aGlzXG4gKiBlbnZpcm9ubWVudCdzIGNhcmQgaXMgdGhlIHN1bW1hcnkgc2hvd24gYXQgdGhlIHRvcCBvZiB0aGUgcGFuZWwuXG4gKi9cblxuLyoqIFBlci1vcmcgcmV0ZW50aW9uIG92ZXJyaWRlIHJvdyAoUGhhc2UgNykuIEJvdGggbnVsbGFibGUg4oeSIGdsb2JhbCBkZWZhdWx0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0aW5nUmV0ZW50aW9uU2V0dGluZ3Mge1xuICBldmVudFJldGVudGlvbkRheXM6IG51bWJlciB8IG51bGw7XG4gIGRvcmFSZXRlbnRpb25EYXlzOiBudW1iZXIgfCBudWxsO1xuICBkZWZhdWx0RXZlbnRSZXRlbnRpb25EYXlzOiBudW1iZXI7XG4gIGRlZmF1bHREb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgdGhlIHJlcG9ydGluZyByZXRlbnRpb24gc3dlZXAuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMge1xuICAvKiogUm93cyBkZWxldGVkIHBlciBzdGF0ZW1lbnQgKGRlZmF1bHQgMTAwMCkuICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIE1heCBiYXRjaGVzIHBlciB0YWJsZSBwZXIgb3JnIHBlciB0aWNrIChkZWZhdWx0IDUwKTsgdGhlIHJlc3QgZGVmZXJzIHRvXG4gICAqICB0aGUgbmV4dCB0aWNrIHNvIGEgaHVnZSBiYWNrbG9nIGNhbid0IGhvbGQgbG9ja3MgdG9vIGxvbmcuICovXG4gIG1heEJhdGNoZXNQZXJUYWJsZT86IG51bWJlcjtcbiAgLyoqIEZpeGVkIFwibm93XCIgZm9yIHRoZSB3aG9sZSBzd2VlcCAoZGVmYXVsdCBgbmV3IERhdGUoKWApLiAqL1xuICBub3c/OiBEYXRlO1xufVxuXG4vKiogUGVyLXJ1biBwdXJnZSB0YWxsaWVzIChhbHNvIGxvZ2dlZCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cyB7XG4gIC8qKiBPcmdzIHN3ZXB0IHRoaXMgcnVuLiAqL1xuICBvcmdzOiBudW1iZXI7XG4gIC8qKiBTdGFuZGFyZCBgcGlwZWxpbmVfZXZlbnRzYCAoZW52aXJvbm1lbnQgSVMgTlVMTCkgcm93cyBwdXJnZWQuICovXG4gIHN0YW5kYXJkRXZlbnRzOiBudW1iZXI7XG4gIC8qKiBET1JBLXNvdXJjZSBgcGlwZWxpbmVfZXZlbnRzYCAoZW52aXJvbm1lbnQgSVMgTk9UIE5VTEwpIHJvd3MgcHVyZ2VkLiAqL1xuICBkb3JhRXZlbnRzOiBudW1iZXI7XG4gIC8qKiBgZGVwbG95bWVudF9vdXRjb21lc2Agcm93cyBwdXJnZWQuICovXG4gIGRlcGxveW1lbnRPdXRjb21lczogbnVtYmVyO1xuICAvKiogYGluY2lkZW50c2Agcm93cyBwdXJnZWQuICovXG4gIGluY2lkZW50czogbnVtYmVyO1xufVxuXG4vKipcbiAqIERPUkEgcGVyZm9ybWFuY2UgYmFuZC4gYG51bGxgID0gaW5zdWZmaWNpZW50IGRhdGEgdG8gY2xhc3NpZnkgKG5vXG4gKiBkZXBsb3ltZW50cy9mYWlsdXJlcy9sZWFkLXRpbWUgc2FtcGxlIGluIHRoZSB3aW5kb3cpLCBzbyB0aGUgVUkgc2hvd3MgYVxuICogbmV1dHJhbCBzdGF0ZSByYXRoZXIgdGhhbiBtaXNsYWJlbGluZyBhbiBlbXB0eSB3aW5kb3cgYXMgXCJsb3dcIi5cbiAqL1xuZXhwb3J0IHR5cGUgRG9yYUxldmVsID0gJ2VsaXRlJyB8ICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdycgfCBudWxsO1xuXG4vKiogT3B0aW9uYWwgc2NvcGluZyBmb3Ige0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuZ2V0RG9yYU1ldHJpY3N9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhT3B0aW9ucyB7XG4gIC8qKiBSZXN0cmljdCB0byBhIHNpbmdsZSBwaXBlbGluZSAocGVyLXBpcGVsaW5lIERPUkEpLiAqL1xuICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICAvKiogUmVzdHJpY3QgdG8gYSBzaW5nbGUgZGVwbG95IGVudmlyb25tZW50IChlbHNlIGFsbCBkZXBsb3kgZW52aXJvbm1lbnRzKS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItb3JnIGluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIHdpbmRvdyBvdmVycmlkZSAoaG91cnMpLiBXaGVuIHNldCAoYVxuICAgKiBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyKSwgdGhlIGluY2lkZW50IGNvcnJlbGF0aW9uIHVzZXMgaXQgaW5zdGVhZCBvZiB0aGVcbiAgICogZ2xvYmFsIGBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU2AuIFRoZSByb3V0ZSByZXNvbHZlcyB0aGlzIGZyb20gdGhlIG9yZydzXG4gICAqIGBkb3JhX3NldHRpbmdzYCByb3cgKHNlZSB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXRJbmNpZGVudFNldHRpbmdzfSkgYW5kXG4gICAqIHBhc3NlcyBpdCBpbjsgdW5zZXQgZmFsbHMgYmFjayB0byB0aGUgZW52IGRlZmF1bHQuXG4gICAqL1xuICBpbmNpZGVudFdpbmRvd0hvdXJzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBlci1vcmcgcmVwb3J0aW5nIHNldHRpbmdzIHN1cmZhY2VkIHRvIHRoZSBvcmctYWRtaW4gcGFuZWwuIGBpbmNpZGVudFdpbmRvd0hvdXJzYFxuICogKFBoYXNlIDViKSBpcyB0aGUgaW5jaWRlbnTihpJkZXBsb3kgY29ycmVsYXRpb24gd2luZG93OyBgZXZlbnRSZXRlbnRpb25EYXlzYCAvXG4gKiBgZG9yYVJldGVudGlvbkRheXNgIChQaGFzZSA3KSBhcmUgdGhlIHR3byByZXRlbnRpb24tc3dlZXAgd2luZG93cy4gRWFjaCBvdmVycmlkZVxuICogaXMgYG51bGxgIHdoZW4gdW5zZXQgKHRoZSBwYWlyZWQgYGRlZmF1bHQqYCBmaWVsZCBzaG93cyB0aGUgZW52IGZhbGxiYWNrIGFwcGxpZWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50U2V0dGluZ3Mge1xuICAvKiogVGhlIG9yZydzIHN0b3JlZCBjb3JyZWxhdGlvbi13aW5kb3cgb3ZlcnJpZGUgaW4gaG91cnMsIG9yIGBudWxsYCB3aGVuIHVuc2V0LiAqL1xuICBpbmNpZGVudFdpbmRvd0hvdXJzOiBudW1iZXIgfCBudWxsO1xuICAvKiogVGhlIGdsb2JhbCBlbnYgZGVmYXVsdCBhcHBsaWVkIHdoZW4gbm8gb3ZlcnJpZGUgaXMgc3RvcmVkLiAqL1xuICBkZWZhdWx0V2luZG93SG91cnM6IG51bWJlcjtcbiAgLyoqIFN0YW5kYXJkLWV2ZW50IHJldGVudGlvbiBvdmVycmlkZSBpbiBkYXlzLCBvciBgbnVsbGAgd2hlbiB1bnNldCAoUGhhc2UgNykuICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIERPUkEtc291cmNlIHJldGVudGlvbiBvdmVycmlkZSBpbiBkYXlzLCBvciBgbnVsbGAgd2hlbiB1bnNldCAoUGhhc2UgNykuICovXG4gIGRvcmFSZXRlbnRpb25EYXlzOiBudW1iZXIgfCBudWxsO1xuICAvKiogR2xvYmFsIHN0YW5kYXJkLWV2ZW50IHJldGVudGlvbiBkZWZhdWx0IGFwcGxpZWQgd2hlbiB1bnNldCAoZGF5cykuICovXG4gIGRlZmF1bHRFdmVudFJldGVudGlvbkRheXM6IG51bWJlcjtcbiAgLyoqIEdsb2JhbCBET1JBLXNvdXJjZSByZXRlbnRpb24gZGVmYXVsdCBhcHBsaWVkIHdoZW4gdW5zZXQgKGRheXMpLiAqL1xuICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqIEEgcGFydGlhbCByZXBvcnRpbmctc2V0dGluZ3Mgd3JpdGUgKFBoYXNlIDViICsgNykuIE9ubHkgcHJvdmlkZWQgZmllbGRzIGFyZVxuICogIHVwc2VydGVkOyBvbWl0dGVkIGZpZWxkcyBhcmUgbGVmdCB1bmNoYW5nZWQgKGFuIG9taXR0ZWQgcmV0ZW50aW9uIGZpZWxkIGtlZXBzXG4gKiAgaXRzIHN0b3JlZCBvdmVycmlkZSAvIHRoZSBnbG9iYWwgZGVmYXVsdCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gge1xuICBpbmNpZGVudFdpbmRvd0hvdXJzPzogbnVtYmVyO1xuICBldmVudFJldGVudGlvbkRheXM/OiBudW1iZXI7XG4gIGRvcmFSZXRlbnRpb25EYXlzPzogbnVtYmVyO1xufVxuXG4vKiogT25lIHJvdyBvZiB0aGUgb3JnLWFkbWluIGluY2lkZW50cyBsaXN0IChyZWNlbnQgaW5jaWRlbnRzICsgZGVwbG95IGNvcnJlbGF0aW9uKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRMaXN0SXRlbSB7XG4gIGluY2lkZW50SWQ6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgc2V2ZXJpdHk6IHN0cmluZztcbiAgb3BlbmVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGNyZWF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRydWUgb25jZSB0aGUgaW5jaWRlbnQgaGFzIGEgYHJlc29sdmVkX2F0YC4gKi9cbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgY29ycmVsYXRlZCBkZXBsb3kgZXhlY3V0aW9uIGlkIChtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSBpbi13aW5kb3cpLCBvciBudWxsLiAqL1xuICBjb3JyZWxhdGVkRXhlY3V0aW9uSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGF0IGRlcGxveSdzIGNvbXBsZXRpb24gaW5zdGFudCwgb3IgbnVsbCB3aGVuIHVuY29ycmVsYXRlZC4gKi9cbiAgZGVwbG95Q29tcGxldGVkQXQ6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBSZXN1bHQgb2YgdGhlIHdpcmluZy10ZXN0IGRyeS1ydW4gY29ycmVsYXRpb24gKHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLnRlc3RJbmNpZGVudENvcnJlbGF0aW9ufSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VGVzdFJlc3VsdCB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3ludGhldGljIGluY2lkZW50J3Mgb3BlbmVkQXQgKG5vdywgSVNPKS4gKi9cbiAgb3BlbmVkQXQ6IHN0cmluZztcbiAgLyoqIFRoZSBlZmZlY3RpdmUgY29ycmVsYXRpb24gd2luZG93IHVzZWQuICovXG4gIHdpbmRvd0hvdXJzOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIGEgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGBlbnZpcm9ubWVudGAgY29ycmVsYXRlZC4gKi9cbiAgY29ycmVsYXRlZDogYm9vbGVhbjtcbiAgLyoqIFRoZSBjb3JyZWxhdGVkIGRlcGxveSBleGVjdXRpb24gaWQsIG9yIG51bGwuICovXG4gIGV4ZWN1dGlvbklkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhhdCBkZXBsb3kncyBjb21wbGV0aW9uIGluc3RhbnQsIG9yIG51bGwuICovXG4gIGRlcGxveUNvbXBsZXRlZEF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vLyBET1JBIHBlcmZvcm1hbmNlIGJhbmRzICh0aHJlc2hvbGRzIGZyb20gdGhlIERPUkEvQWNjZWxlcmF0ZSByZXBvcnRzKS4gRWFjaFxuLy8gaGVscGVyIHJldHVybnMgYG51bGxgIHdoZW4gdGhlcmUncyBubyBzYW1wbGUgdG8gY2xhc3NpZnkuXG4vKiogRGVwbG95bWVudCBmcmVxdWVuY3kgYnkgZGVwbG95cy9kYXk6IGVsaXRlIOKJpTEvZGF5LCBoaWdoIOKJpTEvd2VlaywgbWVkaXVtIOKJpTEvbW9udGguICovXG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LCBvcmctc2NvcGVkIChzaW5nbGUtb3JnIG9yIHJvbGx1cCBzdWJ0cmVlKS5cbiAqXG4gKiBERVBMT1ktQkFTSVMg4oCUIGV2ZXJ5IG1ldHJpYyBkZXJpdmVzIGZyb20gcmVhbCBERVBMT1ktU1RBR0UgZXhlY3V0aW9ucywgaS5lLlxuICogYHBpcGVsaW5lX2V2ZW50c2Agcm93cyB3aXRoIGBldmVudF90eXBlPSdTVEFHRSdgIGFuZCBhIG5vbi1udWxsIGBlbnZpcm9ubWVudGBcbiAqICh0aGUgZm9yd2FyZGVyIHNldHMgYGVudmlyb25tZW50YCBvbmx5IGZvciB0aGUgc3RhZ2VzIGEgdXNlciBkZWNsYXJlZCBpblxuICogYHBiLmRlcGxveXNgKS4gQSBDSS1vbmx5IGJ1aWxkL3Rlc3QgcGlwZWxpbmUgd2l0aCBubyBkZXBsb3kgc3RhZ2UgcHJvZHVjZXMgTk9cbiAqIERPUkEgZGF0YSDigJQgdGhlcmUgaXMgbm8gcnVuLWJhc2VkIGZhbGxiYWNrLiBUaGUgcGFuZWwgaXMgZW1wdHkgdW50aWwgZGVwbG95ZWRcbiAqIHBpcGVsaW5lcyByZS1zeW50aCB3aXRoIHRoZSBuZXcgZGVwbG95IHRhZ3MgYW5kIHN0YXJ0IGVtaXR0aW5nIGRlcGxveSBldmVudHMuXG4gKlxuICogYHByb2R1Y3Rpb25gIGlzIHRoZSBoZWFkbGluZSBlbnZpcm9ubWVudDsgTVRUUiBpcyBtZWFzdXJlZCBwcm9kdWN0aW9uLW9ubHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU1ldHJpY3Mge1xuICAvKiogVGhlIFtmcm9tLHRvXSB3aW5kb3cgZWNob2VkIGJhY2sgKGRlcGxveSBgY29tcGxldGVkX2F0YCByYW5nZSkuICovXG4gIHdpbmRvdzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfTtcbiAgLyoqIFRoZSBzY29waW5nIGFwcGxpZWQgKGVjaG9lZCBmb3IgdGhlIFVJKTsgYG51bGxgIHdoZW4gdW5zY29wZWQuICovXG4gIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDsgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGwgfTtcbiAgLyoqIFRoZSBoZWFkbGluZSBlbnZpcm9ubWVudCBuYW1lIChgcHJvZHVjdGlvbmApLiAqL1xuICBoZWFkbGluZTogc3RyaW5nO1xuICAvKiogUGVyLWVudmlyb25tZW50IERGIC8gQ0ZSIC8gbGVhZCB0aW1lLiBTb3J0ZWQgaGVhZGxpbmUtZmlyc3QsIHRoZW4gQeKGklouICovXG4gIGVudmlyb25tZW50czogRG9yYUVudk1ldHJpY3NbXTtcbiAgLyoqXG4gICAqIE1lYW4gVGltZSBUbyBSZXN0b3JlIOKAlCBQUk9EVUNUSU9OLU9OTFksIGZyb20gYGRlcGxveW1lbnRfb3V0Y29tZXNgLlxuICAgKiBgbWVkaWFuKHJlc3RvcmVkLmF0IOKIkiBkZXBsb3llZC5jb21wbGV0ZWRfYXQpYCBvdmVyIHJlc3RvcmVkIHByb2R1Y3Rpb25cbiAgICogaW5jaWRlbnRzIChkZWx0YXMgY2xhbXBlZCDiiaUwKS4gYGluY2lkZW50c2AgY291bnRzIHByb2R1Y3Rpb24gZGVwbG95cyBtYXJrZWRcbiAgICogZmFpbGVkOyBgcmVzdG9yZWRgIGNvdW50cyB0aG9zZSB0aGF0IHJlY292ZXJlZDsgYG1lZGlhblNlY29uZHNgIGlzIG51bGwgd2hlblxuICAgKiBubyByZXN0b3JlZCBpbmNpZGVudCBoYXMgYSByZXNvbHZhYmxlIGRlcGxveSB0aW1lLlxuICAgKi9cbiAgbWVhblRpbWVUb1Jlc3RvcmU6IHtcbiAgICBpbmNpZGVudHM6IG51bWJlcjtcbiAgICByZXN0b3JlZDogbnVtYmVyO1xuICAgIG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqXG4gICAqIENvdmVyYWdlIHJlY29uY2lsaWF0aW9uIOKAlCByZWdpc3RlcmVkIHBpcGVsaW5lcyB3aXRoIG5vIG9ic2VydmVkIGRlcGxveSBpblxuICAgKiB0aGUgd2luZG93LiBBIGhpZ2ggYHdpdGhvdXREZXBsb3lzYCBjb3VudCBtZWFucyBET1JBIGlzIGJsaW5kIHRvIG1vc3Qgb2YgdGhlXG4gICAqIGZsZWV0IChwaXBlbGluZXMgdGhhdCBoYXZlbid0IHJlLXN5bnRoZWQgd2l0aCBkZXBsb3kgdGFncywgb3IgZG9uJ3QgZGVwbG95KS5cbiAgICovXG4gIGNvdmVyYWdlOiB7XG4gICAgLyoqIFBpcGVsaW5lcyBpbiB0aGUgcmVnaXN0cnkgKG9yZy1zY29wZWQpLiAqL1xuICAgIHJlZ2lzdGVyZWQ6IG51bWJlcjtcbiAgICAvKiogUmVnaXN0ZXJlZCBwaXBlbGluZXMgd2l0aCDiiaUxIGRlcGxveS1zdGFnZSBleGVjdXRpb24gaW4gdGhlIHdpbmRvdy4gKi9cbiAgICBkZXBsb3lpbmc6IG51bWJlcjtcbiAgICAvKiogcmVnaXN0ZXJlZCDiiJIgZGVwbG95aW5nIChjbGFtcGVkIOKJpTApLiAqL1xuICAgIHdpdGhvdXREZXBsb3lzOiBudW1iZXI7XG4gIH07XG59XG5cbi8qKiBQZXItZW52aXJvbm1lbnQgRE9SQSBtZXRyaWNzIChkZXBsb3ltZW50IGZyZXF1ZW5jeSwgQ0ZSLCBsZWFkIHRpbWUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhRW52TWV0cmljcyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIC8qKiBEZXBsb3ltZW50IEZyZXF1ZW5jeSDigJQgc3VjY2Vzc2Z1bCBkZXBsb3ktc3RhZ2UgZXhlY3V0aW9ucyBmb3IgdGhpcyBlbnYuICovXG4gIGRlcGxveW1lbnRGcmVxdWVuY3k6IHtcbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIHBlckRheTogbnVtYmVyO1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKlxuICAgKiBDaGFuZ2UgRmFpbHVyZSBSYXRlIOKAlCB0d28tY2xhc3M6XG4gICAqIGAoZGVwbG95VGltZUZhaWx1cmVzICsgcG9zdERlcGxveUZhaWx1cmVzKSAvIGF0dGVtcHRzYC5cbiAgICogLSBgZGVwbG95VGltZUZhaWx1cmVzYCDigJQgZGVwbG95IHN0YWdlIGByZXN1bHQ9ZmFpbGVkYCAoZnJvbSBldmVudHMpLlxuICAgKiAtIGBwb3N0RGVwbG95RmFpbHVyZXNgIOKAlCBhIHN1Y2Nlc3NmdWwgZGVwbG95IGxhdGVyIG1hcmtlZCBmYWlsZWQgaW4gcHJvZFxuICAgKiAgIChmcm9tIGBkZXBsb3ltZW50X291dGNvbWVzYCkuXG4gICAqIC0gYGF0dGVtcHRzYCDigJQgYWxsIHRlcm1pbmFsIGRlcGxveS1zdGFnZSBhdHRlbXB0cyAoc3VjY2VlZGVkICsgZmFpbGVkKS5cbiAgICovXG4gIGNoYW5nZUZhaWx1cmVSYXRlOiB7XG4gICAgcmF0ZTogbnVtYmVyO1xuICAgIGRlcGxveVRpbWVGYWlsdXJlczogbnVtYmVyO1xuICAgIHBvc3REZXBsb3lGYWlsdXJlczogbnVtYmVyO1xuICAgIGF0dGVtcHRzOiBudW1iZXI7XG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqXG4gICAqIExlYWQgVGltZSDigJQgTUVBU1VSRUQ6IGBtZWRpYW4oZGVwbG95X2NvbXBsZXRlZCDiiJIgb2xkZXN0X2NvbW1pdF90aW1lKWAgb3ZlclxuICAgKiBzdWNjZXNzZnVsIGRlcGxveXMgd2l0aCBhIHJlc29sdmFibGUgY29tbWl0IHRpbWVzdGFtcCAoZGVsdGFzIGNsYW1wZWQg4omlMCkuXG4gICAqIGBtZWRpYW5TZWNvbmRzYCBpcyBgbnVsbGAgKD0gdW5rbm93bikgd2hlbiBubyBzdWNjZXNzZnVsIGRlcGxveSBpbiB0aGlzIGVudlxuICAgKiBjYXJyaWVkIGEgYGNvbW1pdF90aW1lc3RhbXBgLiBUaGUgb2xkIG1lZGlhbi1ydW4tZHVyYXRpb24gcHJveHkgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGxlYWRUaW1lOiB7XG4gICAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95cyB3aXRoIGEgcmVzb2x2YWJsZSBjb21taXQgdGltZSAodGhlIG1lZGlhbiBzYW1wbGUpLiAqL1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgbWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xufVxuXG4vKiogT25lIGludGVydmFsIGJ1Y2tldCBvZiB0aGUgRE9SQSB0cmVuZCAoZGVwbG95IGZyZXF1ZW5jeSArIGNoYW5nZSBmYWlsdXJlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYVRyZW5kUG9pbnQge1xuICAvKiogQnVja2V0IHN0YXJ0IChEQVRFX1RSVU5DIG9mIHRoZSBkZXBsb3kgYGNvbXBsZXRlZF9hdGApLCBJU08gdGV4dC4gKi9cbiAgcGVyaW9kOiBzdHJpbmc7XG4gIC8qKiBTdWNjZXNzZnVsIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIGluIHRoZSBidWNrZXQuICovXG4gIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gIC8qKiBGYWlsZWQgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbnMgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBzdWNjZWVkZWQgKyBmYWlsZWQgaW4gdGhlIGJ1Y2tldCAoZGVwbG95IGF0dGVtcHRzKS4gKi9cbiAgdG90YWw6IG51bWJlcjtcbiAgLyoqIGZhaWxlZC90b3RhbCBhcyBhIHBlcmNlbnQgKDAgd2hlbiB0b3RhbCBpcyAwKS4gRGVwbG95LXRpbWUgQ0ZSIG9ubHkuICovXG4gIGNoYW5nZUZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuLyoqIFBlci1zdGFnZSBidWlsZC1oZWFsdGggbWV0cmljcyAoUGhhc2UgNikgZm9yIG9uZSBwaXBlbGluZSBvdmVyIGEgd2luZG93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEhlYWx0aFN0YWdlIHtcbiAgc3RhZ2U6IHN0cmluZztcbiAgLyoqIFRlcm1pbmFsIHN0YWdlIHJ1bnMgKHN1Y2NlZWRlZCArIGZhaWxlZCkgaW4gdGhlIHdpbmRvdy4gKi9cbiAgcnVuczogbnVtYmVyO1xuICBzdWNjZXNzZXM6IG51bWJlcjtcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIHN1Y2Nlc3NlcyAvIHJ1bnMgYXMgYSBwZXJjZW50ICgwIHdoZW4gcnVucyBpcyAwKS4gKi9cbiAgc3VjY2Vzc1JhdGU6IG51bWJlcjtcbiAgLyoqIER1cmF0aW9uIHBlcmNlbnRpbGVzIG92ZXIgdGhlIHN0YWdlJ3MgdGVybWluYWwgcnVuczsgbnVsbCB3aGVuIG5vIGR1cmF0aW9ucy4gKi9cbiAgcDUwTXM6IG51bWJlciB8IG51bGw7XG4gIHA5ME1zOiBudW1iZXIgfCBudWxsO1xuICBwOTlNczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBQZXItcGlwZWxpbmUgYnVpbGQtaGVhbHRoIGJyZWFrZG93biAoUGhhc2UgNikuIFN0YW5kYXJkIHJlcG9ydGluZyAoTk9UXG4gKiBgYWR2YW5jZWRfcmVwb3J0aW5nYC1nYXRlZCkg4oCUIHBlci1zdGFnZSBzdWNjZXNzIHJhdGUgKyB0aW1pbmcgcGVyY2VudGlsZXMsIHdpdGhcbiAqIHRvdGFscyBzdW1tZWQgYWNyb3NzIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEhlYWx0aCB7XG4gIHN0YWdlczogQnVpbGRIZWFsdGhTdGFnZVtdO1xuICB0b3RhbHM6IHsgcnVuczogbnVtYmVyOyBmYWlsdXJlczogbnVtYmVyOyBmYWlsdXJlUmF0ZTogbnVtYmVyIH07XG59XG5cbi8qKiBQb3N0LWRlcGxveSBpbmNpZGVudCBtYXJrZXIgKFBoYXNlIDUpIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLnJlY29yZEluY2lkZW50YC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jaWRlbnRJbnB1dCB7XG4gIGluY2lkZW50SWQ6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgb3BlbmVkQXQ6IHN0cmluZztcbiAgcmVzb2x2ZWRBdD86IHN0cmluZztcbiAgc2V2ZXJpdHk6IHN0cmluZztcbn1cblxuLyoqIEV2ZW50IHBheWxvYWQgYWNjZXB0ZWQgYnkgYFJlcG9ydGluZ1NlcnZpY2UuaW5nZXN0RXZlbnRzYC4gTWlycm9ycyB0aGUgcm91dGUncyBab2Qgc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdEV2ZW50IHtcbiAgLyoqIFN0YWJsZSBwaXBlbGluZSBpZCB0aGUgZXZlbnRzIExhbWJkYSByZWFkIGZyb20gdGhlIGBwYi5waXBlbGluZS1pZGBcbiAgICogIHRhZyAoPSB0aGUgcGxhdGZvcm0gcGlwZWxpbmVJZCkuIFRoZSByZWdpc3RyeSBqb2luIGtleS4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfCAnY29kZWJ1aWxkJyB8ICdwbHVnaW4tYnVpbGQnO1xuICBldmVudFR5cGU6ICdQSVBFTElORScgfCAnU1RBR0UnIHwgJ0FDVElPTicgfCAnQlVJTEQnO1xuICBzdGF0dXM6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ/OiBzdHJpbmc7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGZhaWx1cmUgcmVhc29uIChBY3Rpb24gZXZlbnRzKS4gKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICAvKiogU291cmNlIGNvbW1pdCBpZCBvZiB0aGUgY2hhbmdlIGJlaW5nIHNoaXBwZWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIHJlZi9icmFuY2ggKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gKi9cbiAgY29tbWl0UmVmPzogc3RyaW5nO1xuICAvKiogRGVwbG95IHRhcmdldCAoZS5nLiBcInByb2R1Y3Rpb25cIikuIEl0cyBwcmVzZW5jZSBvbiBhIFNUQUdFL0FDVElPTiBldmVudFxuICAgKiAgbWFya3MgYSByZWFsIGRlcGxveW1lbnQgKGRlcml2ZWQgc2VydmVyLXNpZGUg4oCUIHRoZXJlIGlzIG5vIGBpc0RlcGxveWApLiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgLyoqIE9sZGVzdCB1bnNoaXBwZWQgY29tbWl0IHRpbWVzdGFtcCAoSVNPIDg2MDEpIGZvciBtZWFzdXJlZCBsZWFkIHRpbWUuICovXG4gIGNvbW1pdFRpbWVzdGFtcD86IHN0cmluZztcbiAgLyoqIE51bWJlciBvZiBjb21taXRzIHNoaXBwZWQgaW4gdGhpcyBjaGFuZ2UgKOKJpTEpLiAqL1xuICBjb21taXRDb3VudD86IG51bWJlcjtcbiAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogUGVyLWV2ZW50IG1ldHJpYyBkZXNjcmlwdG9yIGVtaXR0ZWQgKHZpYSB0aGUge0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuaW5nZXN0RXZlbnRzfVxuICogYG9uTWV0cmljYCBob29rKSBmb3IgZWFjaCBSRUdJU1RFUkVEIHRlcm1pbmFsIGRlcGxveS9zdGFnZSBldmVudCwgc28gdGhlIHJvdXRlXG4gKiBsYXllciBjYW4gZmFuIHRoZW0gaW50byBQcm9tZXRoZXVzIGNvdW50ZXJzIHdpdGhvdXQgcGlwZWxpbmUtZGF0YSBpbXBvcnRpbmdcbiAqIGFwaS1zZXJ2ZXIncyBtZXRyaWNzIHJlZ2lzdHJ5LiBgcmVzdWx0YCBpcyB0aGUgdGVybWluYWwgb3V0Y29tZTsgYGVudmlyb25tZW50YFxuICogaXMgbm9uLW51bGwgb25seSBmb3IgYSBkZXBsb3ktc3RhZ2UgZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0TWV0cmljIHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBzdGFnZTogc3RyaW5nO1xuICBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzdWx0OiAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnO1xufVxuXG4vKiogQ291bnRzICsgdGhlIChwb3NzaWJseSB0cnVuY2F0ZWQpIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyB0aGUgY2FsbGVyIGNhbiBsb2cuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdFJlc3VsdCB7XG4gIGluc2VydGVkOiBudW1iZXI7XG4gIHNraXBwZWQ6IG51bWJlcjtcbiAgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9uZSBvcmcncyBpbmdlc3Rpb24taGVhbHRoIHJvdyBhcyBSRUFEIGJhY2sgYnkgdGhlIFJlcG9ydHMgVUkgKFBoYXNlIDMpLiBUaGVcbiAqIEFXUyBldmVudHMgTGFtYmRhIHdyaXRlcyBpdDsgdGhpcyBpcyB0aGUgc2hhcGUgdGhhdCBsZXRzIHRoZSBVSSB0ZWxsXG4gKiBcImluZ2VzdGlvbiBpcyBoZWFsdGh5LCB0aGVyZSB3ZXJlIHNpbXBseSBubyBkZXBsb3lzIGluIHRoZSByYW5nZVwiIGFwYXJ0IGZyb21cbiAqIFwid2UgaGF2ZW4ndCBoZWFyZCBmcm9tIHRoZSBpbmdlc3QgcGlwZWxpbmUgc2luY2UgWFwiLlxuICpcbiAqIGBudWxsYCBmcm9tIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmdldEluZ2VzdEhlYWx0aH0gbWVhbnMgdGhlIGRlcGxveW1lbnQgaGFzXG4gKiBORVZFUiByZXBvcnRlZCDigJQgbm90IFwic3RhbGVcIi4gVGhlIHR3byBtdXN0IG5vdCBiZSBjb25mbGF0ZWQ6IGEgZnJlc2ggaW5zdGFsbFxuICogKG9yIG9uZSB3aG9zZSBmb3J3YXJkZXIgd2FzIG5ldmVyIHdpcmVkIHVwKSBoYXMgbm8gaGVhcnRiZWF0IGF0IGFsbCwgYW5kXG4gKiBjYWxsaW5nIHRoYXQgXCJzdGFsZVwiIHdvdWxkIGludmVudCBhIHJlZ3Jlc3Npb24gdGhhdCBuZXZlciBoYXBwZW5lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RIZWFsdGhTdGF0dXMge1xuICAvKiogV2hlbiB0aGUgZm9yd2FyZGVyIGxhc3QgcG9zdGVkIGEgaGVhcnRiZWF0IChpdHMgb3duIGNsb2NrLCBJU08gODYwMSkuICovXG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xuICAvKiogVGltZXN0YW1wIG9mIHRoZSBuZXdlc3QgZXZlbnQgaXQgaGFkIGZvcndhcmRlZCwgb3IgbnVsbCBpZiBpdCBoYXMgc2VlbiBub25lLiAqL1xuICBsYXN0RXZlbnRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEN1bXVsYXRpdmUgZXZlbnRzIGZvcndhcmRlZCwgb3IgbnVsbCB3aGVuIHRoZSBmb3J3YXJkZXIgZG9lc24ndCByZXBvcnQgaXQuICovXG4gIGZvcndhcmRlZDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIEN1bXVsYXRpdmUgZXZlbnRzIERST1BQRUQgKG5vbi16ZXJvIOKHkiBkYXRhIGxvc3MgdXBzdHJlYW0gb2YgdGhlIHJlcG9ydHMpLiAqL1xuICBkcm9wcGVkOiBudW1iZXIgfCBudWxsO1xufVxuXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgcm93IHNoYXBlcyBmb3IgdGhlIERPUkEgcXVlcmllcy4gRXhwb3J0ZWQgYmVjYXVzZSAuL2RvcmEudHMgY29uc3VtZXNcbiAqIHRoZW07IG5vdCBwYXJ0IG9mIHRoZSBwYWNrYWdlJ3MgcHVibGljIHN1cmZhY2UgKHJlcG9ydGluZy1zZXJ2aWNlLnRzXG4gKiByZS1leHBvcnRzIHRoaXMgbW9kdWxlIHdob2xlc2FsZSwgd2hpY2ggaXMgYSBkZWxpYmVyYXRlIHNpbXBsaWZpY2F0aW9uIOKAlCB0aGVzZVxuICogZGVzY3JpYmUgcXVlcnkgcmVzdWx0cywgbm90IEFQSSBjb250cmFjdHMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVJvdyB7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIHN0YXR1czogJ1NVQ0NFRURFRCcgfCAnRkFJTEVEJyB8IHN0cmluZztcbiAgLyoqIERlcGxveSBleGVjdXRpb24gaWQg4oCUIHRoZSBhdHRyaWJ1dGlvbiBrZXkgZm9yIGRlZHVwIGFnYWluc3Qgb3V0Y29tZXMvaW5jaWRlbnRzLiAqL1xuICBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgY29tbWl0X3RzOiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZGVwbG95IGNvbXBsZXRlZCBpbnNpZGUgW2Zyb20sdG9dLiBBYnNlbnQgKHVuZGVmaW5lZCkgaW4gdW5pdFxuICAgKiBmaXh0dXJlcyDih5IgdHJlYXRlZCBhcyBpbi13aW5kb3cuIGB0YC9gZmAgdG9sZXJhdGVkIChwZyBib29sZWFuIHRleHQgZm9ybSkuXG4gICAqL1xuICBpbl93aW5kb3c/OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFJhdyBwb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlciByb3cgKGZyb20gYGRlcGxveW1lbnRfb3V0Y29tZXNgLCBpbi13aW5kb3cpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdXRjb21lUm93IHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gIG91dGNvbWU6ICdmYWlsZWQnIHwgJ3Jlc3RvcmVkJyB8IHN0cmluZztcbiAgLyoqIEV4ZWN1dGlvbiB0aGUgdXNlciBtYXJrZWQg4oCUIGRlZHVwIGtleSBhZ2FpbnN0IGluY2lkZW50LWNvcnJlbGF0ZWQgZGVwbG95cy4gKi9cbiAgZXhlY3V0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogUHJvZHVjdGlvbiByZXN0b3JlZC1pbmNpZGVudCBwYWlyOiByZWNvdmVyeSB0aW1lICsgdGhlIGRlcGxveSdzIGNvbXBsZXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIE10dHJQYWlyUm93IHtcbiAgcmVzdG9yZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gIGRlcGxveWVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAvKiogRXhlY3V0aW9uIGlkIOKAlCBsZXRzIGluY2lkZW50IHByZWNlZGVuY2Ugb3ZlcnJpZGUgdGhlIG1hbnVhbCBvdXRjb21lIHBlciBkZXBsb3kuICovXG4gIGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSYXcgaW5jaWRlbnQgcm93IChmcm9tIGBpbmNpZGVudHNgLCBvcGVuZWQgaW4td2luZG93KS4gQ29ycmVsYXRlZCBpbiBKUyB0byB0aGVcbiAqIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGBlbnZpcm9ubWVudGAgd2l0aGluIERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTXG4gKiDihpIgYW4gYXV0b21hdGVkIHBvc3QtZGVwbG95IGZhaWx1cmUgKENGUikgKyByZWFsIHJlY292ZXJ5IHRpbWUgKE1UVFIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50Um93IHtcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgb3BlbmVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICByZXNvbHZlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIENvdmVyYWdlIGNvdW50czogcmVnaXN0ZXJlZCBwaXBlbGluZXMgdnMgdGhvc2UgdGhhdCBhY3R1YWxseSBkZXBsb3llZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ292ZXJhZ2VSb3cge1xuICByZWdpc3RlcmVkOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBkZXBsb3lpbmc6IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG59XG4iXX0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ExecutionCount, TimeSeriesEntry, DurationStats, PipelineExecution, StageFailure, StageBottleneck, ActionFailure, ErrorEntry, PluginSummary, TypeComputeDistribution, VersionCount, BuildTimeSeriesEntry, BuildDuration, BuildFailure, ReportingRetentionOptions, ReportingRetentionCounts, DoraOptions, IncidentSettings, ReportingSettingsPatch, IncidentListItem, IncidentTestResult, DoraMetrics, DoraTrendPoint, BuildHealth, IncidentInput, IngestEvent, IngestMetric, IngestResult } from './reporting/types.js';
|
|
2
|
-
export type { BuildHealth, BuildHealthStage, DoraEnvMetrics, DoraLevel, DoraMetrics, DoraOptions, DoraTrendPoint, IncidentInput, IncidentListItem, IncidentSettings, IncidentTestResult, IngestEvent, IngestMetric, IngestResult, ReportingRetentionCounts, ReportingRetentionOptions, ReportingRetentionSettings, ReportingSettingsPatch, } from './reporting/types.js';
|
|
1
|
+
import type { ExecutionCount, TimeSeriesEntry, DurationStats, PipelineExecution, StageFailure, StageBottleneck, ActionFailure, ErrorEntry, PluginSummary, TypeComputeDistribution, VersionCount, BuildTimeSeriesEntry, BuildDuration, BuildFailure, ReportingRetentionOptions, ReportingRetentionCounts, DoraOptions, IncidentSettings, ReportingSettingsPatch, IncidentListItem, IncidentTestResult, DoraMetrics, DoraTrendPoint, BuildHealth, IncidentInput, IngestEvent, IngestMetric, IngestResult, IngestHealthStatus } from './reporting/types.js';
|
|
2
|
+
export type { BuildHealth, BuildHealthStage, DoraEnvMetrics, DoraLevel, DoraMetrics, DoraOptions, DoraTrendPoint, IncidentInput, IncidentListItem, IncidentSettings, IncidentTestResult, IngestEvent, IngestHealthStatus, IngestMetric, IngestResult, ReportingRetentionCounts, ReportingRetentionOptions, ReportingRetentionSettings, ReportingSettingsPatch, } from './reporting/types.js';
|
|
3
3
|
export { resolveDoraRetentionDays, resolveEventRetentionDays, retentionCutoff } from './reporting/retention.js';
|
|
4
4
|
export declare class ReportingService {
|
|
5
5
|
#private;
|
|
@@ -172,6 +172,13 @@ export declare class ReportingService {
|
|
|
172
172
|
dropped?: number;
|
|
173
173
|
lastEventAt?: string;
|
|
174
174
|
}): Promise<void>;
|
|
175
|
+
/**
|
|
176
|
+
* Read back one org's ingestion health (Phase 3) for the Reports UI freshness
|
|
177
|
+
* indicator. Returns `null` when the org has NO row — i.e. the deployment has
|
|
178
|
+
* never ingested anything — which the UI must render as "no ingest reported
|
|
179
|
+
* yet", never as "stale". RLS-scoped to the org like every other read.
|
|
180
|
+
*/
|
|
181
|
+
getIngestHealth(orgId: string): Promise<IngestHealthStatus | null>;
|
|
175
182
|
/**
|
|
176
183
|
* Reporting retention sweep (Phase 7). Hard-deletes rows older than their
|
|
177
184
|
* retention window, by `created_at`, across every org that has reporting data —
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { createLogger, errorMessage, scrubAwsIdentifiers, scrubAwsIdentifiersFromString } from '@pipeline-builder/api-core';
|
|
4
|
-
import { inArray, sql } from 'drizzle-orm';
|
|
4
|
+
import { eq, inArray, sql } from 'drizzle-orm';
|
|
5
5
|
import { drizzleRows } from './crud-service.js';
|
|
6
6
|
import { schema } from '../database/drizzle-schema.js';
|
|
7
7
|
import { withTenantTx, runWithTenantContext } from '../database/tenancy.js';
|
|
@@ -745,6 +745,28 @@ export class ReportingService {
|
|
|
745
745
|
},
|
|
746
746
|
})));
|
|
747
747
|
}
|
|
748
|
+
/**
|
|
749
|
+
* Read back one org's ingestion health (Phase 3) for the Reports UI freshness
|
|
750
|
+
* indicator. Returns `null` when the org has NO row — i.e. the deployment has
|
|
751
|
+
* never ingested anything — which the UI must render as "no ingest reported
|
|
752
|
+
* yet", never as "stale". RLS-scoped to the org like every other read.
|
|
753
|
+
*/
|
|
754
|
+
async getIngestHealth(orgId) {
|
|
755
|
+
const rows = await runWithTenantContext({ orgId, isSuperAdmin: false }, () => withTenantTx((tx) => tx
|
|
756
|
+
.select()
|
|
757
|
+
.from(schema.ingestHealth)
|
|
758
|
+
.where(eq(schema.ingestHealth.orgId, orgId))
|
|
759
|
+
.limit(1)));
|
|
760
|
+
const row = rows[0];
|
|
761
|
+
if (!row)
|
|
762
|
+
return null;
|
|
763
|
+
return {
|
|
764
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
765
|
+
lastEventAt: row.lastEventAt ? row.lastEventAt.toISOString() : null,
|
|
766
|
+
forwarded: row.forwarded ?? null,
|
|
767
|
+
dropped: row.dropped ?? null,
|
|
768
|
+
};
|
|
769
|
+
}
|
|
748
770
|
/**
|
|
749
771
|
* Batched hard-DELETE of one reporting table's rows expired past a `created_at`
|
|
750
772
|
* cutoff, scoped to an org and an optional row predicate (Phase 7). Uses a
|
|
@@ -861,4 +883,4 @@ export class ReportingService {
|
|
|
861
883
|
}
|
|
862
884
|
}
|
|
863
885
|
export const reportingService = new ReportingService();
|
|
864
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1SCxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxnRkFBZ0Y7QUFDaEYsNEVBQTRFO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckcsT0FBTyxFQUNMLGNBQWMsSUFBSSxXQUFXLEVBQzdCLFlBQVksSUFBSSxTQUFTLEVBQ3pCLGNBQWMsSUFBSSxXQUFXLEdBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRSw4RUFBOEU7QUFDOUUsT0FBTyxFQUNMLDhCQUE4QixFQUFFLDZCQUE2QixFQUM3RCx5QkFBeUIsRUFBRSx3QkFBd0IsRUFBRSxlQUFlLEdBQ3JFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBd0J6RyxPQUFPLEVBQUUs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Q0FDekQsV0FBVyxFQUNYLEdBQUcsQ0FBQSxZQUFZLEtBQUssaURBQWlELFVBQVUsRUFBRSxFQUNqRixTQUFTLEVBQUUsVUFBVSxDQUN0QixDQUFDO29CQUNGLE1BQU0sQ0FBQyxrQkFBa0IsSUFBSSxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FDakUsYUFBYSxFQUNiLEdBQUcsQ0FBQSxZQUFZLEtBQUsscUJBQXFCLFVBQVUsRUFBRSxFQUNyRCxTQUFTLEVBQUUsVUFBVSxDQUN0QixDQUFDO29CQUNGLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQ3hELGNBQWMsRUFDZCxHQUFHLENBQUEsWUFBWSxLQUFLLHFCQUFxQixVQUFVLEVBQUUsRUFDckQsU0FBUyxFQUFFLFVBQVUsQ0FDdEIsQ0FBQztnQkFDSixDQUFDO2dCQUNELE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDM0csSUFBSSxTQUFTLEdBQUcsQ0FBQztnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLCtDQUErQyxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQy9GLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBzY3J1YkF3c0lkZW50aWZpZXJzLCBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGluQXJyYXksIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vLyBFeHRyYWN0ZWQgZm9yIHNpemUg4oCUIHNlZSAuL3JlcG9ydGluZy8uIEV2ZXJ5dGhpbmcgcHVibGljIGlzIHJlLWV4cG9ydGVkIGJlbG93XG4vLyBzbyBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAncyBzdXJmYWNlIGlzIHVuY2hhbmdlZCBieSB0aGUgc3BsaXQuXG5pbXBvcnQgeyBpbnZlbnRvcnlDYWNoZSwgdGltZXNlcmllc0NhY2hlIH0gZnJvbSAnLi9yZXBvcnRpbmcvY2FjaGVzLmpzJztcbmltcG9ydCB7IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLCByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyB9IGZyb20gJy4vcmVwb3J0aW5nL2RvcmEtc2NvcmluZy5qcyc7XG5pbXBvcnQge1xuICBnZXREb3JhTWV0cmljcyBhcyBkb3JhTWV0cmljcyxcbiAgZ2V0RG9yYVRyZW5kIGFzIGRvcmFUcmVuZCxcbiAgZ2V0QnVpbGRIZWFsdGggYXMgYnVpbGRIZWFsdGgsXG59IGZyb20gJy4vcmVwb3J0aW5nL2RvcmEuanMnO1xuaW1wb3J0IHsgb3JnU2NvcGUsIHJ1blJlcG9ydCB9IGZyb20gJy4vcmVwb3J0aW5nL3F1ZXJ5LXNjb3BlLmpzJztcbi8vIEFsaWFzZWQ6IHRoZSBtb2R1bGUgZnVuY3Rpb25zIGFuZCB0aGUgZGVsZWdhdGluZyBtZXRob2RzIGJlbG93IHNoYXJlIG5hbWVzLlxuaW1wb3J0IHtcbiAgUkVQT1JUSU5HX0VWRU5UX1JFVEVOVElPTl9EQVlTLCBSRVBPUlRJTkdfRE9SQV9SRVRFTlRJT05fREFZUyxcbiAgcmVzb2x2ZUV2ZW50UmV0ZW50aW9uRGF5cywgcmVzb2x2ZURvcmFSZXRlbnRpb25EYXlzLCByZXRlbnRpb25DdXRvZmYsXG59IGZyb20gJy4vcmVwb3J0aW5nL3JldGVudGlvbi5qcyc7XG5pbXBvcnQgeyBhc3NlcnRSZXBvcnRJbnRlcnZhbCwgc2NydWJPcHRpb25hbCwgb3B0aW9uYWxTdGFydGVkQXRSYW5nZSB9IGZyb20gJy4vcmVwb3J0aW5nL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRXhlY3V0aW9uQ291bnQsIFRpbWVTZXJpZXNFbnRyeSwgRHVyYXRpb25TdGF0cywgUGlwZWxpbmVFeGVjdXRpb24sIFN0YWdlRmFpbHVyZSwgU3RhZ2VCb3R0bGVuZWNrLFxuICBBY3Rpb25GYWlsdXJlLCBFcnJvckVudHJ5LCBQbHVnaW5TdW1tYXJ5LCBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiwgVmVyc2lvbkNvdW50LFxuICBCdWlsZFRpbWVTZXJpZXNFbnRyeSwgQnVpbGREdXJhdGlvbiwgQnVpbGRGYWlsdXJlLFxuICBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zLCBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsXG4gIERvcmFPcHRpb25zLCBJbmNpZGVudFNldHRpbmdzLCBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLCBJbmNpZGVudExpc3RJdGVtLCBJbmNpZGVudFRlc3RSZXN1bHQsXG4gIERvcmFNZXRyaWNzLCBEb3JhVHJlbmRQb2ludCwgQnVpbGRIZWFsdGgsIEluY2lkZW50SW5wdXQsXG4gIEluZ2VzdEV2ZW50LCBJbmdlc3RNZXRyaWMsIEluZ2VzdFJlc3VsdCxcbn0gZnJvbSAnLi9yZXBvcnRpbmcvdHlwZXMuanMnO1xuXG4vLyBSZS1leHBvcnQgRVhBQ1RMWSB0aGUgc3VyZmFjZSB0aGlzIG1vZHVsZSBoYWQgYmVmb3JlIHRoZSBzcGxpdCDigJQgbm8gbW9yZS5cbi8vIGBzcmMvaW5kZXgudHNgIGRvZXMgYGV4cG9ydCAqIGZyb20gJy4vYXBpL3JlcG9ydGluZy1zZXJ2aWNlLmpzJ2AsIHNvIGFueXRoaW5nXG4vLyByZS1leHBvcnRlZCBoZXJlIGJlY29tZXMgcGFydCBvZiB0aGUgcGFja2FnZSdzIHB1YmxpYyBBUEkuIEVudW1lcmF0ZWQgcmF0aGVyXG4vLyB0aGFuIGBleHBvcnQgKmAgZm9yIHRoYXQgcmVhc29uOiB0aGUgZXh0cmFjdGVkIG1vZHVsZXMgYWxzbyBleHBvcnQgaW50ZXJuYWxzXG4vLyAob3JnU2NvcGUsIHJ1blJlcG9ydCwgdGhlIGNhY2hlcywgdGhlIERPUkEgcm93IHNoYXBlcykgdGhhdCB3ZXJlIHByaXZhdGVcbi8vIGJlZm9yZSBhbmQgbXVzdCBzdGF5IHRoYXQgd2F5LlxuZXhwb3J0IHR5cGUge1xuICBCdWlsZEhlYWx0aCwgQnVpbGRIZWFsdGhTdGFnZSwgRG9yYUVudk1ldHJpY3MsIERvcmFMZXZlbCwgRG9yYU1ldHJpY3MsIERvcmFPcHRpb25zLCBEb3JhVHJlbmRQb2ludCxcbiAgSW5jaWRlbnRJbnB1dCwgSW5jaWRlbnRMaXN0SXRlbSwgSW5jaWRlbnRTZXR0aW5ncywgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICBJbmdlc3RFdmVudCwgSW5nZXN0TWV0cmljLCBJbmdlc3RSZXN1bHQsXG4gIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cywgUmVwb3J0aW5nUmV0ZW50aW9uT3B0aW9ucywgUmVwb3J0aW5nUmV0ZW50aW9uU2V0dGluZ3MsXG4gIFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gsXG59IGZyb20gJy4vcmVwb3J0aW5nL3R5cGVzLmpzJztcbmV4cG9ydCB7IHJlc29sdmVEb3JhUmV0ZW50aW9uRGF5cywgcmVzb2x2ZUV2ZW50UmV0ZW50aW9uRGF5cywgcmV0ZW50aW9uQ3V0b2ZmIH0gZnJvbSAnLi9yZXBvcnRpbmcvcmV0ZW50aW9uLmpzJztcblxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcG9ydGluZy1zZXJ2aWNlJyk7XG5cbmV4cG9ydCBjbGFzcyBSZXBvcnRpbmdTZXJ2aWNlIHtcblxuICAvKiogSW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlcG9ydHMgZm9yIGFuIG9yZyAoY2FsbCBhZnRlciBldmVudCBpbmdlc3QpLiAqL1xuICBhc3luYyBpbnZhbGlkYXRlT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBpbnZlbnRvcnlDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgICAgdGltZXNlcmllc0NhY2hlLmludmFsaWRhdGVQYXR0ZXJuKGAke29yZ0lkfToqYCksXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBpbmNvbWluZyBldmVudHMgYWdhaW5zdCB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIGJhdGNoLWluc2VydCB0aGVcbiAgICogbWF0Y2hlZCBvbmVzLCBhbmQgaW52YWxpZGF0ZSByZXBvcnRpbmcgY2FjaGVzIGZvciBhZmZlY3RlZCBvcmdzLlxuICAgKiBFdmVudHMgZm9yIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgYXJlIGRyb3BwZWQgKGFuZCBsb2dnZWQgYXQgV0FSTlxuICAgKiB3aXRoIHNhbXBsZSBpZHMgc28gYW4gb3BlcmF0b3IgY2FuIHNlZSB3aGVuIEV2ZW50QnJpZGdlIGlzIGRlbGl2ZXJpbmdcbiAgICogZXZlbnRzIGZvciBwaXBlbGluZXMgdGhhdCBoYXZlbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0KS5cbiAgICpcbiAgICogUmV0dXJucyBjb3VudHMgKyBhIHNhbXBsZSBvZiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGZvciBvYnNlcnZhYmlsaXR5LlxuICAgKi9cbiAgYXN5bmMgaW5nZXN0RXZlbnRzKGV2ZW50czogSW5nZXN0RXZlbnRbXSwgb25NZXRyaWM/OiAobTogSW5nZXN0TWV0cmljKSA9PiB2b2lkKTogUHJvbWlzZTxJbmdlc3RSZXN1bHQ+IHtcbiAgICAvLyBNdWx0aS1vcmcgYmF0Y2ggaW5zZXJ0OiB0aGUgY2FsbGVyIHJlc29sdmVzIHRvIG11bHRpcGxlIG9yZ3MgdmlhIHRoZVxuICAgIC8vIHBpcGVsaW5lLXJlZ2lzdHJ5IGxvb2t1cCBiZWxvdywgc28gdGhlIHJvdXRlIGxheWVyIE1VU1QgZXN0YWJsaXNoIGFcbiAgICAvLyBgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgLi4uKWAgc2NvcGUgYmVmb3JlIGNhbGxpbmdcbiAgICAvLyB0aGlzIG1ldGhvZC4gVW5kZXIgRk9SQ0UnZCBSTFMsIGEgc2luZ2xlIHR4IHdpdGggYGFwcC5vcmdfaWQgPSA8b25lXG4gICAgLy8gb3JnPmAgY291bGQgb25seSB3cml0ZSBldmVudHMgZm9yIHRoYXQgb3JnOyBieXBhc3MgdmlhIHN5c2FkbWluIGlzXG4gICAgLy8gdGhlIHJpZ2h0IGdhdGUgZm9yIHRoaXMgc2VydmVyLWludGVybmFsIGNyb3NzLXRlbmFudCBlbmRwb2ludC4gU2VlXG4gICAgLy8gYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50cyBmb3IgdGhlIHdyYXBwZXIuXG4gICAgLy8gUnVuIGluc2VydCBpbnNpZGUgdGhlIHR4LCBidXQgQ09MTEVDVCBhZmZlY3RlZCBvcmdzIGFuZCBpbnZhbGlkYXRlXG4gICAgLy8gY2FjaGVzIEFGVEVSIHRoZSB0eCByZXNvbHZlcy4gS2VlcGluZyBpbnZhbGlkYXRpb24gaW5zaWRlIHRoZSB0eCBoZWxkXG4gICAgLy8gdGhlIHBnIGxvY2tzIG9wZW4gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FjaGUgcm91bmQtdHJpcHMgKFJlZGlzIG9yXG4gICAgLy8gaW4tbWVtb3J5IGludmFsaWRhdGlvbnMgYXJlIHVucmVsYXRlZCB0byB0aGUgdHggYnV0IHN0aWxsIHNlcmlhbGl6ZWRcbiAgICAvLyBpdHMgY29tbWl0KS4gQ2FjaGUgVFRMIGlzIDItNSBtaW4gc28gZmlyZS1hbmQtZm9yZ2V0IHBvc3QtY29tbWl0IGlzXG4gICAgLy8gYW4gYWNjZXB0YWJsZSB0cmFkZSBmb3IgdGlnaHRlciBsb2NrIHdpbmRvd3MuXG4gICAgY29uc3QgeyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMsIGFmZmVjdGVkT3JncywgaW5zZXJ0ZWRSb3dzIH0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAvLyBCYXRjaC1yZXNvbHZlIGFsbCB1bmlxdWUgcGlwZWxpbmUgaWRzIGluIG9uZSBxdWVyeVxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQoZXZlbnRzLm1hcChlID0+IGUucGlwZWxpbmVJZCkpXTtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5Um93cyA9IGF3YWl0IHR4XG4gICAgICAgIC5zZWxlY3Qoe1xuICAgICAgICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgICB9KVxuICAgICAgICAuZnJvbShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeSlcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCwgdW5pcXVlSWRzKSk7XG5cbiAgICAgIGNvbnN0IGlkTWFwID0gbmV3IE1hcChyZWdpc3RyeVJvd3MubWFwKHIgPT4gW3IucGlwZWxpbmVJZCwgcl0pKTtcblxuICAgICAgLy8gQnVpbGQgaW5zZXJ0IGJhdGNoIChza2lwIGV2ZW50cyB3aG9zZSBwaXBlbGluZSBpc24ndCByZWdpc3RlcmVkKVxuICAgICAgY29uc3Qgcm93czogQXJyYXk8dHlwZW9mIHNjaGVtYS5waXBlbGluZUV2ZW50LiRpbmZlckluc2VydD4gPSBbXTtcbiAgICAgIGxldCBza2lwcGVkTG9jYWwgPSAwO1xuICAgICAgY29uc3QgdW5yZWdpc3RlcmVkTG9jYWw6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaWRNYXAuZ2V0KGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgICAgc2tpcHBlZExvY2FsKys7XG4gICAgICAgICAgdW5yZWdpc3RlcmVkTG9jYWwucHVzaChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgLy8gcmVnaXN0cnkucGlwZWxpbmVJZCA9PT0gZXZlbnQucGlwZWxpbmVJZDsgdXNlIHRoZSByZWdpc3RyeSdzIHNvIHRoZVxuICAgICAgICAgIC8vIEZLIGlzIGFsd2F5cyBhIHJvdyB0aGF0IGV4aXN0cywgYW5kIHB1bGwgb3JnSWQgZnJvbSB0aGUgcmVnaXN0cnkgZm9yXG4gICAgICAgICAgLy8gdGVuYW5jeSAobmV2ZXIgdHJ1c3QgdGhlIGNhbGxlcidzIGNsYWltZWQgb3JnKS5cbiAgICAgICAgICBwaXBlbGluZUlkOiByZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiByZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgICBldmVudFNvdXJjZTogZXZlbnQuZXZlbnRTb3VyY2UsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgc3RhdHVzOiBldmVudC5zdGF0dXMsXG4gICAgICAgICAgLy8gZXhlY3V0aW9uSWQgaXMgYW4gQVdTLUFTU0lHTkVEIGlkZW50aWZpZXIgKGEgVVVJRCksIG5vdCBmcmVlLWZvcm1cbiAgICAgICAgICAvLyB1c2VyIHRleHQsIHNvIGl0IGNhbid0IGNhcnJ5IGFuIGFjY291bnQgaWQg4oCUIGFuZCBzY3J1YmJpbmcgYSBVVUlEXG4gICAgICAgICAgLy8gdGhhdCBoYXBwZW5zIHRvIGNvbnRhaW4gYSAxMi1kaWdpdCBydW4gd291bGQgY29ycnVwdCB0aGUgY29ycmVsYXRpb25cbiAgICAgICAgICAvLyBrZXkuIExlZnQgaW50YWN0IGJ5IGRlc2lnbi5cbiAgICAgICAgICBleGVjdXRpb25JZDogZXZlbnQuZXhlY3V0aW9uSWQsXG4gICAgICAgICAgLy8gc3RhZ2VOYW1lL2FjdGlvbk5hbWUgYXJlIFVTRVItQVVUSE9SRUQgcGlwZWxpbmUtc3RydWN0dXJlIG5hbWVzXG4gICAgICAgICAgLy8gcHJvbW90ZWQgZnJvbSB0aGUgQ29kZVBpcGVsaW5lIGRldGFpbCDigJQgc2FtZSB1bnRydXN0ZWQtQVdTLWRlcml2ZWRcbiAgICAgICAgICAvLyBvcmlnaW4gYXMgZXJyb3JNZXNzYWdlIGJlbG93LCBzbyBzY3J1YiB0aGVtIGF0IHRoaXMgcGVyc2lzdGVuY2VcbiAgICAgICAgICAvLyBib3VuZGFyeSB0b28gKGEgc3RhZ2UgbmFtZWQgd2l0aCBhbiBBUk4vMTItZGlnaXQgaWQgbXVzdCBub3QgcGVyc2lzdCkuXG4gICAgICAgICAgc3RhZ2VOYW1lOiBzY3J1Yk9wdGlvbmFsKGV2ZW50LnN0YWdlTmFtZSksXG4gICAgICAgICAgYWN0aW9uTmFtZTogc2NydWJPcHRpb25hbChldmVudC5hY3Rpb25OYW1lKSxcbiAgICAgICAgICAvLyBIQVJEIENPTlNUUkFJTlQ6IGFuIEFXUyBhY2NvdW50IGlkIG11c3QgTkVWRVIgYmUgcGVyc2lzdGVkLiBUaGlzIGlzXG4gICAgICAgICAgLy8gdGhlIERVUkFCTEUgcGVyc2lzdGVuY2UgYm91bmRhcnkgYW5kIG11c3Qgbm90IHRydXN0IHVwc3RyZWFtOlxuICAgICAgICAgIC8vIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgZmFpbHVyZSBkZXRhaWwgJiBtZXNzYWdlcyByb3V0aW5lbHkgY2FycnlcbiAgICAgICAgICAvLyBBUk5zIChhcm46YXdzOuKApjo8YWNjb3VudC1pZD464oCmKSBhbmQgYmFyZSAxMi1kaWdpdCBhY2NvdW50IGlkcy4gU2NydWJcbiAgICAgICAgICAvLyBib3RoIGZyZWUtZm9ybSBmaWVsZHMgaGVyZSBiZWZvcmUgaW5zZXJ0IChwZXItZXZlbnQsIG5vbi1tdXRhdGluZykuXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBzY3J1Yk9wdGlvbmFsKGV2ZW50LmVycm9yTWVzc2FnZSksXG4gICAgICAgICAgc3RhcnRlZEF0OiBldmVudC5zdGFydGVkQXQgPyBuZXcgRGF0ZShldmVudC5zdGFydGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBldmVudC5jb21wbGV0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LmNvbXBsZXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkdXJhdGlvbk1zOiBldmVudC5kdXJhdGlvbk1zLFxuICAgICAgICAgIC8vIERlcGxveS1hdHRyaWJ1dGlvbiBmaWVsZHMg4oCUIHNjcnViYmVkIGxpa2UgdGhlIG90aGVyIGZyZWUtZm9ybSBzdHJpbmdzXG4gICAgICAgICAgLy8gc28gYW4gQVJOL2FjY291bnQgaWQgY2FuIG5ldmVyIGVudGVyIHZpYSBhIHJlZiBvciBlbnZpcm9ubWVudCBuYW1lLlxuICAgICAgICAgIGNvbW1pdFNoYTogc2NydWJPcHRpb25hbChldmVudC5jb21taXRTaGEpLFxuICAgICAgICAgIGNvbW1pdFJlZjogc2NydWJPcHRpb25hbChldmVudC5jb21taXRSZWYpLFxuICAgICAgICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGV2ZW50LmVudmlyb25tZW50KSxcbiAgICAgICAgICAvLyBNZWFzdXJlZCBsZWFkIHRpbWUgKFBoYXNlIDQpOiBvbGRlc3QgdW5zaGlwcGVkIGNvbW1pdCB0aW1lICsgY291bnQuXG4gICAgICAgICAgLy8gY29tbWl0VGltZXN0YW1wIGlzIGFuIEFXUy9TQ00tZGVyaXZlZCBpbnN0YW50IChuZXZlciBhY2NvdW50LWlkXG4gICAgICAgICAgLy8gc2hhcGVkKTsgY29tbWl0Q291bnQgaXMgYSBwbGFpbiBpbnRlZ2VyLiBOZWl0aGVyIG5lZWRzIHNjcnViYmluZy5cbiAgICAgICAgICBjb21taXRUaW1lc3RhbXA6IGV2ZW50LmNvbW1pdFRpbWVzdGFtcCA/IG5ldyBEYXRlKGV2ZW50LmNvbW1pdFRpbWVzdGFtcCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tbWl0Q291bnQ6IGV2ZW50LmNvbW1pdENvdW50LFxuICAgICAgICAgIGRldGFpbDogZXZlbnQuZGV0YWlsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVycyhldmVudC5kZXRhaWwpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIH1cblxuICAgICAgLy8gU1FTIGlzIGF0LWxlYXN0LW9uY2UsIHNvIEV2ZW50QnJpZGdlIGNhbiBkZWxpdmVyIHRoZSBzYW1lIHN0YXRlLWNoYW5nZVxuICAgICAgLy8gdHdpY2UuIGBvbkNvbmZsaWN0RG9Ob3RoaW5nYCArIHRoZSBwYXJ0aWFsIHVuaXF1ZSBpbmRleCBvblxuICAgICAgLy8gKHBpcGVsaW5lX2lkLCBleGVjdXRpb25faWQsIGV2ZW50X3R5cGUsIHN0YXR1cywgc3RhZ2VfbmFtZSwgYWN0aW9uX25hbWUpXG4gICAgICAvLyBtYWtlcyByZS1kZWxpdmVyeSBpZGVtcG90ZW50LiBgcmV0dXJuaW5nYCBnaXZlcyB0aGUgUkVBTCBpbnNlcnRlZCBzZXQgc29cbiAgICAgIC8vIGNvdW50cywgbWV0cmljcyBhbmQgY2FjaGUgaW52YWxpZGF0aW9uIGFsbCBpZ25vcmUgZHVwbGljYXRlcy5cbiAgICAgIGNvbnN0IGxhbmRlZCA9IHJvd3MubGVuZ3RoID4gMFxuICAgICAgICA/IGF3YWl0IHR4Lmluc2VydChzY2hlbWEucGlwZWxpbmVFdmVudCkudmFsdWVzKHJvd3MpXG4gICAgICAgICAgLm9uQ29uZmxpY3REb05vdGhpbmcoKVxuICAgICAgICAgIC5yZXR1cm5pbmcoe1xuICAgICAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50Lm9yZ0lkLFxuICAgICAgICAgICAgcGlwZWxpbmVJZDogc2NoZW1hLnBpcGVsaW5lRXZlbnQucGlwZWxpbmVJZCxcbiAgICAgICAgICAgIGV2ZW50VHlwZTogc2NoZW1hLnBpcGVsaW5lRXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgICAgc3RhdHVzOiBzY2hlbWEucGlwZWxpbmVFdmVudC5zdGF0dXMsXG4gICAgICAgICAgICBzdGFnZU5hbWU6IHNjaGVtYS5waXBlbGluZUV2ZW50LnN0YWdlTmFtZSxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBzY2hlbWEucGlwZWxpbmVFdmVudC5lbnZpcm9ubWVudCxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFtdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnNlcnRlZDogbGFuZGVkLmxlbmd0aCxcbiAgICAgICAgc2tpcHBlZDogc2tpcHBlZExvY2FsLFxuICAgICAgICB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkczogdW5yZWdpc3RlcmVkTG9jYWwsXG4gICAgICAgIGFmZmVjdGVkT3JnczogWy4uLm5ldyBTZXQobGFuZGVkLm1hcChyID0+IHIub3JnSWQpKV0sXG4gICAgICAgIGluc2VydGVkUm93czogbGFuZGVkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFBoYXNlIDNiOiBmYW4gdGVybWluYWwgU1RBR0Ugb3V0Y29tZXMgaW50byBQcm9tZXRoZXVzIGNvdW50ZXJzIHZpYSB0aGVcbiAgICAvLyByb3V0ZSdzIGhvb2sgKHBpcGVsaW5lLWRhdGEgY2FuJ3QgaW1wb3J0IGFwaS1zZXJ2ZXIncyByZWdpc3RyeSksIGFmdGVyIHRoZVxuICAgIC8vIGluc2VydCBDT01NSVRTLiBEcml2ZW4gb2ZmIHRoZSBJTlNFUlRFRCByb3dzIOKAlCBub3QgdGhlIHJlcXVlc3QgYmF0Y2gg4oCUIHNvIGEgcmUtZGVsaXZlcmVkIGV2ZW50XG4gICAgLy8gdGhlIGRlZHVwIGluZGV4IHN3YWxsb3dlZCBpcyBuZXZlciBjb3VudGVkIHR3aWNlIChjb3VudGVycywgdW5saWtlIHRoZVxuICAgIC8vIHRhYmxlLCBoYXZlIG5vIGlkZW1wb3RlbmN5IG9mIHRoZWlyIG93bikuIFZhbHVlcyBhcmUgdGhlIHBlcnNpc3RlZCxcbiAgICAvLyBhbHJlYWR5LXNjcnViYmVkIGNvbHVtbnMuIEEgbm9uLW51bGwgZW52aXJvbm1lbnQgYWxzbyBtYXJrcyBhIGRlcGxveS5cbiAgICBpZiAob25NZXRyaWMpIHtcbiAgICAgIGZvciAoY29uc3QgciBvZiBpbnNlcnRlZFJvd3MpIHtcbiAgICAgICAgaWYgKHIuZXZlbnRUeXBlICE9PSAnU1RBR0UnIHx8IChyLnN0YXR1cyAhPT0gJ1NVQ0NFRURFRCcgJiYgci5zdGF0dXMgIT09ICdGQUlMRUQnKSB8fCAhci5waXBlbGluZUlkKSBjb250aW51ZTtcbiAgICAgICAgb25NZXRyaWMoe1xuICAgICAgICAgIHBpcGVsaW5lSWQ6IHIucGlwZWxpbmVJZCxcbiAgICAgICAgICBvcmdJZDogci5vcmdJZCxcbiAgICAgICAgICBzdGFnZTogci5zdGFnZU5hbWUgPz8gJycsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHIuZW52aXJvbm1lbnQgPz8gbnVsbCxcbiAgICAgICAgICByZXN1bHQ6IHIuc3RhdHVzID09PSAnU1VDQ0VFREVEJyA/ICdzdWNjZWVkZWQnIDogJ2ZhaWxlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN1cmZhY2UgdGhlIHNpbGVudCBza2lwOiBhbiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWQgdXN1YWxseSBtZWFucyB0aGVcbiAgICAvLyBwaXBlbGluZSBoYXNuJ3QgY2FsbGVkIFBPU1QgL3BpcGVsaW5lcy9yZWdpc3RyeSB5ZXQgKG9yIGl0c1xuICAgIC8vIHBiLnBpcGVsaW5lLWlkIHRhZyBpcyBtaXNzaW5nL3VucmVhZGFibGUgYnkgdGhlIExhbWJkYSkuIExvZ2dpbmcgaXRcbiAgICAvLyBtYWtlcyBhIGJyb2tlbiBqb2luIHZpc2libGUgaW5zdGVhZCBvZiBsb29raW5nIGxpa2UgXCJubyBhY3Rpdml0eVwiLlxuICAgIGlmICh1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignUGlwZWxpbmUgZXZlbnRzIHNraXBwZWQ6IHBpcGVsaW5lIGlkIG5vdCBmb3VuZCBpbiByZWdpc3RyeScsIHtcbiAgICAgICAgY291bnQ6IHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLmxlbmd0aCxcbiAgICAgICAgc2FtcGxlOiB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5zbGljZSgwLCAzKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFBvc3QtY29tbWl0IGNhY2hlIGludmFsaWRhdGlvbi4gRmlyZS1hbmQtZm9yZ2V0IHdpdGggbG9nZ2luZyDigJQgVFRMIGlzXG4gICAgLy8gc2hvcnQgZW5vdWdoIHRoYXQgYSBtaXNzZWQgaW52YWxpZGF0aW9uIHNlbGYtaGVhbHMuXG4gICAgaWYgKGFmZmVjdGVkT3Jncy5sZW5ndGggPiAwKSB7XG4gICAgICB2b2lkIFByb21pc2UuYWxsKGFmZmVjdGVkT3Jncy5tYXAoKG9yZykgPT5cbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQ6IG9yZywgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICB9KSxcbiAgICAgICkpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGluc2VydGVkLCBza2lwcGVkLCB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcyB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDE6IFBpcGVsaW5lIEV4ZWN1dGlvbiAmIFBlcmZvcm1hbmNlIOKUgOKUgFxuXG5cbiAgLyoqIDEuMSBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9KTogUHJvbWlzZTxFeGVjdXRpb25Db3VudFtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgLy8gT3B0aW9uYWwgW2Zyb20sdG9dIHdpbmRvdyBvbiB0aGUgZXhlY3V0aW9uJ3Mgc3RhcnRlZF9hdCwgbWlycm9yaW5nIHRoZVxuICAgIC8vIHNpYmxpbmcgdGltZXNlcmllcyByZXBvcnRzIHNvIHRoZSBkYXNoYm9hcmQgZGF0ZS1yYW5nZSBwaWNrZXIgbmFycm93cyB0aGVcbiAgICAvLyBjb3VudCB0b28gKGFuIGVtcHR5IHJhbmdlID0gYWxsLXRpbWUsIHByZXNlcnZpbmcgdGhlIHByaW9yIGJlaGF2aW9yKS4gVGhlXG4gICAgLy8gcmFuZ2UgcmlkZXMgdGhlIEpPSU4gc28gcGlwZWxpbmVzIHdpdGggbm8gaW4td2luZG93IGV2ZW50cyBzdGlsbCBsaXN0XG4gICAgLy8gKExFRlQgc2VtYW50aWNzIHByZXNlcnZlZCB2aWEgdGhlIGlubmVyLWpvaW4gZmlsdGVyIOKAlCBhIHBpcGVsaW5lIHdpdGggemVyb1xuICAgIC8vIG1hdGNoaW5nIGV2ZW50cyBkcm9wcyBmcm9tIHRoZSBjb3VudCwgc2FtZSBhcyBiZWZvcmUgZm9yIGl0cyB3aW5kb3cpLlxuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gb3B0aW9uYWxTdGFydGVkQXRSYW5nZShyYW5nZSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAub3JnYW5pemF0aW9uLCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpOjppbnQgQVMgY2FuY2VsZWQsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgZmlyc3RfZXhlY3V0aW9uLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3RfZXhlY3V0aW9uXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmV9IHBcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlIE9OIGUucGlwZWxpbmVfaWQgPSBwLmlkXG4gICAgICAgICAgQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzICE9ICdTVEFSVEVEJ1xuICAgICAgICAgICR7cmFuZ2VDbGF1c2V9XG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIHAuaXNfYWN0aXZlID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSBwLmlkXG4gICAgICAgIE9SREVSIEJZIHRvdGFsIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFeGVjdXRpb25Db3VudD4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OmV4ZWMtY291bnQ6JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuMWIgUGVyLXBpcGVsaW5lIGV4ZWN1dGlvbiBoaXN0b3J5IOKAlCBESVNUSU5DVCBleGVjdXRpb25zIGZvciBvbmUgcGlwZWxpbmUsXG4gICAqIG5ld2VzdCBmaXJzdC4gR3JvdXBzIGFsbCBldmVudHMgYnkgYGV4ZWN1dGlvbl9pZGAgaW4gYSBzaW5nbGUgc2NhbiBhbmRcbiAgICogcm9sbHMgZWFjaCBleGVjdXRpb24gdXAgdG8gb25lIHJvdzpcbiAgICogICAtIHN0YXR1czogZGVyaXZlZCBmcm9tIHRoZSBQSVBFTElORS10eXBlIGV2ZW50cy4gRkFJTEVEIHdpbnMsIHRoZW5cbiAgICogICAgIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRDsgYW4gZXhlY3V0aW9uIHdpdGggbm8gdGVybWluYWwgUElQRUxJTkUgZXZlbnRcbiAgICogICAgIGlzIHN0aWxsIGBpbi1wcm9ncmVzc2AuXG4gICAqICAgLSBzdGFydGVkQXQvZW5kZWRBdC9kdXJhdGlvbk1zOiBmcm9tIHRoZSBQSVBFTElORSBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKiAgIC0gZmFpbGluZ1N0YWdlL2ZhaWxpbmdBY3Rpb246IHRoZSBmaXJzdCBGQUlMRUQgU1RBR0UvQUNUSU9OIGV2ZW50IChjaGVhcCDigJRcbiAgICogICAgIHNhbWUgc2Nhbiwgbm8gZXh0cmEgcXVlcnkpLlxuICAgKlxuICAgKiBPUkctU0NPUElORzogaWRlbnRpY2FsIHRvIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzIOKAlCBqb2lucyB0aGUgcGlwZWxpbmVcbiAgICogcmVnaXN0cnkgdGFibGUgKGBwaXBlbGluZWApIGFuZCBnYXRlcyBvbiBgcC5vcmdfaWQgJHtwcmVkfWAsIHdoZXJlIGBwcmVkYCBpc1xuICAgKiB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYCBvciAod2l0aCBhIHJvbGx1cCkgYW4gYElOICguLi4pYCBvdmVyIHRoZSBvcmfihpJ0ZWFtXG4gICAqIHN1YnRyZWUuIEEgcGlwZWxpbmVJZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBvcmcgeWllbGRzIHplcm8gcm93cy5cbiAgICovXG4gIGFzeW5jIGxpc3RQaXBlbGluZUV4ZWN1dGlvbnMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0sXG4gICAgbGltaXQ6IG51bWJlciA9IDUwLFxuICApOiBQcm9taXNlPFBpcGVsaW5lRXhlY3V0aW9uW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UocmFuZ2UpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5leGVjdXRpb25faWQsXG4gICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ2ZhaWxlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKSBUSEVOICdzdWNjZWVkZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKSBUSEVOICdjYW5jZWxlZCdcbiAgICAgICAgICAgIEVMU0UgJ2luLXByb2dyZXNzJ1xuICAgICAgICAgIEVORCBBUyBzdGF0dXMsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBzdGFydGVkX2F0LFxuICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBlbmRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6aW50IEFTIGR1cmF0aW9uX21zLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5zdGFnZV9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX3N0YWdlLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5hY3Rpb25fbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfYWN0aW9uXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9IEFORCBlLmV4ZWN1dGlvbl9pZCBJUyBOT1QgTlVMTFxuICAgICAgICAgICR7cmFuZ2VDbGF1c2V9XG4gICAgICAgIEdST1VQIEJZIGUuZXhlY3V0aW9uX2lkXG4gICAgICAgIE9SREVSIEJZIE1BWChlLmNyZWF0ZWRfYXQpIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxQaXBlbGluZUV4ZWN1dGlvbj4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OnBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4yIFN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUgZm9yIGFuIG9yZy4gKi9cbiAgYXN5bmMgZ2V0U3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8VGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpOjppbnQgQVMgY2FuY2VsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJ1xuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnKVxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRpbWVTZXJpZXNFbnRyeT4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OnN1Y2Nlc3MtcmF0ZToke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMyBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1JTihlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1pbl9tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuOTUpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZS5kdXJhdGlvbl9tcyk6OmludCBBUyBwOTVfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBleGVjdXRpb25zXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHAuaWQgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxEdXJhdGlvblN0YXRzPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHJ1blJlcG9ydChgJHtvcmdJZH06YXZnLWR1cmF0aW9uOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS41IFN0YWdlIGZhaWx1cmUgaGVhdG1hcCDigJQgd2hpY2ggc3RhZ2VzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxTdGFnZUZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpzdGFnZS1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3RpbmN0IGRlcGxveSBgZW52aXJvbm1lbnRgIHZhbHVlcyBvYnNlcnZlZCBpbiB0aGUgd2luZG93IOKAlCBwb3dlcnMgdGhlXG4gICAqIERPUkEgZW52aXJvbm1lbnQtc2NvcGUgZGF0YWxpc3QuIE9yZy1zY29wZWQgKyByb2xsdXAtYXdhcmUgbGlrZSB0aGUgc2libGluZ1xuICAgKiByZXBvcnRzOyBvbmx5IG5vbi1udWxsIGVudmlyb25tZW50cyAoaS5lLiBkZXBsb3ktYXR0cmlidXRlZCBleGVjdXRpb25zKS5cbiAgICovXG4gIGFzeW5jIGdldFJlcG9ydEVudmlyb25tZW50cyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUIERJU1RJTkNUIGUuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgT1JERVIgQlkgZW52aXJvbm1lbnRcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czx7IGVudmlyb25tZW50OiBzdHJpbmcgfT4oci5yb3dzKS5tYXAoKHJvdykgPT4gcm93LmVudmlyb25tZW50KSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OnJlcG9ydC1lbnZzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS42IFN0YWdlIGJvdHRsZW5lY2tzIOKAlCBzbG93ZXN0IHN0YWdlcyBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucGlwZWxpbmVfbmFtZSwgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCwgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8U3RhZ2VCb3R0bGVuZWNrPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHJ1blJlcG9ydChgJHtvcmdJZH06c3RhZ2UtYm90dGxlbmVja3M6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjcgQWN0aW9uIGZhaWx1cmUgcmF0ZSDigJQgd2hpY2ggcGx1Z2luIHN0ZXBzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0QWN0aW9uRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uRmFpbHVyZVtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxBY3Rpb25GYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHJ1blJlcG9ydChgJHtvcmdJZH06YWN0aW9uLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKipcbiAgICogMS44IEVycm9yIGNhdGVnb3JpemF0aW9uIOKAlCBncm91cCBmYWlsdXJlIG1lc3NhZ2VzLiBFeGVjdXRpb24gcmVwb3J0LCBzb1xuICAgKiByb2xsdXAtYXdhcmUgZXhhY3RseSBsaWtlIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzOiB3aXRoIGBvcmdJZHNgXG4gICAqICh0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlKSB0aGUgb3JnIGdhdGUgYmVjb21lcyBhbiBgSU4gKC4uLilgIGFuZCB0aGUgcmVhZCBydW5zXG4gICAqIGZyZXNoIHVuZGVyIHN5c2FkbWluIHZpYSBgcnVuUmVwb3J0YDsgc2luZ2xlLW9yZyByZWFkcyBrZWVwIHRoZSBwZXItb3JnIGNhY2hlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RXJyb3JzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8RXJyb3JFbnRyeVtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBTVUJTVFJJTkcoZS5lcnJvcl9tZXNzYWdlIEZST00gMSBGT1IgMjAwKSBBUyBlcnJvcl9wYXR0ZXJuLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgQ09VTlQoRElTVElOQ1QgZS5waXBlbGluZV9pZCk6OmludCBBUyBhZmZlY3RlZF9waXBlbGluZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcgQU5EIGUuZXJyb3JfbWVzc2FnZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZXJyb3JfcGF0dGVybiBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RXJyb3JFbnRyeT4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OmVycm9yczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3VyIERPUkEgbWVhc3VyZXMgcGx1cyB0aGVpciBwZXItZW52aXJvbm1lbnQgYnJlYWtkb3duLlxuICAgKiBJbXBsZW1lbnRhdGlvbiBpbiAuL3JlcG9ydGluZy9kb3JhLnRzIOKAlCBzZWUgdGhhdCBmaWxlJ3MgaGVhZGVyIGZvciB3aHkuXG4gICAqL1xuICBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gICAgcmV0dXJuIGRvcmFNZXRyaWNzKG9yZ0lkLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBET1JBIG1lYXN1cmVzIGJ1Y2tldGVkIG92ZXIgdGltZS4gKi9cbiAgZ2V0RG9yYVRyZW5kKFxuICAgIG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIHJldHVybiBkb3JhVHJlbmQob3JnSWQsIGludGVydmFsLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBQZXItcGlwZWxpbmUgYnVpbGQgaGVhbHRoIChzdGFnZSBwYXNzIHJhdGVzIG92ZXIgYSB3aW5kb3cpLiAqL1xuICBnZXRCdWlsZEhlYWx0aChcbiAgICBvcmdJZDogc3RyaW5nLCBwaXBlbGluZUlkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sXG4gICk6IFByb21pc2U8QnVpbGRIZWFsdGg+IHtcbiAgICByZXR1cm4gYnVpbGRIZWFsdGgob3JnSWQsIHBpcGVsaW5lSWQsIGZyb20sIHRvLCBvcmdJZHMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UGx1Z2luU3VtbWFyeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5TdW1tYXJ5PiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tc3VtbWFyeWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgTk9UICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgaW5hY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHVibGljJyk6OmludCBBUyBwdWJsaWMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAnb3JnJyk6OmludCBBUyBvcmcsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIG9yZzogMCwgcHJpdmF0ZTogMCwgdW5pcXVlTmFtZXM6IDAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogMi4yIFR5cGUgJiBjb21wdXRlIGRpc3RyaWJ1dGlvbi5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpbkRpc3RyaWJ1dGlvbihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbltdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tZGlzdHJpYnV0aW9uYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0gQVMgcGx1Z2luX3R5cGUsXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfSBBUyBjb21wdXRlX3R5cGUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBjb3VudFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0sICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX1cbiAgICAgICAgT1JERVIgQlkgY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAyLjMgVmVyc2lvbiBjb3VudHMgcGVyIHBsdWdpbiBuYW1lLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIHBlci1vcmcgKHNlZVxuICAgKiAgZ2V0UGx1Z2luU3VtbWFyeSkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luVmVyc2lvbnMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VmVyc2lvbkNvdW50W10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi12ZXJzaW9uc2AsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLm5hbWV9LFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdmVyc2lvbl9jb3VudCxcbiAgICAgICAgICAtLSBIaWdoZXN0IHZlcnNpb24gYnkgTlVNRVJJQyBzZW12ZXIgY29yZSAobm90IGxleGljYWw6ICcxMC4wLjAnID4gJzkuMC4wJykuXG4gICAgICAgICAgLS0gU3RyaXAgYW55IC1wcmVyZWxlYXNlLytidWlsZCBzdWZmaXggYmVmb3JlIHRoZSBpbnRbXSBjYXN0IHNvIGl0IGNhbid0XG4gICAgICAgICAgLS0gZXJyb3Igb24gdmFsaWQgc2VtdmVyOyBrZWVwIHRoZSBvcmlnaW5hbCBzdHJpbmcgZm9yIGRpc3BsYXkuXG4gICAgICAgICAgLS0gR1VBUkQ6IGEgbm9uLW51bWVyaWMtZG90dGVkIHZlcnNpb24gKCdsYXRlc3QnLCAnJywgJ3YxJykgd291bGQgbWFrZSB0aGVcbiAgICAgICAgICAtLSA6OmludFtdIGNhc3QgdGhyb3cgYW5kIGJsb3cgdXAgdGhlIFdIT0xFIG9yZyBzdW1tYXJ5LiBPbmx5IGNhc3Qgcm93c1xuICAgICAgICAgIC0tIHdob3NlIHN0cmlwcGVkIGNvcmUgbWF0Y2hlcyBhIG51bWVyaWMtZG90dGVkIHNoYXBlOyBzb3J0IGV2ZXJ5dGhpbmdcbiAgICAgICAgICAtLSBlbHNlIHRvIHRoZSBib3R0b20gdmlhIGEgc2VudGluZWwgQVJSQVlbLTFdIHNvIHRoZSByb3cgc3RpbGwgY291bnRzLlxuICAgICAgICAgIChhcnJheV9hZ2coJHtzY2hlbWEucGx1Z2luLnZlcnNpb259XG4gICAgICAgICAgICAgT1JERVIgQlkgQ0FTRVxuICAgICAgICAgICAgICAgV0hFTiByZWdleHBfcmVwbGFjZSgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0sICdbLStdLiokJywgJycpIH4gJ15bMC05XSsoWy5dWzAtOV0rKSokJ1xuICAgICAgICAgICAgICAgICBUSEVOIHN0cmluZ190b19hcnJheShyZWdleHBfcmVwbGFjZSgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0sICdbLStdLiokJywgJycpLCAnLicpOjppbnRbXVxuICAgICAgICAgICAgICAgRUxTRSBBUlJBWVstMV1cbiAgICAgICAgICAgICBFTkQgREVTQ1xuICAgICAgICAgICkpWzFdIEFTIGxhdGVzdF92ZXJzaW9uLFxuICAgICAgICAgIGJvb2xfb3IoJHtzY2hlbWEucGx1Z2luLmlzRGVmYXVsdH0pIEFTIGhhc19kZWZhdWx0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5uYW1lfVxuICAgICAgICBPUkRFUiBCWSB2ZXJzaW9uX2NvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxWZXJzaW9uQ291bnQ+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIDIuNCBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGRUaW1lU2VyaWVzRW50cnlbXT4ge1xuICAgIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgICAvLyBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBleGVjdXRpb24gcmVwb3J0cy4gVGhlc2VcbiAgICAvLyByb3dzIGFyZSBnYXRlZCBvbiB0aGUgcGlwZWxpbmVfZXZlbnQgYG9yZ19pZGAgZGlyZWN0bHkgKG5vIHBpcGVsaW5lIGpvaW4pLFxuICAgIC8vIHNvIGBwcmVkYCBhcHBsaWVzIHRvIGBlLm9yZ19pZGAuXG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnZmFpbGVkJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdjb21wbGV0ZWQnLCAnZmFpbGVkJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLXN1Y2Nlc3M6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAyLjUgQnVpbGQgZHVyYXRpb24gcGVyIHBsdWdpbi4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGREdXJhdGlvbltdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgYnVpbGRzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRHVyYXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpidWlsZC1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDIuNiBCdWlsZCBmYWlsdXJlcyDigJQgdG9wIGVycm9yIG1lc3NhZ2VzLiBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZS4gKi9cbiAgYXN5bmMgZ2V0QnVpbGRGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkRmFpbHVyZVtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBlLmVycm9yX21lc3NhZ2UsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuc3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lLCBlLmVycm9yX21lc3NhZ2VcbiAgICAgICAgT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRmFpbHVyZT4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLWZhaWx1cmVzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgMzogRE9SQSB3cml0ZSBwYXRocyAocG9zdC1kZXBsb3kgb3V0Y29tZXMgKyBpbmdlc3QgaGVhbHRoKSDilIDilIBcblxuICAvKipcbiAgICogUmVjb3JkIGEgbWFudWFsIHBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VyIChQaGFzZSAyKTogYSB1c2VyIG1hcmtzIGFcbiAgICogZGVwbG95bWVudCBgZmFpbGVkYCAoYSBwcm9kdWN0aW9uIGluY2lkZW50IGxpbmtlZCB0byB0aGUgZGVwbG95KSBvclxuICAgKiBgcmVzdG9yZWRgIChyZWNvdmVyZWQpLiBJZGVtcG90ZW50IOKAlCBrZXllZCBvbiAoZXhlY3V0aW9uX2lkLCBvdXRjb21lKSBzbyBhXG4gICAqIGR1cGxpY2F0ZSBQT1NUIHJlZnJlc2hlcyBgYXRgIHJhdGhlciB0aGFuIGRvdWJsZS1jb3VudGluZywgd2hpbGUgYVxuICAgKiBmYWlsZWTihpJyZXN0b3JlZCBwYWlyIHN0YXlzIHR3byByb3dzLiBGZWVkcyB0aGUgcG9zdC1kZXBsb3kgQ0ZSIGNvbXBvbmVudCBhbmRcbiAgICogdGhlIHJlYWwgTVRUUi4gUnVucyB1bmRlciB0aGUgY2FsbGVyJ3Mgb3JnIGNvbnRleHQgKFJMUyBXSVRIIENIRUNLKS5cbiAgICovXG4gIGFzeW5jIHJlY29yZERlcGxveW1lbnRPdXRjb21lKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgZXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICBpbnB1dDogeyBvdXRjb21lOiAnZmFpbGVkJyB8ICdyZXN0b3JlZCc7IGF0OiBzdHJpbmc7IGVudmlyb25tZW50Pzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZGVwbG95bWVudE91dGNvbWUpLnZhbHVlcyh7XG4gICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICBvcmdJZCxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHNjcnViT3B0aW9uYWwoaW5wdXQuZW52aXJvbm1lbnQpLFxuICAgICAgICBvdXRjb21lOiBpbnB1dC5vdXRjb21lLFxuICAgICAgICBhdDogbmV3IERhdGUoaW5wdXQuYXQpLFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBbc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLmV4ZWN1dGlvbklkLCBzY2hlbWEuZGVwbG95bWVudE91dGNvbWUub3V0Y29tZV0sXG4gICAgICAgIHNldDoge1xuICAgICAgICAgIGF0OiBuZXcgRGF0ZShpbnB1dC5hdCksXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHNjcnViT3B0aW9uYWwoaW5wdXQuZW52aXJvbm1lbnQpID8/IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9KSksXG4gICAgKTtcbiAgICAvLyBPdXRjb21lIGNoYW5nZXMgdGhlIERPUkEgYWdncmVnYXRlIOKAlCBkcm9wIHRoZSBvcmcncyBjYWNoZWQgcmVwb3J0cy5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmdlc3QgYSBwcm9kdWN0aW9uIGluY2lkZW50IChQaGFzZSA1KSBmcm9tIHRoZSBvcmcncyBpbmNpZGVudCB0b29saW5nXG4gICAqIChQYWdlckR1dHkgLyBEYXRhZG9nIC8gQWxlcnRtYW5hZ2VyIHdlYmhvb2spLiBJZGVtcG90ZW50IOKAlCBrZXllZCBvblxuICAgKiAob3JnX2lkLCBpbmNpZGVudF9pZCkgc28gYSBsYXRlciByZXNvbHZlIHJlLXBvc3QgdXBzZXJ0cyBgcmVzb2x2ZWRfYXRgXG4gICAqIChhbmQgcmVmcmVzaGVzIHRoZSBvdGhlciBtdXRhYmxlIGZpZWxkcykgaW5zdGVhZCBvZiBpbnNlcnRpbmcgYSBkdXBsaWNhdGUuXG4gICAqIERPUkEgY29ycmVsYXRlcyBlYWNoIGluY2lkZW50IHRvIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBpdHNcbiAgICogYGVudmlyb25tZW50YCwgcHJvZHVjaW5nIGFuIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlICsgYSByZWFsIE1UVFIuXG4gICAqIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSyk7IGZyZWUtZm9ybSBmaWVsZHMgYXJlXG4gICAqIEFXUy1pZCBzY3J1YmJlZCBhdCB0aGlzIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGxpa2UgdGhlIG90aGVyIGluZ2VzdCBwYXRocy5cbiAgICovXG4gIGFzeW5jIHJlY29yZEluY2lkZW50KG9yZ0lkOiBzdHJpbmcsIGlucHV0OiBJbmNpZGVudElucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5jaWRlbnRJZCA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGlucHV0LmluY2lkZW50SWQpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IHNldmVyaXR5ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuc2V2ZXJpdHkpO1xuICAgIGNvbnN0IG9wZW5lZEF0ID0gbmV3IERhdGUoaW5wdXQub3BlbmVkQXQpO1xuICAgIGNvbnN0IHJlc29sdmVkQXQgPSBpbnB1dC5yZXNvbHZlZEF0ID8gbmV3IERhdGUoaW5wdXQucmVzb2x2ZWRBdCkgOiBudWxsO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuaW5jaWRlbnQpLnZhbHVlcyh7XG4gICAgICAgIGluY2lkZW50SWQsXG4gICAgICAgIG9yZ0lkLFxuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgb3BlbmVkQXQsXG4gICAgICAgIHJlc29sdmVkQXQsXG4gICAgICAgIHNldmVyaXR5LFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBbc2NoZW1hLmluY2lkZW50Lm9yZ0lkLCBzY2hlbWEuaW5jaWRlbnQuaW5jaWRlbnRJZF0sXG4gICAgICAgIHNldDogeyBlbnZpcm9ubWVudCwgb3BlbmVkQXQsIHJlc29sdmVkQXQsIHNldmVyaXR5IH0sXG4gICAgICB9KSksXG4gICAgKTtcbiAgICAvLyBBIG5ldy91cGRhdGVkIGluY2lkZW50IGNoYW5nZXMgdGhlIERPUkEgYWdncmVnYXRlIOKAlCBkcm9wIGNhY2hlZCByZXBvcnRzLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZU9yZyhvcmdJZCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIHBlci1vcmcgRE9SQSBzZXR0aW5ncyAoUGhhc2UgNWIpLiBSZXR1cm5zIHRoZSBzdG9yZWRcbiAgICogYGluY2lkZW50V2luZG93SG91cnNgIG92ZXJyaWRlIChvciBgbnVsbGAgd2hlbiB1bnNldCkgcGx1cyB0aGUgZ2xvYmFsIGVudlxuICAgKiBkZWZhdWx0LCBzbyB0aGUgc2V0dGluZ3MgVUkgY2FuIHNob3cgYm90aC4gUnVucyB1bmRlciB0aGUgY2FsbGVyJ3MgdGVuYW50XG4gICAqIGNvbnRleHQgKFJMUy1zY29wZWQpOyBhIHNpbmdsZS1vcmcgcmVhZC5cbiAgICovXG4gIGFzeW5jIGdldEluY2lkZW50U2V0dGluZ3Mob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8SW5jaWRlbnRTZXR0aW5ncz4ge1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czx7XG4gICAgICBpbmNpZGVudF93aW5kb3dfaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgICBldmVudF9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGRvcmFfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgfT4oKGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1QgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmluY2lkZW50V2luZG93SG91cnN9IEFTIGluY2lkZW50X3dpbmRvd19ob3VycyxcbiAgICAgICAgICAgICAgICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5ldmVudFJldGVudGlvbkRheXN9IEFTIGV2ZW50X3JldGVudGlvbl9kYXlzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmRvcmFSZXRlbnRpb25EYXlzfSBBUyBkb3JhX3JldGVudGlvbl9kYXlzXG4gICAgICAgIEZST00gJHtzY2hlbWEuZG9yYVNldHRpbmdzfVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgYCkpKS5yb3dzKTtcbiAgICBjb25zdCByb3cgPSByb3dzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBpbmNpZGVudFdpbmRvd0hvdXJzOiByb3c/LmluY2lkZW50X3dpbmRvd19ob3VycyAhPSBudWxsID8gTnVtYmVyKHJvdy5pbmNpZGVudF93aW5kb3dfaG91cnMpIDogbnVsbCxcbiAgICAgIGRlZmF1bHRXaW5kb3dIb3VyczogRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMsXG4gICAgICBldmVudFJldGVudGlvbkRheXM6IHJvdz8uZXZlbnRfcmV0ZW50aW9uX2RheXMgIT0gbnVsbCA/IE51bWJlcihyb3cuZXZlbnRfcmV0ZW50aW9uX2RheXMpIDogbnVsbCxcbiAgICAgIGRvcmFSZXRlbnRpb25EYXlzOiByb3c/LmRvcmFfcmV0ZW50aW9uX2RheXMgIT0gbnVsbCA/IE51bWJlcihyb3cuZG9yYV9yZXRlbnRpb25fZGF5cykgOiBudWxsLFxuICAgICAgZGVmYXVsdEV2ZW50UmV0ZW50aW9uRGF5czogUkVQT1JUSU5HX0VWRU5UX1JFVEVOVElPTl9EQVlTLFxuICAgICAgZGVmYXVsdERvcmFSZXRlbnRpb25EYXlzOiBSRVBPUlRJTkdfRE9SQV9SRVRFTlRJT05fREFZUyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwc2VydCBwZXItb3JnIHJlcG9ydGluZyBzZXR0aW5ncyAoUGhhc2UgNWIgaW5jaWRlbnQgd2luZG93ICsgUGhhc2UgN1xuICAgKiByZXRlbnRpb24gb3ZlcnJpZGVzKSwgaWRlbXBvdGVudCBvbiBgb3JnX2lkYC4gQSBwYXJ0aWFsIHdyaXRlIOKAlCBvbmx5IHRoZVxuICAgKiBmaWVsZHMgcHJlc2VudCBpbiBgcGF0Y2hgIGFyZSBzZXQgKHNvIHVwZGF0aW5nIHJldGVudGlvbiBuZXZlciBjbGVhcnMgdGhlXG4gICAqIGluY2lkZW50IHdpbmRvdywgYW5kIHZpY2UtdmVyc2EpLiBTZXQgc2VsZi1zZXJ2ZSBieSBhbiBvcmcgYWRtaW4gdmlhXG4gICAqIGBQVVQgL2FwaS9yZXBvcnRzL3NldHRpbmdzL2luY2lkZW50c2AuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0XG4gICAqIChSTFMgV0lUSCBDSEVDSyk7IGEgY2hhbmdlZCB2YWx1ZSBhZmZlY3RzIERPUkEgYWdncmVnYXRlcyBzbyB0aGUgb3JnJ3NcbiAgICogY2FjaGVkIHJlcG9ydHMgYXJlIGRyb3BwZWQuXG4gICAqL1xuICBhc3luYyBzZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZDogc3RyaW5nLCBwYXRjaDogUmVwb3J0aW5nU2V0dGluZ3NQYXRjaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9O1xuICAgIGlmIChwYXRjaC5pbmNpZGVudFdpbmRvd0hvdXJzICE9PSB1bmRlZmluZWQpIHNldC5pbmNpZGVudFdpbmRvd0hvdXJzID0gcGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycztcbiAgICBpZiAocGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQpIHNldC5ldmVudFJldGVudGlvbkRheXMgPSBwYXRjaC5ldmVudFJldGVudGlvbkRheXM7XG4gICAgaWYgKHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQpIHNldC5kb3JhUmV0ZW50aW9uRGF5cyA9IHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKS52YWx1ZXMoe1xuICAgICAgICBvcmdJZCxcbiAgICAgICAgaW5jaWRlbnRXaW5kb3dIb3VyczogcGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycyxcbiAgICAgICAgZXZlbnRSZXRlbnRpb25EYXlzOiBwYXRjaC5ldmVudFJldGVudGlvbkRheXMsXG4gICAgICAgIGRvcmFSZXRlbnRpb25EYXlzOiBwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cyxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLFxuICAgICAgICBzZXQsXG4gICAgICB9KSksXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHJlY2VudCBpbmNpZGVudHMgZm9yIGFuIG9yZyAoUGhhc2UgNWIgb3JnLWFkbWluIHN1cmZhY2UpLCBuZXdlc3QgZmlyc3QsXG4gICAqIHBhZ2luYXRlZC4gRWFjaCByb3cgY2FycmllcyBpdHMgcmVzb2x2ZWQgc3RhdGUgYW5kIGl0cyBkZXBsb3kgY29ycmVsYXRpb24g4oCUXG4gICAqIHRoZSBtb3N0IHJlY2VudCBTVUNDRVNTRlVMIGRlcGxveSB0byB0aGUgaW5jaWRlbnQncyBgZW52aXJvbm1lbnRgIHdob3NlXG4gICAqIGBjb21wbGV0ZWRfYXRgIGZhbGxzIHdpdGhpbiB0aGUgZWZmZWN0aXZlIHBlci1vcmcgY29ycmVsYXRpb24gd2luZG93IGJlZm9yZVxuICAgKiBgb3BlbmVkX2F0YCAodGhlIHNhbWUgcnVsZSBET1JBJ3MgQ0ZSL01UVFIgY29ycmVsYXRpb24gYXBwbGllcykuIFNpbmdsZS1vcmdcbiAgICogKG5vIHJvbGx1cCkg4oCUIGFuIG9yZyBhZG1pbiB2aWV3cyB0aGVpciBvd24gb3JnJ3MgaW5jaWRlbnRzLiBSTFMtc2NvcGVkIHZpYVxuICAgKiB0aGUgYHAub3JnX2lkYC9gaS5vcmdfaWRgIHByZWRpY2F0ZXMgKyB0aGUgdGVuYW50IGNvbnRleHQuXG4gICAqL1xuICBhc3luYyBsaXN0SW5jaWRlbnRzKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IHsgbGltaXQ6IG51bWJlcjsgb2Zmc2V0OiBudW1iZXIgfSk6IFByb21pc2U8SW5jaWRlbnRMaXN0SXRlbVtdPiB7XG4gICAgY29uc3QgeyBpbmNpZGVudFdpbmRvd0hvdXJzIH0gPSBhd2FpdCB0aGlzLmdldEluY2lkZW50U2V0dGluZ3Mob3JnSWQpO1xuICAgIGNvbnN0IHdpbmRvd0hvdXJzID0gcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMoaW5jaWRlbnRXaW5kb3dIb3Vycyk7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihvcHRzLmxpbWl0LCAyMDApKTtcbiAgICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgwLCBvcHRzLm9mZnNldCk7XG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBpLmluY2lkZW50X2lkIEFTIFwiaW5jaWRlbnRJZFwiLFxuICAgICAgICAgIGkuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgICAgaS5zZXZlcml0eSBBUyBzZXZlcml0eSxcbiAgICAgICAgICBpLm9wZW5lZF9hdDo6dGV4dCBBUyBcIm9wZW5lZEF0XCIsXG4gICAgICAgICAgaS5yZXNvbHZlZF9hdDo6dGV4dCBBUyBcInJlc29sdmVkQXRcIixcbiAgICAgICAgICBpLmNyZWF0ZWRfYXQ6OnRleHQgQVMgXCJjcmVhdGVkQXRcIixcbiAgICAgICAgICAoaS5yZXNvbHZlZF9hdCBJUyBOT1QgTlVMTCkgQVMgcmVzb2x2ZWQsXG4gICAgICAgICAgY29yci5leGVjdXRpb25faWQgQVMgXCJjb3JyZWxhdGVkRXhlY3V0aW9uSWRcIixcbiAgICAgICAgICBjb3JyLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBcImRlcGxveUNvbXBsZXRlZEF0XCJcbiAgICAgICAgRlJPTSAke3NjaGVtYS5pbmNpZGVudH0gaVxuICAgICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgU0VMRUNUIGUuZXhlY3V0aW9uX2lkLCBlLmNvbXBsZXRlZF9hdFxuICAgICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnXG4gICAgICAgICAgICBBTkQgZS5lbnZpcm9ubWVudCA9IGkuZW52aXJvbm1lbnQgQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA8PSBpLm9wZW5lZF9hdFxuICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49IGkub3BlbmVkX2F0IC0gbWFrZV9pbnRlcnZhbChob3VycyA9PiAke3dpbmRvd0hvdXJzfTo6aW50KVxuICAgICAgICAgIE9SREVSIEJZIGUuY29tcGxldGVkX2F0IERFU0NcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICkgY29yciBPTiB0cnVlXG4gICAgICAgIFdIRVJFIGkub3JnX2lkID0gJHtvcmdJZH1cbiAgICAgICAgT1JERVIgQlkgaS5vcGVuZWRfYXQgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fSBPRkZTRVQgJHtvZmZzZXR9XG4gICAgICBgKS50aGVuKChyKSA9PiBkcml6emxlUm93czxJbmNpZGVudExpc3RJdGVtPihyLnJvd3MpLm1hcCgocm93KSA9PiAoe1xuICAgICAgLi4ucm93LFxuICAgICAgcmVzb2x2ZWQ6IHJvdy5yZXNvbHZlZCA9PT0gdHJ1ZSB8fCAocm93LnJlc29sdmVkIGFzIHVua25vd24pID09PSAndCcsXG4gICAgICBjb3JyZWxhdGVkRXhlY3V0aW9uSWQ6IHJvdy5jb3JyZWxhdGVkRXhlY3V0aW9uSWQgPz8gbnVsbCxcbiAgICAgIGRlcGxveUNvbXBsZXRlZEF0OiByb3cuZGVwbG95Q29tcGxldGVkQXQgPz8gbnVsbCxcbiAgICB9KSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJpbmctdGVzdCBkcnktcnVuIChQaGFzZSA1Yik6IHdvdWxkIGEgc3ludGhldGljIGluY2lkZW50IG9wZW5pbmcgTk9XIGZvclxuICAgKiBgZW52aXJvbm1lbnRgIGNvcnJlbGF0ZSB0byBhIHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB1bmRlciB0aGUgb3JnJ3NcbiAgICogZWZmZWN0aXZlIHdpbmRvdz8gVGhpcyBpcyBhIE5PTi1wZXJzaXN0aW5nIGNvcnJlbGF0aW9uIGNoZWNrIOKAlCBpdCB2ZXJpZmllc1xuICAgKiB0aGUgYWRtaW4ncyBlbnZpcm9ubWVudCBuYW1pbmcgKyB3aW5kb3cgbGluZSB1cCB3aXRoIHJlYWwgZGVwbG95IGV2ZW50c1xuICAgKiBXSVRIT1VUIHdyaXRpbmcgYW4gaW5jaWRlbnQgKHNvIGEgXCJ0ZXN0XCIgbmV2ZXIgcG9sbHV0ZXMgQ0ZSL01UVFIpLiBSTFMtc2NvcGVkLlxuICAgKi9cbiAgYXN5bmMgdGVzdEluY2lkZW50Q29ycmVsYXRpb24ob3JnSWQ6IHN0cmluZywgZW52aXJvbm1lbnQ6IHN0cmluZyk6IFByb21pc2U8SW5jaWRlbnRUZXN0UmVzdWx0PiB7XG4gICAgY29uc3QgZW52ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IG9wZW5lZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IHsgaW5jaWRlbnRXaW5kb3dIb3VycyB9ID0gYXdhaXQgdGhpcy5nZXRJbmNpZGVudFNldHRpbmdzKG9yZ0lkKTtcbiAgICBjb25zdCB3aW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKGluY2lkZW50V2luZG93SG91cnMpO1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czx7IGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDsgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUIGUuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCwgZS5jb21wbGV0ZWRfYXQ6OnRleHQgQVMgY29tcGxldGVkX2F0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRSdcbiAgICAgICAgICBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52fSBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke29wZW5lZEF0fTo6dGltZXN0YW1wdHpcbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtvcGVuZWRBdH06OnRpbWVzdGFtcHR6IC0gbWFrZV9pbnRlcnZhbChob3VycyA9PiAke3dpbmRvd0hvdXJzfTo6aW50KVxuICAgICAgICBPUkRFUiBCWSBlLmNvbXBsZXRlZF9hdCBERVNDXG4gICAgICAgIExJTUlUIDFcbiAgICAgIGApKSkucm93cyk7XG4gICAgY29uc3QgaGl0ID0gcm93c1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgZW52aXJvbm1lbnQ6IGVudixcbiAgICAgIG9wZW5lZEF0LFxuICAgICAgd2luZG93SG91cnMsXG4gICAgICBjb3JyZWxhdGVkOiBoaXQ/LmV4ZWN1dGlvbl9pZCAhPSBudWxsLFxuICAgICAgZXhlY3V0aW9uSWQ6IGhpdD8uZXhlY3V0aW9uX2lkID8/IG51bGwsXG4gICAgICBkZXBsb3lDb21wbGV0ZWRBdDogaGl0Py5jb21wbGV0ZWRfYXQgPz8gbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwc2VydCBwZXItb3JnIGluZ2VzdGlvbiBoZWFsdGggKFBoYXNlIDMpOiB0aGUgQVdTIGV2ZW50cyBMYW1iZGEgcGVyaW9kaWNhbGx5XG4gICAqIHJlcG9ydHMgZm9yd2FyZGVkL2Ryb3BwZWQgY291bnRlcnMgKyB0aGUgbGFzdCBldmVudCB0aW1lc3RhbXAgc28gdGhlIFJlcG9ydHNcbiAgICogVUkgY2FuIHNob3cgZmxvd2luZyAvIHN0YWxlIC8gZHJvcHBpbmcuIE9uZSByb3cgcGVyIG9yZyAodXBzZXJ0IG9uIG9yZ19pZCkuXG4gICAqL1xuICBhc3luYyByZWNvcmRJbmdlc3RIZWFsdGgoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpbnB1dDogeyBmb3J3YXJkZWQ/OiBudW1iZXI7IGRyb3BwZWQ/OiBudW1iZXI7IGxhc3RFdmVudEF0Pzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhc3RFdmVudEF0ID0gaW5wdXQubGFzdEV2ZW50QXQgPyBuZXcgRGF0ZShpbnB1dC5sYXN0RXZlbnRBdCkgOiB1bmRlZmluZWQ7XG4gICAgYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5pbmdlc3RIZWFsdGgpLnZhbHVlcyh7XG4gICAgICAgIG9yZ0lkLFxuICAgICAgICBmb3J3YXJkZWQ6IGlucHV0LmZvcndhcmRlZCxcbiAgICAgICAgZHJvcHBlZDogaW5wdXQuZHJvcHBlZCxcbiAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmluZ2VzdEhlYWx0aC5vcmdJZCxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgZm9yd2FyZGVkOiBpbnB1dC5mb3J3YXJkZWQsXG4gICAgICAgICAgZHJvcHBlZDogaW5wdXQuZHJvcHBlZCxcbiAgICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIH0sXG4gICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaGVkIGhhcmQtREVMRVRFIG9mIG9uZSByZXBvcnRpbmcgdGFibGUncyByb3dzIGV4cGlyZWQgcGFzdCBhIGBjcmVhdGVkX2F0YFxuICAgKiBjdXRvZmYsIHNjb3BlZCB0byBhbiBvcmcgYW5kIGFuIG9wdGlvbmFsIHJvdyBwcmVkaWNhdGUgKFBoYXNlIDcpLiBVc2VzIGFcbiAgICogYGN0aWRgLWluLXN1YnF1ZXJ5IExJTUlUIHNvIGVhY2ggc3RhdGVtZW50IHRvdWNoZXMgYXQgbW9zdCBgYmF0Y2hTaXplYCByb3dzXG4gICAqIChzaG9ydCBsb2NrIHdpbmRvd3MsIG5vIGxvbmcgdGFibGUgc2NhbiB1bmRlciBsb2NrKTsgYFJFVFVSTklORyAxYCBsZXRzIHVzXG4gICAqIGNvdW50IHZpYSBgLnJvd3MubGVuZ3RoYCB3aXRob3V0IGRlcGVuZGluZyBvbiB0aGUgZHJpdmVyJ3MgYHJvd0NvdW50YC4gTG9vcHNcbiAgICogdW50aWwgYSBzaG9ydCBiYXRjaCAoZHJhaW5lZCkgb3IgdGhlIHBlci10aWNrIGNhcCwgdGhlbiBkZWZlcnMgdGhlIHJlc3QuXG4gICAqIE1VU1QgcnVuIGluc2lkZSBhIHN5c2FkbWluIHRlbmFudCBzY29wZSAoc2VlIHB1cmdlRXhwaXJlZFJlcG9ydGluZ0RhdGEpIHNvIGl0XG4gICAqIGJ5cGFzc2VzIFJMUyBhbmQgY2FuIGRlbGV0ZSBhY3Jvc3MgdGhlIG9yZydzIHJvd3MuXG4gICAqL1xuICBhc3luYyAjcHVyZ2VSZXBvcnRpbmdUYWJsZUJhdGNoZWQoXG4gICAgdGFibGVTcWw6IFJldHVyblR5cGU8dHlwZW9mIHNxbD4sXG4gICAgcHJlZGljYXRlOiBSZXR1cm5UeXBlPHR5cGVvZiBzcWw+LFxuICAgIGJhdGNoU2l6ZTogbnVtYmVyLFxuICAgIG1heEJhdGNoZXM6IG51bWJlcixcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4QmF0Y2hlczsgaSsrKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgREVMRVRFIEZST00gJHt0YWJsZVNxbH1cbiAgICAgICAgV0hFUkUgY3RpZCBJTiAoXG4gICAgICAgICAgU0VMRUNUIGN0aWQgRlJPTSAke3RhYmxlU3FsfVxuICAgICAgICAgIFdIRVJFICR7cHJlZGljYXRlfVxuICAgICAgICAgIExJTUlUICR7YmF0Y2hTaXplfVxuICAgICAgICApXG4gICAgICAgIFJFVFVSTklORyAxXG4gICAgICBgKSk7XG4gICAgICBjb25zdCBwdXJnZWQgPSBkcml6emxlUm93czx1bmtub3duPihyZXMucm93cykubGVuZ3RoO1xuICAgICAgdG90YWwgKz0gcHVyZ2VkO1xuICAgICAgaWYgKHB1cmdlZCA8IGJhdGNoU2l6ZSkgYnJlYWs7IC8vIGRyYWluZWRcbiAgICAgIGlmIChpID09PSBtYXhCYXRjaGVzIC0gMSkge1xuICAgICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIHJldGVudGlvbiBoaXQgcGVyLXRpY2sgY2FwOyByZW1haW5pbmcgcm93cyBkZWZlcnJlZCcsIHtcbiAgICAgICAgICBwdXJnZWRUaGlzVGljazogdG90YWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG90YWw7XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0aW5nIHJldGVudGlvbiBzd2VlcCAoUGhhc2UgNykuIEhhcmQtZGVsZXRlcyByb3dzIG9sZGVyIHRoYW4gdGhlaXJcbiAgICogcmV0ZW50aW9uIHdpbmRvdywgYnkgYGNyZWF0ZWRfYXRgLCBhY3Jvc3MgZXZlcnkgb3JnIHRoYXQgaGFzIHJlcG9ydGluZyBkYXRhIOKAlFxuICAgKiBhICoqc3BsaXQqKiBwb2xpY3kgc28gaGlnaC12b2x1bWUgc3RhbmRhcmQgZXZlbnRzIGV4cGlyZSBmYXN0ZXIgdGhhbiB0aGVcbiAgICogbG93LXZvbHVtZSBET1JBIHNvdXJjZTpcbiAgICogIC0gYHBpcGVsaW5lX2V2ZW50cyBXSEVSRSBlbnZpcm9ubWVudCBJUyBOVUxMYCDihpIgc3RhbmRhcmQtZXZlbnQgd2luZG93LlxuICAgKiAgLSBgcGlwZWxpbmVfZXZlbnRzIFdIRVJFIGVudmlyb25tZW50IElTIE5PVCBOVUxMYCAoZGVwbG95IHN0YWdlcyksXG4gICAqICAgIGBkZXBsb3ltZW50X291dGNvbWVzYCwgYW5kIGBpbmNpZGVudHNgIOKGkiBET1JBLXNvdXJjZSB3aW5kb3cuXG4gICAqIEVhY2ggb3JnJ3Mgd2luZG93cyBjb21lIGZyb20gaXRzIGBkb3JhX3NldHRpbmdzYCBvdmVycmlkZSwgZWxzZSB0aGUgZ2xvYmFsXG4gICAqIGVudiBkZWZhdWx0cyAoc2VlIHtAbGluayByZXNvbHZlRXZlbnRSZXRlbnRpb25EYXlzfSAvIHtAbGluayByZXNvbHZlRG9yYVJldGVudGlvbkRheXN9KS5cbiAgICogYGluZ2VzdF9oZWFsdGhgIGFuZCBgZG9yYV9zZXR0aW5nc2AgYXJlIG5ldmVyIHB1cmdlZC4gT25lIGBub3dgIGZvciB0aGUgd2hvbGVcbiAgICogdGljayAocm93cyBjcm9zc2luZyB0aGUgYm91bmRhcnkgbWlkLXN3ZWVwIHdhaXQgZm9yIHRoZSBuZXh0KS4gRXN0YWJsaXNoZXMgYVxuICAgKiBzeXNhZG1pbiB0ZW5hbnQgc2NvcGUgc28gdGhlIGRlbGV0ZXMgc3BhbiBhbGwgb3JncyAvIGJ5cGFzcyBSTFMg4oCUIHRoaXMgaXMgYVxuICAgKiBjcm9zcy10ZW5hbnQgaG91c2VrZWVwaW5nIGpvYi4gUmV0dXJucyAoYW5kIGxvZ3MpIHBlci13aW5kb3cgcHVyZ2UgdGFsbGllcy5cbiAgICovXG4gIGFzeW5jIHB1cmdlRXhwaXJlZFJlcG9ydGluZ0RhdGEob3B0czogUmVwb3J0aW5nUmV0ZW50aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSZXBvcnRpbmdSZXRlbnRpb25Db3VudHM+IHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBNYXRoLm1heCgxLCBvcHRzLmJhdGNoU2l6ZSA/PyAxMDAwKTtcbiAgICBjb25zdCBtYXhCYXRjaGVzID0gTWF0aC5tYXgoMSwgb3B0cy5tYXhCYXRjaGVzUGVyVGFibGUgPz8gNTApO1xuICAgIGNvbnN0IG5vdyA9IG9wdHMubm93ID8/IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgY291bnRzOiBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMgPSB7XG4gICAgICBvcmdzOiAwLCBzdGFuZGFyZEV2ZW50czogMCwgZG9yYUV2ZW50czogMCwgZGVwbG95bWVudE91dGNvbWVzOiAwLCBpbmNpZGVudHM6IDAsXG4gICAgfTtcblxuICAgIHJldHVybiBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBFbnVtZXJhdGUgZXZlcnkgb3JnIHdpdGggcmVwb3J0aW5nIGRhdGEgKHVuaW9uIGFjcm9zcyB0aGUgdGhyZWUgdGFibGVzKS5cbiAgICAgIGNvbnN0IG9yZ1Jvd3MgPSBkcml6emxlUm93czx7IG9yZ19pZDogc3RyaW5nIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUIERJU1RJTkNUIG9yZ19pZCBGUk9NIChcbiAgICAgICAgICBTRUxFQ1QgJHtzY2hlbWEucGlwZWxpbmVFdmVudC5vcmdJZH0gQVMgb3JnX2lkIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH1cbiAgICAgICAgICBVTklPTlxuICAgICAgICAgIFNFTEVDVCAke3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5vcmdJZH0gQVMgb3JnX2lkIEZST00gJHtzY2hlbWEuZGVwbG95bWVudE91dGNvbWV9XG4gICAgICAgICAgVU5JT05cbiAgICAgICAgICBTRUxFQ1QgJHtzY2hlbWEuaW5jaWRlbnQub3JnSWR9IEFTIG9yZ19pZCBGUk9NICR7c2NoZW1hLmluY2lkZW50fVxuICAgICAgICApIEFTIG9yZ3NcbiAgICAgIGApKSkucm93cyk7XG4gICAgICBpZiAob3JnUm93cy5sZW5ndGggPT09IDApIHJldHVybiBjb3VudHM7XG5cbiAgICAgIC8vIFBlci1vcmcgcmV0ZW50aW9uIG92ZXJyaWRlcyAoYSBzaW5nbGUgcmVhZDsgb3JncyB3aXRob3V0IGEgcm93IHVzZSBkZWZhdWx0cykuXG4gICAgICBjb25zdCBvdmVycmlkZVJvd3MgPSBkcml6emxlUm93czx7XG4gICAgICAgIG9yZ19pZDogc3RyaW5nO1xuICAgICAgICBldmVudF9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgZG9yYV9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICAgIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZH0gQVMgb3JnX2lkLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmV2ZW50UmV0ZW50aW9uRGF5c30gQVMgZXZlbnRfcmV0ZW50aW9uX2RheXMsXG4gICAgICAgICAgICAgICAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZG9yYVJldGVudGlvbkRheXN9IEFTIGRvcmFfcmV0ZW50aW9uX2RheXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5kb3JhU2V0dGluZ3N9XG4gICAgICBgKSkpLnJvd3MpO1xuICAgICAgY29uc3Qgb3ZlcnJpZGVzID0gbmV3IE1hcChvdmVycmlkZVJvd3MubWFwKChyKSA9PiBbci5vcmdfaWQsIHJdKSk7XG5cbiAgICAgIGNvbnN0IGV2ZW50c1RhYmxlID0gc3FsYCR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9YDtcbiAgICAgIGNvbnN0IG91dGNvbWVzVGFibGUgPSBzcWxgJHtzY2hlbWEuZGVwbG95bWVudE91dGNvbWV9YDtcbiAgICAgIGNvbnN0IGluY2lkZW50c1RhYmxlID0gc3FsYCR7c2NoZW1hLmluY2lkZW50fWA7XG5cbiAgICAgIGZvciAoY29uc3QgeyBvcmdfaWQ6IG9yZ0lkIH0gb2Ygb3JnUm93cykge1xuICAgICAgICBjb25zdCBvdiA9IG92ZXJyaWRlcy5nZXQob3JnSWQpO1xuICAgICAgICBjb25zdCBldmVudERheXMgPSByZXNvbHZlRXZlbnRSZXRlbnRpb25EYXlzKG92Py5ldmVudF9yZXRlbnRpb25fZGF5cyk7XG4gICAgICAgIGNvbnN0IGRvcmFEYXlzID0gcmVzb2x2ZURvcmFSZXRlbnRpb25EYXlzKG92Py5kb3JhX3JldGVudGlvbl9kYXlzKTtcbiAgICAgICAgLy8gYC0xYCA9IHVubGltaXRlZCAoUGhhc2UgOCk6IGtlZXAgZm9yZXZlciwgc2tpcCB0aGF0IHdpbmRvdydzIGRlbGV0ZXMgZm9yXG4gICAgICAgIC8vIHRoaXMgb3JnLiBTdGFuZGFyZC1ldmVudCBhbmQgRE9SQS1zb3VyY2Ugd2luZG93cyBhcmUgaW5kZXBlbmRlbnQ7IGFuIG9yZ1xuICAgICAgICAvLyB3aXRoIGJvdGggYC0xYCBpcyBmdWxseSBza2lwcGVkLiBMb2cgdGhlIHNraXAgc28gaXQncyBvYnNlcnZhYmxlLlxuICAgICAgICBjb25zdCBza2lwRXZlbnRzID0gZXZlbnREYXlzID09PSAtMTtcbiAgICAgICAgY29uc3Qgc2tpcERvcmEgPSBkb3JhRGF5cyA9PT0gLTE7XG4gICAgICAgIGlmIChza2lwRXZlbnRzIHx8IHNraXBEb3JhKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1JlcG9ydGluZyByZXRlbnRpb24gc3dlZXAgc2tpcHBpbmcgdW5saW1pdGVkIHdpbmRvdyhzKScsIHtcbiAgICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgICAgc3RhbmRhcmRFdmVudHM6IHNraXBFdmVudHMgPyAndW5saW1pdGVkJyA6IGV2ZW50RGF5cyxcbiAgICAgICAgICAgIGRvcmFTb3VyY2U6IHNraXBEb3JhID8gJ3VubGltaXRlZCcgOiBkb3JhRGF5cyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2tpcEV2ZW50cykge1xuICAgICAgICAgIGNvbnN0IGV2ZW50Q3V0b2ZmID0gcmV0ZW50aW9uQ3V0b2ZmKG5vdywgZXZlbnREYXlzKTtcbiAgICAgICAgICBjb3VudHMuc3RhbmRhcmRFdmVudHMgKz0gYXdhaXQgdGhpcy4jcHVyZ2VSZXBvcnRpbmdUYWJsZUJhdGNoZWQoXG4gICAgICAgICAgICBldmVudHNUYWJsZSxcbiAgICAgICAgICAgIHNxbGBvcmdfaWQgPSAke29yZ0lkfSBBTkQgZW52aXJvbm1lbnQgSVMgTlVMTCBBTkQgY3JlYXRlZF9hdCA8ICR7ZXZlbnRDdXRvZmZ9YCxcbiAgICAgICAgICAgIGJhdGNoU2l6ZSwgbWF4QmF0Y2hlcyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFza2lwRG9yYSkge1xuICAgICAgICAgIGNvbnN0IGRvcmFDdXRvZmYgPSByZXRlbnRpb25DdXRvZmYobm93LCBkb3JhRGF5cyk7XG4gICAgICAgICAgY291bnRzLmRvcmFFdmVudHMgKz0gYXdhaXQgdGhpcy4jcHVyZ2VSZXBvcnRpbmdUYWJsZUJhdGNoZWQoXG4gICAgICAgICAgICBldmVudHNUYWJsZSxcbiAgICAgICAgICAgIHNxbGBvcmdfaWQgPSAke29yZ0lkfSBBTkQgZW52aXJvbm1lbnQgSVMgTk9UIE5VTEwgQU5EIGNyZWF0ZWRfYXQgPCAke2RvcmFDdXRvZmZ9YCxcbiAgICAgICAgICAgIGJhdGNoU2l6ZSwgbWF4QmF0Y2hlcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvdW50cy5kZXBsb3ltZW50T3V0Y29tZXMgKz0gYXdhaXQgdGhpcy4jcHVyZ2VSZXBvcnRpbmdUYWJsZUJhdGNoZWQoXG4gICAgICAgICAgICBvdXRjb21lc1RhYmxlLFxuICAgICAgICAgICAgc3FsYG9yZ19pZCA9ICR7b3JnSWR9IEFORCBjcmVhdGVkX2F0IDwgJHtkb3JhQ3V0b2ZmfWAsXG4gICAgICAgICAgICBiYXRjaFNpemUsIG1heEJhdGNoZXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb3VudHMuaW5jaWRlbnRzICs9IGF3YWl0IHRoaXMuI3B1cmdlUmVwb3J0aW5nVGFibGVCYXRjaGVkKFxuICAgICAgICAgICAgaW5jaWRlbnRzVGFibGUsXG4gICAgICAgICAgICBzcWxgb3JnX2lkID0gJHtvcmdJZH0gQU5EIGNyZWF0ZWRfYXQgPCAke2RvcmFDdXRvZmZ9YCxcbiAgICAgICAgICAgIGJhdGNoU2l6ZSwgbWF4QmF0Y2hlcyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50cy5vcmdzICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHB1cmdlZEFueSA9IGNvdW50cy5zdGFuZGFyZEV2ZW50cyArIGNvdW50cy5kb3JhRXZlbnRzICsgY291bnRzLmRlcGxveW1lbnRPdXRjb21lcyArIGNvdW50cy5pbmNpZGVudHM7XG4gICAgICBpZiAocHVyZ2VkQW55ID4gMCkgbG9nZ2VyLmluZm8oJ1JlcG9ydGluZyByZXRlbnRpb24gc3dlZXAgcHVyZ2VkIGV4cGlyZWQgcm93cycsIHsgLi4uY291bnRzIH0pO1xuICAgICAgcmV0dXJuIGNvdW50cztcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVwb3J0aW5nU2VydmljZSA9IG5ldyBSZXBvcnRpbmdTZXJ2aWNlKCk7XG4iXX0=
|
|
886
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1SCxPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUUsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JHLE9BQU8sRUFDTCxjQUFjLElBQUksV0FBVyxFQUM3QixZQUFZLElBQUksU0FBUyxFQUN6QixjQUFjLElBQUksV0FBVyxHQUM5QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsOEVBQThFO0FBQzlFLE9BQU8sRUFDTCw4QkFBOEIsRUFBRSw2QkFBNkIsRUFDN0QseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxHQUNyRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQXdCekcs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LENBQ3RCLENBQUM7b0JBQ0YsTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FDeEQsY0FBYyxFQUNkLEdBQUcsQ0FBQSxZQUFZLEtBQUsscUJBQXFCLFVBQVUsRUFBRSxFQUNyRCxTQUFTLEVBQUUsVUFBVSxDQUN0QixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUMzRyxJQUFJLFNBQVMsR0FBRyxDQUFDO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDL0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBlcnJvck1lc3NhZ2UsIHNjcnViQXdzSWRlbnRpZmllcnMsIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgZXEsIGluQXJyYXksIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vLyBFeHRyYWN0ZWQgZm9yIHNpemUg4oCUIHNlZSAuL3JlcG9ydGluZy8uIEV2ZXJ5dGhpbmcgcHVibGljIGlzIHJlLWV4cG9ydGVkIGJlbG93XG4vLyBzbyBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAncyBzdXJmYWNlIGlzIHVuY2hhbmdlZCBieSB0aGUgc3BsaXQuXG5pbXBvcnQgeyBpbnZlbnRvcnlDYWNoZSwgdGltZXNlcmllc0NhY2hlIH0gZnJvbSAnLi9yZXBvcnRpbmcvY2FjaGVzLmpzJztcbmltcG9ydCB7IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLCByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyB9IGZyb20gJy4vcmVwb3J0aW5nL2RvcmEtc2NvcmluZy5qcyc7XG5pbXBvcnQge1xuICBnZXREb3JhTWV0cmljcyBhcyBkb3JhTWV0cmljcyxcbiAgZ2V0RG9yYVRyZW5kIGFzIGRvcmFUcmVuZCxcbiAgZ2V0QnVpbGRIZWFsdGggYXMgYnVpbGRIZWFsdGgsXG59IGZyb20gJy4vcmVwb3J0aW5nL2RvcmEuanMnO1xuaW1wb3J0IHsgb3JnU2NvcGUsIHJ1blJlcG9ydCB9IGZyb20gJy4vcmVwb3J0aW5nL3F1ZXJ5LXNjb3BlLmpzJztcbi8vIEFsaWFzZWQ6IHRoZSBtb2R1bGUgZnVuY3Rpb25zIGFuZCB0aGUgZGVsZWdhdGluZyBtZXRob2RzIGJlbG93IHNoYXJlIG5hbWVzLlxuaW1wb3J0IHtcbiAgUkVQT1JUSU5HX0VWRU5UX1JFVEVOVElPTl9EQVlTLCBSRVBPUlRJTkdfRE9SQV9SRVRFTlRJT05fREFZUyxcbiAgcmVzb2x2ZUV2ZW50UmV0ZW50aW9uRGF5cywgcmVzb2x2ZURvcmFSZXRlbnRpb25EYXlzLCByZXRlbnRpb25DdXRvZmYsXG59IGZyb20gJy4vcmVwb3J0aW5nL3JldGVudGlvbi5qcyc7XG5pbXBvcnQgeyBhc3NlcnRSZXBvcnRJbnRlcnZhbCwgc2NydWJPcHRpb25hbCwgb3B0aW9uYWxTdGFydGVkQXRSYW5nZSB9IGZyb20gJy4vcmVwb3J0aW5nL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRXhlY3V0aW9uQ291bnQsIFRpbWVTZXJpZXNFbnRyeSwgRHVyYXRpb25TdGF0cywgUGlwZWxpbmVFeGVjdXRpb24sIFN0YWdlRmFpbHVyZSwgU3RhZ2VCb3R0bGVuZWNrLFxuICBBY3Rpb25GYWlsdXJlLCBFcnJvckVudHJ5LCBQbHVnaW5TdW1tYXJ5LCBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiwgVmVyc2lvbkNvdW50LFxuICBCdWlsZFRpbWVTZXJpZXNFbnRyeSwgQnVpbGREdXJhdGlvbiwgQnVpbGRGYWlsdXJlLFxuICBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zLCBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsXG4gIERvcmFPcHRpb25zLCBJbmNpZGVudFNldHRpbmdzLCBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLCBJbmNpZGVudExpc3RJdGVtLCBJbmNpZGVudFRlc3RSZXN1bHQsXG4gIERvcmFNZXRyaWNzLCBEb3JhVHJlbmRQb2ludCwgQnVpbGRIZWFsdGgsIEluY2lkZW50SW5wdXQsXG4gIEluZ2VzdEV2ZW50LCBJbmdlc3RNZXRyaWMsIEluZ2VzdFJlc3VsdCwgSW5nZXN0SGVhbHRoU3RhdHVzLFxufSBmcm9tICcuL3JlcG9ydGluZy90eXBlcy5qcyc7XG5cbi8vIFJlLWV4cG9ydCBFWEFDVExZIHRoZSBzdXJmYWNlIHRoaXMgbW9kdWxlIGhhZCBiZWZvcmUgdGhlIHNwbGl0IOKAlCBubyBtb3JlLlxuLy8gYHNyYy9pbmRleC50c2AgZG9lcyBgZXhwb3J0ICogZnJvbSAnLi9hcGkvcmVwb3J0aW5nLXNlcnZpY2UuanMnYCwgc28gYW55dGhpbmdcbi8vIHJlLWV4cG9ydGVkIGhlcmUgYmVjb21lcyBwYXJ0IG9mIHRoZSBwYWNrYWdlJ3MgcHVibGljIEFQSS4gRW51bWVyYXRlZCByYXRoZXJcbi8vIHRoYW4gYGV4cG9ydCAqYCBmb3IgdGhhdCByZWFzb246IHRoZSBleHRyYWN0ZWQgbW9kdWxlcyBhbHNvIGV4cG9ydCBpbnRlcm5hbHNcbi8vIChvcmdTY29wZSwgcnVuUmVwb3J0LCB0aGUgY2FjaGVzLCB0aGUgRE9SQSByb3cgc2hhcGVzKSB0aGF0IHdlcmUgcHJpdmF0ZVxuLy8gYmVmb3JlIGFuZCBtdXN0IHN0YXkgdGhhdCB3YXkuXG5leHBvcnQgdHlwZSB7XG4gIEJ1aWxkSGVhbHRoLCBCdWlsZEhlYWx0aFN0YWdlLCBEb3JhRW52TWV0cmljcywgRG9yYUxldmVsLCBEb3JhTWV0cmljcywgRG9yYU9wdGlvbnMsIERvcmFUcmVuZFBvaW50LFxuICBJbmNpZGVudElucHV0LCBJbmNpZGVudExpc3RJdGVtLCBJbmNpZGVudFNldHRpbmdzLCBJbmNpZGVudFRlc3RSZXN1bHQsXG4gIEluZ2VzdEV2ZW50LCBJbmdlc3RIZWFsdGhTdGF0dXMsIEluZ2VzdE1ldHJpYywgSW5nZXN0UmVzdWx0LFxuICBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMsIFJlcG9ydGluZ1JldGVudGlvblNldHRpbmdzLFxuICBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLFxufSBmcm9tICcuL3JlcG9ydGluZy90eXBlcy5qcyc7XG5leHBvcnQgeyByZXNvbHZlRG9yYVJldGVudGlvbkRheXMsIHJlc29sdmVFdmVudFJldGVudGlvbkRheXMsIHJldGVudGlvbkN1dG9mZiB9IGZyb20gJy4vcmVwb3J0aW5nL3JldGVudGlvbi5qcyc7XG5cblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW52ZW50b3J5Q2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICAgIHRpbWVzZXJpZXNDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGFyZSBkcm9wcGVkIChhbmQgbG9nZ2VkIGF0IFdBUk5cbiAgICogd2l0aCBzYW1wbGUgaWRzIHNvIGFuIG9wZXJhdG9yIGNhbiBzZWUgd2hlbiBFdmVudEJyaWRnZSBpcyBkZWxpdmVyaW5nXG4gICAqIGV2ZW50cyBmb3IgcGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCkuXG4gICAqXG4gICAqIFJldHVybnMgY291bnRzICsgYSBzYW1wbGUgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICovXG4gIGFzeW5jIGluZ2VzdEV2ZW50cyhldmVudHM6IEluZ2VzdEV2ZW50W10sIG9uTWV0cmljPzogKG06IEluZ2VzdE1ldHJpYykgPT4gdm9pZCk6IFByb21pc2U8SW5nZXN0UmVzdWx0PiB7XG4gICAgLy8gTXVsdGktb3JnIGJhdGNoIGluc2VydDogdGhlIGNhbGxlciByZXNvbHZlcyB0byBtdWx0aXBsZSBvcmdzIHZpYSB0aGVcbiAgICAvLyBwaXBlbGluZS1yZWdpc3RyeSBsb29rdXAgYmVsb3csIHNvIHRoZSByb3V0ZSBsYXllciBNVVNUIGVzdGFibGlzaCBhXG4gICAgLy8gYHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIC4uLilgIHNjb3BlIGJlZm9yZSBjYWxsaW5nXG4gICAgLy8gdGhpcyBtZXRob2QuIFVuZGVyIEZPUkNFJ2QgUkxTLCBhIHNpbmdsZSB0eCB3aXRoIGBhcHAub3JnX2lkID0gPG9uZVxuICAgIC8vIG9yZz5gIGNvdWxkIG9ubHkgd3JpdGUgZXZlbnRzIGZvciB0aGF0IG9yZzsgYnlwYXNzIHZpYSBzeXNhZG1pbiBpc1xuICAgIC8vIHRoZSByaWdodCBnYXRlIGZvciB0aGlzIHNlcnZlci1pbnRlcm5hbCBjcm9zcy10ZW5hbnQgZW5kcG9pbnQuIFNlZVxuICAgIC8vIGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHMgZm9yIHRoZSB3cmFwcGVyLlxuICAgIC8vIFJ1biBpbnNlcnQgaW5zaWRlIHRoZSB0eCwgYnV0IENPTExFQ1QgYWZmZWN0ZWQgb3JncyBhbmQgaW52YWxpZGF0ZVxuICAgIC8vIGNhY2hlcyBBRlRFUiB0aGUgdHggcmVzb2x2ZXMuIEtlZXBpbmcgaW52YWxpZGF0aW9uIGluc2lkZSB0aGUgdHggaGVsZFxuICAgIC8vIHRoZSBwZyBsb2NrcyBvcGVuIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhY2hlIHJvdW5kLXRyaXBzIChSZWRpcyBvclxuICAgIC8vIGluLW1lbW9yeSBpbnZhbGlkYXRpb25zIGFyZSB1bnJlbGF0ZWQgdG8gdGhlIHR4IGJ1dCBzdGlsbCBzZXJpYWxpemVkXG4gICAgLy8gaXRzIGNvbW1pdCkuIENhY2hlIFRUTCBpcyAyLTUgbWluIHNvIGZpcmUtYW5kLWZvcmdldCBwb3N0LWNvbW1pdCBpc1xuICAgIC8vIGFuIGFjY2VwdGFibGUgdHJhZGUgZm9yIHRpZ2h0ZXIgbG9jayB3aW5kb3dzLlxuICAgIGNvbnN0IHsgaW5zZXJ0ZWQsIHNraXBwZWQsIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLCBhZmZlY3RlZE9yZ3MsIGluc2VydGVkUm93cyB9ID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gQmF0Y2gtcmVzb2x2ZSBhbGwgdW5pcXVlIHBpcGVsaW5lIGlkcyBpbiBvbmUgcXVlcnlcbiAgICAgIGNvbnN0IHVuaXF1ZUlkcyA9IFsuLi5uZXcgU2V0KGV2ZW50cy5tYXAoZSA9PiBlLnBpcGVsaW5lSWQpKV07XG4gICAgICBjb25zdCByZWdpc3RyeVJvd3MgPSBhd2FpdCB0eFxuICAgICAgICAuc2VsZWN0KHtcbiAgICAgICAgICBwaXBlbGluZUlkOiBzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiBzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgfSlcbiAgICAgICAgLmZyb20oc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkpXG4gICAgICAgIC53aGVyZShpbkFycmF5KHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lSWQsIHVuaXF1ZUlkcykpO1xuXG4gICAgICBjb25zdCBpZE1hcCA9IG5ldyBNYXAocmVnaXN0cnlSb3dzLm1hcChyID0+IFtyLnBpcGVsaW5lSWQsIHJdKSk7XG5cbiAgICAgIC8vIEJ1aWxkIGluc2VydCBiYXRjaCAoc2tpcCBldmVudHMgd2hvc2UgcGlwZWxpbmUgaXNuJ3QgcmVnaXN0ZXJlZClcbiAgICAgIGNvbnN0IHJvd3M6IEFycmF5PHR5cGVvZiBzY2hlbWEucGlwZWxpbmVFdmVudC4kaW5mZXJJbnNlcnQ+ID0gW107XG4gICAgICBsZXQgc2tpcHBlZExvY2FsID0gMDtcbiAgICAgIGNvbnN0IHVucmVnaXN0ZXJlZExvY2FsOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IGlkTWFwLmdldChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgaWYgKCFyZWdpc3RyeSkge1xuICAgICAgICAgIHNraXBwZWRMb2NhbCsrO1xuICAgICAgICAgIHVucmVnaXN0ZXJlZExvY2FsLnB1c2goZXZlbnQucGlwZWxpbmVJZCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByb3dzLnB1c2goe1xuICAgICAgICAgIC8vIHJlZ2lzdHJ5LnBpcGVsaW5lSWQgPT09IGV2ZW50LnBpcGVsaW5lSWQ7IHVzZSB0aGUgcmVnaXN0cnkncyBzbyB0aGVcbiAgICAgICAgICAvLyBGSyBpcyBhbHdheXMgYSByb3cgdGhhdCBleGlzdHMsIGFuZCBwdWxsIG9yZ0lkIGZyb20gdGhlIHJlZ2lzdHJ5IGZvclxuICAgICAgICAgIC8vIHRlbmFuY3kgKG5ldmVyIHRydXN0IHRoZSBjYWxsZXIncyBjbGFpbWVkIG9yZykuXG4gICAgICAgICAgcGlwZWxpbmVJZDogcmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICAgICAgICBvcmdJZDogcmVnaXN0cnkub3JnSWQsXG4gICAgICAgICAgZXZlbnRTb3VyY2U6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgIHN0YXR1czogZXZlbnQuc3RhdHVzLFxuICAgICAgICAgIC8vIGV4ZWN1dGlvbklkIGlzIGFuIEFXUy1BU1NJR05FRCBpZGVudGlmaWVyIChhIFVVSUQpLCBub3QgZnJlZS1mb3JtXG4gICAgICAgICAgLy8gdXNlciB0ZXh0LCBzbyBpdCBjYW4ndCBjYXJyeSBhbiBhY2NvdW50IGlkIOKAlCBhbmQgc2NydWJiaW5nIGEgVVVJRFxuICAgICAgICAgIC8vIHRoYXQgaGFwcGVucyB0byBjb250YWluIGEgMTItZGlnaXQgcnVuIHdvdWxkIGNvcnJ1cHQgdGhlIGNvcnJlbGF0aW9uXG4gICAgICAgICAgLy8ga2V5LiBMZWZ0IGludGFjdCBieSBkZXNpZ24uXG4gICAgICAgICAgZXhlY3V0aW9uSWQ6IGV2ZW50LmV4ZWN1dGlvbklkLFxuICAgICAgICAgIC8vIHN0YWdlTmFtZS9hY3Rpb25OYW1lIGFyZSBVU0VSLUFVVEhPUkVEIHBpcGVsaW5lLXN0cnVjdHVyZSBuYW1lc1xuICAgICAgICAgIC8vIHByb21vdGVkIGZyb20gdGhlIENvZGVQaXBlbGluZSBkZXRhaWwg4oCUIHNhbWUgdW50cnVzdGVkLUFXUy1kZXJpdmVkXG4gICAgICAgICAgLy8gb3JpZ2luIGFzIGVycm9yTWVzc2FnZSBiZWxvdywgc28gc2NydWIgdGhlbSBhdCB0aGlzIHBlcnNpc3RlbmNlXG4gICAgICAgICAgLy8gYm91bmRhcnkgdG9vIChhIHN0YWdlIG5hbWVkIHdpdGggYW4gQVJOLzEyLWRpZ2l0IGlkIG11c3Qgbm90IHBlcnNpc3QpLlxuICAgICAgICAgIHN0YWdlTmFtZTogc2NydWJPcHRpb25hbChldmVudC5zdGFnZU5hbWUpLFxuICAgICAgICAgIGFjdGlvbk5hbWU6IHNjcnViT3B0aW9uYWwoZXZlbnQuYWN0aW9uTmFtZSksXG4gICAgICAgICAgLy8gSEFSRCBDT05TVFJBSU5UOiBhbiBBV1MgYWNjb3VudCBpZCBtdXN0IE5FVkVSIGJlIHBlcnNpc3RlZC4gVGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBEVVJBQkxFIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGFuZCBtdXN0IG5vdCB0cnVzdCB1cHN0cmVhbTpcbiAgICAgICAgICAvLyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGZhaWx1cmUgZGV0YWlsICYgbWVzc2FnZXMgcm91dGluZWx5IGNhcnJ5XG4gICAgICAgICAgLy8gQVJOcyAoYXJuOmF3czrigKY6PGFjY291bnQtaWQ+OuKApikgYW5kIGJhcmUgMTItZGlnaXQgYWNjb3VudCBpZHMuIFNjcnViXG4gICAgICAgICAgLy8gYm90aCBmcmVlLWZvcm0gZmllbGRzIGhlcmUgYmVmb3JlIGluc2VydCAocGVyLWV2ZW50LCBub24tbXV0YXRpbmcpLlxuICAgICAgICAgIGVycm9yTWVzc2FnZTogc2NydWJPcHRpb25hbChldmVudC5lcnJvck1lc3NhZ2UpLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogZXZlbnQuc3RhcnRlZEF0ID8gbmV3IERhdGUoZXZlbnQuc3RhcnRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb21wbGV0ZWRBdDogZXZlbnQuY29tcGxldGVkQXQgPyBuZXcgRGF0ZShldmVudC5jb21wbGV0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZHVyYXRpb25NczogZXZlbnQuZHVyYXRpb25NcyxcbiAgICAgICAgICAvLyBEZXBsb3ktYXR0cmlidXRpb24gZmllbGRzIOKAlCBzY3J1YmJlZCBsaWtlIHRoZSBvdGhlciBmcmVlLWZvcm0gc3RyaW5nc1xuICAgICAgICAgIC8vIHNvIGFuIEFSTi9hY2NvdW50IGlkIGNhbiBuZXZlciBlbnRlciB2aWEgYSByZWYgb3IgZW52aXJvbm1lbnQgbmFtZS5cbiAgICAgICAgICBjb21taXRTaGE6IHNjcnViT3B0aW9uYWwoZXZlbnQuY29tbWl0U2hhKSxcbiAgICAgICAgICBjb21taXRSZWY6IHNjcnViT3B0aW9uYWwoZXZlbnQuY29tbWl0UmVmKSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogc2NydWJPcHRpb25hbChldmVudC5lbnZpcm9ubWVudCksXG4gICAgICAgICAgLy8gTWVhc3VyZWQgbGVhZCB0aW1lIChQaGFzZSA0KTogb2xkZXN0IHVuc2hpcHBlZCBjb21taXQgdGltZSArIGNvdW50LlxuICAgICAgICAgIC8vIGNvbW1pdFRpbWVzdGFtcCBpcyBhbiBBV1MvU0NNLWRlcml2ZWQgaW5zdGFudCAobmV2ZXIgYWNjb3VudC1pZFxuICAgICAgICAgIC8vIHNoYXBlZCk7IGNvbW1pdENvdW50IGlzIGEgcGxhaW4gaW50ZWdlci4gTmVpdGhlciBuZWVkcyBzY3J1YmJpbmcuXG4gICAgICAgICAgY29tbWl0VGltZXN0YW1wOiBldmVudC5jb21taXRUaW1lc3RhbXAgPyBuZXcgRGF0ZShldmVudC5jb21taXRUaW1lc3RhbXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbW1pdENvdW50OiBldmVudC5jb21taXRDb3VudCxcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LmRldGFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnMoZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICB9XG5cbiAgICAgIC8vIFNRUyBpcyBhdC1sZWFzdC1vbmNlLCBzbyBFdmVudEJyaWRnZSBjYW4gZGVsaXZlciB0aGUgc2FtZSBzdGF0ZS1jaGFuZ2VcbiAgICAgIC8vIHR3aWNlLiBgb25Db25mbGljdERvTm90aGluZ2AgKyB0aGUgcGFydGlhbCB1bmlxdWUgaW5kZXggb25cbiAgICAgIC8vIChwaXBlbGluZV9pZCwgZXhlY3V0aW9uX2lkLCBldmVudF90eXBlLCBzdGF0dXMsIHN0YWdlX25hbWUsIGFjdGlvbl9uYW1lKVxuICAgICAgLy8gbWFrZXMgcmUtZGVsaXZlcnkgaWRlbXBvdGVudC4gYHJldHVybmluZ2AgZ2l2ZXMgdGhlIFJFQUwgaW5zZXJ0ZWQgc2V0IHNvXG4gICAgICAvLyBjb3VudHMsIG1ldHJpY3MgYW5kIGNhY2hlIGludmFsaWRhdGlvbiBhbGwgaWdub3JlIGR1cGxpY2F0ZXMuXG4gICAgICBjb25zdCBsYW5kZWQgPSByb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBpcGVsaW5lRXZlbnQpLnZhbHVlcyhyb3dzKVxuICAgICAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKClcbiAgICAgICAgICAucmV0dXJuaW5nKHtcbiAgICAgICAgICAgIG9yZ0lkOiBzY2hlbWEucGlwZWxpbmVFdmVudC5vcmdJZCxcbiAgICAgICAgICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50LnBpcGVsaW5lSWQsXG4gICAgICAgICAgICBldmVudFR5cGU6IHNjaGVtYS5waXBlbGluZUV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgICAgIHN0YXR1czogc2NoZW1hLnBpcGVsaW5lRXZlbnQuc3RhdHVzLFxuICAgICAgICAgICAgc3RhZ2VOYW1lOiBzY2hlbWEucGlwZWxpbmVFdmVudC5zdGFnZU5hbWUsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuZW52aXJvbm1lbnQsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zZXJ0ZWQ6IGxhbmRlZC5sZW5ndGgsXG4gICAgICAgIHNraXBwZWQ6IHNraXBwZWRMb2NhbCxcbiAgICAgICAgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHM6IHVucmVnaXN0ZXJlZExvY2FsLFxuICAgICAgICBhZmZlY3RlZE9yZ3M6IFsuLi5uZXcgU2V0KGxhbmRlZC5tYXAociA9PiByLm9yZ0lkKSldLFxuICAgICAgICBpbnNlcnRlZFJvd3M6IGxhbmRlZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBQaGFzZSAzYjogZmFuIHRlcm1pbmFsIFNUQUdFIG91dGNvbWVzIGludG8gUHJvbWV0aGV1cyBjb3VudGVycyB2aWEgdGhlXG4gICAgLy8gcm91dGUncyBob29rIChwaXBlbGluZS1kYXRhIGNhbid0IGltcG9ydCBhcGktc2VydmVyJ3MgcmVnaXN0cnkpLCBhZnRlciB0aGVcbiAgICAvLyBpbnNlcnQgQ09NTUlUUy4gRHJpdmVuIG9mZiB0aGUgSU5TRVJURUQgcm93cyDigJQgbm90IHRoZSByZXF1ZXN0IGJhdGNoIOKAlCBzbyBhIHJlLWRlbGl2ZXJlZCBldmVudFxuICAgIC8vIHRoZSBkZWR1cCBpbmRleCBzd2FsbG93ZWQgaXMgbmV2ZXIgY291bnRlZCB0d2ljZSAoY291bnRlcnMsIHVubGlrZSB0aGVcbiAgICAvLyB0YWJsZSwgaGF2ZSBubyBpZGVtcG90ZW5jeSBvZiB0aGVpciBvd24pLiBWYWx1ZXMgYXJlIHRoZSBwZXJzaXN0ZWQsXG4gICAgLy8gYWxyZWFkeS1zY3J1YmJlZCBjb2x1bW5zLiBBIG5vbi1udWxsIGVudmlyb25tZW50IGFsc28gbWFya3MgYSBkZXBsb3kuXG4gICAgaWYgKG9uTWV0cmljKSB7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgaW5zZXJ0ZWRSb3dzKSB7XG4gICAgICAgIGlmIChyLmV2ZW50VHlwZSAhPT0gJ1NUQUdFJyB8fCAoci5zdGF0dXMgIT09ICdTVUNDRUVERUQnICYmIHIuc3RhdHVzICE9PSAnRkFJTEVEJykgfHwgIXIucGlwZWxpbmVJZCkgY29udGludWU7XG4gICAgICAgIG9uTWV0cmljKHtcbiAgICAgICAgICBwaXBlbGluZUlkOiByLnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHIub3JnSWQsXG4gICAgICAgICAgc3RhZ2U6IHIuc3RhZ2VOYW1lID8/ICcnLFxuICAgICAgICAgIGVudmlyb25tZW50OiByLmVudmlyb25tZW50ID8/IG51bGwsXG4gICAgICAgICAgcmVzdWx0OiByLnN0YXR1cyA9PT0gJ1NVQ0NFRURFRCcgPyAnc3VjY2VlZGVkJyA6ICdmYWlsZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdXJmYWNlIHRoZSBzaWxlbnQgc2tpcDogYW4gdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkIHVzdWFsbHkgbWVhbnMgdGhlXG4gICAgLy8gcGlwZWxpbmUgaGFzbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0IChvciBpdHNcbiAgICAvLyBwYi5waXBlbGluZS1pZCB0YWcgaXMgbWlzc2luZy91bnJlYWRhYmxlIGJ5IHRoZSBMYW1iZGEpLiBMb2dnaW5nIGl0XG4gICAgLy8gbWFrZXMgYSBicm9rZW4gam9pbiB2aXNpYmxlIGluc3RlYWQgb2YgbG9va2luZyBsaWtlIFwibm8gYWN0aXZpdHlcIi5cbiAgICBpZiAodW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGV2ZW50cyBza2lwcGVkOiBwaXBlbGluZSBpZCBub3QgZm91bmQgaW4gcmVnaXN0cnknLCB7XG4gICAgICAgIGNvdW50OiB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5sZW5ndGgsXG4gICAgICAgIHNhbXBsZTogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMuc2xpY2UoMCwgMyksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAgIC8vIHNob3J0IGVub3VnaCB0aGF0IGEgbWlzc2VkIGludmFsaWRhdGlvbiBzZWxmLWhlYWxzLlxuICAgIGlmIChhZmZlY3RlZE9yZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZU9yZyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkOiBvcmcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgfSksXG4gICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuXG4gIC8qKiAxLjEgRXhlY3V0aW9uIGNvdW50IHBlciBwaXBlbGluZSB3aXRoIHN0YXR1cyBicmVha2Rvd24uICovXG4gIGFzeW5jIGdldEV4ZWN1dGlvbkNvdW50KG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSk6IFByb21pc2U8RXhlY3V0aW9uQ291bnRbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIC8vIE9wdGlvbmFsIFtmcm9tLHRvXSB3aW5kb3cgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQsIG1pcnJvcmluZyB0aGVcbiAgICAvLyBzaWJsaW5nIHRpbWVzZXJpZXMgcmVwb3J0cyBzbyB0aGUgZGFzaGJvYXJkIGRhdGUtcmFuZ2UgcGlja2VyIG5hcnJvd3MgdGhlXG4gICAgLy8gY291bnQgdG9vIChhbiBlbXB0eSByYW5nZSA9IGFsbC10aW1lLCBwcmVzZXJ2aW5nIHRoZSBwcmlvciBiZWhhdmlvcikuIFRoZVxuICAgIC8vIHJhbmdlIHJpZGVzIHRoZSBKT0lOIHNvIHBpcGVsaW5lcyB3aXRoIG5vIGluLXdpbmRvdyBldmVudHMgc3RpbGwgbGlzdFxuICAgIC8vIChMRUZUIHNlbWFudGljcyBwcmVzZXJ2ZWQgdmlhIHRoZSBpbm5lci1qb2luIGZpbHRlciDigJQgYSBwaXBlbGluZSB3aXRoIHplcm9cbiAgICAvLyBtYXRjaGluZyBldmVudHMgZHJvcHMgZnJvbSB0aGUgY291bnQsIHNhbWUgYXMgYmVmb3JlIGZvciBpdHMgd2luZG93KS5cbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UocmFuZ2UpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBwLmlzX2FjdGl2ZSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgcC5pZFxuICAgICAgICBPUkRFUiBCWSB0b3RhbCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RXhlY3V0aW9uQ291bnQ+KHIucm93cykpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpleGVjLWNvdW50OiR7cmFuZ2U/LmZyb20gPz8gJyd9OiR7cmFuZ2U/LnRvID8/ICcnfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjFiIFBlci1waXBlbGluZSBleGVjdXRpb24gaGlzdG9yeSDigJQgRElTVElOQ1QgZXhlY3V0aW9ucyBmb3Igb25lIHBpcGVsaW5lLFxuICAgKiBuZXdlc3QgZmlyc3QuIEdyb3VwcyBhbGwgZXZlbnRzIGJ5IGBleGVjdXRpb25faWRgIGluIGEgc2luZ2xlIHNjYW4gYW5kXG4gICAqIHJvbGxzIGVhY2ggZXhlY3V0aW9uIHVwIHRvIG9uZSByb3c6XG4gICAqICAgLSBzdGF0dXM6IGRlcml2ZWQgZnJvbSB0aGUgUElQRUxJTkUtdHlwZSBldmVudHMuIEZBSUxFRCB3aW5zLCB0aGVuXG4gICAqICAgICBTVUNDRUVERUQsIHRoZW4gQ0FOQ0VMRUQ7IGFuIGV4ZWN1dGlvbiB3aXRoIG5vIHRlcm1pbmFsIFBJUEVMSU5FIGV2ZW50XG4gICAqICAgICBpcyBzdGlsbCBgaW4tcHJvZ3Jlc3NgLlxuICAgKiAgIC0gc3RhcnRlZEF0L2VuZGVkQXQvZHVyYXRpb25NczogZnJvbSB0aGUgUElQRUxJTkUgbGlmZWN5Y2xlIGV2ZW50cy5cbiAgICogICAtIGZhaWxpbmdTdGFnZS9mYWlsaW5nQWN0aW9uOiB0aGUgZmlyc3QgRkFJTEVEIFNUQUdFL0FDVElPTiBldmVudCAoY2hlYXAg4oCUXG4gICAqICAgICBzYW1lIHNjYW4sIG5vIGV4dHJhIHF1ZXJ5KS5cbiAgICpcbiAgICogT1JHLVNDT1BJTkc6IGlkZW50aWNhbCB0byB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0cyDigJQgam9pbnMgdGhlIHBpcGVsaW5lXG4gICAqIHJlZ2lzdHJ5IHRhYmxlIChgcGlwZWxpbmVgKSBhbmQgZ2F0ZXMgb24gYHAub3JnX2lkICR7cHJlZH1gLCB3aGVyZSBgcHJlZGAgaXNcbiAgICogdGhlIHNpbmdsZS1vcmcgYD0gJG9yZ2Agb3IgKHdpdGggYSByb2xsdXApIGFuIGBJTiAoLi4uKWAgb3ZlciB0aGUgb3Jn4oaSdGVhbVxuICAgKiBzdWJ0cmVlLiBBIHBpcGVsaW5lSWQgYmVsb25naW5nIHRvIGFub3RoZXIgb3JnIHlpZWxkcyB6ZXJvIHJvd3MuXG4gICAqL1xuICBhc3luYyBsaXN0UGlwZWxpbmVFeGVjdXRpb25zKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9LFxuICAgIGxpbWl0OiBudW1iZXIgPSA1MCxcbiAgKTogUHJvbWlzZTxQaXBlbGluZUV4ZWN1dGlvbltdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgcmFuZ2VDbGF1c2UgPSBvcHRpb25hbFN0YXJ0ZWRBdFJhbmdlKHJhbmdlKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSBUSEVOICdmYWlsZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0NBTkNFTEVEJykgVEhFTiAnY2FuY2VsZWQnXG4gICAgICAgICAgICBFTFNFICdpbi1wcm9ncmVzcydcbiAgICAgICAgICBFTkQgQVMgc3RhdHVzLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OmludCBBUyBkdXJhdGlvbl9tcyxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuc3RhZ2VfbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19zdGFnZSxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuYWN0aW9uX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX2FjdGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfSBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZFxuICAgICAgICBPUkRFUiBCWSBNQVgoZS5jcmVhdGVkX2F0KSBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8UGlwZWxpbmVFeGVjdXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpwaXBlbGluZS1leGVjdXRpb25zOiR7cGlwZWxpbmVJZH06JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9OiR7bGltaXR9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMiBTdWNjZXNzIHJhdGUgb3ZlciB0aW1lIGZvciBhbiBvcmcuICovXG4gIGFzeW5jIGdldFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpzdWNjZXNzLXJhdGU6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjMgQXZlcmFnZSBkdXJhdGlvbiBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldEF2ZXJhZ2VEdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxEdXJhdGlvblN0YXRzW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNSU4oZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtaW5fbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk1KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGUuZHVyYXRpb25fbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZXhlY3V0aW9uc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RHVyYXRpb25TdGF0cz4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OmF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNSBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuc3RhZ2VfbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBmYWlsdXJlX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YWdlX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8U3RhZ2VGYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHJ1blJlcG9ydChgJHtvcmdJZH06c3RhZ2UtZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5jdCBkZXBsb3kgYGVudmlyb25tZW50YCB2YWx1ZXMgb2JzZXJ2ZWQgaW4gdGhlIHdpbmRvdyDigJQgcG93ZXJzIHRoZVxuICAgKiBET1JBIGVudmlyb25tZW50LXNjb3BlIGRhdGFsaXN0LiBPcmctc2NvcGVkICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmdcbiAgICogcmVwb3J0czsgb25seSBub24tbnVsbCBlbnZpcm9ubWVudHMgKGkuZS4gZGVwbG95LWF0dHJpYnV0ZWQgZXhlY3V0aW9ucykuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRFbnZpcm9ubWVudHMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCBESVNUSU5DVCBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIE9SREVSIEJZIGVudmlyb25tZW50XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8eyBlbnZpcm9ubWVudDogc3RyaW5nIH0+KHIucm93cykubWFwKChyb3cpID0+IHJvdy5lbnZpcm9ubWVudCkpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpyZXBvcnQtZW52czoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNiBTdGFnZSBib3R0bGVuZWNrcyDigJQgc2xvd2VzdCBzdGFnZXMgcGVyIHBpcGVsaW5lLiAqL1xuICBhc3luYyBnZXRTdGFnZUJvdHRsZW5lY2tzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFN0YWdlQm90dGxlbmVja1tdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnBpcGVsaW5lX25hbWUsIGUuc3RhZ2VfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHAuaWQsIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFN0YWdlQm90dGxlbmVjaz4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWJvdHRsZW5lY2tzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS43IEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5hY3Rpb25fbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBmYWlsdXJlX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5hY3Rpb25fbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5hY3Rpb25fbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QWN0aW9uRmFpbHVyZT4oci5yb3dzKSkpO1xuICAgIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OmFjdGlvbi1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuOCBFcnJvciBjYXRlZ29yaXphdGlvbiDigJQgZ3JvdXAgZmFpbHVyZSBtZXNzYWdlcy4gRXhlY3V0aW9uIHJlcG9ydCwgc29cbiAgICogcm9sbHVwLWF3YXJlIGV4YWN0bHkgbGlrZSB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0czogd2l0aCBgb3JnSWRzYFxuICAgKiAodGhlIG9yZ+KGknRlYW0gc3VidHJlZSkgdGhlIG9yZyBnYXRlIGJlY29tZXMgYW4gYElOICguLi4pYCBhbmQgdGhlIHJlYWQgcnVuc1xuICAgKiBmcmVzaCB1bmRlciBzeXNhZG1pbiB2aWEgYHJ1blJlcG9ydGA7IHNpbmdsZS1vcmcgcmVhZHMga2VlcCB0aGUgcGVyLW9yZyBjYWNoZS5cbiAgICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEVycm9yRW50cnlbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgU1VCU1RSSU5HKGUuZXJyb3JfbWVzc2FnZSBGUk9NIDEgRk9SIDIwMCkgQVMgZXJyb3JfcGF0dGVybixcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgQVMgYWZmZWN0ZWRfcGlwZWxpbmVzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnIEFORCBlLmVycm9yX21lc3NhZ2UgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGVycm9yX3BhdHRlcm4gT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEVycm9yRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTplcnJvcnM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm91ciBET1JBIG1lYXN1cmVzIHBsdXMgdGhlaXIgcGVyLWVudmlyb25tZW50IGJyZWFrZG93bi5cbiAgICogSW1wbGVtZW50YXRpb24gaW4gLi9yZXBvcnRpbmcvZG9yYS50cyDigJQgc2VlIHRoYXQgZmlsZSdzIGhlYWRlciBmb3Igd2h5LlxuICAgKi9cbiAgZ2V0RG9yYU1ldHJpY3MoXG4gICAgb3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSwgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxEb3JhTWV0cmljcz4ge1xuICAgIHJldHVybiBkb3JhTWV0cmljcyhvcmdJZCwgZnJvbSwgdG8sIG9yZ0lkcywgb3B0cyk7XG4gIH1cblxuICAvKiogRE9SQSBtZWFzdXJlcyBidWNrZXRlZCBvdmVyIHRpbWUuICovXG4gIGdldERvcmFUcmVuZChcbiAgICBvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFUcmVuZFBvaW50W10+IHtcbiAgICByZXR1cm4gZG9yYVRyZW5kKG9yZ0lkLCBpbnRlcnZhbCwgZnJvbSwgdG8sIG9yZ0lkcywgb3B0cyk7XG4gIH1cblxuICAvKiogUGVyLXBpcGVsaW5lIGJ1aWxkIGhlYWx0aCAoc3RhZ2UgcGFzcyByYXRlcyBvdmVyIGEgd2luZG93KS4gKi9cbiAgZ2V0QnVpbGRIZWFsdGgoXG4gICAgb3JnSWQ6IHN0cmluZywgcGlwZWxpbmVJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPEJ1aWxkSGVhbHRoPiB7XG4gICAgcmV0dXJuIGJ1aWxkSGVhbHRoKG9yZ0lkLCBwaXBlbGluZUlkLCBmcm9tLCB0bywgb3JnSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdldFBsdWdpblN1bW1hcnkob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luU3VtbWFyeT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXN1bW1hcnlgLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIE5PVCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGluYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLnZpc2liaWxpdHl9ID0gJ3B1YmxpYycpOjppbnQgQVMgcHVibGljLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLnZpc2liaWxpdHl9ID0gJ29yZycpOjppbnQgQVMgb3JnLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLnZpc2liaWxpdHl9ID0gJ3ByaXZhdGUnKTo6aW50IEFTIHByaXZhdGUsXG4gICAgICAgICAgQ09VTlQoRElTVElOQ1QgJHtzY2hlbWEucGx1Z2luLm5hbWV9KTo6aW50IEFTIHVuaXF1ZV9uYW1lc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICBgKSk7XG4gICAgICByZXR1cm4gKGRyaXp6bGVSb3dzPFBsdWdpblN1bW1hcnk+KHJvd3Mucm93cylbMF0gfHwgeyB0b3RhbDogMCwgYWN0aXZlOiAwLCBpbmFjdGl2ZTogMCwgcHVibGljOiAwLCBvcmc6IDAsIHByaXZhdGU6IDAsIHVuaXF1ZU5hbWVzOiAwIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIDIuMiBUeXBlICYgY29tcHV0ZSBkaXN0cmlidXRpb24uXG4gICAqICBJTlRFTlRJT05BTExZIFNJTkdMRS1PUkcgKG5vIHJvbGx1cCk6IHBsdWdpbiBpbnZlbnRvcnkgaXMgcGVyLW9yZyAoc2VlXG4gICAqICBnZXRQbHVnaW5TdW1tYXJ5KS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuICBhc3luYyBnZXRQbHVnaW5EaXN0cmlidXRpb24ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VHlwZUNvbXB1dGVEaXN0cmlidXRpb25bXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLWRpc3RyaWJ1dGlvbmAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9IEFTIHBsdWdpbl90eXBlLFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX0gQVMgY29tcHV0ZV90eXBlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgY291bnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9LCAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9XG4gICAgICAgIE9SREVSIEJZIGNvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbj4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi4zIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgLS0gSGlnaGVzdCB2ZXJzaW9uIGJ5IE5VTUVSSUMgc2VtdmVyIGNvcmUgKG5vdCBsZXhpY2FsOiAnMTAuMC4wJyA+ICc5LjAuMCcpLlxuICAgICAgICAgIC0tIFN0cmlwIGFueSAtcHJlcmVsZWFzZS8rYnVpbGQgc3VmZml4IGJlZm9yZSB0aGUgaW50W10gY2FzdCBzbyBpdCBjYW4ndFxuICAgICAgICAgIC0tIGVycm9yIG9uIHZhbGlkIHNlbXZlcjsga2VlcCB0aGUgb3JpZ2luYWwgc3RyaW5nIGZvciBkaXNwbGF5LlxuICAgICAgICAgIC0tIEdVQVJEOiBhIG5vbi1udW1lcmljLWRvdHRlZCB2ZXJzaW9uICgnbGF0ZXN0JywgJycsICd2MScpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAgICAgLS0gOjppbnRbXSBjYXN0IHRocm93IGFuZCBibG93IHVwIHRoZSBXSE9MRSBvcmcgc3VtbWFyeS4gT25seSBjYXN0IHJvd3NcbiAgICAgICAgICAtLSB3aG9zZSBzdHJpcHBlZCBjb3JlIG1hdGNoZXMgYSBudW1lcmljLWRvdHRlZCBzaGFwZTsgc29ydCBldmVyeXRoaW5nXG4gICAgICAgICAgLS0gZWxzZSB0byB0aGUgYm90dG9tIHZpYSBhIHNlbnRpbmVsIEFSUkFZWy0xXSBzbyB0aGUgcm93IHN0aWxsIGNvdW50cy5cbiAgICAgICAgICAoYXJyYXlfYWdnKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufVxuICAgICAgICAgICAgIE9SREVSIEJZIENBU0VcbiAgICAgICAgICAgICAgIFdIRU4gcmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSB+ICdeWzAtOV0rKFsuXVswLTldKykqJCdcbiAgICAgICAgICAgICAgICAgVEhFTiBzdHJpbmdfdG9fYXJyYXkocmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSwgJy4nKTo6aW50W11cbiAgICAgICAgICAgICAgIEVMU0UgQVJSQVlbLTFdXG4gICAgICAgICAgICAgRU5EIERFU0NcbiAgICAgICAgICApKVsxXSBBUyBsYXRlc3RfdmVyc2lvbixcbiAgICAgICAgICBib29sX29yKCR7c2NoZW1hLnBsdWdpbi5pc0RlZmF1bHR9KSBBUyBoYXNfZGVmYXVsdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ubmFtZX1cbiAgICAgICAgT1JERVIgQlkgdmVyc2lvbl9jb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VmVyc2lvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAyLjQgQnVpbGQgc3VjY2VzcyByYXRlIG92ZXIgdGltZS5cbiAgICpcbiAgICogU1RBVFVTIENBU0lORyBOT1RFOiBUaGlzIHF1ZXJ5IGZpbHRlcnMgYnkgYGV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnYFxuICAgKiBhbmQgdXNlcyBsb3dlcmNhc2Ugc3RhdHVzIHZhbHVlcyAoYCdjb21wbGV0ZWQnYCwgYCdmYWlsZWQnYCksIHdoaWxlXG4gICAqIGBnZXRTdWNjZXNzUmF0ZWAgKDEuMikgZmlsdGVycyBieSBgZXZlbnRfdHlwZSA9ICdQSVBFTElORSdgIHdpdGhcbiAgICogdXBwZXJjYXNlIEFXUy1zdHlsZSBzdGF0dXNlcyAoYCdTVUNDRUVERUQnYCwgYCdGQUlMRUQnYCwgYCdDQU5DRUxFRCdgKS5cbiAgICogVGhlIGNhc2luZyBkcmlmdCBpcyBpbnRlbnRpb25hbCBhbmQgdHJhY2tzIHRoZSBwcm9kdWNlcjpcbiAgICogICAtIGBwbHVnaW4tYnVpbGRgIGV2ZW50cyBjb21lIGZyb20gb3VyIG93biBidWlsZCBwaXBlbGluZSAobG93ZXJjYXNlKVxuICAgKiAgIC0gYFBJUEVMSU5FYCBldmVudHMgY29tZSBmcm9tIEFXUyBDb2RlUGlwZWxpbmUgKHVwcGVyY2FzZSlcbiAgICogVGhlIGluZ2VzdCBab2Qgc2NoZW1hIGF0IGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHNcbiAgICogU0hPVUxEIGVudW0gdGhlc2UgcGVyLWV2ZW50U291cmNlIHNvIHdlIGNhdGNoIGRyaWZ0IGF0IGluZ2VzdCByYXRoZXJcbiAgICogdGhhbiBzaWxlbnRseSBwcm9kdWNpbmcgemVybyByb3dzIGhlcmUuIFNlZSBmaW5kaW5ncyBONzEuXG4gICAqL1xuICBhc3luYyBnZXRCdWlsZFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkVGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgLy8gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUgbGlrZSB0aGUgZXhlY3V0aW9uIHJlcG9ydHMuIFRoZXNlXG4gICAgLy8gcm93cyBhcmUgZ2F0ZWQgb24gdGhlIHBpcGVsaW5lX2V2ZW50IGBvcmdfaWRgIGRpcmVjdGx5IChubyBwaXBlbGluZSBqb2luKSxcbiAgICAvLyBzbyBgcHJlZGAgYXBwbGllcyB0byBgZS5vcmdfaWRgLlxuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2ZhaWxlZCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnY29tcGxldGVkJywgJ2ZhaWxlZCcpXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGRUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpidWlsZC1zdWNjZXNzOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMi41IEJ1aWxkIGR1cmF0aW9uIHBlciBwbHVnaW4uIEJ1aWxkIGFjdGl2aXR5IHJlcG9ydCDigJQgcm9sbHVwLWF3YXJlLiAqL1xuICBhc3luYyBnZXRCdWlsZER1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkRHVyYXRpb25bXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGJ1aWxkc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZER1cmF0aW9uPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHJ1blJlcG9ydChgJHtvcmdJZH06YnVpbGQtZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAyLjYgQnVpbGQgZmFpbHVyZXMg4oCUIHRvcCBlcnJvciBtZXNzYWdlcy4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgZS5lcnJvcl9tZXNzYWdlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSwgZS5lcnJvcl9tZXNzYWdlXG4gICAgICAgIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZEZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gcnVuUmVwb3J0KGAke29yZ0lkfTpidWlsZC1mYWlsdXJlczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDM6IERPUkEgd3JpdGUgcGF0aHMgKHBvc3QtZGVwbG95IG91dGNvbWVzICsgaW5nZXN0IGhlYWx0aCkg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIG1hbnVhbCBwb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlciAoUGhhc2UgMik6IGEgdXNlciBtYXJrcyBhXG4gICAqIGRlcGxveW1lbnQgYGZhaWxlZGAgKGEgcHJvZHVjdGlvbiBpbmNpZGVudCBsaW5rZWQgdG8gdGhlIGRlcGxveSkgb3JcbiAgICogYHJlc3RvcmVkYCAocmVjb3ZlcmVkKS4gSWRlbXBvdGVudCDigJQga2V5ZWQgb24gKGV4ZWN1dGlvbl9pZCwgb3V0Y29tZSkgc28gYVxuICAgKiBkdXBsaWNhdGUgUE9TVCByZWZyZXNoZXMgYGF0YCByYXRoZXIgdGhhbiBkb3VibGUtY291bnRpbmcsIHdoaWxlIGFcbiAgICogZmFpbGVk4oaScmVzdG9yZWQgcGFpciBzdGF5cyB0d28gcm93cy4gRmVlZHMgdGhlIHBvc3QtZGVwbG95IENGUiBjb21wb25lbnQgYW5kXG4gICAqIHRoZSByZWFsIE1UVFIuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSykuXG4gICAqL1xuICBhc3luYyByZWNvcmREZXBsb3ltZW50T3V0Y29tZShcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHsgb3V0Y29tZTogJ2ZhaWxlZCcgfCAncmVzdG9yZWQnOyBhdDogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lKS52YWx1ZXMoe1xuICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGlucHV0LmVudmlyb25tZW50KSxcbiAgICAgICAgb3V0Y29tZTogaW5wdXQub3V0Y29tZSxcbiAgICAgICAgYXQ6IG5ldyBEYXRlKGlucHV0LmF0KSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogW3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5leGVjdXRpb25JZCwgc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLm91dGNvbWVdLFxuICAgICAgICBzZXQ6IHtcbiAgICAgICAgICBhdDogbmV3IERhdGUoaW5wdXQuYXQpLFxuICAgICAgICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGlucHV0LmVudmlyb25tZW50KSA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgLy8gT3V0Y29tZSBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCB0aGUgb3JnJ3MgY2FjaGVkIHJlcG9ydHMuXG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZ0lkKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5nZXN0IGEgcHJvZHVjdGlvbiBpbmNpZGVudCAoUGhhc2UgNSkgZnJvbSB0aGUgb3JnJ3MgaW5jaWRlbnQgdG9vbGluZ1xuICAgKiAoUGFnZXJEdXR5IC8gRGF0YWRvZyAvIEFsZXJ0bWFuYWdlciB3ZWJob29rKS4gSWRlbXBvdGVudCDigJQga2V5ZWQgb25cbiAgICogKG9yZ19pZCwgaW5jaWRlbnRfaWQpIHNvIGEgbGF0ZXIgcmVzb2x2ZSByZS1wb3N0IHVwc2VydHMgYHJlc29sdmVkX2F0YFxuICAgKiAoYW5kIHJlZnJlc2hlcyB0aGUgb3RoZXIgbXV0YWJsZSBmaWVsZHMpIGluc3RlYWQgb2YgaW5zZXJ0aW5nIGEgZHVwbGljYXRlLlxuICAgKiBET1JBIGNvcnJlbGF0ZXMgZWFjaCBpbmNpZGVudCB0byB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kgdG8gaXRzXG4gICAqIGBlbnZpcm9ubWVudGAsIHByb2R1Y2luZyBhbiBhdXRvbWF0ZWQgcG9zdC1kZXBsb3kgZmFpbHVyZSArIGEgcmVhbCBNVFRSLlxuICAgKiBSdW5zIHVuZGVyIHRoZSBjYWxsZXIncyBvcmcgY29udGV4dCAoUkxTIFdJVEggQ0hFQ0spOyBmcmVlLWZvcm0gZmllbGRzIGFyZVxuICAgKiBBV1MtaWQgc2NydWJiZWQgYXQgdGhpcyBwZXJzaXN0ZW5jZSBib3VuZGFyeSBsaWtlIHRoZSBvdGhlciBpbmdlc3QgcGF0aHMuXG4gICAqL1xuICBhc3luYyByZWNvcmRJbmNpZGVudChvcmdJZDogc3RyaW5nLCBpbnB1dDogSW5jaWRlbnRJbnB1dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluY2lkZW50SWQgPSBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhpbnB1dC5pbmNpZGVudElkKTtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGlucHV0LmVudmlyb25tZW50KTtcbiAgICBjb25zdCBzZXZlcml0eSA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGlucHV0LnNldmVyaXR5KTtcbiAgICBjb25zdCBvcGVuZWRBdCA9IG5ldyBEYXRlKGlucHV0Lm9wZW5lZEF0KTtcbiAgICBjb25zdCByZXNvbHZlZEF0ID0gaW5wdXQucmVzb2x2ZWRBdCA/IG5ldyBEYXRlKGlucHV0LnJlc29sdmVkQXQpIDogbnVsbDtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmluY2lkZW50KS52YWx1ZXMoe1xuICAgICAgICBpbmNpZGVudElkLFxuICAgICAgICBvcmdJZCxcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgIG9wZW5lZEF0LFxuICAgICAgICByZXNvbHZlZEF0LFxuICAgICAgICBzZXZlcml0eSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogW3NjaGVtYS5pbmNpZGVudC5vcmdJZCwgc2NoZW1hLmluY2lkZW50LmluY2lkZW50SWRdLFxuICAgICAgICBzZXQ6IHsgZW52aXJvbm1lbnQsIG9wZW5lZEF0LCByZXNvbHZlZEF0LCBzZXZlcml0eSB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgLy8gQSBuZXcvdXBkYXRlZCBpbmNpZGVudCBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCBjYWNoZWQgcmVwb3J0cy5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBwZXItb3JnIERPUkEgc2V0dGluZ3MgKFBoYXNlIDViKS4gUmV0dXJucyB0aGUgc3RvcmVkXG4gICAqIGBpbmNpZGVudFdpbmRvd0hvdXJzYCBvdmVycmlkZSAob3IgYG51bGxgIHdoZW4gdW5zZXQpIHBsdXMgdGhlIGdsb2JhbCBlbnZcbiAgICogZGVmYXVsdCwgc28gdGhlIHNldHRpbmdzIFVJIGNhbiBzaG93IGJvdGguIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIHRlbmFudFxuICAgKiBjb250ZXh0IChSTFMtc2NvcGVkKTsgYSBzaW5nbGUtb3JnIHJlYWQuXG4gICAqL1xuICBhc3luYyBnZXRJbmNpZGVudFNldHRpbmdzKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEluY2lkZW50U2V0dGluZ3M+IHtcbiAgICBjb25zdCByb3dzID0gZHJpenpsZVJvd3M8e1xuICAgICAgaW5jaWRlbnRfd2luZG93X2hvdXJzOiBudW1iZXIgfCBudWxsO1xuICAgICAgZXZlbnRfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgICBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5pbmNpZGVudFdpbmRvd0hvdXJzfSBBUyBpbmNpZGVudF93aW5kb3dfaG91cnMsXG4gICAgICAgICAgICAgICAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZXZlbnRSZXRlbnRpb25EYXlzfSBBUyBldmVudF9yZXRlbnRpb25fZGF5cyxcbiAgICAgICAgICAgICAgICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5kb3JhUmV0ZW50aW9uRGF5c30gQVMgZG9yYV9yZXRlbnRpb25fZGF5c1xuICAgICAgICBGUk9NICR7c2NoZW1hLmRvcmFTZXR0aW5nc31cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICAgIExJTUlUIDFcbiAgICAgIGApKSkucm93cyk7XG4gICAgY29uc3Qgcm93ID0gcm93c1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5jaWRlbnRXaW5kb3dIb3Vyczogcm93Py5pbmNpZGVudF93aW5kb3dfaG91cnMgIT0gbnVsbCA/IE51bWJlcihyb3cuaW5jaWRlbnRfd2luZG93X2hvdXJzKSA6IG51bGwsXG4gICAgICBkZWZhdWx0V2luZG93SG91cnM6IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLFxuICAgICAgZXZlbnRSZXRlbnRpb25EYXlzOiByb3c/LmV2ZW50X3JldGVudGlvbl9kYXlzICE9IG51bGwgPyBOdW1iZXIocm93LmV2ZW50X3JldGVudGlvbl9kYXlzKSA6IG51bGwsXG4gICAgICBkb3JhUmV0ZW50aW9uRGF5czogcm93Py5kb3JhX3JldGVudGlvbl9kYXlzICE9IG51bGwgPyBOdW1iZXIocm93LmRvcmFfcmV0ZW50aW9uX2RheXMpIDogbnVsbCxcbiAgICAgIGRlZmF1bHRFdmVudFJldGVudGlvbkRheXM6IFJFUE9SVElOR19FVkVOVF9SRVRFTlRJT05fREFZUyxcbiAgICAgIGRlZmF1bHREb3JhUmV0ZW50aW9uRGF5czogUkVQT1JUSU5HX0RPUkFfUkVURU5USU9OX0RBWVMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnQgcGVyLW9yZyByZXBvcnRpbmcgc2V0dGluZ3MgKFBoYXNlIDViIGluY2lkZW50IHdpbmRvdyArIFBoYXNlIDdcbiAgICogcmV0ZW50aW9uIG92ZXJyaWRlcyksIGlkZW1wb3RlbnQgb24gYG9yZ19pZGAuIEEgcGFydGlhbCB3cml0ZSDigJQgb25seSB0aGVcbiAgICogZmllbGRzIHByZXNlbnQgaW4gYHBhdGNoYCBhcmUgc2V0IChzbyB1cGRhdGluZyByZXRlbnRpb24gbmV2ZXIgY2xlYXJzIHRoZVxuICAgKiBpbmNpZGVudCB3aW5kb3csIGFuZCB2aWNlLXZlcnNhKS4gU2V0IHNlbGYtc2VydmUgYnkgYW4gb3JnIGFkbWluIHZpYVxuICAgKiBgUFVUIC9hcGkvcmVwb3J0cy9zZXR0aW5ncy9pbmNpZGVudHNgLiBSdW5zIHVuZGVyIHRoZSBjYWxsZXIncyBvcmcgY29udGV4dFxuICAgKiAoUkxTIFdJVEggQ0hFQ0spOyBhIGNoYW5nZWQgdmFsdWUgYWZmZWN0cyBET1JBIGFnZ3JlZ2F0ZXMgc28gdGhlIG9yZydzXG4gICAqIGNhY2hlZCByZXBvcnRzIGFyZSBkcm9wcGVkLlxuICAgKi9cbiAgYXN5bmMgc2V0UmVwb3J0aW5nU2V0dGluZ3Mob3JnSWQ6IHN0cmluZywgcGF0Y2g6IFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBpZiAocGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycyAhPT0gdW5kZWZpbmVkKSBzZXQuaW5jaWRlbnRXaW5kb3dIb3VycyA9IHBhdGNoLmluY2lkZW50V2luZG93SG91cnM7XG4gICAgaWYgKHBhdGNoLmV2ZW50UmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkKSBzZXQuZXZlbnRSZXRlbnRpb25EYXlzID0gcGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzO1xuICAgIGlmIChwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkKSBzZXQuZG9yYVJldGVudGlvbkRheXMgPSBwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cztcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmRvcmFTZXR0aW5ncykudmFsdWVzKHtcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIGluY2lkZW50V2luZG93SG91cnM6IHBhdGNoLmluY2lkZW50V2luZG93SG91cnMsXG4gICAgICAgIGV2ZW50UmV0ZW50aW9uRGF5czogcGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzLFxuICAgICAgICBkb3JhUmV0ZW50aW9uRGF5czogcGF0Y2guZG9yYVJldGVudGlvbkRheXMsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCxcbiAgICAgICAgc2V0LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZ0lkKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCByZWNlbnQgaW5jaWRlbnRzIGZvciBhbiBvcmcgKFBoYXNlIDViIG9yZy1hZG1pbiBzdXJmYWNlKSwgbmV3ZXN0IGZpcnN0LFxuICAgKiBwYWdpbmF0ZWQuIEVhY2ggcm93IGNhcnJpZXMgaXRzIHJlc29sdmVkIHN0YXRlIGFuZCBpdHMgZGVwbG95IGNvcnJlbGF0aW9uIOKAlFxuICAgKiB0aGUgbW9zdCByZWNlbnQgU1VDQ0VTU0ZVTCBkZXBsb3kgdG8gdGhlIGluY2lkZW50J3MgYGVudmlyb25tZW50YCB3aG9zZVxuICAgKiBgY29tcGxldGVkX2F0YCBmYWxscyB3aXRoaW4gdGhlIGVmZmVjdGl2ZSBwZXItb3JnIGNvcnJlbGF0aW9uIHdpbmRvdyBiZWZvcmVcbiAgICogYG9wZW5lZF9hdGAgKHRoZSBzYW1lIHJ1bGUgRE9SQSdzIENGUi9NVFRSIGNvcnJlbGF0aW9uIGFwcGxpZXMpLiBTaW5nbGUtb3JnXG4gICAqIChubyByb2xsdXApIOKAlCBhbiBvcmcgYWRtaW4gdmlld3MgdGhlaXIgb3duIG9yZydzIGluY2lkZW50cy4gUkxTLXNjb3BlZCB2aWFcbiAgICogdGhlIGBwLm9yZ19pZGAvYGkub3JnX2lkYCBwcmVkaWNhdGVzICsgdGhlIHRlbmFudCBjb250ZXh0LlxuICAgKi9cbiAgYXN5bmMgbGlzdEluY2lkZW50cyhvcmdJZDogc3RyaW5nLCBvcHRzOiB7IGxpbWl0OiBudW1iZXI7IG9mZnNldDogbnVtYmVyIH0pOiBQcm9taXNlPEluY2lkZW50TGlzdEl0ZW1bXT4ge1xuICAgIGNvbnN0IHsgaW5jaWRlbnRXaW5kb3dIb3VycyB9ID0gYXdhaXQgdGhpcy5nZXRJbmNpZGVudFNldHRpbmdzKG9yZ0lkKTtcbiAgICBjb25zdCB3aW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKGluY2lkZW50V2luZG93SG91cnMpO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4ob3B0cy5saW1pdCwgMjAwKSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb3B0cy5vZmZzZXQpO1xuICAgIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgaS5pbmNpZGVudF9pZCBBUyBcImluY2lkZW50SWRcIixcbiAgICAgICAgICBpLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LFxuICAgICAgICAgIGkuc2V2ZXJpdHkgQVMgc2V2ZXJpdHksXG4gICAgICAgICAgaS5vcGVuZWRfYXQ6OnRleHQgQVMgXCJvcGVuZWRBdFwiLFxuICAgICAgICAgIGkucmVzb2x2ZWRfYXQ6OnRleHQgQVMgXCJyZXNvbHZlZEF0XCIsXG4gICAgICAgICAgaS5jcmVhdGVkX2F0Ojp0ZXh0IEFTIFwiY3JlYXRlZEF0XCIsXG4gICAgICAgICAgKGkucmVzb2x2ZWRfYXQgSVMgTk9UIE5VTEwpIEFTIHJlc29sdmVkLFxuICAgICAgICAgIGNvcnIuZXhlY3V0aW9uX2lkIEFTIFwiY29ycmVsYXRlZEV4ZWN1dGlvbklkXCIsXG4gICAgICAgICAgY29yci5jb21wbGV0ZWRfYXQ6OnRleHQgQVMgXCJkZXBsb3lDb21wbGV0ZWRBdFwiXG4gICAgICAgIEZST00gJHtzY2hlbWEuaW5jaWRlbnR9IGlcbiAgICAgICAgTEVGVCBKT0lOIExBVEVSQUwgKFxuICAgICAgICAgIFNFTEVDVCBlLmV4ZWN1dGlvbl9pZCwgZS5jb21wbGV0ZWRfYXRcbiAgICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJ1xuICAgICAgICAgICAgQU5EIGUuZW52aXJvbm1lbnQgPSBpLmVudmlyb25tZW50IEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnXG4gICAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gaS5vcGVuZWRfYXRcbiAgICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA+PSBpLm9wZW5lZF9hdCAtIG1ha2VfaW50ZXJ2YWwoaG91cnMgPT4gJHt3aW5kb3dIb3Vyc306OmludClcbiAgICAgICAgICBPUkRFUiBCWSBlLmNvbXBsZXRlZF9hdCBERVNDXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICApIGNvcnIgT04gdHJ1ZVxuICAgICAgICBXSEVSRSBpLm9yZ19pZCA9ICR7b3JnSWR9XG4gICAgICAgIE9SREVSIEJZIGkub3BlbmVkX2F0IERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH0gT0ZGU0VUICR7b2Zmc2V0fVxuICAgICAgYCkudGhlbigocikgPT4gZHJpenpsZVJvd3M8SW5jaWRlbnRMaXN0SXRlbT4oci5yb3dzKS5tYXAoKHJvdykgPT4gKHtcbiAgICAgIC4uLnJvdyxcbiAgICAgIHJlc29sdmVkOiByb3cucmVzb2x2ZWQgPT09IHRydWUgfHwgKHJvdy5yZXNvbHZlZCBhcyB1bmtub3duKSA9PT0gJ3QnLFxuICAgICAgY29ycmVsYXRlZEV4ZWN1dGlvbklkOiByb3cuY29ycmVsYXRlZEV4ZWN1dGlvbklkID8/IG51bGwsXG4gICAgICBkZXBsb3lDb21wbGV0ZWRBdDogcm93LmRlcGxveUNvbXBsZXRlZEF0ID8/IG51bGwsXG4gICAgfSkpKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyaW5nLXRlc3QgZHJ5LXJ1biAoUGhhc2UgNWIpOiB3b3VsZCBhIHN5bnRoZXRpYyBpbmNpZGVudCBvcGVuaW5nIE5PVyBmb3JcbiAgICogYGVudmlyb25tZW50YCBjb3JyZWxhdGUgdG8gYSByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kgdW5kZXIgdGhlIG9yZydzXG4gICAqIGVmZmVjdGl2ZSB3aW5kb3c/IFRoaXMgaXMgYSBOT04tcGVyc2lzdGluZyBjb3JyZWxhdGlvbiBjaGVjayDigJQgaXQgdmVyaWZpZXNcbiAgICogdGhlIGFkbWluJ3MgZW52aXJvbm1lbnQgbmFtaW5nICsgd2luZG93IGxpbmUgdXAgd2l0aCByZWFsIGRlcGxveSBldmVudHNcbiAgICogV0lUSE9VVCB3cml0aW5nIGFuIGluY2lkZW50IChzbyBhIFwidGVzdFwiIG5ldmVyIHBvbGx1dGVzIENGUi9NVFRSKS4gUkxTLXNjb3BlZC5cbiAgICovXG4gIGFzeW5jIHRlc3RJbmNpZGVudENvcnJlbGF0aW9uKG9yZ0lkOiBzdHJpbmcsIGVudmlyb25tZW50OiBzdHJpbmcpOiBQcm9taXNlPEluY2lkZW50VGVzdFJlc3VsdD4ge1xuICAgIGNvbnN0IGVudiA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGVudmlyb25tZW50KTtcbiAgICBjb25zdCBvcGVuZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICBjb25zdCB7IGluY2lkZW50V2luZG93SG91cnMgfSA9IGF3YWl0IHRoaXMuZ2V0SW5jaWRlbnRTZXR0aW5ncyhvcmdJZCk7XG4gICAgY29uc3Qgd2luZG93SG91cnMgPSByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyhpbmNpZGVudFdpbmRvd0hvdXJzKTtcbiAgICBjb25zdCByb3dzID0gZHJpenpsZVJvd3M8eyBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7IGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbCB9PigoYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCBlLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWQsIGUuY29tcGxldGVkX2F0Ojp0ZXh0IEFTIGNvbXBsZXRlZF9hdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnXG4gICAgICAgICAgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudn0gQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCdcbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gJHtvcGVuZWRBdH06OnRpbWVzdGFtcHR6XG4gICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7b3BlbmVkQXR9Ojp0aW1lc3RhbXB0eiAtIG1ha2VfaW50ZXJ2YWwoaG91cnMgPT4gJHt3aW5kb3dIb3Vyc306OmludClcbiAgICAgICAgT1JERVIgQlkgZS5jb21wbGV0ZWRfYXQgREVTQ1xuICAgICAgICBMSU1JVCAxXG4gICAgICBgKSkpLnJvd3MpO1xuICAgIGNvbnN0IGhpdCA9IHJvd3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudmlyb25tZW50OiBlbnYsXG4gICAgICBvcGVuZWRBdCxcbiAgICAgIHdpbmRvd0hvdXJzLFxuICAgICAgY29ycmVsYXRlZDogaGl0Py5leGVjdXRpb25faWQgIT0gbnVsbCxcbiAgICAgIGV4ZWN1dGlvbklkOiBoaXQ/LmV4ZWN1dGlvbl9pZCA/PyBudWxsLFxuICAgICAgZGVwbG95Q29tcGxldGVkQXQ6IGhpdD8uY29tcGxldGVkX2F0ID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnQgcGVyLW9yZyBpbmdlc3Rpb24gaGVhbHRoIChQaGFzZSAzKTogdGhlIEFXUyBldmVudHMgTGFtYmRhIHBlcmlvZGljYWxseVxuICAgKiByZXBvcnRzIGZvcndhcmRlZC9kcm9wcGVkIGNvdW50ZXJzICsgdGhlIGxhc3QgZXZlbnQgdGltZXN0YW1wIHNvIHRoZSBSZXBvcnRzXG4gICAqIFVJIGNhbiBzaG93IGZsb3dpbmcgLyBzdGFsZSAvIGRyb3BwaW5nLiBPbmUgcm93IHBlciBvcmcgKHVwc2VydCBvbiBvcmdfaWQpLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkSW5nZXN0SGVhbHRoKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHsgZm9yd2FyZGVkPzogbnVtYmVyOyBkcm9wcGVkPzogbnVtYmVyOyBsYXN0RXZlbnRBdD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsYXN0RXZlbnRBdCA9IGlucHV0Lmxhc3RFdmVudEF0ID8gbmV3IERhdGUoaW5wdXQubGFzdEV2ZW50QXQpIDogdW5kZWZpbmVkO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuaW5nZXN0SGVhbHRoKS52YWx1ZXMoe1xuICAgICAgICBvcmdJZCxcbiAgICAgICAgZm9yd2FyZGVkOiBpbnB1dC5mb3J3YXJkZWQsXG4gICAgICAgIGRyb3BwZWQ6IGlucHV0LmRyb3BwZWQsXG4gICAgICAgIGxhc3RFdmVudEF0LFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICB0YXJnZXQ6IHNjaGVtYS5pbmdlc3RIZWFsdGgub3JnSWQsXG4gICAgICAgIHNldDoge1xuICAgICAgICAgIGZvcndhcmRlZDogaW5wdXQuZm9yd2FyZGVkLFxuICAgICAgICAgIGRyb3BwZWQ6IGlucHV0LmRyb3BwZWQsXG4gICAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBiYWNrIG9uZSBvcmcncyBpbmdlc3Rpb24gaGVhbHRoIChQaGFzZSAzKSBmb3IgdGhlIFJlcG9ydHMgVUkgZnJlc2huZXNzXG4gICAqIGluZGljYXRvci4gUmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgb3JnIGhhcyBOTyByb3cg4oCUIGkuZS4gdGhlIGRlcGxveW1lbnQgaGFzXG4gICAqIG5ldmVyIGluZ2VzdGVkIGFueXRoaW5nIOKAlCB3aGljaCB0aGUgVUkgbXVzdCByZW5kZXIgYXMgXCJubyBpbmdlc3QgcmVwb3J0ZWRcbiAgICogeWV0XCIsIG5ldmVyIGFzIFwic3RhbGVcIi4gUkxTLXNjb3BlZCB0byB0aGUgb3JnIGxpa2UgZXZlcnkgb3RoZXIgcmVhZC5cbiAgICovXG4gIGFzeW5jIGdldEluZ2VzdEhlYWx0aChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxJbmdlc3RIZWFsdGhTdGF0dXMgfCBudWxsPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4XG4gICAgICAgIC5zZWxlY3QoKVxuICAgICAgICAuZnJvbShzY2hlbWEuaW5nZXN0SGVhbHRoKVxuICAgICAgICAud2hlcmUoZXEoc2NoZW1hLmluZ2VzdEhlYWx0aC5vcmdJZCwgb3JnSWQpKVxuICAgICAgICAubGltaXQoMSkpLFxuICAgICk7XG4gICAgY29uc3Qgcm93ID0gcm93c1swXTtcbiAgICBpZiAoIXJvdykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZWRBdDogcm93LnVwZGF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgbGFzdEV2ZW50QXQ6IHJvdy5sYXN0RXZlbnRBdCA/IHJvdy5sYXN0RXZlbnRBdC50b0lTT1N0cmluZygpIDogbnVsbCxcbiAgICAgIGZvcndhcmRlZDogcm93LmZvcndhcmRlZCA/PyBudWxsLFxuICAgICAgZHJvcHBlZDogcm93LmRyb3BwZWQgPz8gbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoZWQgaGFyZC1ERUxFVEUgb2Ygb25lIHJlcG9ydGluZyB0YWJsZSdzIHJvd3MgZXhwaXJlZCBwYXN0IGEgYGNyZWF0ZWRfYXRgXG4gICAqIGN1dG9mZiwgc2NvcGVkIHRvIGFuIG9yZyBhbmQgYW4gb3B0aW9uYWwgcm93IHByZWRpY2F0ZSAoUGhhc2UgNykuIFVzZXMgYVxuICAgKiBgY3RpZGAtaW4tc3VicXVlcnkgTElNSVQgc28gZWFjaCBzdGF0ZW1lbnQgdG91Y2hlcyBhdCBtb3N0IGBiYXRjaFNpemVgIHJvd3NcbiAgICogKHNob3J0IGxvY2sgd2luZG93cywgbm8gbG9uZyB0YWJsZSBzY2FuIHVuZGVyIGxvY2spOyBgUkVUVVJOSU5HIDFgIGxldHMgdXNcbiAgICogY291bnQgdmlhIGAucm93cy5sZW5ndGhgIHdpdGhvdXQgZGVwZW5kaW5nIG9uIHRoZSBkcml2ZXIncyBgcm93Q291bnRgLiBMb29wc1xuICAgKiB1bnRpbCBhIHNob3J0IGJhdGNoIChkcmFpbmVkKSBvciB0aGUgcGVyLXRpY2sgY2FwLCB0aGVuIGRlZmVycyB0aGUgcmVzdC5cbiAgICogTVVTVCBydW4gaW5zaWRlIGEgc3lzYWRtaW4gdGVuYW50IHNjb3BlIChzZWUgcHVyZ2VFeHBpcmVkUmVwb3J0aW5nRGF0YSkgc28gaXRcbiAgICogYnlwYXNzZXMgUkxTIGFuZCBjYW4gZGVsZXRlIGFjcm9zcyB0aGUgb3JnJ3Mgcm93cy5cbiAgICovXG4gIGFzeW5jICNwdXJnZVJlcG9ydGluZ1RhYmxlQmF0Y2hlZChcbiAgICB0YWJsZVNxbDogUmV0dXJuVHlwZTx0eXBlb2Ygc3FsPixcbiAgICBwcmVkaWNhdGU6IFJldHVyblR5cGU8dHlwZW9mIHNxbD4sXG4gICAgYmF0Y2hTaXplOiBudW1iZXIsXG4gICAgbWF4QmF0Y2hlczogbnVtYmVyLFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhCYXRjaGVzOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBERUxFVEUgRlJPTSAke3RhYmxlU3FsfVxuICAgICAgICBXSEVSRSBjdGlkIElOIChcbiAgICAgICAgICBTRUxFQ1QgY3RpZCBGUk9NICR7dGFibGVTcWx9XG4gICAgICAgICAgV0hFUkUgJHtwcmVkaWNhdGV9XG4gICAgICAgICAgTElNSVQgJHtiYXRjaFNpemV9XG4gICAgICAgIClcbiAgICAgICAgUkVUVVJOSU5HIDFcbiAgICAgIGApKTtcbiAgICAgIGNvbnN0IHB1cmdlZCA9IGRyaXp6bGVSb3dzPHVua25vd24+KHJlcy5yb3dzKS5sZW5ndGg7XG4gICAgICB0b3RhbCArPSBwdXJnZWQ7XG4gICAgICBpZiAocHVyZ2VkIDwgYmF0Y2hTaXplKSBicmVhazsgLy8gZHJhaW5lZFxuICAgICAgaWYgKGkgPT09IG1heEJhdGNoZXMgLSAxKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgcmV0ZW50aW9uIGhpdCBwZXItdGljayBjYXA7IHJlbWFpbmluZyByb3dzIGRlZmVycmVkJywge1xuICAgICAgICAgIHB1cmdlZFRoaXNUaWNrOiB0b3RhbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRpbmcgcmV0ZW50aW9uIHN3ZWVwIChQaGFzZSA3KS4gSGFyZC1kZWxldGVzIHJvd3Mgb2xkZXIgdGhhbiB0aGVpclxuICAgKiByZXRlbnRpb24gd2luZG93LCBieSBgY3JlYXRlZF9hdGAsIGFjcm9zcyBldmVyeSBvcmcgdGhhdCBoYXMgcmVwb3J0aW5nIGRhdGEg4oCUXG4gICAqIGEgKipzcGxpdCoqIHBvbGljeSBzbyBoaWdoLXZvbHVtZSBzdGFuZGFyZCBldmVudHMgZXhwaXJlIGZhc3RlciB0aGFuIHRoZVxuICAgKiBsb3ctdm9sdW1lIERPUkEgc291cmNlOlxuICAgKiAgLSBgcGlwZWxpbmVfZXZlbnRzIFdIRVJFIGVudmlyb25tZW50IElTIE5VTExgIOKGkiBzdGFuZGFyZC1ldmVudCB3aW5kb3cuXG4gICAqICAtIGBwaXBlbGluZV9ldmVudHMgV0hFUkUgZW52aXJvbm1lbnQgSVMgTk9UIE5VTExgIChkZXBsb3kgc3RhZ2VzKSxcbiAgICogICAgYGRlcGxveW1lbnRfb3V0Y29tZXNgLCBhbmQgYGluY2lkZW50c2Ag4oaSIERPUkEtc291cmNlIHdpbmRvdy5cbiAgICogRWFjaCBvcmcncyB3aW5kb3dzIGNvbWUgZnJvbSBpdHMgYGRvcmFfc2V0dGluZ3NgIG92ZXJyaWRlLCBlbHNlIHRoZSBnbG9iYWxcbiAgICogZW52IGRlZmF1bHRzIChzZWUge0BsaW5rIHJlc29sdmVFdmVudFJldGVudGlvbkRheXN9IC8ge0BsaW5rIHJlc29sdmVEb3JhUmV0ZW50aW9uRGF5c30pLlxuICAgKiBgaW5nZXN0X2hlYWx0aGAgYW5kIGBkb3JhX3NldHRpbmdzYCBhcmUgbmV2ZXIgcHVyZ2VkLiBPbmUgYG5vd2AgZm9yIHRoZSB3aG9sZVxuICAgKiB0aWNrIChyb3dzIGNyb3NzaW5nIHRoZSBib3VuZGFyeSBtaWQtc3dlZXAgd2FpdCBmb3IgdGhlIG5leHQpLiBFc3RhYmxpc2hlcyBhXG4gICAqIHN5c2FkbWluIHRlbmFudCBzY29wZSBzbyB0aGUgZGVsZXRlcyBzcGFuIGFsbCBvcmdzIC8gYnlwYXNzIFJMUyDigJQgdGhpcyBpcyBhXG4gICAqIGNyb3NzLXRlbmFudCBob3VzZWtlZXBpbmcgam9iLiBSZXR1cm5zIChhbmQgbG9ncykgcGVyLXdpbmRvdyBwdXJnZSB0YWxsaWVzLlxuICAgKi9cbiAgYXN5bmMgcHVyZ2VFeHBpcmVkUmVwb3J0aW5nRGF0YShvcHRzOiBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFJlcG9ydGluZ1JldGVudGlvbkNvdW50cz4ge1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IE1hdGgubWF4KDEsIG9wdHMuYmF0Y2hTaXplID8/IDEwMDApO1xuICAgIGNvbnN0IG1heEJhdGNoZXMgPSBNYXRoLm1heCgxLCBvcHRzLm1heEJhdGNoZXNQZXJUYWJsZSA/PyA1MCk7XG4gICAgY29uc3Qgbm93ID0gb3B0cy5ub3cgPz8gbmV3IERhdGUoKTtcbiAgICBjb25zdCBjb3VudHM6IFJlcG9ydGluZ1JldGVudGlvbkNvdW50cyA9IHtcbiAgICAgIG9yZ3M6IDAsIHN0YW5kYXJkRXZlbnRzOiAwLCBkb3JhRXZlbnRzOiAwLCBkZXBsb3ltZW50T3V0Y29tZXM6IDAsIGluY2lkZW50czogMCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEVudW1lcmF0ZSBldmVyeSBvcmcgd2l0aCByZXBvcnRpbmcgZGF0YSAodW5pb24gYWNyb3NzIHRoZSB0aHJlZSB0YWJsZXMpLlxuICAgICAgY29uc3Qgb3JnUm93cyA9IGRyaXp6bGVSb3dzPHsgb3JnX2lkOiBzdHJpbmcgfT4oKGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1QgRElTVElOQ1Qgb3JnX2lkIEZST00gKFxuICAgICAgICAgIFNFTEVDVCAke3NjaGVtYS5waXBlbGluZUV2ZW50Lm9yZ0lkfSBBUyBvcmdfaWQgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fVxuICAgICAgICAgIFVOSU9OXG4gICAgICAgICAgU0VMRUNUICR7c2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLm9yZ0lkfSBBUyBvcmdfaWQgRlJPTSAke3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZX1cbiAgICAgICAgICBVTklPTlxuICAgICAgICAgIFNFTEVDVCAke3NjaGVtYS5pbmNpZGVudC5vcmdJZH0gQVMgb3JnX2lkIEZST00gJHtzY2hlbWEuaW5jaWRlbnR9XG4gICAgICAgICkgQVMgb3Jnc1xuICAgICAgYCkpKS5yb3dzKTtcbiAgICAgIGlmIChvcmdSb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvdW50cztcblxuICAgICAgLy8gUGVyLW9yZyByZXRlbnRpb24gb3ZlcnJpZGVzIChhIHNpbmdsZSByZWFkOyBvcmdzIHdpdGhvdXQgYSByb3cgdXNlIGRlZmF1bHRzKS5cbiAgICAgIGNvbnN0IG92ZXJyaWRlUm93cyA9IGRyaXp6bGVSb3dzPHtcbiAgICAgICAgb3JnX2lkOiBzdHJpbmc7XG4gICAgICAgIGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgICAgICBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgICAgfT4oKGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1QgJHtzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkfSBBUyBvcmdfaWQsXG4gICAgICAgICAgICAgICAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZXZlbnRSZXRlbnRpb25EYXlzfSBBUyBldmVudF9yZXRlbnRpb25fZGF5cyxcbiAgICAgICAgICAgICAgICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5kb3JhUmV0ZW50aW9uRGF5c30gQVMgZG9yYV9yZXRlbnRpb25fZGF5c1xuICAgICAgICBGUk9NICR7c2NoZW1hLmRvcmFTZXR0aW5nc31cbiAgICAgIGApKSkucm93cyk7XG4gICAgICBjb25zdCBvdmVycmlkZXMgPSBuZXcgTWFwKG92ZXJyaWRlUm93cy5tYXAoKHIpID0+IFtyLm9yZ19pZCwgcl0pKTtcblxuICAgICAgY29uc3QgZXZlbnRzVGFibGUgPSBzcWxgJHtzY2hlbWEucGlwZWxpbmVFdmVudH1gO1xuICAgICAgY29uc3Qgb3V0Y29tZXNUYWJsZSA9IHNxbGAke3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZX1gO1xuICAgICAgY29uc3QgaW5jaWRlbnRzVGFibGUgPSBzcWxgJHtzY2hlbWEuaW5jaWRlbnR9YDtcblxuICAgICAgZm9yIChjb25zdCB7IG9yZ19pZDogb3JnSWQgfSBvZiBvcmdSb3dzKSB7XG4gICAgICAgIGNvbnN0IG92ID0gb3ZlcnJpZGVzLmdldChvcmdJZCk7XG4gICAgICAgIGNvbnN0IGV2ZW50RGF5cyA9IHJlc29sdmVFdmVudFJldGVudGlvbkRheXMob3Y/LmV2ZW50X3JldGVudGlvbl9kYXlzKTtcbiAgICAgICAgY29uc3QgZG9yYURheXMgPSByZXNvbHZlRG9yYVJldGVudGlvbkRheXMob3Y/LmRvcmFfcmV0ZW50aW9uX2RheXMpO1xuICAgICAgICAvLyBgLTFgID0gdW5saW1pdGVkIChQaGFzZSA4KToga2VlcCBmb3JldmVyLCBza2lwIHRoYXQgd2luZG93J3MgZGVsZXRlcyBmb3JcbiAgICAgICAgLy8gdGhpcyBvcmcuIFN0YW5kYXJkLWV2ZW50IGFuZCBET1JBLXNvdXJjZSB3aW5kb3dzIGFyZSBpbmRlcGVuZGVudDsgYW4gb3JnXG4gICAgICAgIC8vIHdpdGggYm90aCBgLTFgIGlzIGZ1bGx5IHNraXBwZWQuIExvZyB0aGUgc2tpcCBzbyBpdCdzIG9ic2VydmFibGUuXG4gICAgICAgIGNvbnN0IHNraXBFdmVudHMgPSBldmVudERheXMgPT09IC0xO1xuICAgICAgICBjb25zdCBza2lwRG9yYSA9IGRvcmFEYXlzID09PSAtMTtcbiAgICAgICAgaWYgKHNraXBFdmVudHMgfHwgc2tpcERvcmEpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnUmVwb3J0aW5nIHJldGVudGlvbiBzd2VlcCBza2lwcGluZyB1bmxpbWl0ZWQgd2luZG93KHMpJywge1xuICAgICAgICAgICAgb3JnSWQsXG4gICAgICAgICAgICBzdGFuZGFyZEV2ZW50czogc2tpcEV2ZW50cyA/ICd1bmxpbWl0ZWQnIDogZXZlbnREYXlzLFxuICAgICAgICAgICAgZG9yYVNvdXJjZTogc2tpcERvcmEgPyAndW5saW1pdGVkJyA6IGRvcmFEYXlzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFza2lwRXZlbnRzKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnRDdXRvZmYgPSByZXRlbnRpb25DdXRvZmYobm93LCBldmVudERheXMpO1xuICAgICAgICAgIGNvdW50cy5zdGFuZGFyZEV2ZW50cyArPSBhd2FpdCB0aGlzLiNwdXJnZVJlcG9ydGluZ1RhYmxlQmF0Y2hlZChcbiAgICAgICAgICAgIGV2ZW50c1RhYmxlLFxuICAgICAgICAgICAgc3FsYG9yZ19pZCA9ICR7b3JnSWR9IEFORCBlbnZpcm9ubWVudCBJUyBOVUxMIEFORCBjcmVhdGVkX2F0IDwgJHtldmVudEN1dG9mZn1gLFxuICAgICAgICAgICAgYmF0Y2hTaXplLCBtYXhCYXRjaGVzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNraXBEb3JhKSB7XG4gICAgICAgICAgY29uc3QgZG9yYUN1dG9mZiA9IHJldGVudGlvbkN1dG9mZihub3csIGRvcmFEYXlzKTtcbiAgICAgICAgICBjb3VudHMuZG9yYUV2ZW50cyArPSBhd2FpdCB0aGlzLiNwdXJnZVJlcG9ydGluZ1RhYmxlQmF0Y2hlZChcbiAgICAgICAgICAgIGV2ZW50c1RhYmxlLFxuICAgICAgICAgICAgc3FsYG9yZ19pZCA9ICR7b3JnSWR9IEFORCBlbnZpcm9ubWVudCBJUyBOT1QgTlVMTCBBTkQgY3JlYXRlZF9hdCA8ICR7ZG9yYUN1dG9mZn1gLFxuICAgICAgICAgICAgYmF0Y2hTaXplLCBtYXhCYXRjaGVzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY291bnRzLmRlcGxveW1lbnRPdXRjb21lcyArPSBhd2FpdCB0aGlzLiNwdXJnZVJlcG9ydGluZ1RhYmxlQmF0Y2hlZChcbiAgICAgICAgICAgIG91dGNvbWVzVGFibGUsXG4gICAgICAgICAgICBzcWxgb3JnX2lkID0gJHtvcmdJZH0gQU5EIGNyZWF0ZWRfYXQgPCAke2RvcmFDdXRvZmZ9YCxcbiAgICAgICAgICAgIGJhdGNoU2l6ZSwgbWF4QmF0Y2hlcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvdW50cy5pbmNpZGVudHMgKz0gYXdhaXQgdGhpcy4jcHVyZ2VSZXBvcnRpbmdUYWJsZUJhdGNoZWQoXG4gICAgICAgICAgICBpbmNpZGVudHNUYWJsZSxcbiAgICAgICAgICAgIHNxbGBvcmdfaWQgPSAke29yZ0lkfSBBTkQgY3JlYXRlZF9hdCA8ICR7ZG9yYUN1dG9mZn1gLFxuICAgICAgICAgICAgYmF0Y2hTaXplLCBtYXhCYXRjaGVzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY291bnRzLm9yZ3MgKz0gMTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHVyZ2VkQW55ID0gY291bnRzLnN0YW5kYXJkRXZlbnRzICsgY291bnRzLmRvcmFFdmVudHMgKyBjb3VudHMuZGVwbG95bWVudE91dGNvbWVzICsgY291bnRzLmluY2lkZW50cztcbiAgICAgIGlmIChwdXJnZWRBbnkgPiAwKSBsb2dnZXIuaW5mbygnUmVwb3J0aW5nIHJldGVudGlvbiBzd2VlcCBwdXJnZWQgZXhwaXJlZCByb3dzJywgeyAuLi5jb3VudHMgfSk7XG4gICAgICByZXR1cm4gY291bnRzO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXBvcnRpbmdTZXJ2aWNlID0gbmV3IFJlcG9ydGluZ1NlcnZpY2UoKTtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"drizzle-orm": "0.45.2",
|
|
27
27
|
"pg": "8.22.0",
|
|
28
|
-
"@pipeline-builder/api-core": "4.1.
|
|
28
|
+
"@pipeline-builder/api-core": "4.1.6"
|
|
29
29
|
},
|
|
30
30
|
"keywords": [
|
|
31
31
|
"ci-cd",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"access": "public",
|
|
82
82
|
"registry": "https://registry.npmjs.org/"
|
|
83
83
|
},
|
|
84
|
-
"version": "4.1.
|
|
84
|
+
"version": "4.1.7",
|
|
85
85
|
"bugs": {
|
|
86
86
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
87
87
|
},
|