@pipeline-builder/pipeline-data 3.4.111 → 3.4.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/crud-service.js +13 -4
- package/lib/api/reporting-service.js +10 -2
- package/package.json +2 -2
package/lib/api/crud-service.js
CHANGED
|
@@ -292,9 +292,18 @@ export class CrudService {
|
|
|
292
292
|
const ctx = getTenantContext();
|
|
293
293
|
const d = data;
|
|
294
294
|
if (ctx && !ctx.isSuperAdmin && ctx.orgId && d.orgId !== ctx.orgId) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
295
|
+
// Distinguish the two cases that reach here so the log stays useful and
|
|
296
|
+
// quiet: a PRESENT-but-mismatched `orgId` is an actual override attempt
|
|
297
|
+
// (warn), while an ABSENT `orgId` is the common normal-write path that just
|
|
298
|
+
// needs the default stamp (debug) — logging that at warn floods the log on
|
|
299
|
+
// every write that omits orgId.
|
|
300
|
+
const meta = { supplied: 'orgId' in d ? d.orgId : undefined, enforced: ctx.orgId };
|
|
301
|
+
if ('orgId' in d) {
|
|
302
|
+
this._logger.warn('CrudService: overriding mismatched org on write', meta);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
this._logger.debug('CrudService: stamping tenant-context org on write', meta);
|
|
306
|
+
}
|
|
298
307
|
return { ...d, orgId: ctx.orgId };
|
|
299
308
|
}
|
|
300
309
|
return data;
|
|
@@ -575,4 +584,4 @@ export class CrudService {
|
|
|
575
584
|
return deleted;
|
|
576
585
|
}
|
|
577
586
|
}
|
|
578
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RixtRkFBbUY7QUFDbkYsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDakYsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUUxRTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUksSUFBYTtJQUMxQyxPQUFPLElBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYTtJQUN4QyxPQUFPLElBQTJCLENBQUM7QUFDckMsQ0FBQztBQTJGRCxNQUFNLE9BQWdCLFdBQVc7SUFTL0I7Ozs7OztPQU1HO0lBQ0gsSUFBWSxJQUFJO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBZ0MsQ0FBQztJQUMvQyxDQUFDO0lBeUJnQixPQUFPLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXhEO1FBQ0Usd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxzRUFBc0U7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QUFHO1lBQ2QsU0FBUyxFQUFFLElBQUk7WUFDZixTQUFTLEVBQUUsR0FBRztZQUNkLFNBQVMsRUFBRSxJQUFJO1NBQ1QsQ0FBQzthQUNSLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQzthQUN6QixTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQ25FLENBQ0YsQ0FDRixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IsIGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IFNRTCwgZXEsIGFuZCwgYXNjLCBkZXNjLCBzcWwsIGluQXJyYXksIGdldFRhYmxlQ29sdW1ucyB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQW55Q29sdW1uIH0gZnJvbSAnZHJpenpsZS1vcm0vY29sdW1uJztcbmltcG9ydCB0eXBlIHsgUGdUYWJsZSB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCwgZ2V0VGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vKiogUGFnaW5hdGlvbiBkZWZhdWx0cyDigJQgcmVhZCBmcm9tIGVudiB0byBtYXRjaCBDb3JlQ29uc3RhbnRzIGluIHBpcGVsaW5lLWNvcmUuICovXG5jb25zdCBERUZBVUxUX1BBR0VfTElNSVQgPSBwYXJzZUludChwcm9jZXNzLmVudi5ERUZBVUxUX1BBR0VfTElNSVQgfHwgJzEwMCcsIDEwKTtcbmNvbnN0IE1BWF9QQUdFX0xJTUlUID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuTUFYX1BBR0VfTElNSVQgfHwgJzEwMDAnLCAxMCk7XG5cbi8qKlxuICogQ2FzdCBEcml6emxlIHF1ZXJ5IHJlc3VsdHMgdG8gYSB0eXBlZCBhcnJheS5cbiAqIERyaXp6bGUncyBnZW5lcmljIHJldHVybiB0eXBlIChgUGdTZWxlY3RCYXNlPC4uLj5gKSBkb2Vzbid0IG5hcnJvdyB0byBvdXJcbiAqIGVudGl0eSBnZW5lcmljcywgc28gYW4gZXhwbGljaXQgY2FzdCBpcyBuZWVkZWQuIENlbnRyYWxpc2VkIGhlcmUgc28gZXZlcnlcbiAqIGNhbGwtc2l0ZSBzdGF5cyBvbmUtbGluZXIgY2xlYW4gYW5kIHRoZSBjYXN0IGlzIGRvY3VtZW50ZWQgaW4gb25lIHBsYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJpenpsZVJvd3M8VD4ocm93czogdW5rbm93bik6IFRbXSB7XG4gIHJldHVybiByb3dzIGFzIFRbXTtcbn1cblxuLyoqIENhc3QgYSBEcml6emxlIGFnZ3JlZ2F0ZSByZXN1bHQgdG8gZXh0cmFjdCBgW3sgY291bnQ6IG51bWJlciB9XWAuICovXG5leHBvcnQgZnVuY3Rpb24gZHJpenpsZUNvdW50KHJvd3M6IHVua25vd24pOiBbeyBjb3VudDogbnVtYmVyIH1dIHtcbiAgcmV0dXJuIHJvd3MgYXMgW3sgY291bnQ6IG51bWJlciB9XTtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgZW50aXRpZXMgd2l0aCBjb21tb24gZmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUVudGl0eSB7XG4gIGlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIGlzRGVmYXVsdDogYm9vbGVhbjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICB1cGRhdGVkQXQ6IERhdGU7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICB1cGRhdGVkQnk6IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBQYWdpbmF0aW9uIGFuZCBzb3J0aW5nIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeU9wdGlvbnMge1xuICBsaW1pdD86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzb3J0Qnk/OiBzdHJpbmc7XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICAvKiogV2hlbiB0cnVlLCBydW5zIGEgc2VwYXJhdGUgQ09VTlQoKikgcXVlcnkgdG8gaW5jbHVkZSBleGFjdCB0b3RhbC4gRGVmYXVsdDogZmFsc2UuICovXG4gIGluY2x1ZGVUb3RhbD86IGJvb2xlYW47XG4gIC8qKiBDdXJzb3ItYmFzZWQgcGFnaW5hdGlvbjogZmV0Y2ggcm93cyBhZnRlciB0aGlzIGN1cnNvciB2YWx1ZSAodXNlcyBzb3J0QnkgY29sdW1uKS4gKi9cbiAgY3Vyc29yPzogc3RyaW5nO1xuICAvKiogU3BhcnNlIGZpZWxkc2V0OiBjb2x1bW4gbmFtZXMgdG8gc2VsZWN0LiBSZXR1cm5zIGFsbCBjb2x1bW5zIHdoZW4gb21pdHRlZC4gKi9cbiAgZmllbGRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFnaW5hdGVkIHJlc3VsdCB3aXRoIG1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVkUmVzdWx0PFQ+IHtcbiAgZGF0YTogVFtdO1xuICAvKiogVG90YWwgY291bnQgb2YgbWF0Y2hpbmcgZW50aXRpZXMuIE9ubHkgcHJlc2VudCB3aGVuIGluY2x1ZGVUb3RhbCBpcyB0cnVlLiAqL1xuICB0b3RhbD86IG51bWJlcjtcbiAgbGltaXQ6IG51bWJlcjtcbiAgb2Zmc2V0OiBudW1iZXI7XG4gIGhhc01vcmU6IGJvb2xlYW47XG4gIC8qKiBDdXJzb3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgaXRlbSwgZm9yIGN1cnNvci1iYXNlZCBwYWdpbmF0aW9uLiAqL1xuICBuZXh0Q3Vyc29yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IENSVUQgc2VydmljZSB3aXRoIG11bHRpLXRlbmFudCBhY2Nlc3MgY29udHJvbCBhbmQgcGFnaW5hdGlvbi5cbiAqXG4gKiBTdWJjbGFzc2VzIGJpbmQgdG8gYSBzcGVjaWZpYyBEcml6emxlIHRhYmxlIGJ5IGltcGxlbWVudGluZyBgc2NoZW1hYCxcbiAqIGBidWlsZENvbmRpdGlvbnNgLCBgZ2V0U29ydENvbHVtbmAsIGFuZCB0aGUgb3JnL3Byb2plY3QtY29sdW1uIGFjY2Vzc29ycy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRFbnRpdHkgLSBFbnRpdHkgdHlwZSBleHRlbmRpbmcgQmFzZUVudGl0eVxuICogQHR5cGVQYXJhbSBURmlsdGVyIC0gRmlsdGVyIHR5cGUgZm9yIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqIEB0eXBlUGFyYW0gVEluc2VydCAtIEluc2VydCBEVE8gdHlwZVxuICogQHR5cGVQYXJhbSBUVXBkYXRlIC0gVXBkYXRlIERUTyB0eXBlXG4gKlxuICogKipBIG5vdGUgb24gdGhlIHR5cGUgY2FzdHMuKiogRHJpenpsZSdzIHJvdyB0eXBlcyBhcmUgaW5mZXJyZWQgZnJvbVxuICogYHBnVGFibGUoLi4uKWAgYW5kIGRvbid0IGdlbmVyaWNhbGx5IG5hcnJvdyB0aHJvdWdoIHRoZSBhYnN0cmFjdCBgc2NoZW1hYFxuICogZ2V0dGVyLCBzbyB0aGUgYmFzZSBjbGFzcyBjYXN0cyBxdWVyeSByZXN1bHRzIHRvIGBURW50aXR5YCBhbmQgYmFjay4gVGhlXG4gKiBjYXN0IGlzICpub3QqIGEgcnVudGltZSBzYWZldHkgZ3VhcmFudGVlIOKAlCBpdCByZWxpZXMgb24gZWFjaCBzdWJjbGFzc1xuICogcGFzc2luZyB0aGUgbWF0Y2hpbmcgZW50aXR5IHR5cGUuIE9yZy1zY29waW5nIGlzIGVuZm9yY2VkIGJ5IGV2ZXJ5XG4gKiBzdWJjbGFzcydzIGBidWlsZENvbmRpdGlvbnNgIGluamVjdGluZyBgV0hFUkUgb3JnX2lkID0gJDFgOyB0aGlzIGNsYXNzXG4gKiBkb2VzIG5vdCBhZGQgdGhhdCBmaWx0ZXIgaXRzZWxmLlxuICpcbiAqICoqRXJyb3IgcG9saWN5LioqIEVycm9ycyBwcm9wYWdhdGUgdXAgdG8gdGhlIHJvdXRlLWxldmVsIGhhbmRsZXJcbiAqIChgd2l0aFJvdXRlYCk7IG5vIGNhdGNoLWFuZC1zd2FsbG93IGhlcmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFBpcGVsaW5lU2VydmljZSBleHRlbmRzIENydWRTZXJ2aWNlPFBpcGVsaW5lLCBQaXBlbGluZUZpbHRlciwgUGlwZWxpbmVJbnNlcnQsIFBpcGVsaW5lVXBkYXRlPiB7XG4gKiAgIHByb3RlY3RlZCBnZXQgc2NoZW1hKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lOyB9XG4gKiAgIHByb3RlY3RlZCBidWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCkgeyByZXR1cm4gYnVpbGRQaXBlbGluZUNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCk7IH1cbiAqICAgcHJvdGVjdGVkIGdldFNvcnRDb2x1bW4oc29ydEJ5KSB7IHJldHVybiBzb3J0Q29sdW1uTWFwW3NvcnRCeV0gPz8gbnVsbDsgfVxuICogICBwcm90ZWN0ZWQgZ2V0UHJvamVjdENvbHVtbigpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZS5wcm9qZWN0OyB9XG4gKiAgIHByb3RlY3RlZCBnZXRPcmdDb2x1bW4oKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmUub3JnSWQ7IH1cbiAqIH1cbiAqIGBgYFxuICovXG4vKiogU3RydWN0dXJhbCB2aWV3IG9mIHRoZSBzdWJjbGFzcyB0YWJsZSdzIGNvbHVtbnMgdGhlIGJhc2UgY2xhc3MgdG91Y2hlc1xuICogIGRpcmVjdGx5LiBgaWRgL2Bpc0FjdGl2ZWAvYGlzRGVmYXVsdGAgYXJlIGFsd2F5cyBwcmVzZW50IG9uIGEgQ1JVRCBlbnRpdHk7XG4gKiAgYGFjY2Vzc01vZGlmaWVyYCBvbmx5IG9uIHB1YmxpYy12aXNpYmlsaXR5IGVudGl0aWVzOyB0aGUgaW5kZXggc2lnbmF0dXJlXG4gKiAgY292ZXJzIGR5bmFtaWMgKHNwYXJzZS1maWVsZHNldCkgY29sdW1uIGFjY2Vzcy4gKi9cbmludGVyZmFjZSBDcnVkQ29sdW1ucyB7XG4gIGlkOiBBbnlDb2x1bW47XG4gIGlzQWN0aXZlOiBBbnlDb2x1bW47XG4gIGlzRGVmYXVsdDogQW55Q29sdW1uO1xuICBhY2Nlc3NNb2RpZmllcj86IEFueUNvbHVtbjtcbiAgW2tleTogc3RyaW5nXTogQW55Q29sdW1uIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3J1ZFNlcnZpY2U8XG4gIFRFbnRpdHkgZXh0ZW5kcyBCYXNlRW50aXR5LFxuICBURmlsdGVyLFxuICBUSW5zZXJ0LFxuICBUVXBkYXRlLFxuPiB7XG4gIC8qKiBEcml6emxlIHNjaGVtYSB0YWJsZSBmb3IgdGhpcyBlbnRpdHkgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBzY2hlbWEoKTogUGdUYWJsZTtcblxuICAvKipcbiAgICogVHlwZWQgY29sdW1uIHZpZXcgb2Yge0BsaW5rIHNjaGVtYX0uIGBQZ1RhYmxlYCBleHBvc2VzIG5vIHN0YXRpYyBjb2x1bW5zLCBzb1xuICAgKiB0aGUgYmFzZSBjbGFzcyBwcmV2aW91c2x5IHJlYWNoZWQgZm9yIGAodGhpcy5zY2hlbWEgYXMgYW55KS5pZGAgZXRjLiBhdCBlYWNoXG4gICAqIHVzZTsgY2VudHJhbGl6ZSB0aGF0IHNpbmdsZSB1bmF2b2lkYWJsZSBjYXN0IGhlcmUgc28gY2FsbGVycyBnZXQgc3RydWN0dXJlZCxcbiAgICogdHlwZWQgYWNjZXNzIGluc3RlYWQuIGBhY2Nlc3NNb2RpZmllcmAgaXMgb3B0aW9uYWwgKG5vdCBldmVyeSBlbnRpdHkgaGFzIGl0KVxuICAgKiBhbmQgdGhlIGluZGV4IHNpZ25hdHVyZSBjb3ZlcnMgZHluYW1pYyBzcGFyc2UtZmllbGRzZXQgY29sdW1uIGxvb2t1cC5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGNvbHMoKTogQ3J1ZENvbHVtbnMge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYSBhcyB1bmtub3duIGFzIENydWRDb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBmaWx0ZXJpbmcgZW50aXRpZXMuXG4gICAqIGBwYXJlbnRPcmdJZGAgKG9yZyDihpIgdGVhbSBoaWVyYXJjaHkpIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGhvbm9yZWQgYnlcbiAgICogc2VydmljZXMgdGhhdCBvcHQgaW50byBwYXJlbnQtaW5oZXJpdGVkIHZpc2liaWxpdHkgKGUuZy4gcGx1Z2lucykuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGRDb25kaXRpb25zKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW107XG5cbiAgLyoqIEdldCB0aGUgc2NoZW1hIGNvbHVtbiBmb3Igc29ydGluZyBieSBmaWVsZCBuYW1lICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTb3J0Q29sdW1uKHNvcnRCeTogc3RyaW5nKTogQW55Q29sdW1uIHwgbnVsbDtcblxuICAvKiogR2V0IHRoZSBwcm9qZWN0IGNvbHVtbiBmb3Igc2V0RGVmYXVsdCBzY29waW5nIChudWxsIGlmIGVudGl0eSBoYXMgbm8gcHJvamVjdCBzY29wZSkgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFByb2plY3RDb2x1bW4oKTogQW55Q29sdW1uIHwgbnVsbDtcblxuICAvKipcbiAgICogR2V0IHRoZSB0ZW5hbnQgb3JnLWlkIGNvbHVtbi4gVXNlZCBib3RoIHRvIHNjb3BlIGBzZXREZWZhdWx0YCBhbmQgdG8gcGluXG4gICAqIGV2ZXJ5IHdyaXRlICh1cGRhdGUvZGVsZXRlL2J1bGtEZWxldGUpIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIOKAlCBzbyBpdCBNVVNUXG4gICAqIGJlIHRoZSB0ZW5hbnQgYG9yZ0lkYCBjb2x1bW4sIG5vdCBhIGRpc3BsYXkvbmFtZSBjb2x1bW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0T3JnQ29sdW1uKCk6IEFueUNvbHVtbjtcblxuICAvKiogR2V0IHRoZSB1bmlxdWUgY29uc3RyYWludCBjb2x1bW5zIGZvciBvbkNvbmZsaWN0RG9VcGRhdGUgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjb25mbGljdFRhcmdldCgpOiBBbnlDb2x1bW5bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NydWQtc2VydmljZScpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZhaWwgZmFzdCBpZiBhIHN1YmNsYXNzIGRvZXNuJ3QgZXhwb3NlIGEgdGVuYW50IG9yZyBjb2x1bW4uIFRoZSB3cml0ZVxuICAgIC8vIHBhdGhzICh3cml0ZUNvbmRpdGlvbnMgLyBidWxrRGVsZXRlKSBwaW4gbXV0YXRpb25zIHRvIHRoZSBjYWxsZXIncyBvd25cbiAgICAvLyBvcmcgdGhyb3VnaCBpdDsgYSBtaXNzaW5nIGNvbHVtbiB3b3VsZCBzaWxlbnRseSBkcm9wIHRoYXQgZ3VhcmQg4oCUIGFcbiAgICAvLyBjcm9zcy10ZW5hbnQgZmFpbC1vcGVuIOKAlCBzbyBhc3NlcnQgaXRzIHByZXNlbmNlIHVwIGZyb250LlxuICAgIGlmICh0aGlzLmdldE9yZ0NvbHVtbigpID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBnZXRPcmdDb2x1bW4oKSBtdXN0IHJldHVybiB0aGUgdGVuYW50IG9yZyBjb2x1bW5gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgY29uZGl0aW9ucyBmb3IgYSBzaW5nbGUgZW50aXR5IGJ5IElELlxuICAgKiAgYHBhcmVudE9yZ0lkYCB3aWRlbnMgdmlzaWJpbGl0eSB0byBhIHBhcmVudCBvcmcncyBwdWJsaWMgcm93cyAob3JnIOKGkiB0ZWFtXG4gICAqICBoaWVyYXJjaHkpIOKAlCBzYW1lIG9wdC1pbiBzZW1hbnRpY3MgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYC4gT21pdHRlZCBieSB0aGVcbiAgICogIHdyaXRlIHBhdGggKGB3cml0ZUNvbmRpdGlvbnNgKSwgd2hpY2ggbXVzdCBzdGF5IG93bi1vcmcgc2NvcGVkLiAqL1xuICBwcml2YXRlIGlkQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb25kaXRpb25zKHsgaWQgfSBhcyB1bmtub3duIGFzIFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZGl0aW9ucyBmb3IgYSBNVVRBVElPTiAodXBkYXRlL2RlbGV0ZSkgb2YgYSBzaW5nbGUgZW50aXR5LlxuICAgKlxuICAgKiBgaWRDb25kaXRpb25zYCByZXVzZXMgdGhlIFJFQUQgYWNjZXNzLWNvbnRyb2wgY2xhdXNlLCB3aGljaCBhbHNvIG1hdGNoZXNcbiAgICogc3lzdGVtLW9yZyAvIG90aGVyLW9yZyBQVUJMSUMgcmVjb3JkcyDigJQgc28gd2l0aG91dCBhbiBleHRyYSBvd25lcnNoaXAgcGluIGFueVxuICAgKiB0ZW5hbnQgY291bGQgdXBkYXRlIG9yIHNvZnQtZGVsZXRlIGFub3RoZXIgb3JnJ3MgKG9yIHRoZSBzeXN0ZW0gb3JnJ3MpIHB1YmxpY1xuICAgKiByZWNvcmRzLiBBTkQgYSBzdHJpY3QgYG9yZ0lkID09PSBjYWxsZXJgIHByZWRpY2F0ZTogdGhlIHJlYWQgY2xhdXNlJ3NcbiAgICogcHVibGljLU9SIGJyYW5jaCByZXF1aXJlcyBgb3JnX2lkID0gJ3N5c3RlbSdgLCB3aGljaCB0aGVuIGNhbid0IGJlIHNhdGlzZmllZCxcbiAgICogbGVhdmluZyBvbmx5IG93bi1vcmcgcm93cy4gb3JnSWQtbGVzcyAoc3lzYWRtaW4pIGNvbnRleHQga2VlcHMgZnVsbCBhY2Nlc3MuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkKTtcbiAgICAvLyBQaW4gdGhlIG11dGF0aW9uIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIHZpYSB0aGUgdGVuYW50IGNvbHVtblxuICAgIC8vIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsIGluIHRoZSBjb25zdHJ1Y3Rvcikg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgIC8vIHNldERlZmF1bHQgYW5kIHdpdGhvdXQgdGhlIG9sZCBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IHdhcyBhYnNlbnQuXG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcbiAgICAvLyBGb3JjZSBFWEFDVCBpZCBlcXVhbGl0eSBvbiB0aGUgbXV0YXRpb24gcGF0aC4gYGlkQ29uZGl0aW9uc2AgcmV1c2VzIHRoZVxuICAgIC8vIGxpc3QtZmlsdGVyIGNsYXVzZSwgd2hvc2UgYGJ1aWxkSWRGaWx0ZXJgIFBSRUZJWC1tYXRjaGVzIChgaWQ6OnRleHQgTElLRVxuICAgIC8vICd2YWwlJ2ApIGFueSBub24tZnVsbC1VVUlEIHZhbHVlIOKAlCBzbyBhIHBhcnRpYWwgaWQgKGBERUxFVEUgL3gvYWJgKSB3b3VsZFxuICAgIC8vIHNvZnQtZGVsZXRlL211dGF0ZSBFVkVSWSBvd24tb3JnIHJvdyB3aG9zZSBpZCBzdGFydHMgd2l0aCBgYWJgIGFuZCByZXBvcnRcbiAgICAvLyB0b3VjaGluZyBvbmUuIEFORGluZyBhbiBleGFjdCBgaWQgPSB2YWxgIGNvbGxhcHNlcyB0aGUgcHJlZml4IGNsYXVzZSB0byBhdFxuICAgIC8vIG1vc3QgdGhlIHNpbmdsZSBleGFjdCByb3c7IGEgbWFsZm9ybWVkL3BhcnRpYWwgaWQgdGhlbiBtYXRjaGVzIG5vdGhpbmdcbiAgICAvLyAo4oaSIDQwNCB2aWEgdGhlIGNhbGxlcnMnIGBpZiAoIWRlbGV0ZWQpYCBndWFyZCkgaW5zdGVhZCBvZiBtYXNzLW11dGF0aW5nLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIC8qKiBFeGFjdCBpZCBlcXVhbGl0eSwgbG93ZXItY2FzZWQgdG8gbWF0Y2ggYGJ1aWxkSWRGaWx0ZXJgJ3MgZnVsbC1VVUlEIGJyYW5jaC5cbiAgICogIGBzY2hlbWFgIGlzIHR5cGVkIGBQZ1RhYmxlYCAobm8gc3RhdGljIGAuaWRgKSwgc28gY2FzdCDigJQgc2FtZSBwYXR0ZXJuIHRoZVxuICAgKiAgc29ydC9kZWZhdWx0IGhlbHBlcnMgdXNlIGZvciBjb2x1bW4gYWNjZXNzLiAqL1xuICBwcml2YXRlIGV4YWN0SWRDb25kaXRpb24oaWQ6IHN0cmluZyk6IFNRTCB7XG4gICAgcmV0dXJuIGVxKHRoaXMuY29scy5pZCwgU3RyaW5nKGlkKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIC8vIExpZmVjeWNsZSBob29rcyDigJQgb3ZlcnJpZGUgaW4gc3ViY2xhc3NlcyB0byByZWFjdCB0byBtdXRhdGlvbnNcbiAgLy8gVGhlc2UgYXJlIGZpcmUtYW5kLWZvcmdldDogZXJyb3JzIGFyZSBsb2dnZWQgYnV0IG5ldmVyIGJsb2NrIHRoZSBjYWxsZXIuXG5cbiAgLyoqIENhbGxlZCBhZnRlciBhIG5ldyBlbnRpdHkgaXMgY3JlYXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlckNyZWF0ZShfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhbiBlbnRpdHkgaXMgdXBkYXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclVwZGF0ZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYW4gZW50aXR5IGlzIHNvZnQtZGVsZXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlckRlbGV0ZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKlxuICAgKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aGVuIGEgcmVhZCBpcyB3aWRlbmVkIHRvIGEgcGFyZW50IG9yZyAoYHBhcmVudE9yZ0lkYFxuICAgKiBzZXQpLCB0aGUgcGFyZW50J3Mgcm93cyBhcmUgb3V0c2lkZSB0aGUgY2FsbGVyJ3MgUkxTIHNjb3BlLCBzbyB0aGUgcmVhZCBtdXN0XG4gICAqIHJ1biB1bmRlciBzeXNhZG1pbiBjb250ZXh0IOKAlCB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIChvd24gKyBwYXJlbnQgK1xuICAgKiBzeXN0ZW0gcHVibGljLCBidWlsdCBzZXJ2ZXItc2lkZSBmcm9tIGEgdHJ1c3RlZCBKV1QgY2xhaW0pIGlzIHRoZW4gdGhlXG4gICAqIGF1dGhvcml0YXRpdmUgdGVuYW5jeSBnYXRlLiBXaXRob3V0IGBwYXJlbnRPcmdJZGAgaXQgc3RheXMgUkxTLXNjb3BlZC5cbiAgICpcbiAgICogSU5WQVJJQU5UICh3aHkgdGhlIHN5c2FkbWluIGJ5cGFzcyBpcyBzYWZlKTogdGhlIFdIRVJFIGNsYXVzZSBpcyBhbHdheXNcbiAgICogc2VydmVyLWJ1aWx0IGJ5IGBidWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpYCBmcm9tIHZhbHVlc1xuICAgKiBkZXJpdmVkIGZyb20gdGhlIHZhbGlkYXRlZCBKV1QgKGBvcmdJZGAgPSBhY3RpdmUgb3JnLCBgcGFyZW50T3JnSWRgID0gdGhlXG4gICAqIGFjdGl2ZSBvcmcncyBwYXJlbnQpLiBOb25lIG9mIHRoZW0gaXMgYSByYXcgdXNlci1zdXBwbGllZCBwcmVkaWNhdGUsIHNvIHRoZVxuICAgKiBieXBhc3Mgb25seSBldmVyIHdpZGVucyB0aGUgcmVhZCB0byB0aGUgY2FsbGVyJ3Mgb3duIHN1YnRyZWUgKyBzeXN0ZW0gcHVibGljXG4gICAqIHJvd3Mg4oCUIGl0IGNhbiBOT1QgYmUgc3RlZXJlZCBhdCBhbiBhcmJpdHJhcnkgb3JnLiBOT1RFOiB0aGlzIGRvZXMgcmVtb3ZlIHRoZVxuICAgKiBSTFMgYmFja3N0b3AgZm9yIHRoZSB3aWRlbmVkIHJlYWQ7IGEgc2luZ2xlLUdVQyBgYXBwLm9yZ19pZGAgY2FuJ3QgZXhwcmVzc1xuICAgKiB0aGUgXCJvd24gT1IgcGFyZW50IE9SIHN5c3RlbVwiIHNldCB0aGUgcG9saWN5IHdvdWxkIG5lZWQsIHNvIHJlcGxhY2luZyB0aGVcbiAgICogYnlwYXNzIHdvdWxkIHJlcXVpcmUgYSB0ZW5hbmN5LWxheWVyIGNoYW5nZSAoZS5nLiBhIG11bHRpLW9yZyBSTFMgcG9saWN5KS5cbiAgICogRGVmZXJyZWQgZGVsaWJlcmF0ZWx5IOKAlCBkbyBub3Qgc3dhcCB0aGlzIGZvciBhIGJsYW5rZXQgYnlwYXNzIHdpdGhvdXRcbiAgICogcmUtY2hlY2tpbmcgdGhlIFdIRVJFIGlzIHN0aWxsIGZ1bGx5IHNlcnZlci1idWlsdC5cbiAgICovXG4gIHByaXZhdGUgcnVuUmVhZDxUPihwYXJlbnRPcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBwYXJlbnRPcmdJZCA/IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGZuKSA6IGZuKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqL1xuICBhc3luYyBmaW5kKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRpdGllcyB3aXRoIHBhZ2luYXRpb24gYW5kIHNvcnRpbmdcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUGFnaW5hdGlvbiBhbmQgc29ydGluZyBvcHRpb25zXG4gICAqL1xuICBhc3luYyBmaW5kUGFnaW5hdGVkKFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBvcmdJZD86IHN0cmluZyxcbiAgICBvcHRpb25zOiBRdWVyeU9wdGlvbnMgPSB7fSxcbiAgICBwYXJlbnRPcmdJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXN1bHQ8VEVudGl0eT4+IHtcbiAgICBjb25zdCB7IGxpbWl0OiByYXdMaW1pdCA9IERFRkFVTFRfUEFHRV9MSU1JVCwgb2Zmc2V0ID0gMCwgc29ydEJ5LCBzb3J0T3JkZXIgPSAnYXNjJywgaW5jbHVkZVRvdGFsID0gZmFsc2UsIGN1cnNvciwgZmllbGRzIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oTWF0aC5tYXgoMSwgcmF3TGltaXQpLCBNQVhfUEFHRV9MSU1JVCk7XG5cbiAgICAvLyBDdXJzb3IgYW5kIG9mZnNldCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIOKAlCBjdXJzb3IgdGFrZXMgcHJlY2VkZW5jZVxuICAgIGNvbnN0IHVzZUN1cnNvciA9ICEhKGN1cnNvciAmJiBzb3J0QnkpO1xuXG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIC8vIEN1cnNvci1iYXNlZCBwYWdpbmF0aW9uOiBhZGQgV0hFUkUgY2xhdXNlIGZvciBrZXlzZXQgcGFnaW5hdGlvblxuICAgIGlmICh1c2VDdXJzb3IpIHtcbiAgICAgIGNvbnN0IHNvcnRDb2x1bW4gPSB0aGlzLmdldFNvcnRDb2x1bW4oc29ydEJ5KTtcbiAgICAgIGlmIChzb3J0Q29sdW1uKSB7XG4gICAgICAgIGNvbnN0IG9wID0gc29ydE9yZGVyID09PSAnZGVzYydcbiAgICAgICAgICA/IHNxbGAke3NvcnRDb2x1bW59IDwgJHtjdXJzb3J9YFxuICAgICAgICAgIDogc3FsYCR7c29ydENvbHVtbn0gPiAke2N1cnNvcn1gO1xuICAgICAgICBjb25kaXRpb25zLnB1c2gob3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdyYXAgdGhlIHdob2xlIHBhZ2luYXRlZCByZWFkIChTRUxFQ1QgKyBvcHRpb25hbCBDT1VOVCkgaW4gb25lXG4gICAgLy8gdGVuYW50IHR4LiBCb3RoIHF1ZXJpZXMgYXJlIHZpc2liaWxpdHktc2NvcGVkIGJ5IHRoZSBzYW1lIFJMUyBwb2xpY3ksXG4gICAgLy8gYW5kIHBpbm5pbmcgdGhlbSB0byBhIHNpbmdsZSB0eCBrZWVwcyB0aGUgYGFwcC5vcmdfaWRgIEdVQyBzdGFibGVcbiAgICAvLyBiZXR3ZWVuIHRoZW0uIFdoZW4gd2lkZW5pbmcgdG8gYSBwYXJlbnQgb3JnLCB0aGUgd2hvbGUgcmVhZCBydW5zIHVuZGVyXG4gICAgLy8gc3lzYWRtaW4gY29udGV4dCAoc2VlIHJ1blJlYWQpIHNvIHRoZSBhY2Nlc3MtY29udHJvbCBXSEVSRSBpcyB0aGUgZ2F0ZS5cbiAgICByZXR1cm4gdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAvLyBCdWlsZCBTRUxFQ1Qg4oCUIHNwYXJzZSBmaWVsZHNldCB3aGVuIGZpZWxkcyBhcmUgc3BlY2lmaWVkLiBUaGUgc29ydEJ5XG4gICAgICAvLyBjb2x1bW4gTVVTVCBiZSBwYXJ0IG9mIHRoZSBwcm9qZWN0aW9uIHdoZW5ldmVyIHNvcnRpbmcgaXMgYWN0aXZlOiB0aGVcbiAgICAgIC8vIG5leHQgY3Vyc29yIGlzIGRlcml2ZWQgZnJvbSBgbGFzdEl0ZW1bc29ydEJ5XWAgYmVsb3csIHNvIGEgZmllbGRzIHNldFxuICAgICAgLy8gdGhhdCBvbWl0cyBzb3J0Qnkgd291bGQgbGVhdmUgdGhlIGN1cnNvciB1bmRlZmluZWQgYW5kIHN0YWxsIHRoZSBjbGllbnRcbiAgICAgIC8vIG9uIHBhZ2UgMS4gYnVpbGRGaWVsZFNlbGVjdCBhbHdheXMgYWRkcyBpdCBiYWNrIChsaWtlIGBpZGApLlxuICAgICAgY29uc3Qgc2VsZWN0U3BlYyA9IGZpZWxkcyA/IHRoaXMuYnVpbGRGaWVsZFNlbGVjdChmaWVsZHMsIHNvcnRCeSkgOiB1bmRlZmluZWQ7XG4gICAgICBsZXQgcXVlcnkgPSBzZWxlY3RTcGVjXG4gICAgICAgID8gdHguc2VsZWN0KHNlbGVjdFNwZWMgYXMgYW55KS5mcm9tKHRoaXMuc2NoZW1hKS53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAgIDogdHguc2VsZWN0KCkuZnJvbSh0aGlzLnNjaGVtYSkud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKTtcblxuICAgICAgaWYgKHNvcnRCeSkge1xuICAgICAgICBjb25zdCBzb3J0Q29sdW1uID0gdGhpcy5nZXRTb3J0Q29sdW1uKHNvcnRCeSk7XG4gICAgICAgIGlmIChzb3J0Q29sdW1uKSB7XG4gICAgICAgICAgcXVlcnkgPSBxdWVyeS5vcmRlckJ5KHNvcnRPcmRlciA9PT0gJ2Rlc2MnID8gZGVzYyhzb3J0Q29sdW1uKSA6IGFzYyhzb3J0Q29sdW1uKSkgYXMgYW55O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZldGNoIGxpbWl0KzEgdG8gZGV0ZWN0IGhhc01vcmUgd2l0aG91dCBDT1VOVCgqKVxuICAgICAgY29uc3QgZWZmZWN0aXZlT2Zmc2V0ID0gdXNlQ3Vyc29yID8gMCA6IG9mZnNldDtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeVxuICAgICAgICAubGltaXQobGltaXQgKyAxKVxuICAgICAgICAub2Zmc2V0KGVmZmVjdGl2ZU9mZnNldCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKTtcblxuICAgICAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gbGltaXQ7XG4gICAgICBjb25zdCBkYXRhID0gaGFzTW9yZSA/IHJvd3Muc2xpY2UoMCwgbGltaXQpIDogcm93cztcblxuICAgICAgY29uc3QgcmVzdWx0OiBQYWdpbmF0ZWRSZXN1bHQ8VEVudGl0eT4gPSB7IGRhdGEsIGxpbWl0LCBvZmZzZXQ6IGVmZmVjdGl2ZU9mZnNldCwgaGFzTW9yZSB9O1xuXG4gICAgICAvLyBQcm92aWRlIG5leHQgY3Vyc29yIGZyb20gbGFzdCBpdGVtJ3Mgc29ydCBjb2x1bW4gdmFsdWVcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgc29ydEJ5KSB7XG4gICAgICAgIGNvbnN0IGxhc3RJdGVtID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBjb25zdCBjdXJzb3JWYWx1ZSA9IGxhc3RJdGVtW3NvcnRCeV07XG4gICAgICAgIGlmIChjdXJzb3JWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0Lm5leHRDdXJzb3IgPSBjdXJzb3JWYWx1ZSBpbnN0YW5jZW9mIERhdGUgPyBjdXJzb3JWYWx1ZS50b0lTT1N0cmluZygpIDogU3RyaW5nKGN1cnNvclZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHJ1biB0aGUgQ09VTlQoKikgcXVlcnkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgbmVlZHMgdGhlIHRvdGFsLlxuICAgICAgLy8gTXVzdCBpbmNsdWRlIHBhcmVudE9yZ0lkIHNvIGB0b3RhbGAgbWF0Y2hlcyB0aGUgd2lkZW5lZCBkYXRhIHNldC5cbiAgICAgIGlmIChpbmNsdWRlVG90YWwpIHtcbiAgICAgICAgY29uc3QgYmFzZUNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgICAgIGNvbnN0IFtjb3VudFJlc3VsdF0gPSBhd2FpdCB0eFxuICAgICAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAud2hlcmUoYW5kKC4uLmJhc2VDb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSk7XG4gICAgICAgIHJlc3VsdC50b3RhbCA9IGNvdW50UmVzdWx0Py5jb3VudCB8fCAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGNvbHVtbiBzZWxlY3Rpb24gbWFwIGZvciBzcGFyc2UgZmllbGRzZXRzLlxuICAgKiBGYWxscyBiYWNrIHRvIGZ1bGwgc2VsZWN0IGlmIG5vIG1hdGNoaW5nIGNvbHVtbnMgZm91bmQuXG4gICAqXG4gICAqIGBzb3J0QnlgICh3aGVuIHNldCkgaXMgYWx3YXlzIGZvbGRlZCBpbnRvIHRoZSBwcm9qZWN0aW9uIGV2ZW4gaWYgdGhlIGNhbGxlcidzXG4gICAqIGBmaWVsZHNgIG9taXRzIGl0IOKAlCBjdXJzb3IgcGFnaW5hdGlvbiByZWFkcyB0aGUgbmV4dCBjdXJzb3IgZnJvbSB0aGUgc29ydFxuICAgKiBjb2x1bW4ncyB2YWx1ZSBvbiB0aGUgbGFzdCByb3csIHNvIGRyb3BwaW5nIGl0IGZyb20gdGhlIFNFTEVDVCB3b3VsZCB5aWVsZCBhblxuICAgKiB1bmRlZmluZWQgY3Vyc29yIGFuZCBzdGFsbCBwYWdpbmcuIEluY2x1ZGVkIHRoZSBzYW1lIHdheSBgaWRgIGFsd2F5cyBpcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGaWVsZFNlbGVjdChmaWVsZHM6IHN0cmluZ1tdLCBzb3J0Qnk/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIC8vIEFsd2F5cyBpbmNsdWRlIGlkIGZvciBlbnRpdHkgaWRlbnRpdHlcbiAgICBjb2x1bW5zLmlkID0gdGhpcy5jb2xzLmlkO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZCA9PT0gJ2lkJykgY29udGludWU7IC8vIEFscmVhZHkgaW5jbHVkZWRcbiAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sc1tmaWVsZF07XG4gICAgICBpZiAoY29sKSBjb2x1bW5zW2ZpZWxkXSA9IGNvbDtcbiAgICB9XG5cbiAgICAvLyBHdWFyYW50ZWUgdGhlIHNvcnQgY29sdW1uIGlzIHNlbGVjdGFibGUgc28gdGhlIG5leHQgY3Vyc29yIGNhbiBiZSByZWFkXG4gICAgLy8gZnJvbSB0aGUgbGFzdCByb3cgKHNlZSBmaW5kUGFnaW5hdGVkKS4gTm8tb3AgaWYgYWxyZWFkeSBhZGRlZCBvciB1bmtub3duLlxuICAgIGlmIChzb3J0QnkgJiYgc29ydEJ5ICE9PSAnaWQnICYmICEoc29ydEJ5IGluIGNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBzb3J0Q29sID0gdGhpcy5jb2xzW3NvcnRCeV07XG4gICAgICBpZiAoc29ydENvbCkgY29sdW1uc1tzb3J0QnldID0gc29ydENvbDtcbiAgICB9XG5cbiAgICAvLyBBdCBtaW5pbXVtIHdlJ2xsIGhhdmUgeyBpZCB9LCB3aGljaCBpcyB2YWxpZFxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50IGVudGl0aWVzIG1hdGNoaW5nIGZpbHRlciBjcml0ZXJpYVxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2lkZW4gdGhlIGNvdW50IHRvIHRoZSBwYXJlbnQgb3JnJ3NcbiAgICogICBwdWJsaWMgcm93cy4gTVVTVCBtaXJyb3IgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYCdzIHdpZGVuaW5nIChzYW1lXG4gICAqICAgYGJ1aWxkQ29uZGl0aW9uc2AgYXJncyArIHN5c2FkbWluLXNjb3BlZCByZWFkIHZpYSBgcnVuUmVhZGApIHNvIGEgcGFnZWRcbiAgICogICBsaXN0J3MgYHRvdGFsYCBtYXRjaGVzIHRoZSByb3dzIGEgd2lkZW5lZCBgZmluZCgpYCByZXR1cm5zIOKAlCBvdGhlcndpc2UgdGhlXG4gICAqICAgY291bnQgb21pdHMgdGhlIHBhcmVudCdzIHJvd3MgYW5kIHJlcG9ydHMgYSBuYXJyb3dlciB0b3RhbCB0aGFuIHRoZSBkYXRhIHNldC5cbiAgICovXG4gIGFzeW5jIGNvdW50KGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KHsgY291bnQ6IHNxbDxudW1iZXI+YGNvdW50KCopOjppbnRgIH0pXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpLnRoZW4ociA9PiBkcml6emxlQ291bnQocikpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0Py5jb3VudCB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBzaW5nbGUgZW50aXR5IGJ5IElEXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIEVudGl0eSBJRFxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBwYXJlbnRPcmdJZCAtIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdpZGVuIHZpc2liaWxpdHkgdG8gdGhlIHBhcmVudFxuICAgKiAgIG9yZydzIHB1YmxpYyByb3dzIChzbyBhIHRlYW0gY2FuIGZldGNoIGEgcGFyZW50J3MgcHVibGljIGVudGl0eSBieSBpZCkuXG4gICAqICAgU2FtZSBvcHQtaW4gKyBzeXNhZG1pbi1zY29wZWQgcmVhZCBhcyBgZmluZGAvYGZpbmRQYWdpbmF0ZWRgOyB0aGVcbiAgICogICBhY2Nlc3MtY29udHJvbCBXSEVSRSBjbGF1c2UgaXMgdGhlIGF1dGhvcml0YXRpdmUgdGVuYW5jeSBnYXRlLlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5SWQoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmlkQ29uZGl0aW9ucyhpZCwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICAvLyBFeGFjdCBpZCDigJQgYGZpbmRCeUlkYCBtZWFucyBUSEUgcm93IHdpdGggdGhpcyBpZCwgbm90IGEgcHJlZml4IG1hdGNoLiBUaGVcbiAgICAvLyBzaGFyZWQgYGJ1aWxkSWRGaWx0ZXJgIHByZWZpeC1tYXRjaGVzIG5vbi1mdWxsLVVVSUQgdmFsdWVzIChhIGxpc3Qtc2VhcmNoXG4gICAgLy8gZmVhdHVyZSksIHdoaWNoIGhlcmUgd291bGQgcmV0dXJuIGFuIGFyYml0cmFyeSBmaXJzdCBwcmVmaXggaGl0IGZvciBhXG4gICAgLy8gcGFydGlhbCBpZDsgcGluIGl0IHRvIGV4YWN0IHNvIGEgbWFsZm9ybWVkIGlkIHJldHVybnMgbnVsbC5cbiAgICBjb25kaXRpb25zLnB1c2godGhpcy5leGFjdElkQ29uZGl0aW9uKGlkKSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8vIE11dGF0aW9uIG9wZXJhdGlvbnNcblxuICAvKipcbiAgICogRGVmZW5zZS1pbi1kZXB0aCB0ZW5hbnQgc3RhbXAuIFJMUyBpcyBpbiBvd25lci1ieXBhc3MgbW9kZSwgc28gdGhlIGFwcCBsYXllclxuICAgKiBpcyB0aGUgb25seSB0ZW5hbnQgZ2F0ZSBvbiB3cml0ZXMuIEEgTk9OLXN5c2FkbWluIGNhbGxlciBtYXkgb25seSB3cml0ZSBpbnRvXG4gICAqIGl0cyBPV04gb3JnLCBzbyBwaW4gdGhlIHJvdyB0byB0aGUgdHJ1c3RlZCB0ZW5hbnQtY29udGV4dCBvcmcuXG4gICAqXG4gICAqIFRoZSBzdGFtcCBmaXJlcyB3aGVuZXZlciB0aGUgcGF5bG9hZCdzIGBvcmdJZGAgZGlmZmVycyBmcm9tIHRoZSBjb250ZXh0IG9yZyDigJRcbiAgICogd2hpY2ggY292ZXJzIEJPVEggYSBmb3JnZWQvbWlzbWF0Y2hlZCBgZGF0YS5vcmdJZGAgQU5EIGFuIEFCU0VOVCBvbmUuIFRoZVxuICAgKiBhYnNlbnQgY2FzZSBpcyB0aGUgaW1wb3J0YW50IHRlbmFudC1ib3VuZGFyeSBmaXg6IHRoZSBgb3JnX2lkYCBjb2x1bW4gREVGQVVMVHNcbiAgICogdG8gYFNZU1RFTV9PUkdfSURgIChzY2hlbWEvcGlwZWxpbmUudHMsIHNjaGVtYS9wbHVnaW4udHMpLCBzbyBhbiBpbnNlcnQgdGhhdFxuICAgKiBvbWl0cyBgb3JnSWRgIHdvdWxkIG90aGVyd2lzZSBsYW5kIHRoZSB0ZW5hbnQncyByb3cgaW4gdGhlIHB1YmxpYyBzeXN0ZW1cbiAgICogY2F0YWxvZyDigJQgYSBjcm9zcy10ZW5hbnQgZmFpbC1vcGVuLiBBbHdheXMgaW5qZWN0aW5nIGBjdHgub3JnSWRgIGNsb3NlcyBpdC5cbiAgICpcbiAgICogU3lzYWRtaW4gKGFuZCBvdXQtb2YtY29udGV4dCB3b3JrZXIvc3lzdGVtIHBhdGhzLCB3aGVyZSBgZ2V0VGVuYW50Q29udGV4dCgpYFxuICAgKiBpcyB1bmRlZmluZWQpIGtlZXAgdGhlIHN1cHBsaWVkIG9yZywgbWF0Y2hpbmcgdGhlIFJMUyBwb2xpY3lcbiAgICogYGN1cnJlbnRfaXNfc3lzYWRtaW4oKSBPUiBvcmdfaWQgPSBjdXJyZW50X29yZ19pZCgpYC5cbiAgICovXG4gIHByb3RlY3RlZCBlbmZvcmNlT3JnSWQoZGF0YTogVEluc2VydCk6IFRJbnNlcnQge1xuICAgIGNvbnN0IGN0eCA9IGdldFRlbmFudENvbnRleHQoKTtcbiAgICBjb25zdCBkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoY3R4ICYmICFjdHguaXNTdXBlckFkbWluICYmIGN0eC5vcmdJZCAmJiBkLm9yZ0lkICE9PSBjdHgub3JnSWQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdDcnVkU2VydmljZTogc3RhbXBpbmcgdGVuYW50LWNvbnRleHQgb3JnIG9uIHdyaXRlJywge1xuICAgICAgICBzdXBwbGllZDogJ29yZ0lkJyBpbiBkID8gZC5vcmdJZCA6IHVuZGVmaW5lZCwgZW5mb3JjZWQ6IGN0eC5vcmdJZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgLi4uZCwgb3JnSWQ6IGN0eC5vcmdJZCB9IGFzIFRJbnNlcnQ7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShkYXRhOiBUSW5zZXJ0LCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG4gICAgY29uc3QgW2NyZWF0ZWRdID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5pbnNlcnQodGhpcy5zY2hlbWEpXG4gICAgICAudmFsdWVzKHtcbiAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgIGNyZWF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogdGhpcy5jb25mbGljdFRhcmdldCBhcyBhbnksXG4gICAgICAgIHNldDoge1xuICAgICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgLy8gQXdhaXRlZCBpbnRlbnRpb25hbGx5OiBjYWNoZSBpbnZhbGlkYXRpb24gaGFwcGVucyBpbiB0aGUgaG9vaywgYW5kIGFcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgcGF0dGVybiBsZXRzIGEgc3Vic2VxdWVudCByZWFkIGluc2lkZSB0aGUgc2FtZSByZXF1ZXN0XG4gICAgLy8gcmV0dXJuIHRoZSBzdGFsZSBwcmUtd3JpdGUgZW50cnkuIFRoZSBob29rIGlzIGV4cGVjdGVkIHRvIGJlIGZhc3RcbiAgICAvLyAoc2luZ2xlIFJlZGlzIG9wKTsgc2xvdyBob29rcyBzaG91bGQgcnVuIHRoZWlyIG93biBiYWNrZ3JvdW5kIHdvcmsuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub25BZnRlckNyZWF0ZShjcmVhdGVkLCB1c2VySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgYG9yZ0lkYCBpbiB0aGUgdXBkYXRlIHBheWxvYWQgKGFzIGNyZWF0ZSBkb2VzKTogdGhlXG4gICAgLy8gV0hFUkUgb25seSBwaW5zIHdoaWNoIHJvd3MgeW91IGNhbiBUQVJHRVQsIG5vdCB3aGF0IHlvdSBjYW4gc2V0IOKAlCB3aXRob3V0IHRoaXNcbiAgICAvLyBhIHRlbmFudCBjb3VsZCByZS1ob21lIGEgcm93IGl0IG93bnMgaW50byBhbm90aGVyIG9yZyB2aWEgYGRhdGEub3JnSWRgLlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSBhcyB1bmtub3duIGFzIFRJbnNlcnQpIGFzIHVua25vd24gYXMgUGFydGlhbDxUVXBkYXRlPjtcblxuICAgIGNvbnN0IFt1cGRhdGVkXSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclVwZGF0ZShpZCwgdXBkYXRlZCwgdXNlcklkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IChzb2Z0IGRlbGV0ZSBieSBzZXR0aW5nIGlzQWN0aXZlID0gZmFsc2UpXG4gICAqL1xuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMud3JpdGVDb25kaXRpb25zKGlkLCBvcmdJZCk7XG5cbiAgICBjb25zdCBbZGVsZXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIGRlbGV0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgZGVsZXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyRGVsZXRlKGlkLCBkZWxldGVkLCB1c2VySWQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBlbnRpdHkgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvamVjdC9vcmdhbml6YXRpb24gc2NvcGUuXG4gICAqIE1hcmtzIGFsbCBvdGhlciBlbnRpdGllcyBhcyBub24tZGVmYXVsdCwgdGhlbiBzZXRzIHRoZSBzcGVjaWZpZWQgZW50aXR5LlxuICAgKiBVc2VzIGEgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIGF0b21pY2l0eS5cbiAgICovXG4gIGFzeW5jIHNldERlZmF1bHQoXG4gICAgcHJvamVjdDogc3RyaW5nLFxuICAgIG9yZzogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIC8vIEEgbm9uLXN5c2FkbWluIG1heSBvbmx5IGZsaXAgZGVmYXVsdHMgd2l0aGluIGl0cyBPV04gb3JnIOKAlCBwaW4gdGhlIHNjb3BlIHRvXG4gICAgLy8gdGhlIHRydXN0ZWQgdGVuYW50IGNvbnRleHQgc28gYSBmb3J3YXJkZWQgYG9yZ2AgYXJnIGNhbid0IHRvdWNoIGFub3RoZXJcbiAgICAvLyB0ZW5hbnQncyBkZWZhdWx0cyAoUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlOyB0aGlzIGlzIHRoZSBnYXRlKS5cbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQpIG9yZyA9IGN0eC5vcmdJZDtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3Qgb3JnQ29sdW1uID0gdGhpcy5nZXRPcmdDb2x1bW4oKTtcbiAgICAgIGNvbnN0IHByb2plY3RDb2x1bW4gPSB0aGlzLmdldFByb2plY3RDb2x1bW4oKTtcblxuICAgICAgLy8gQnVpbGQgc2NvcGluZyBjb25kaXRpb25zIGZvciBjbGVhcmluZyBkZWZhdWx0c1xuICAgICAgY29uc3Qgc2NvcGVDb25kaXRpb25zID0gW1xuICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgIGVxKHRoaXMuY29scy5pc0RlZmF1bHQsIHRydWUpLFxuICAgICAgXTtcbiAgICAgIGlmIChwcm9qZWN0Q29sdW1uKSB7XG4gICAgICAgIHNjb3BlQ29uZGl0aW9ucy5wdXNoKGVxKHByb2plY3RDb2x1bW4sIHByb2plY3QpKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9jayBleGlzdGluZyBkZWZhdWx0cyB3aXRoIEZPUiBVUERBVEUgdG8gcHJldmVudCBjb25jdXJyZW50IHNldERlZmF1bHQgcmFjZXNcbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoXG4gICAgICAgIHNxbGBTRUxFQ1QgaWQgRlJPTSAke3RoaXMuc2NoZW1hfVxuICAgICAgICAgICAgV0hFUkUgJHtvcmdDb2x1bW59ID0gJHtvcmd9XG4gICAgICAgICAgICAgIEFORCAke3RoaXMuY29scy5pc0RlZmF1bHR9ID0gdHJ1ZVxuICAgICAgICAgICAgJHtwcm9qZWN0Q29sdW1uID8gc3FsYEFORCAke3Byb2plY3RDb2x1bW59ID0gJHtwcm9qZWN0fWAgOiBzcWxgYH1cbiAgICAgICAgICAgIEZPUiBVUERBVEVgLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhbGwgZW50aXRpZXMgaW4gc2NvcGUgYXMgbm9uLWRlZmF1bHRcbiAgICAgIGF3YWl0IHR4XG4gICAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLndoZXJlKGFuZCguLi5zY29wZUNvbmRpdGlvbnMpKTtcblxuICAgICAgLy8gU2V0IHRoZSBzcGVjaWZpZWQgZW50aXR5IGFzIGRlZmF1bHQuIEd1YXJkIGFnYWluc3QgcHJvbW90aW5nIGFcbiAgICAgIC8vIHNvZnQtZGVsZXRlZCByb3cgKGlzQWN0aXZlID0gdHJ1ZSkg4oCUIGEgZGVsZXRlZCBlbnRpdHkgbXVzdCBuZXZlciBiZWNvbWVcbiAgICAgIC8vIHRoZSBhY3RpdmUgZGVmYXVsdCDigJQgYW5kIHBpbiB0aGUgaWQgd2l0aCB0aGUgc2FtZSBsb3dlcmNhc2VkXG4gICAgICAvLyBleGFjdElkQ29uZGl0aW9uIHRoZSBtdXRhdGlvbiBwYXRocyB1c2UgKHRoZSByYXcgYGVxKGNvbHMuaWQsIGlkKWAgaGVyZVxuICAgICAgLy8gc2tpcHBlZCB0aGUgbG93ZXItY2FzaW5nIHRoYXQgYGJ1aWxkSWRGaWx0ZXJgL2B3cml0ZUNvbmRpdGlvbnNgIGFwcGx5LFxuICAgICAgLy8gc28gYSBtaXhlZC1jYXNlIGlkIGNvdWxkIG1pc3MgaXRzIHJvdykuIEEgbm9uLW1hdGNoIOKGkiBOb3RGb3VuZEVycm9yIGJlbG93LlxuICAgICAgY29uc3QgW3VwZGF0ZWRdID0gYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgaXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC53aGVyZShcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICB0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpLFxuICAgICAgICAgICAgZXEob3JnQ29sdW1uLCBvcmcpLFxuICAgICAgICAgICAgZXEodGhpcy5jb2xzLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBpZiAoIXVwZGF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYEVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsdGlwbGUgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyXG4gICAqL1xuICBhc3luYyB1cGRhdGVNYW55KFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBkYXRhOiBQYXJ0aWFsPFRVcGRhdGU+LFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuICAgIC8vIE93bi1vcmcgd3JpdGUtcGluOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlci1vcmcgUFVCTElDXG4gICAgLy8gcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY291bGQgbXV0YXRlXG4gICAgLy8gc2hhcmVkIChvciBhbm90aGVyIHRlbmFudCdzIHB1YmxpYykgcmVjb3Jkcy4gTWlycm9yIHVwZGF0ZS9kZWxldGUvXG4gICAgLy8gYnVsa0RlbGV0ZS4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKSBBbiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwc1xuICAgIC8vIGZ1bGwgYWNjZXNzLlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBvcmdJZCAoc2VlIHVwZGF0ZSgpKSBzbyBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY2FuJ3RcbiAgICAvLyByZS1ob21lIHJvd3MgaW50byBhbm90aGVyIHRlbmFudC5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEgYXMgdW5rbm93biBhcyBUSW5zZXJ0KSBhcyB1bmtub3duIGFzIFBhcnRpYWw8VFVwZGF0ZT47XG5cbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG11bHRpcGxlIGVudGl0aWVzIGluIGEgc2luZ2xlIGJhdGNoIGluc2VydC5cbiAgICogVXNlcyB1cHNlcnQgKG9uQ29uZmxpY3REb1VwZGF0ZSkg4oCUIGFsbCByb3dzIGFyZSBpbnNlcnRlZCBpbiBvbmUgcXVlcnkgcGVyIGNodW5rLlxuICAgKiBDaHVua3Mgb2YgMTAwIHRvIHN0YXkgd2l0aGluIFBvc3RncmVTUUwgcGFyYW1ldGVyIGxpbWl0cy5cbiAgICovXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgYG9uQ29uZmxpY3REb1VwZGF0ZWAgU0VUIGZvciBhIGJ1bGsgdXBzZXJ0LiBVbmxpa2UgYSBzaW5nbGUtcm93XG4gICAqIGNyZWF0ZSAod2hpY2ggY2FuIHNwcmVhZCB0aGUgb25lIHJvdydzIGRhdGEpLCBhIGJhdGNoZWQgaW5zZXJ0IGhhcyBtYW55IHJvd3MsXG4gICAqIHNvIGVhY2ggdXBkYXRhYmxlIGNvbHVtbiBpcyB3cml0dGVuIGZyb20gYGV4Y2x1ZGVkLipgICh0aGUgd291bGQtYmUtaW5zZXJ0ZWRcbiAgICogdmFsdWUpIOKAlCBvdGhlcndpc2UgYW4gZXhpc3Rpbmcgcm93J3MgZmllbGRzIGFyZSBzaWxlbnRseSBkaXNjYXJkZWQgYW5kIG9ubHlcbiAgICogdGltZXN0YW1wcyBidW1wLiBTa2lwcyBpZGVudGl0eS9pbW11dGFibGUgKGBpZGAsIGBjcmVhdGVkQXRgLCBgY3JlYXRlZEJ5YClcbiAgICogYW5kIHRoZSBjb25mbGljdC10YXJnZXQgY29sdW1uczsgYHVwZGF0ZWRBdGAvYHVwZGF0ZWRCeWAgZ2V0IHRoZSBmcmVzaCB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQnVsa1Vwc2VydFNldChub3c6IERhdGUsIHVzZXI6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBjb25mbGljdE5hbWVzID0gbmV3IFNldCh0aGlzLmNvbmZsaWN0VGFyZ2V0Lm1hcCgoYykgPT4gKGMgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lKSk7XG4gICAgY29uc3Qgc2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgY29sXSBvZiBPYmplY3QuZW50cmllcyhnZXRUYWJsZUNvbHVtbnModGhpcy5zY2hlbWEpKSkge1xuICAgICAgY29uc3QgbmFtZSA9IChjb2wgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgICAgaWYgKGtleSA9PT0gJ2lkJyB8fCBrZXkgPT09ICdjcmVhdGVkQXQnIHx8IGtleSA9PT0gJ2NyZWF0ZWRCeScgfHwgY29uZmxpY3ROYW1lcy5oYXMobmFtZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGtleSA9PT0gJ3VwZGF0ZWRBdCcpIHsgc2V0W2tleV0gPSBub3c7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoa2V5ID09PSAndXBkYXRlZEJ5JykgeyBzZXRba2V5XSA9IHVzZXI7IGNvbnRpbnVlOyB9XG4gICAgICBzZXRba2V5XSA9IHNxbGBleGNsdWRlZC4ke3NxbC5pZGVudGlmaWVyKG5hbWUpfWA7XG4gICAgfVxuICAgIHJldHVybiBzZXQ7XG4gIH1cblxuICBhc3luYyBidWxrQ3JlYXRlKGl0ZW1zOiBUSW5zZXJ0W10sIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBDSFVOS19TSVpFID0gMTAwO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCB8fCAnc3lzdGVtJztcbiAgICBjb25zdCBjb25mbGljdFNldCA9IHRoaXMuYnVpbGRCdWxrVXBzZXJ0U2V0KG5vdywgdXNlcik7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ3JlYXRlZDogVEVudGl0eVtdID0gW107XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IENIVU5LX1NJWkUpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBpdGVtcy5zbGljZShpLCBpICsgQ0hVTktfU0laRSk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNodW5rLm1hcChkYXRhID0+ICh7XG4gICAgICAgICAgLi4udGhpcy5lbmZvcmNlT3JnSWQoZGF0YSksXG4gICAgICAgICAgY3JlYXRlZEJ5OiB1c2VyLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcixcbiAgICAgICAgfSBhcyBhbnkpKTtcblxuICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdHhcbiAgICAgICAgICAuaW5zZXJ0KHRoaXMuc2NoZW1hKVxuICAgICAgICAgIC52YWx1ZXModmFsdWVzKVxuICAgICAgICAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLmNvbmZsaWN0VGFyZ2V0IGFzIGFueSxcbiAgICAgICAgICAgIHNldDogY29uZmxpY3RTZXQgYXMgYW55LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSk7XG5cbiAgICAgICAgYWxsQ3JlYXRlZC5wdXNoKC4uLmNyZWF0ZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsQ3JlYXRlZDtcbiAgICB9KTtcblxuICAgIC8vIFJ1biBob29rcyBpbiBwYXJhbGxlbCBidXQgYXdhaXQgYWxsIGJlZm9yZSByZXR1cm5pbmcgc28gYSBzdWJzZXF1ZW50XG4gICAgLy8gcmVhZCBpbiB0aGUgc2FtZSByZXF1ZXN0IHNlZXMgYSBjb2hlcmVudCBwb3N0LXdyaXRlIHZpZXcuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByZXN1bHRzLm1hcChlbnRpdHkgPT5cbiAgICAgICAgdGhpcy5vbkFmdGVyQ3JlYXRlKGVudGl0eSwgdXNlcklkKS5jYXRjaChlcnIgPT5cbiAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb2Z0LWRlbGV0ZSBtdWx0aXBsZSBlbnRpdGllcyBieSBJRHMgaW4gYSBzaW5nbGUgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgYnVsa0RlbGV0ZShcbiAgICBpZHM6IHN0cmluZ1tdLFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgLyoqIFdoZW4gdHJ1ZSwgb25seSBQUklWQVRFIHJlY29yZHMgYXJlIGRlbGV0ZWQg4oCUIG1pcnJvcnMgdGhlIHNpbmdsZS1kZWxldGVcbiAgICAgKiAgYHJlcXVpcmVQdWJsaWNBY2Nlc3NgIGdhdGUgc28gYSBub24tc3lzYWRtaW4gY2FuJ3QgYnVsay1kZWxldGUgcHVibGljXG4gICAgICogIChzaGFyZWQvc3lzYWRtaW4tbWFuYWdlZCkgcmVjb3Jkcy4gTm8tb3AgZm9yIGVudGl0aWVzIHdpdGhvdXQgYW5cbiAgICAgKiAgYGFjY2Vzc01vZGlmaWVyYCBjb2x1bW4uIENhbGxlcnMgcGFzcyBgIWlzU3lzdGVtQWRtaW4ocmVxKWAuICovXG4gICAgcmVzdHJpY3RUb1ByaXZhdGUgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB1c2VyID0gdXNlcklkIHx8ICdzeXN0ZW0nO1xuICAgIC8vIE93bmVyLXNjb3BlIHRoZSBidWxrIHNvZnQtZGVsZXRlOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlclxuICAgIC8vIC1vcmcgUFVCTElDIHJvd3MsIHNvIHdpdGhvdXQgdGhlIHN0cmljdCBvcmdJZCBwaW4gYSB0ZW5hbnQgY291bGQgZGVsZXRlXG4gICAgLy8gc2hhcmVkIHJlY29yZHMgYnkgaWQuIChTZWUgd3JpdGVDb25kaXRpb25zLilcbiAgICBjb25zdCBhY2Nlc3NDb2wgPSB0aGlzLmNvbHMuYWNjZXNzTW9kaWZpZXI7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgIGluQXJyYXkodGhpcy5jb2xzLmlkLCBpZHMpLFxuICAgICAgLi4udGhpcy5idWlsZENvbmRpdGlvbnMoe30gYXMgUGFydGlhbDxURmlsdGVyPiwgb3JnSWQpLFxuICAgICAgLy8gVGVuYW50IGNvbHVtbiAoZ2V0T3JnQ29sdW1uLCBhc3NlcnRlZCBub24tbnVsbCkg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgICAgLy8gd3JpdGVDb25kaXRpb25zOyBubyBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IGlzIGFic2VudC5cbiAgICAgIC4uLihvcmdJZCA/IFtlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCldIDogW10pLFxuICAgICAgLi4uKHJlc3RyaWN0VG9Qcml2YXRlICYmIGFjY2Vzc0NvbCA/IFtlcShhY2Nlc3NDb2wsICdwcml2YXRlJyldIDogW10pLFxuICAgIF07XG5cbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgICBkZWxldGVkQXQ6IG5vdyxcbiAgICAgICAgZGVsZXRlZEJ5OiB1c2VyLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBkZWxldGVkLm1hcChlbnRpdHkgPT5cbiAgICAgICAgdGhpcy5vbkFmdGVyRGVsZXRlKGVudGl0eS5pZCwgZW50aXR5LCB1c2VySWQpLmNhdGNoKGVyciA9PlxuICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG59XG4iXX0=
|
|
587
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RixtRkFBbUY7QUFDbkYsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDakYsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUUxRTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUksSUFBYTtJQUMxQyxPQUFPLElBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYTtJQUN4QyxPQUFPLElBQTJCLENBQUM7QUFDckMsQ0FBQztBQTJGRCxNQUFNLE9BQWdCLFdBQVc7SUFTL0I7Ozs7OztPQU1HO0lBQ0gsSUFBWSxJQUFJO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBZ0MsQ0FBQztJQUMvQyxDQUFDO0lBeUJnQixPQUFPLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXhEO1FBQ0Usd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxzRUFBc0U7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RSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEUsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7YUFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDbkIsR0FBRyxDQUFDO1lBQ0gsUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUsR0FBRztZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsU0FBUyxFQUFFLEdBQUc7WUFDZCxTQUFTLEVBQUUsSUFBSTtTQUNULENBQUM7YUFDUixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7YUFDekIsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUNuRSxDQUNGLENBQ0YsQ0FBQztRQUVGLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yLCBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBTUUwsIGVxLCBhbmQsIGFzYywgZGVzYywgc3FsLCBpbkFycmF5LCBnZXRUYWJsZUNvbHVtbnMgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQgdHlwZSB7IFBnVGFibGUgfSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQsIGdldFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuLyoqIFBhZ2luYXRpb24gZGVmYXVsdHMg4oCUIHJlYWQgZnJvbSBlbnYgdG8gbWF0Y2ggQ29yZUNvbnN0YW50cyBpbiBwaXBlbGluZS1jb3JlLiAqL1xuY29uc3QgREVGQVVMVF9QQUdFX0xJTUlUID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuREVGQVVMVF9QQUdFX0xJTUlUIHx8ICcxMDAnLCAxMCk7XG5jb25zdCBNQVhfUEFHRV9MSU1JVCA9IHBhcnNlSW50KHByb2Nlc3MuZW52Lk1BWF9QQUdFX0xJTUlUIHx8ICcxMDAwJywgMTApO1xuXG4vKipcbiAqIENhc3QgRHJpenpsZSBxdWVyeSByZXN1bHRzIHRvIGEgdHlwZWQgYXJyYXkuXG4gKiBEcml6emxlJ3MgZ2VuZXJpYyByZXR1cm4gdHlwZSAoYFBnU2VsZWN0QmFzZTwuLi4+YCkgZG9lc24ndCBuYXJyb3cgdG8gb3VyXG4gKiBlbnRpdHkgZ2VuZXJpY3MsIHNvIGFuIGV4cGxpY2l0IGNhc3QgaXMgbmVlZGVkLiBDZW50cmFsaXNlZCBoZXJlIHNvIGV2ZXJ5XG4gKiBjYWxsLXNpdGUgc3RheXMgb25lLWxpbmVyIGNsZWFuIGFuZCB0aGUgY2FzdCBpcyBkb2N1bWVudGVkIGluIG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVSb3dzPFQ+KHJvd3M6IHVua25vd24pOiBUW10ge1xuICByZXR1cm4gcm93cyBhcyBUW107XG59XG5cbi8qKiBDYXN0IGEgRHJpenpsZSBhZ2dyZWdhdGUgcmVzdWx0IHRvIGV4dHJhY3QgYFt7IGNvdW50OiBudW1iZXIgfV1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVDb3VudChyb3dzOiB1bmtub3duKTogW3sgY291bnQ6IG51bWJlciB9XSB7XG4gIHJldHVybiByb3dzIGFzIFt7IGNvdW50OiBudW1iZXIgfV07XG59XG5cbi8qKlxuICogQmFzZSBpbnRlcmZhY2UgZm9yIGVudGl0aWVzIHdpdGggY29tbW9uIGZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBpc0RlZmF1bHQ6IGJvb2xlYW47XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgdXBkYXRlZEJ5OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogUGFnaW5hdGlvbiBhbmQgc29ydGluZyBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlPcHRpb25zIHtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgc29ydEJ5Pzogc3RyaW5nO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAgLyoqIFdoZW4gdHJ1ZSwgcnVucyBhIHNlcGFyYXRlIENPVU5UKCopIHF1ZXJ5IHRvIGluY2x1ZGUgZXhhY3QgdG90YWwuIERlZmF1bHQ6IGZhbHNlLiAqL1xuICBpbmNsdWRlVG90YWw/OiBib29sZWFuO1xuICAvKiogQ3Vyc29yLWJhc2VkIHBhZ2luYXRpb246IGZldGNoIHJvd3MgYWZ0ZXIgdGhpcyBjdXJzb3IgdmFsdWUgKHVzZXMgc29ydEJ5IGNvbHVtbikuICovXG4gIGN1cnNvcj86IHN0cmluZztcbiAgLyoqIFNwYXJzZSBmaWVsZHNldDogY29sdW1uIG5hbWVzIHRvIHNlbGVjdC4gUmV0dXJucyBhbGwgY29sdW1ucyB3aGVuIG9taXR0ZWQuICovXG4gIGZpZWxkcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhZ2luYXRlZCByZXN1bHQgd2l0aCBtZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZFJlc3VsdDxUPiB7XG4gIGRhdGE6IFRbXTtcbiAgLyoqIFRvdGFsIGNvdW50IG9mIG1hdGNoaW5nIGVudGl0aWVzLiBPbmx5IHByZXNlbnQgd2hlbiBpbmNsdWRlVG90YWwgaXMgdHJ1ZS4gKi9cbiAgdG90YWw/OiBudW1iZXI7XG4gIGxpbWl0OiBudW1iZXI7XG4gIG9mZnNldDogbnVtYmVyO1xuICBoYXNNb3JlOiBib29sZWFuO1xuICAvKiogQ3Vyc29yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGl0ZW0sIGZvciBjdXJzb3ItYmFzZWQgcGFnaW5hdGlvbi4gKi9cbiAgbmV4dEN1cnNvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBDUlVEIHNlcnZpY2Ugd2l0aCBtdWx0aS10ZW5hbnQgYWNjZXNzIGNvbnRyb2wgYW5kIHBhZ2luYXRpb24uXG4gKlxuICogU3ViY2xhc3NlcyBiaW5kIHRvIGEgc3BlY2lmaWMgRHJpenpsZSB0YWJsZSBieSBpbXBsZW1lbnRpbmcgYHNjaGVtYWAsXG4gKiBgYnVpbGRDb25kaXRpb25zYCwgYGdldFNvcnRDb2x1bW5gLCBhbmQgdGhlIG9yZy9wcm9qZWN0LWNvbHVtbiBhY2Nlc3NvcnMuXG4gKlxuICogQHR5cGVQYXJhbSBURW50aXR5IC0gRW50aXR5IHR5cGUgZXh0ZW5kaW5nIEJhc2VFbnRpdHlcbiAqIEB0eXBlUGFyYW0gVEZpbHRlciAtIEZpbHRlciB0eXBlIGZvciBxdWVyeSBwYXJhbWV0ZXJzXG4gKiBAdHlwZVBhcmFtIFRJbnNlcnQgLSBJbnNlcnQgRFRPIHR5cGVcbiAqIEB0eXBlUGFyYW0gVFVwZGF0ZSAtIFVwZGF0ZSBEVE8gdHlwZVxuICpcbiAqICoqQSBub3RlIG9uIHRoZSB0eXBlIGNhc3RzLioqIERyaXp6bGUncyByb3cgdHlwZXMgYXJlIGluZmVycmVkIGZyb21cbiAqIGBwZ1RhYmxlKC4uLilgIGFuZCBkb24ndCBnZW5lcmljYWxseSBuYXJyb3cgdGhyb3VnaCB0aGUgYWJzdHJhY3QgYHNjaGVtYWBcbiAqIGdldHRlciwgc28gdGhlIGJhc2UgY2xhc3MgY2FzdHMgcXVlcnkgcmVzdWx0cyB0byBgVEVudGl0eWAgYW5kIGJhY2suIFRoZVxuICogY2FzdCBpcyAqbm90KiBhIHJ1bnRpbWUgc2FmZXR5IGd1YXJhbnRlZSDigJQgaXQgcmVsaWVzIG9uIGVhY2ggc3ViY2xhc3NcbiAqIHBhc3NpbmcgdGhlIG1hdGNoaW5nIGVudGl0eSB0eXBlLiBPcmctc2NvcGluZyBpcyBlbmZvcmNlZCBieSBldmVyeVxuICogc3ViY2xhc3MncyBgYnVpbGRDb25kaXRpb25zYCBpbmplY3RpbmcgYFdIRVJFIG9yZ19pZCA9ICQxYDsgdGhpcyBjbGFzc1xuICogZG9lcyBub3QgYWRkIHRoYXQgZmlsdGVyIGl0c2VsZi5cbiAqXG4gKiAqKkVycm9yIHBvbGljeS4qKiBFcnJvcnMgcHJvcGFnYXRlIHVwIHRvIHRoZSByb3V0ZS1sZXZlbCBoYW5kbGVyXG4gKiAoYHdpdGhSb3V0ZWApOyBubyBjYXRjaC1hbmQtc3dhbGxvdyBoZXJlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBQaXBlbGluZVNlcnZpY2UgZXh0ZW5kcyBDcnVkU2VydmljZTxQaXBlbGluZSwgUGlwZWxpbmVGaWx0ZXIsIFBpcGVsaW5lSW5zZXJ0LCBQaXBlbGluZVVwZGF0ZT4ge1xuICogICBwcm90ZWN0ZWQgZ2V0IHNjaGVtYSgpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZTsgfVxuICogICBwcm90ZWN0ZWQgYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpIHsgcmV0dXJuIGJ1aWxkUGlwZWxpbmVDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpOyB9XG4gKiAgIHByb3RlY3RlZCBnZXRTb3J0Q29sdW1uKHNvcnRCeSkgeyByZXR1cm4gc29ydENvbHVtbk1hcFtzb3J0QnldID8/IG51bGw7IH1cbiAqICAgcHJvdGVjdGVkIGdldFByb2plY3RDb2x1bW4oKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmUucHJvamVjdDsgfVxuICogICBwcm90ZWN0ZWQgZ2V0T3JnQ29sdW1uKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lLm9yZ0lkOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuLyoqIFN0cnVjdHVyYWwgdmlldyBvZiB0aGUgc3ViY2xhc3MgdGFibGUncyBjb2x1bW5zIHRoZSBiYXNlIGNsYXNzIHRvdWNoZXNcbiAqICBkaXJlY3RseS4gYGlkYC9gaXNBY3RpdmVgL2Bpc0RlZmF1bHRgIGFyZSBhbHdheXMgcHJlc2VudCBvbiBhIENSVUQgZW50aXR5O1xuICogIGBhY2Nlc3NNb2RpZmllcmAgb25seSBvbiBwdWJsaWMtdmlzaWJpbGl0eSBlbnRpdGllczsgdGhlIGluZGV4IHNpZ25hdHVyZVxuICogIGNvdmVycyBkeW5hbWljIChzcGFyc2UtZmllbGRzZXQpIGNvbHVtbiBhY2Nlc3MuICovXG5pbnRlcmZhY2UgQ3J1ZENvbHVtbnMge1xuICBpZDogQW55Q29sdW1uO1xuICBpc0FjdGl2ZTogQW55Q29sdW1uO1xuICBpc0RlZmF1bHQ6IEFueUNvbHVtbjtcbiAgYWNjZXNzTW9kaWZpZXI/OiBBbnlDb2x1bW47XG4gIFtrZXk6IHN0cmluZ106IEFueUNvbHVtbiB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENydWRTZXJ2aWNlPFxuICBURW50aXR5IGV4dGVuZHMgQmFzZUVudGl0eSxcbiAgVEZpbHRlcixcbiAgVEluc2VydCxcbiAgVFVwZGF0ZSxcbj4ge1xuICAvKiogRHJpenpsZSBzY2hlbWEgdGFibGUgZm9yIHRoaXMgZW50aXR5ICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgc2NoZW1hKCk6IFBnVGFibGU7XG5cbiAgLyoqXG4gICAqIFR5cGVkIGNvbHVtbiB2aWV3IG9mIHtAbGluayBzY2hlbWF9LiBgUGdUYWJsZWAgZXhwb3NlcyBubyBzdGF0aWMgY29sdW1ucywgc29cbiAgICogdGhlIGJhc2UgY2xhc3MgcHJldmlvdXNseSByZWFjaGVkIGZvciBgKHRoaXMuc2NoZW1hIGFzIGFueSkuaWRgIGV0Yy4gYXQgZWFjaFxuICAgKiB1c2U7IGNlbnRyYWxpemUgdGhhdCBzaW5nbGUgdW5hdm9pZGFibGUgY2FzdCBoZXJlIHNvIGNhbGxlcnMgZ2V0IHN0cnVjdHVyZWQsXG4gICAqIHR5cGVkIGFjY2VzcyBpbnN0ZWFkLiBgYWNjZXNzTW9kaWZpZXJgIGlzIG9wdGlvbmFsIChub3QgZXZlcnkgZW50aXR5IGhhcyBpdClcbiAgICogYW5kIHRoZSBpbmRleCBzaWduYXR1cmUgY292ZXJzIGR5bmFtaWMgc3BhcnNlLWZpZWxkc2V0IGNvbHVtbiBsb29rdXAuXG4gICAqL1xuICBwcml2YXRlIGdldCBjb2xzKCk6IENydWRDb2x1bW5zIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEgYXMgdW5rbm93biBhcyBDcnVkQ29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgZmlsdGVyaW5nIGVudGl0aWVzLlxuICAgKiBgcGFyZW50T3JnSWRgIChvcmcg4oaSIHRlYW0gaGllcmFyY2h5KSBpcyBvcHRpb25hbCBhbmQgb25seSBob25vcmVkIGJ5XG4gICAqIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gcGFyZW50LWluaGVyaXRlZCB2aXNpYmlsaXR5IChlLmcuIHBsdWdpbnMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdO1xuXG4gIC8qKiBHZXQgdGhlIHNjaGVtYSBjb2x1bW4gZm9yIHNvcnRpbmcgYnkgZmllbGQgbmFtZSAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U29ydENvbHVtbihzb3J0Qnk6IHN0cmluZyk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqIEdldCB0aGUgcHJvamVjdCBjb2x1bW4gZm9yIHNldERlZmF1bHQgc2NvcGluZyAobnVsbCBpZiBlbnRpdHkgaGFzIG5vIHByb2plY3Qgc2NvcGUpICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9qZWN0Q29sdW1uKCk6IEFueUNvbHVtbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGVuYW50IG9yZy1pZCBjb2x1bW4uIFVzZWQgYm90aCB0byBzY29wZSBgc2V0RGVmYXVsdGAgYW5kIHRvIHBpblxuICAgKiBldmVyeSB3cml0ZSAodXBkYXRlL2RlbGV0ZS9idWxrRGVsZXRlKSB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyDigJQgc28gaXQgTVVTVFxuICAgKiBiZSB0aGUgdGVuYW50IGBvcmdJZGAgY29sdW1uLCBub3QgYSBkaXNwbGF5L25hbWUgY29sdW1uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldE9yZ0NvbHVtbigpOiBBbnlDb2x1bW47XG5cbiAgLyoqIEdldCB0aGUgdW5pcXVlIGNvbnN0cmFpbnQgY29sdW1ucyBmb3Igb25Db25mbGljdERvVXBkYXRlICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgY29uZmxpY3RUYXJnZXQoKTogQW55Q29sdW1uW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdjcnVkLXNlcnZpY2UnKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBGYWlsIGZhc3QgaWYgYSBzdWJjbGFzcyBkb2Vzbid0IGV4cG9zZSBhIHRlbmFudCBvcmcgY29sdW1uLiBUaGUgd3JpdGVcbiAgICAvLyBwYXRocyAod3JpdGVDb25kaXRpb25zIC8gYnVsa0RlbGV0ZSkgcGluIG11dGF0aW9ucyB0byB0aGUgY2FsbGVyJ3Mgb3duXG4gICAgLy8gb3JnIHRocm91Z2ggaXQ7IGEgbWlzc2luZyBjb2x1bW4gd291bGQgc2lsZW50bHkgZHJvcCB0aGF0IGd1YXJkIOKAlCBhXG4gICAgLy8gY3Jvc3MtdGVuYW50IGZhaWwtb3BlbiDigJQgc28gYXNzZXJ0IGl0cyBwcmVzZW5jZSB1cCBmcm9udC5cbiAgICBpZiAodGhpcy5nZXRPcmdDb2x1bW4oKSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfTogZ2V0T3JnQ29sdW1uKCkgbXVzdCByZXR1cm4gdGhlIHRlbmFudCBvcmcgY29sdW1uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGNvbmRpdGlvbnMgZm9yIGEgc2luZ2xlIGVudGl0eSBieSBJRC5cbiAgICogIGBwYXJlbnRPcmdJZGAgd2lkZW5zIHZpc2liaWxpdHkgdG8gYSBwYXJlbnQgb3JnJ3MgcHVibGljIHJvd3MgKG9yZyDihpIgdGVhbVxuICAgKiAgaGllcmFyY2h5KSDigJQgc2FtZSBvcHQtaW4gc2VtYW50aWNzIGFzIGBmaW5kYC9gZmluZFBhZ2luYXRlZGAuIE9taXR0ZWQgYnkgdGhlXG4gICAqICB3cml0ZSBwYXRoIChgd3JpdGVDb25kaXRpb25zYCksIHdoaWNoIG11c3Qgc3RheSBvd24tb3JnIHNjb3BlZC4gKi9cbiAgcHJpdmF0ZSBpZENvbmRpdGlvbnMoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29uZGl0aW9ucyh7IGlkIH0gYXMgdW5rbm93biBhcyBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmRpdGlvbnMgZm9yIGEgTVVUQVRJT04gKHVwZGF0ZS9kZWxldGUpIG9mIGEgc2luZ2xlIGVudGl0eS5cbiAgICpcbiAgICogYGlkQ29uZGl0aW9uc2AgcmV1c2VzIHRoZSBSRUFEIGFjY2Vzcy1jb250cm9sIGNsYXVzZSwgd2hpY2ggYWxzbyBtYXRjaGVzXG4gICAqIHN5c3RlbS1vcmcgLyBvdGhlci1vcmcgUFVCTElDIHJlY29yZHMg4oCUIHNvIHdpdGhvdXQgYW4gZXh0cmEgb3duZXJzaGlwIHBpbiBhbnlcbiAgICogdGVuYW50IGNvdWxkIHVwZGF0ZSBvciBzb2Z0LWRlbGV0ZSBhbm90aGVyIG9yZydzIChvciB0aGUgc3lzdGVtIG9yZydzKSBwdWJsaWNcbiAgICogcmVjb3Jkcy4gQU5EIGEgc3RyaWN0IGBvcmdJZCA9PT0gY2FsbGVyYCBwcmVkaWNhdGU6IHRoZSByZWFkIGNsYXVzZSdzXG4gICAqIHB1YmxpYy1PUiBicmFuY2ggcmVxdWlyZXMgYG9yZ19pZCA9ICdzeXN0ZW0nYCwgd2hpY2ggdGhlbiBjYW4ndCBiZSBzYXRpc2ZpZWQsXG4gICAqIGxlYXZpbmcgb25seSBvd24tb3JnIHJvd3MuIG9yZ0lkLWxlc3MgKHN5c2FkbWluKSBjb250ZXh0IGtlZXBzIGZ1bGwgYWNjZXNzLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZUNvbmRpdGlvbnMoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuaWRDb25kaXRpb25zKGlkLCBvcmdJZCk7XG4gICAgLy8gUGluIHRoZSBtdXRhdGlvbiB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyB2aWEgdGhlIHRlbmFudCBjb2x1bW5cbiAgICAvLyAoZ2V0T3JnQ29sdW1uLCBhc3NlcnRlZCBub24tbnVsbCBpbiB0aGUgY29uc3RydWN0b3IpIOKAlCBjb25zaXN0ZW50IHdpdGhcbiAgICAvLyBzZXREZWZhdWx0IGFuZCB3aXRob3V0IHRoZSBvbGQgc2lsZW50IGZhaWwtb3BlbiB3aGVuIHRoZSBwcm9wZXJ0eSB3YXMgYWJzZW50LlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG4gICAgLy8gRm9yY2UgRVhBQ1QgaWQgZXF1YWxpdHkgb24gdGhlIG11dGF0aW9uIHBhdGguIGBpZENvbmRpdGlvbnNgIHJldXNlcyB0aGVcbiAgICAvLyBsaXN0LWZpbHRlciBjbGF1c2UsIHdob3NlIGBidWlsZElkRmlsdGVyYCBQUkVGSVgtbWF0Y2hlcyAoYGlkOjp0ZXh0IExJS0VcbiAgICAvLyAndmFsJSdgKSBhbnkgbm9uLWZ1bGwtVVVJRCB2YWx1ZSDigJQgc28gYSBwYXJ0aWFsIGlkIChgREVMRVRFIC94L2FiYCkgd291bGRcbiAgICAvLyBzb2Z0LWRlbGV0ZS9tdXRhdGUgRVZFUlkgb3duLW9yZyByb3cgd2hvc2UgaWQgc3RhcnRzIHdpdGggYGFiYCBhbmQgcmVwb3J0XG4gICAgLy8gdG91Y2hpbmcgb25lLiBBTkRpbmcgYW4gZXhhY3QgYGlkID0gdmFsYCBjb2xsYXBzZXMgdGhlIHByZWZpeCBjbGF1c2UgdG8gYXRcbiAgICAvLyBtb3N0IHRoZSBzaW5nbGUgZXhhY3Qgcm93OyBhIG1hbGZvcm1lZC9wYXJ0aWFsIGlkIHRoZW4gbWF0Y2hlcyBub3RoaW5nXG4gICAgLy8gKOKGkiA0MDQgdmlhIHRoZSBjYWxsZXJzJyBgaWYgKCFkZWxldGVkKWAgZ3VhcmQpIGluc3RlYWQgb2YgbWFzcy1tdXRhdGluZy5cbiAgICBjb25kaXRpb25zLnB1c2godGhpcy5leGFjdElkQ29uZGl0aW9uKGlkKSk7XG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cblxuICAvKiogRXhhY3QgaWQgZXF1YWxpdHksIGxvd2VyLWNhc2VkIHRvIG1hdGNoIGBidWlsZElkRmlsdGVyYCdzIGZ1bGwtVVVJRCBicmFuY2guXG4gICAqICBgc2NoZW1hYCBpcyB0eXBlZCBgUGdUYWJsZWAgKG5vIHN0YXRpYyBgLmlkYCksIHNvIGNhc3Qg4oCUIHNhbWUgcGF0dGVybiB0aGVcbiAgICogIHNvcnQvZGVmYXVsdCBoZWxwZXJzIHVzZSBmb3IgY29sdW1uIGFjY2Vzcy4gKi9cbiAgcHJpdmF0ZSBleGFjdElkQ29uZGl0aW9uKGlkOiBzdHJpbmcpOiBTUUwge1xuICAgIHJldHVybiBlcSh0aGlzLmNvbHMuaWQsIFN0cmluZyhpZCkudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvLyBMaWZlY3ljbGUgaG9va3Mg4oCUIG92ZXJyaWRlIGluIHN1YmNsYXNzZXMgdG8gcmVhY3QgdG8gbXV0YXRpb25zXG4gIC8vIFRoZXNlIGFyZSBmaXJlLWFuZC1mb3JnZXQ6IGVycm9ycyBhcmUgbG9nZ2VkIGJ1dCBuZXZlciBibG9jayB0aGUgY2FsbGVyLlxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJDcmVhdGUoX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYW4gZW50aXR5IGlzIHVwZGF0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJVcGRhdGUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogQ2FsbGVkIGFmdGVyIGFuIGVudGl0eSBpcyBzb2Z0LWRlbGV0ZWQgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJEZWxldGUoX2lkOiBzdHJpbmcsIF9lbnRpdHk6IFRFbnRpdHksIF91c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKipcbiAgICogT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2hlbiBhIHJlYWQgaXMgd2lkZW5lZCB0byBhIHBhcmVudCBvcmcgKGBwYXJlbnRPcmdJZGBcbiAgICogc2V0KSwgdGhlIHBhcmVudCdzIHJvd3MgYXJlIG91dHNpZGUgdGhlIGNhbGxlcidzIFJMUyBzY29wZSwgc28gdGhlIHJlYWQgbXVzdFxuICAgKiBydW4gdW5kZXIgc3lzYWRtaW4gY29udGV4dCDigJQgdGhlIGFjY2Vzcy1jb250cm9sIFdIRVJFIGNsYXVzZSAob3duICsgcGFyZW50ICtcbiAgICogc3lzdGVtIHB1YmxpYywgYnVpbHQgc2VydmVyLXNpZGUgZnJvbSBhIHRydXN0ZWQgSldUIGNsYWltKSBpcyB0aGVuIHRoZVxuICAgKiBhdXRob3JpdGF0aXZlIHRlbmFuY3kgZ2F0ZS4gV2l0aG91dCBgcGFyZW50T3JnSWRgIGl0IHN0YXlzIFJMUy1zY29wZWQuXG4gICAqXG4gICAqIElOVkFSSUFOVCAod2h5IHRoZSBzeXNhZG1pbiBieXBhc3MgaXMgc2FmZSk6IHRoZSBXSEVSRSBjbGF1c2UgaXMgYWx3YXlzXG4gICAqIHNlcnZlci1idWlsdCBieSBgYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKWAgZnJvbSB2YWx1ZXNcbiAgICogZGVyaXZlZCBmcm9tIHRoZSB2YWxpZGF0ZWQgSldUIChgb3JnSWRgID0gYWN0aXZlIG9yZywgYHBhcmVudE9yZ0lkYCA9IHRoZVxuICAgKiBhY3RpdmUgb3JnJ3MgcGFyZW50KS4gTm9uZSBvZiB0aGVtIGlzIGEgcmF3IHVzZXItc3VwcGxpZWQgcHJlZGljYXRlLCBzbyB0aGVcbiAgICogYnlwYXNzIG9ubHkgZXZlciB3aWRlbnMgdGhlIHJlYWQgdG8gdGhlIGNhbGxlcidzIG93biBzdWJ0cmVlICsgc3lzdGVtIHB1YmxpY1xuICAgKiByb3dzIOKAlCBpdCBjYW4gTk9UIGJlIHN0ZWVyZWQgYXQgYW4gYXJiaXRyYXJ5IG9yZy4gTk9URTogdGhpcyBkb2VzIHJlbW92ZSB0aGVcbiAgICogUkxTIGJhY2tzdG9wIGZvciB0aGUgd2lkZW5lZCByZWFkOyBhIHNpbmdsZS1HVUMgYGFwcC5vcmdfaWRgIGNhbid0IGV4cHJlc3NcbiAgICogdGhlIFwib3duIE9SIHBhcmVudCBPUiBzeXN0ZW1cIiBzZXQgdGhlIHBvbGljeSB3b3VsZCBuZWVkLCBzbyByZXBsYWNpbmcgdGhlXG4gICAqIGJ5cGFzcyB3b3VsZCByZXF1aXJlIGEgdGVuYW5jeS1sYXllciBjaGFuZ2UgKGUuZy4gYSBtdWx0aS1vcmcgUkxTIHBvbGljeSkuXG4gICAqIERlZmVycmVkIGRlbGliZXJhdGVseSDigJQgZG8gbm90IHN3YXAgdGhpcyBmb3IgYSBibGFua2V0IGJ5cGFzcyB3aXRob3V0XG4gICAqIHJlLWNoZWNraW5nIHRoZSBXSEVSRSBpcyBzdGlsbCBmdWxseSBzZXJ2ZXItYnVpbHQuXG4gICAqL1xuICBwcml2YXRlIHJ1blJlYWQ8VD4ocGFyZW50T3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gcGFyZW50T3JnSWQgPyBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBmbikgOiBmbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyIGNyaXRlcmlhXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKi9cbiAgYXN5bmMgZmluZChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIHJldHVybiB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZW50aXRpZXMgd2l0aCBwYWdpbmF0aW9uIGFuZCBzb3J0aW5nXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBhZ2luYXRpb24gYW5kIHNvcnRpbmcgb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgZmluZFBhZ2luYXRlZChcbiAgICBmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sXG4gICAgb3JnSWQ/OiBzdHJpbmcsXG4gICAgb3B0aW9uczogUXVlcnlPcHRpb25zID0ge30sXG4gICAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzdWx0PFRFbnRpdHk+PiB7XG4gICAgY29uc3QgeyBsaW1pdDogcmF3TGltaXQgPSBERUZBVUxUX1BBR0VfTElNSVQsIG9mZnNldCA9IDAsIHNvcnRCeSwgc29ydE9yZGVyID0gJ2FzYycsIGluY2x1ZGVUb3RhbCA9IGZhbHNlLCBjdXJzb3IsIGZpZWxkcyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKE1hdGgubWF4KDEsIHJhd0xpbWl0KSwgTUFYX1BBR0VfTElNSVQpO1xuXG4gICAgLy8gQ3Vyc29yIGFuZCBvZmZzZXQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSDigJQgY3Vyc29yIHRha2VzIHByZWNlZGVuY2VcbiAgICBjb25zdCB1c2VDdXJzb3IgPSAhIShjdXJzb3IgJiYgc29ydEJ5KTtcblxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICAvLyBDdXJzb3ItYmFzZWQgcGFnaW5hdGlvbjogYWRkIFdIRVJFIGNsYXVzZSBmb3Iga2V5c2V0IHBhZ2luYXRpb25cbiAgICBpZiAodXNlQ3Vyc29yKSB7XG4gICAgICBjb25zdCBzb3J0Q29sdW1uID0gdGhpcy5nZXRTb3J0Q29sdW1uKHNvcnRCeSk7XG4gICAgICBpZiAoc29ydENvbHVtbikge1xuICAgICAgICBjb25zdCBvcCA9IHNvcnRPcmRlciA9PT0gJ2Rlc2MnXG4gICAgICAgICAgPyBzcWxgJHtzb3J0Q29sdW1ufSA8ICR7Y3Vyc29yfWBcbiAgICAgICAgICA6IHNxbGAke3NvcnRDb2x1bW59ID4gJHtjdXJzb3J9YDtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKG9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXcmFwIHRoZSB3aG9sZSBwYWdpbmF0ZWQgcmVhZCAoU0VMRUNUICsgb3B0aW9uYWwgQ09VTlQpIGluIG9uZVxuICAgIC8vIHRlbmFudCB0eC4gQm90aCBxdWVyaWVzIGFyZSB2aXNpYmlsaXR5LXNjb3BlZCBieSB0aGUgc2FtZSBSTFMgcG9saWN5LFxuICAgIC8vIGFuZCBwaW5uaW5nIHRoZW0gdG8gYSBzaW5nbGUgdHgga2VlcHMgdGhlIGBhcHAub3JnX2lkYCBHVUMgc3RhYmxlXG4gICAgLy8gYmV0d2VlbiB0aGVtLiBXaGVuIHdpZGVuaW5nIHRvIGEgcGFyZW50IG9yZywgdGhlIHdob2xlIHJlYWQgcnVucyB1bmRlclxuICAgIC8vIHN5c2FkbWluIGNvbnRleHQgKHNlZSBydW5SZWFkKSBzbyB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgaXMgdGhlIGdhdGUuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gQnVpbGQgU0VMRUNUIOKAlCBzcGFyc2UgZmllbGRzZXQgd2hlbiBmaWVsZHMgYXJlIHNwZWNpZmllZC4gVGhlIHNvcnRCeVxuICAgICAgLy8gY29sdW1uIE1VU1QgYmUgcGFydCBvZiB0aGUgcHJvamVjdGlvbiB3aGVuZXZlciBzb3J0aW5nIGlzIGFjdGl2ZTogdGhlXG4gICAgICAvLyBuZXh0IGN1cnNvciBpcyBkZXJpdmVkIGZyb20gYGxhc3RJdGVtW3NvcnRCeV1gIGJlbG93LCBzbyBhIGZpZWxkcyBzZXRcbiAgICAgIC8vIHRoYXQgb21pdHMgc29ydEJ5IHdvdWxkIGxlYXZlIHRoZSBjdXJzb3IgdW5kZWZpbmVkIGFuZCBzdGFsbCB0aGUgY2xpZW50XG4gICAgICAvLyBvbiBwYWdlIDEuIGJ1aWxkRmllbGRTZWxlY3QgYWx3YXlzIGFkZHMgaXQgYmFjayAobGlrZSBgaWRgKS5cbiAgICAgIGNvbnN0IHNlbGVjdFNwZWMgPSBmaWVsZHMgPyB0aGlzLmJ1aWxkRmllbGRTZWxlY3QoZmllbGRzLCBzb3J0QnkpIDogdW5kZWZpbmVkO1xuICAgICAgbGV0IHF1ZXJ5ID0gc2VsZWN0U3BlY1xuICAgICAgICA/IHR4LnNlbGVjdChzZWxlY3RTcGVjIGFzIGFueSkuZnJvbSh0aGlzLnNjaGVtYSkud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgICA6IHR4LnNlbGVjdCgpLmZyb20odGhpcy5zY2hlbWEpLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSk7XG5cbiAgICAgIGlmIChzb3J0QnkpIHtcbiAgICAgICAgY29uc3Qgc29ydENvbHVtbiA9IHRoaXMuZ2V0U29ydENvbHVtbihzb3J0QnkpO1xuICAgICAgICBpZiAoc29ydENvbHVtbikge1xuICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShzb3J0T3JkZXIgPT09ICdkZXNjJyA/IGRlc2Moc29ydENvbHVtbikgOiBhc2Moc29ydENvbHVtbikpIGFzIGFueTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGZXRjaCBsaW1pdCsxIHRvIGRldGVjdCBoYXNNb3JlIHdpdGhvdXQgQ09VTlQoKilcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU9mZnNldCA9IHVzZUN1cnNvciA/IDAgOiBvZmZzZXQ7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnlcbiAgICAgICAgLmxpbWl0KGxpbWl0ICsgMSlcbiAgICAgICAgLm9mZnNldChlZmZlY3RpdmVPZmZzZXQpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSk7XG5cbiAgICAgIGNvbnN0IGhhc01vcmUgPSByb3dzLmxlbmd0aCA+IGxpbWl0O1xuICAgICAgY29uc3QgZGF0YSA9IGhhc01vcmUgPyByb3dzLnNsaWNlKDAsIGxpbWl0KSA6IHJvd3M7XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogUGFnaW5hdGVkUmVzdWx0PFRFbnRpdHk+ID0geyBkYXRhLCBsaW1pdCwgb2Zmc2V0OiBlZmZlY3RpdmVPZmZzZXQsIGhhc01vcmUgfTtcblxuICAgICAgLy8gUHJvdmlkZSBuZXh0IGN1cnNvciBmcm9tIGxhc3QgaXRlbSdzIHNvcnQgY29sdW1uIHZhbHVlXG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiAwICYmIHNvcnRCeSkge1xuICAgICAgICBjb25zdCBsYXN0SXRlbSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgY29uc3QgY3Vyc29yVmFsdWUgPSBsYXN0SXRlbVtzb3J0QnldO1xuICAgICAgICBpZiAoY3Vyc29yVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdC5uZXh0Q3Vyc29yID0gY3Vyc29yVmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gY3Vyc29yVmFsdWUudG9JU09TdHJpbmcoKSA6IFN0cmluZyhjdXJzb3JWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT25seSBydW4gdGhlIENPVU5UKCopIHF1ZXJ5IHdoZW4gdGhlIGNhbGxlciBleHBsaWNpdGx5IG5lZWRzIHRoZSB0b3RhbC5cbiAgICAgIC8vIE11c3QgaW5jbHVkZSBwYXJlbnRPcmdJZCBzbyBgdG90YWxgIG1hdGNoZXMgdGhlIHdpZGVuZWQgZGF0YSBzZXQuXG4gICAgICBpZiAoaW5jbHVkZVRvdGFsKSB7XG4gICAgICAgIGNvbnN0IGJhc2VDb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuICAgICAgICBjb25zdCBbY291bnRSZXN1bHRdID0gYXdhaXQgdHhcbiAgICAgICAgICAuc2VsZWN0KHsgY291bnQ6IHNxbDxudW1iZXI+YGNvdW50KCopOjppbnRgIH0pXG4gICAgICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAgICAgLndoZXJlKGFuZCguLi5iYXNlQ29uZGl0aW9ucykpLnRoZW4ociA9PiBkcml6emxlQ291bnQocikpO1xuICAgICAgICByZXN1bHQudG90YWwgPSBjb3VudFJlc3VsdD8uY291bnQgfHwgMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBjb2x1bW4gc2VsZWN0aW9uIG1hcCBmb3Igc3BhcnNlIGZpZWxkc2V0cy5cbiAgICogRmFsbHMgYmFjayB0byBmdWxsIHNlbGVjdCBpZiBubyBtYXRjaGluZyBjb2x1bW5zIGZvdW5kLlxuICAgKlxuICAgKiBgc29ydEJ5YCAod2hlbiBzZXQpIGlzIGFsd2F5cyBmb2xkZWQgaW50byB0aGUgcHJvamVjdGlvbiBldmVuIGlmIHRoZSBjYWxsZXInc1xuICAgKiBgZmllbGRzYCBvbWl0cyBpdCDigJQgY3Vyc29yIHBhZ2luYXRpb24gcmVhZHMgdGhlIG5leHQgY3Vyc29yIGZyb20gdGhlIHNvcnRcbiAgICogY29sdW1uJ3MgdmFsdWUgb24gdGhlIGxhc3Qgcm93LCBzbyBkcm9wcGluZyBpdCBmcm9tIHRoZSBTRUxFQ1Qgd291bGQgeWllbGQgYW5cbiAgICogdW5kZWZpbmVkIGN1cnNvciBhbmQgc3RhbGwgcGFnaW5nLiBJbmNsdWRlZCB0aGUgc2FtZSB3YXkgYGlkYCBhbHdheXMgaXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRmllbGRTZWxlY3QoZmllbGRzOiBzdHJpbmdbXSwgc29ydEJ5Pzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29sdW1uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAvLyBBbHdheXMgaW5jbHVkZSBpZCBmb3IgZW50aXR5IGlkZW50aXR5XG4gICAgY29sdW1ucy5pZCA9IHRoaXMuY29scy5pZDtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQgPT09ICdpZCcpIGNvbnRpbnVlOyAvLyBBbHJlYWR5IGluY2x1ZGVkXG4gICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHNbZmllbGRdO1xuICAgICAgaWYgKGNvbCkgY29sdW1uc1tmaWVsZF0gPSBjb2w7XG4gICAgfVxuXG4gICAgLy8gR3VhcmFudGVlIHRoZSBzb3J0IGNvbHVtbiBpcyBzZWxlY3RhYmxlIHNvIHRoZSBuZXh0IGN1cnNvciBjYW4gYmUgcmVhZFxuICAgIC8vIGZyb20gdGhlIGxhc3Qgcm93IChzZWUgZmluZFBhZ2luYXRlZCkuIE5vLW9wIGlmIGFscmVhZHkgYWRkZWQgb3IgdW5rbm93bi5cbiAgICBpZiAoc29ydEJ5ICYmIHNvcnRCeSAhPT0gJ2lkJyAmJiAhKHNvcnRCeSBpbiBjb2x1bW5zKSkge1xuICAgICAgY29uc3Qgc29ydENvbCA9IHRoaXMuY29sc1tzb3J0QnldO1xuICAgICAgaWYgKHNvcnRDb2wpIGNvbHVtbnNbc29ydEJ5XSA9IHNvcnRDb2w7XG4gICAgfVxuXG4gICAgLy8gQXQgbWluaW11bSB3ZSdsbCBoYXZlIHsgaWQgfSwgd2hpY2ggaXMgdmFsaWRcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqIEBwYXJhbSBwYXJlbnRPcmdJZCAtIE9yZyDihpIgdGVhbSBoaWVyYXJjaHk6IHdpZGVuIHRoZSBjb3VudCB0byB0aGUgcGFyZW50IG9yZydzXG4gICAqICAgcHVibGljIHJvd3MuIE1VU1QgbWlycm9yIGBmaW5kYC9gZmluZFBhZ2luYXRlZGAncyB3aWRlbmluZyAoc2FtZVxuICAgKiAgIGBidWlsZENvbmRpdGlvbnNgIGFyZ3MgKyBzeXNhZG1pbi1zY29wZWQgcmVhZCB2aWEgYHJ1blJlYWRgKSBzbyBhIHBhZ2VkXG4gICAqICAgbGlzdCdzIGB0b3RhbGAgbWF0Y2hlcyB0aGUgcm93cyBhIHdpZGVuZWQgYGZpbmQoKWAgcmV0dXJucyDigJQgb3RoZXJ3aXNlIHRoZVxuICAgKiAgIGNvdW50IG9taXRzIHRoZSBwYXJlbnQncyByb3dzIGFuZCByZXBvcnRzIGEgbmFycm93ZXIgdG90YWwgdGhhbiB0aGUgZGF0YSBzZXQuXG4gICAqL1xuICBhc3luYyBjb3VudChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCh7IGNvdW50OiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZUNvdW50KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdD8uY291bnQgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgc2luZ2xlIGVudGl0eSBieSBJRFxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBFbnRpdHkgSURcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB2aXNpYmlsaXR5IHRvIHRoZSBwYXJlbnRcbiAgICogICBvcmcncyBwdWJsaWMgcm93cyAoc28gYSB0ZWFtIGNhbiBmZXRjaCBhIHBhcmVudCdzIHB1YmxpYyBlbnRpdHkgYnkgaWQpLlxuICAgKiAgIFNhbWUgb3B0LWluICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYDsgdGhlXG4gICAqICAgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIGlzIHRoZSBhdXRob3JpdGF0aXZlIHRlbmFuY3kgZ2F0ZS5cbiAgICovXG4gIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcsIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gICAgLy8gRXhhY3QgaWQg4oCUIGBmaW5kQnlJZGAgbWVhbnMgVEhFIHJvdyB3aXRoIHRoaXMgaWQsIG5vdCBhIHByZWZpeCBtYXRjaC4gVGhlXG4gICAgLy8gc2hhcmVkIGBidWlsZElkRmlsdGVyYCBwcmVmaXgtbWF0Y2hlcyBub24tZnVsbC1VVUlEIHZhbHVlcyAoYSBsaXN0LXNlYXJjaFxuICAgIC8vIGZlYXR1cmUpLCB3aGljaCBoZXJlIHdvdWxkIHJldHVybiBhbiBhcmJpdHJhcnkgZmlyc3QgcHJlZml4IGhpdCBmb3IgYVxuICAgIC8vIHBhcnRpYWwgaWQ7IHBpbiBpdCB0byBleGFjdCBzbyBhIG1hbGZvcm1lZCBpZCByZXR1cm5zIG51bGwuXG4gICAgY29uZGl0aW9ucy5wdXNoKHRoaXMuZXhhY3RJZENvbmRpdGlvbihpZCkpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gIH1cblxuICAvLyBNdXRhdGlvbiBvcGVyYXRpb25zXG5cbiAgLyoqXG4gICAqIERlZmVuc2UtaW4tZGVwdGggdGVuYW50IHN0YW1wLiBSTFMgaXMgaW4gb3duZXItYnlwYXNzIG1vZGUsIHNvIHRoZSBhcHAgbGF5ZXJcbiAgICogaXMgdGhlIG9ubHkgdGVuYW50IGdhdGUgb24gd3JpdGVzLiBBIE5PTi1zeXNhZG1pbiBjYWxsZXIgbWF5IG9ubHkgd3JpdGUgaW50b1xuICAgKiBpdHMgT1dOIG9yZywgc28gcGluIHRoZSByb3cgdG8gdGhlIHRydXN0ZWQgdGVuYW50LWNvbnRleHQgb3JnLlxuICAgKlxuICAgKiBUaGUgc3RhbXAgZmlyZXMgd2hlbmV2ZXIgdGhlIHBheWxvYWQncyBgb3JnSWRgIGRpZmZlcnMgZnJvbSB0aGUgY29udGV4dCBvcmcg4oCUXG4gICAqIHdoaWNoIGNvdmVycyBCT1RIIGEgZm9yZ2VkL21pc21hdGNoZWQgYGRhdGEub3JnSWRgIEFORCBhbiBBQlNFTlQgb25lLiBUaGVcbiAgICogYWJzZW50IGNhc2UgaXMgdGhlIGltcG9ydGFudCB0ZW5hbnQtYm91bmRhcnkgZml4OiB0aGUgYG9yZ19pZGAgY29sdW1uIERFRkFVTFRzXG4gICAqIHRvIGBTWVNURU1fT1JHX0lEYCAoc2NoZW1hL3BpcGVsaW5lLnRzLCBzY2hlbWEvcGx1Z2luLnRzKSwgc28gYW4gaW5zZXJ0IHRoYXRcbiAgICogb21pdHMgYG9yZ0lkYCB3b3VsZCBvdGhlcndpc2UgbGFuZCB0aGUgdGVuYW50J3Mgcm93IGluIHRoZSBwdWJsaWMgc3lzdGVtXG4gICAqIGNhdGFsb2cg4oCUIGEgY3Jvc3MtdGVuYW50IGZhaWwtb3Blbi4gQWx3YXlzIGluamVjdGluZyBgY3R4Lm9yZ0lkYCBjbG9zZXMgaXQuXG4gICAqXG4gICAqIFN5c2FkbWluIChhbmQgb3V0LW9mLWNvbnRleHQgd29ya2VyL3N5c3RlbSBwYXRocywgd2hlcmUgYGdldFRlbmFudENvbnRleHQoKWBcbiAgICogaXMgdW5kZWZpbmVkKSBrZWVwIHRoZSBzdXBwbGllZCBvcmcsIG1hdGNoaW5nIHRoZSBSTFMgcG9saWN5XG4gICAqIGBjdXJyZW50X2lzX3N5c2FkbWluKCkgT1Igb3JnX2lkID0gY3VycmVudF9vcmdfaWQoKWAuXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5mb3JjZU9yZ0lkKGRhdGE6IFRJbnNlcnQpOiBUSW5zZXJ0IHtcbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgY29uc3QgZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQgJiYgZC5vcmdJZCAhPT0gY3R4Lm9yZ0lkKSB7XG4gICAgICAvLyBEaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIHRoYXQgcmVhY2ggaGVyZSBzbyB0aGUgbG9nIHN0YXlzIHVzZWZ1bCBhbmRcbiAgICAgIC8vIHF1aWV0OiBhIFBSRVNFTlQtYnV0LW1pc21hdGNoZWQgYG9yZ0lkYCBpcyBhbiBhY3R1YWwgb3ZlcnJpZGUgYXR0ZW1wdFxuICAgICAgLy8gKHdhcm4pLCB3aGlsZSBhbiBBQlNFTlQgYG9yZ0lkYCBpcyB0aGUgY29tbW9uIG5vcm1hbC13cml0ZSBwYXRoIHRoYXQganVzdFxuICAgICAgLy8gbmVlZHMgdGhlIGRlZmF1bHQgc3RhbXAgKGRlYnVnKSDigJQgbG9nZ2luZyB0aGF0IGF0IHdhcm4gZmxvb2RzIHRoZSBsb2cgb25cbiAgICAgIC8vIGV2ZXJ5IHdyaXRlIHRoYXQgb21pdHMgb3JnSWQuXG4gICAgICBjb25zdCBtZXRhID0geyBzdXBwbGllZDogJ29yZ0lkJyBpbiBkID8gZC5vcmdJZCA6IHVuZGVmaW5lZCwgZW5mb3JjZWQ6IGN0eC5vcmdJZCB9O1xuICAgICAgaWYgKCdvcmdJZCcgaW4gZCkge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignQ3J1ZFNlcnZpY2U6IG92ZXJyaWRpbmcgbWlzbWF0Y2hlZCBvcmcgb24gd3JpdGUnLCBtZXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnQ3J1ZFNlcnZpY2U6IHN0YW1waW5nIHRlbmFudC1jb250ZXh0IG9yZyBvbiB3cml0ZScsIG1ldGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uZCwgb3JnSWQ6IGN0eC5vcmdJZCB9IGFzIFRJbnNlcnQ7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShkYXRhOiBUSW5zZXJ0LCB1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG4gICAgY29uc3QgW2NyZWF0ZWRdID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5pbnNlcnQodGhpcy5zY2hlbWEpXG4gICAgICAudmFsdWVzKHtcbiAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgIGNyZWF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogdGhpcy5jb25mbGljdFRhcmdldCBhcyBhbnksXG4gICAgICAgIHNldDoge1xuICAgICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgLy8gQXdhaXRlZCBpbnRlbnRpb25hbGx5OiBjYWNoZSBpbnZhbGlkYXRpb24gaGFwcGVucyBpbiB0aGUgaG9vaywgYW5kIGFcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgcGF0dGVybiBsZXRzIGEgc3Vic2VxdWVudCByZWFkIGluc2lkZSB0aGUgc2FtZSByZXF1ZXN0XG4gICAgLy8gcmV0dXJuIHRoZSBzdGFsZSBwcmUtd3JpdGUgZW50cnkuIFRoZSBob29rIGlzIGV4cGVjdGVkIHRvIGJlIGZhc3RcbiAgICAvLyAoc2luZ2xlIFJlZGlzIG9wKTsgc2xvdyBob29rcyBzaG91bGQgcnVuIHRoZWlyIG93biBiYWNrZ3JvdW5kIHdvcmsuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub25BZnRlckNyZWF0ZShjcmVhdGVkLCB1c2VySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgYG9yZ0lkYCBpbiB0aGUgdXBkYXRlIHBheWxvYWQgKGFzIGNyZWF0ZSBkb2VzKTogdGhlXG4gICAgLy8gV0hFUkUgb25seSBwaW5zIHdoaWNoIHJvd3MgeW91IGNhbiBUQVJHRVQsIG5vdCB3aGF0IHlvdSBjYW4gc2V0IOKAlCB3aXRob3V0IHRoaXNcbiAgICAvLyBhIHRlbmFudCBjb3VsZCByZS1ob21lIGEgcm93IGl0IG93bnMgaW50byBhbm90aGVyIG9yZyB2aWEgYGRhdGEub3JnSWRgLlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSBhcyB1bmtub3duIGFzIFRJbnNlcnQpIGFzIHVua25vd24gYXMgUGFydGlhbDxUVXBkYXRlPjtcblxuICAgIGNvbnN0IFt1cGRhdGVkXSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclVwZGF0ZShpZCwgdXBkYXRlZCwgdXNlcklkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWQgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IChzb2Z0IGRlbGV0ZSBieSBzZXR0aW5nIGlzQWN0aXZlID0gZmFsc2UpXG4gICAqL1xuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMud3JpdGVDb25kaXRpb25zKGlkLCBvcmdJZCk7XG5cbiAgICBjb25zdCBbZGVsZXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIGRlbGV0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgZGVsZXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyRGVsZXRlKGlkLCBkZWxldGVkLCB1c2VySWQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBlbnRpdHkgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvamVjdC9vcmdhbml6YXRpb24gc2NvcGUuXG4gICAqIE1hcmtzIGFsbCBvdGhlciBlbnRpdGllcyBhcyBub24tZGVmYXVsdCwgdGhlbiBzZXRzIHRoZSBzcGVjaWZpZWQgZW50aXR5LlxuICAgKiBVc2VzIGEgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIGF0b21pY2l0eS5cbiAgICovXG4gIGFzeW5jIHNldERlZmF1bHQoXG4gICAgcHJvamVjdDogc3RyaW5nLFxuICAgIG9yZzogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIC8vIEEgbm9uLXN5c2FkbWluIG1heSBvbmx5IGZsaXAgZGVmYXVsdHMgd2l0aGluIGl0cyBPV04gb3JnIOKAlCBwaW4gdGhlIHNjb3BlIHRvXG4gICAgLy8gdGhlIHRydXN0ZWQgdGVuYW50IGNvbnRleHQgc28gYSBmb3J3YXJkZWQgYG9yZ2AgYXJnIGNhbid0IHRvdWNoIGFub3RoZXJcbiAgICAvLyB0ZW5hbnQncyBkZWZhdWx0cyAoUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlOyB0aGlzIGlzIHRoZSBnYXRlKS5cbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQpIG9yZyA9IGN0eC5vcmdJZDtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3Qgb3JnQ29sdW1uID0gdGhpcy5nZXRPcmdDb2x1bW4oKTtcbiAgICAgIGNvbnN0IHByb2plY3RDb2x1bW4gPSB0aGlzLmdldFByb2plY3RDb2x1bW4oKTtcblxuICAgICAgLy8gQnVpbGQgc2NvcGluZyBjb25kaXRpb25zIGZvciBjbGVhcmluZyBkZWZhdWx0c1xuICAgICAgY29uc3Qgc2NvcGVDb25kaXRpb25zID0gW1xuICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgIGVxKHRoaXMuY29scy5pc0RlZmF1bHQsIHRydWUpLFxuICAgICAgXTtcbiAgICAgIGlmIChwcm9qZWN0Q29sdW1uKSB7XG4gICAgICAgIHNjb3BlQ29uZGl0aW9ucy5wdXNoKGVxKHByb2plY3RDb2x1bW4sIHByb2plY3QpKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9jayBleGlzdGluZyBkZWZhdWx0cyB3aXRoIEZPUiBVUERBVEUgdG8gcHJldmVudCBjb25jdXJyZW50IHNldERlZmF1bHQgcmFjZXNcbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoXG4gICAgICAgIHNxbGBTRUxFQ1QgaWQgRlJPTSAke3RoaXMuc2NoZW1hfVxuICAgICAgICAgICAgV0hFUkUgJHtvcmdDb2x1bW59ID0gJHtvcmd9XG4gICAgICAgICAgICAgIEFORCAke3RoaXMuY29scy5pc0RlZmF1bHR9ID0gdHJ1ZVxuICAgICAgICAgICAgJHtwcm9qZWN0Q29sdW1uID8gc3FsYEFORCAke3Byb2plY3RDb2x1bW59ID0gJHtwcm9qZWN0fWAgOiBzcWxgYH1cbiAgICAgICAgICAgIEZPUiBVUERBVEVgLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhbGwgZW50aXRpZXMgaW4gc2NvcGUgYXMgbm9uLWRlZmF1bHRcbiAgICAgIGF3YWl0IHR4XG4gICAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLndoZXJlKGFuZCguLi5zY29wZUNvbmRpdGlvbnMpKTtcblxuICAgICAgLy8gU2V0IHRoZSBzcGVjaWZpZWQgZW50aXR5IGFzIGRlZmF1bHQuIEd1YXJkIGFnYWluc3QgcHJvbW90aW5nIGFcbiAgICAgIC8vIHNvZnQtZGVsZXRlZCByb3cgKGlzQWN0aXZlID0gdHJ1ZSkg4oCUIGEgZGVsZXRlZCBlbnRpdHkgbXVzdCBuZXZlciBiZWNvbWVcbiAgICAgIC8vIHRoZSBhY3RpdmUgZGVmYXVsdCDigJQgYW5kIHBpbiB0aGUgaWQgd2l0aCB0aGUgc2FtZSBsb3dlcmNhc2VkXG4gICAgICAvLyBleGFjdElkQ29uZGl0aW9uIHRoZSBtdXRhdGlvbiBwYXRocyB1c2UgKHRoZSByYXcgYGVxKGNvbHMuaWQsIGlkKWAgaGVyZVxuICAgICAgLy8gc2tpcHBlZCB0aGUgbG93ZXItY2FzaW5nIHRoYXQgYGJ1aWxkSWRGaWx0ZXJgL2B3cml0ZUNvbmRpdGlvbnNgIGFwcGx5LFxuICAgICAgLy8gc28gYSBtaXhlZC1jYXNlIGlkIGNvdWxkIG1pc3MgaXRzIHJvdykuIEEgbm9uLW1hdGNoIOKGkiBOb3RGb3VuZEVycm9yIGJlbG93LlxuICAgICAgY29uc3QgW3VwZGF0ZWRdID0gYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgaXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC53aGVyZShcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICB0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpLFxuICAgICAgICAgICAgZXEob3JnQ29sdW1uLCBvcmcpLFxuICAgICAgICAgICAgZXEodGhpcy5jb2xzLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBpZiAoIXVwZGF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYEVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsdGlwbGUgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyXG4gICAqL1xuICBhc3luYyB1cGRhdGVNYW55KFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBkYXRhOiBQYXJ0aWFsPFRVcGRhdGU+LFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuICAgIC8vIE93bi1vcmcgd3JpdGUtcGluOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlci1vcmcgUFVCTElDXG4gICAgLy8gcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY291bGQgbXV0YXRlXG4gICAgLy8gc2hhcmVkIChvciBhbm90aGVyIHRlbmFudCdzIHB1YmxpYykgcmVjb3Jkcy4gTWlycm9yIHVwZGF0ZS9kZWxldGUvXG4gICAgLy8gYnVsa0RlbGV0ZS4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKSBBbiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwc1xuICAgIC8vIGZ1bGwgYWNjZXNzLlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBvcmdJZCAoc2VlIHVwZGF0ZSgpKSBzbyBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY2FuJ3RcbiAgICAvLyByZS1ob21lIHJvd3MgaW50byBhbm90aGVyIHRlbmFudC5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEgYXMgdW5rbm93biBhcyBUSW5zZXJ0KSBhcyB1bmtub3duIGFzIFBhcnRpYWw8VFVwZGF0ZT47XG5cbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG11bHRpcGxlIGVudGl0aWVzIGluIGEgc2luZ2xlIGJhdGNoIGluc2VydC5cbiAgICogVXNlcyB1cHNlcnQgKG9uQ29uZmxpY3REb1VwZGF0ZSkg4oCUIGFsbCByb3dzIGFyZSBpbnNlcnRlZCBpbiBvbmUgcXVlcnkgcGVyIGNodW5rLlxuICAgKiBDaHVua3Mgb2YgMTAwIHRvIHN0YXkgd2l0aGluIFBvc3RncmVTUUwgcGFyYW1ldGVyIGxpbWl0cy5cbiAgICovXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgYG9uQ29uZmxpY3REb1VwZGF0ZWAgU0VUIGZvciBhIGJ1bGsgdXBzZXJ0LiBVbmxpa2UgYSBzaW5nbGUtcm93XG4gICAqIGNyZWF0ZSAod2hpY2ggY2FuIHNwcmVhZCB0aGUgb25lIHJvdydzIGRhdGEpLCBhIGJhdGNoZWQgaW5zZXJ0IGhhcyBtYW55IHJvd3MsXG4gICAqIHNvIGVhY2ggdXBkYXRhYmxlIGNvbHVtbiBpcyB3cml0dGVuIGZyb20gYGV4Y2x1ZGVkLipgICh0aGUgd291bGQtYmUtaW5zZXJ0ZWRcbiAgICogdmFsdWUpIOKAlCBvdGhlcndpc2UgYW4gZXhpc3Rpbmcgcm93J3MgZmllbGRzIGFyZSBzaWxlbnRseSBkaXNjYXJkZWQgYW5kIG9ubHlcbiAgICogdGltZXN0YW1wcyBidW1wLiBTa2lwcyBpZGVudGl0eS9pbW11dGFibGUgKGBpZGAsIGBjcmVhdGVkQXRgLCBgY3JlYXRlZEJ5YClcbiAgICogYW5kIHRoZSBjb25mbGljdC10YXJnZXQgY29sdW1uczsgYHVwZGF0ZWRBdGAvYHVwZGF0ZWRCeWAgZ2V0IHRoZSBmcmVzaCB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQnVsa1Vwc2VydFNldChub3c6IERhdGUsIHVzZXI6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBjb25mbGljdE5hbWVzID0gbmV3IFNldCh0aGlzLmNvbmZsaWN0VGFyZ2V0Lm1hcCgoYykgPT4gKGMgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lKSk7XG4gICAgY29uc3Qgc2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgY29sXSBvZiBPYmplY3QuZW50cmllcyhnZXRUYWJsZUNvbHVtbnModGhpcy5zY2hlbWEpKSkge1xuICAgICAgY29uc3QgbmFtZSA9IChjb2wgYXMgdW5rbm93biBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lO1xuICAgICAgaWYgKGtleSA9PT0gJ2lkJyB8fCBrZXkgPT09ICdjcmVhdGVkQXQnIHx8IGtleSA9PT0gJ2NyZWF0ZWRCeScgfHwgY29uZmxpY3ROYW1lcy5oYXMobmFtZSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGtleSA9PT0gJ3VwZGF0ZWRBdCcpIHsgc2V0W2tleV0gPSBub3c7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoa2V5ID09PSAndXBkYXRlZEJ5JykgeyBzZXRba2V5XSA9IHVzZXI7IGNvbnRpbnVlOyB9XG4gICAgICBzZXRba2V5XSA9IHNxbGBleGNsdWRlZC4ke3NxbC5pZGVudGlmaWVyKG5hbWUpfWA7XG4gICAgfVxuICAgIHJldHVybiBzZXQ7XG4gIH1cblxuICBhc3luYyBidWxrQ3JlYXRlKGl0ZW1zOiBUSW5zZXJ0W10sIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBDSFVOS19TSVpFID0gMTAwO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCB8fCAnc3lzdGVtJztcbiAgICBjb25zdCBjb25mbGljdFNldCA9IHRoaXMuYnVpbGRCdWxrVXBzZXJ0U2V0KG5vdywgdXNlcik7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgYWxsQ3JlYXRlZDogVEVudGl0eVtdID0gW107XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IENIVU5LX1NJWkUpIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBpdGVtcy5zbGljZShpLCBpICsgQ0hVTktfU0laRSk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGNodW5rLm1hcChkYXRhID0+ICh7XG4gICAgICAgICAgLi4udGhpcy5lbmZvcmNlT3JnSWQoZGF0YSksXG4gICAgICAgICAgY3JlYXRlZEJ5OiB1c2VyLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcixcbiAgICAgICAgfSBhcyBhbnkpKTtcblxuICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdHhcbiAgICAgICAgICAuaW5zZXJ0KHRoaXMuc2NoZW1hKVxuICAgICAgICAgIC52YWx1ZXModmFsdWVzKVxuICAgICAgICAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLmNvbmZsaWN0VGFyZ2V0IGFzIGFueSxcbiAgICAgICAgICAgIHNldDogY29uZmxpY3RTZXQgYXMgYW55LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSk7XG5cbiAgICAgICAgYWxsQ3JlYXRlZC5wdXNoKC4uLmNyZWF0ZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsQ3JlYXRlZDtcbiAgICB9KTtcblxuICAgIC8vIFJ1biBob29rcyBpbiBwYXJhbGxlbCBidXQgYXdhaXQgYWxsIGJlZm9yZSByZXR1cm5pbmcgc28gYSBzdWJzZXF1ZW50XG4gICAgLy8gcmVhZCBpbiB0aGUgc2FtZSByZXF1ZXN0IHNlZXMgYSBjb2hlcmVudCBwb3N0LXdyaXRlIHZpZXcuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByZXN1bHRzLm1hcChlbnRpdHkgPT5cbiAgICAgICAgdGhpcy5vbkFmdGVyQ3JlYXRlKGVudGl0eSwgdXNlcklkKS5jYXRjaChlcnIgPT5cbiAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignTGlmZWN5Y2xlIGhvb2sgZmFpbGVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb2Z0LWRlbGV0ZSBtdWx0aXBsZSBlbnRpdGllcyBieSBJRHMgaW4gYSBzaW5nbGUgYmF0Y2ggb3BlcmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgYnVsa0RlbGV0ZShcbiAgICBpZHM6IHN0cmluZ1tdLFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgLyoqIFdoZW4gdHJ1ZSwgb25seSBQUklWQVRFIHJlY29yZHMgYXJlIGRlbGV0ZWQg4oCUIG1pcnJvcnMgdGhlIHNpbmdsZS1kZWxldGVcbiAgICAgKiAgYHJlcXVpcmVQdWJsaWNBY2Nlc3NgIGdhdGUgc28gYSBub24tc3lzYWRtaW4gY2FuJ3QgYnVsay1kZWxldGUgcHVibGljXG4gICAgICogIChzaGFyZWQvc3lzYWRtaW4tbWFuYWdlZCkgcmVjb3Jkcy4gTm8tb3AgZm9yIGVudGl0aWVzIHdpdGhvdXQgYW5cbiAgICAgKiAgYGFjY2Vzc01vZGlmaWVyYCBjb2x1bW4uIENhbGxlcnMgcGFzcyBgIWlzU3lzdGVtQWRtaW4ocmVxKWAuICovXG4gICAgcmVzdHJpY3RUb1ByaXZhdGUgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB1c2VyID0gdXNlcklkIHx8ICdzeXN0ZW0nO1xuICAgIC8vIE93bmVyLXNjb3BlIHRoZSBidWxrIHNvZnQtZGVsZXRlOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlclxuICAgIC8vIC1vcmcgUFVCTElDIHJvd3MsIHNvIHdpdGhvdXQgdGhlIHN0cmljdCBvcmdJZCBwaW4gYSB0ZW5hbnQgY291bGQgZGVsZXRlXG4gICAgLy8gc2hhcmVkIHJlY29yZHMgYnkgaWQuIChTZWUgd3JpdGVDb25kaXRpb25zLilcbiAgICBjb25zdCBhY2Nlc3NDb2wgPSB0aGlzLmNvbHMuYWNjZXNzTW9kaWZpZXI7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgIGluQXJyYXkodGhpcy5jb2xzLmlkLCBpZHMpLFxuICAgICAgLi4udGhpcy5idWlsZENvbmRpdGlvbnMoe30gYXMgUGFydGlhbDxURmlsdGVyPiwgb3JnSWQpLFxuICAgICAgLy8gVGVuYW50IGNvbHVtbiAoZ2V0T3JnQ29sdW1uLCBhc3NlcnRlZCBub24tbnVsbCkg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgICAgLy8gd3JpdGVDb25kaXRpb25zOyBubyBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IGlzIGFic2VudC5cbiAgICAgIC4uLihvcmdJZCA/IFtlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCldIDogW10pLFxuICAgICAgLi4uKHJlc3RyaWN0VG9Qcml2YXRlICYmIGFjY2Vzc0NvbCA/IFtlcShhY2Nlc3NDb2wsICdwcml2YXRlJyldIDogW10pLFxuICAgIF07XG5cbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgICBkZWxldGVkQXQ6IG5vdyxcbiAgICAgICAgZGVsZXRlZEJ5OiB1c2VyLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBkZWxldGVkLm1hcChlbnRpdHkgPT5cbiAgICAgICAgdGhpcy5vbkFmdGVyRGVsZXRlKGVudGl0eS5pZCwgZW50aXR5LCB1c2VySWQpLmNhdGNoKGVyciA9PlxuICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG59XG4iXX0=
|
|
@@ -835,8 +835,16 @@ export class ReportingService {
|
|
|
835
835
|
-- Highest version by NUMERIC semver core (not lexical: '10.0.0' > '9.0.0').
|
|
836
836
|
-- Strip any -prerelease/+build suffix before the int[] cast so it can't
|
|
837
837
|
-- error on valid semver; keep the original string for display.
|
|
838
|
+
-- GUARD: a non-numeric-dotted version ('latest', '', 'v1') would make the
|
|
839
|
+
-- ::int[] cast throw and blow up the WHOLE org summary. Only cast rows
|
|
840
|
+
-- whose stripped core matches a numeric-dotted shape; sort everything
|
|
841
|
+
-- else to the bottom via a sentinel ARRAY[-1] so the row still counts.
|
|
838
842
|
(array_agg(${schema.plugin.version}
|
|
839
|
-
ORDER BY
|
|
843
|
+
ORDER BY CASE
|
|
844
|
+
WHEN regexp_replace(${schema.plugin.version}, '[-+].*$', '') ~ '^[0-9]+([.][0-9]+)*$'
|
|
845
|
+
THEN string_to_array(regexp_replace(${schema.plugin.version}, '[-+].*$', ''), '.')::int[]
|
|
846
|
+
ELSE ARRAY[-1]
|
|
847
|
+
END DESC
|
|
840
848
|
))[1] AS latest_version,
|
|
841
849
|
bool_or(${schema.plugin.isDefault}) AS has_default
|
|
842
850
|
FROM ${schema.plugin}
|
|
@@ -916,4 +924,4 @@ export class ReportingService {
|
|
|
916
924
|
}
|
|
917
925
|
}
|
|
918
926
|
export const reportingService = new ReportingService();
|
|
919
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQjtJQUM1QyxJQUFJLENBQUUsZ0JBQXNDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsUUFBUSxzQkFBc0IsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEgsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENB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aW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVDYWNoZVNlcnZpY2UsIGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBSRVBPUlRfSU5URVJWQUxTLCBzY3J1YkF3c0lkZW50aWZpZXJzLCBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGluQXJyYXksIHNxbCwgdHlwZSBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBkcml6emxlUm93cyB9IGZyb20gJy4vY3J1ZC1zZXJ2aWNlLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG4vKipcbiAqIERlZmVuc2UtaW4tZGVwdGggZ3VhcmQgZm9yIHRoZSBgREFURV9UUlVOQygke2ludGVydmFsfSwg4oCmKWAgYnVja2V0IGFyZ3VtZW50LlxuICogVGhlIHJvdXRlIGxheWVyIChgcGFyc2VSZXBvcnRJbnRlcnZhbGApIGlzIHRoZSBzZWN1cml0eSBib3VuZGFyeSBhbmQgYWxyZWFkeVxuICogcmVqZWN0cyB1bmtub3duIGludGVydmFsczsgdGhpcyBhc3NlcnQgbWFrZXMgYW4gaW52YWxpZCB2YWx1ZSBmYWlsIGZhc3QgYXQgdGhlXG4gKiBzZXJ2aWNlIGJvdW5kYXJ5IHdpdGggYSBjbGVhciBlcnJvciBpbnN0ZWFkIG9mIHN1cmZhY2luZyBhIHJhdyBQb3N0Z3JlcyBlcnJvclxuICogaWYgYSBjYWxsZXIgZXZlciBieXBhc3NlcyB0aGUgcm91dGUgdmFsaWRhdGlvbi4gU2hhcmVzIGFwaS1jb3JlJ3NcbiAqIFJFUE9SVF9JTlRFUlZBTFMgYWxsb3ctbGlzdCBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0LlxuICovXG5mdW5jdGlvbiBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghKFJFUE9SVF9JTlRFUlZBTFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGludGVydmFsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXBvcnQgaW50ZXJ2YWw6ICR7aW50ZXJ2YWx9LiBFeHBlY3RlZCBvbmUgb2Y6ICR7UkVQT1JUX0lOVEVSVkFMUy5qb2luKCcsICcpfWApO1xuICB9XG59XG5cbi8qKlxuICogQ2FjaGUgZm9yIHJlcG9ydGluZyBhZ2dyZWdhdGlvbnMuIFR3byB0aWVyczpcbiAqIC0gSW52ZW50b3J5IHF1ZXJpZXMgKHBsdWdpbiBzdW1tYXJ5L2Rpc3RyaWJ1dGlvbi92ZXJzaW9ucyk6IDUgbWluIFRUTCDigJQgY2hhbmdlcyBvbiBwbHVnaW4gQ1JVRFxuICogLSBFeGVjdXRpb24vYnVpbGQgcXVlcmllcyB3aXRoIGRhdGUgcmFuZ2VzOiAyIG1pbiBUVEwg4oCUIG5ldyBldmVudHMgYXJyaXZlIGNvbnRpbnVvdXNseVxuICovXG5jb25zdCBpbnZlbnRvcnlDYWNoZSA9IGNyZWF0ZUNhY2hlU2VydmljZSgncmVwb3J0OmludjonLCBwYXJzZUludChwcm9jZXNzLmVudi5DQUNIRV9UVExfUkVQT1JUX0lOVkVOVE9SWSB8fCAnMzAwJywgMTApKTtcbmNvbnN0IHRpbWVzZXJpZXNDYWNoZSA9IGNyZWF0ZUNhY2hlU2VydmljZSgncmVwb3J0OnRzOicsIHBhcnNlSW50KHByb2Nlc3MuZW52LkNBQ0hFX1RUTF9SRVBPUlRfVElNRVNFUklFUyB8fCAnMTIwJywgMTApKTtcblxuLy8g4pSA4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgRXhlY3V0aW9uQ291bnQge1xuICBpZDogc3RyaW5nO1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHRvdGFsOiBudW1iZXI7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgZmlyc3RFeGVjdXRpb246IHN0cmluZyB8IG51bGw7XG4gIGxhc3RFeGVjdXRpb246IHN0cmluZyB8IG51bGw7XG59XG5cbmludGVyZmFjZSBUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBjYW5jZWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBEdXJhdGlvblN0YXRzIHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1pbk1zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIHA5NU1zOiBudW1iZXI7XG4gIGV4ZWN1dGlvbnM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFBpcGVsaW5lRXhlY3V0aW9uIHtcbiAgZXhlY3V0aW9uSWQ6IHN0cmluZztcbiAgLyoqIFJvbGxlZC11cCB0ZXJtaW5hbCBzdGF0dXM6IHN1Y2NlZWRlZCB8IGZhaWxlZCB8IGNhbmNlbGVkIHwgaW4tcHJvZ3Jlc3MuICovXG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGVuZGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIGR1cmF0aW9uTXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBGaXJzdCBmYWlsaW5nIHN0YWdlL2FjdGlvbiBmb3IgdGhlIGV4ZWN1dGlvbiAobnVsbCB3aGVuIGl0IGRpZG4ndCBmYWlsKS4gKi9cbiAgZmFpbGluZ1N0YWdlOiBzdHJpbmcgfCBudWxsO1xuICBmYWlsaW5nQWN0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgU3RhZ2VGYWlsdXJlIHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFN0YWdlQm90dGxlbmVjayB7XG4gIGlkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBBY3Rpb25GYWlsdXJlIHtcbiAgYWN0aW9uTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBFcnJvckVudHJ5IHtcbiAgZXJyb3JQYXR0ZXJuOiBzdHJpbmc7XG4gIG9jY3VycmVuY2VzOiBudW1iZXI7XG4gIGFmZmVjdGVkUGlwZWxpbmVzOiBudW1iZXI7XG4gIGxhc3RTZWVuOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQbHVnaW5TdW1tYXJ5IHtcbiAgdG90YWw6IG51bWJlcjtcbiAgYWN0aXZlOiBudW1iZXI7XG4gIGluYWN0aXZlOiBudW1iZXI7XG4gIHB1YmxpYzogbnVtYmVyO1xuICBwcml2YXRlOiBudW1iZXI7XG4gIHVuaXF1ZU5hbWVzOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiB7XG4gIHBsdWdpblR5cGU6IHN0cmluZztcbiAgY29tcHV0ZVR5cGU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFZlcnNpb25Db3VudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbkNvdW50OiBudW1iZXI7XG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbiAgaGFzRGVmYXVsdDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQnVpbGREdXJhdGlvbiB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgYnVpbGRzOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBCdWlsZEZhaWx1cmUge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG4vKiogUmF3IHNpbmdsZS1yb3cgc2hhcGUgcmV0dXJuZWQgYnkgdGhlIERPUkEgYWdncmVnYXRlIHF1ZXJ5IChwcmUtc2hhcGluZykuICovXG4vKipcbiAqIEhvdyBmYXIgcGFzdCB0aGUgcmVwb3J0J3MgYHRvYCBib3VuZCB0aGUgRE9SQSBNVFRSIHF1ZXJ5IG1heSBsb29rIGZvciBhXG4gKiBmYWlsdXJlJ3MgcmVjb3ZlcmluZyBydW4uIEJvdW5kcyB0aGUgc2NhbiB3aGlsZSBzdG9wcGluZyBhIGZhaWx1cmUgbmVhciB0aGVcbiAqIHdpbmRvdyBlZGdlIGZyb20gYmVpbmcgc3B1cmlvdXNseSBzY29yZWQgXCJuZXZlciByZXN0b3JlZFwiLiBBIGZhaWx1cmUgdGhhdFxuICogaGFzIG5vdCByZWNvdmVyZWQgd2l0aGluIHRoaXMgd2luZG93IHN0YXlzIGNvdW50ZWQgYXMgYW4gb3BlbiBpbmNpZGVudC5cbiAqL1xuY29uc3QgTVRUUl9SRVNUT1JFX0xPT0tBSEVBRCA9ICczMCBkYXlzJztcblxuLyoqXG4gKiBET1JBIHBlcmZvcm1hbmNlIGJhbmQuIGBudWxsYCA9IGluc3VmZmljaWVudCBkYXRhIHRvIGNsYXNzaWZ5IChub1xuICogZGVwbG95bWVudHMvZmFpbHVyZXMvbGVhZC10aW1lIHNhbXBsZSBpbiB0aGUgd2luZG93KSwgc28gdGhlIFVJIHNob3dzIGFcbiAqIG5ldXRyYWwgc3RhdGUgcmF0aGVyIHRoYW4gbWlzbGFiZWxpbmcgYW4gZW1wdHkgd2luZG93IGFzIFwibG93XCIuXG4gKi9cbmV4cG9ydCB0eXBlIERvcmFMZXZlbCA9ICdlbGl0ZScgfCAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgbnVsbDtcblxuLyoqIE9wdGlvbmFsIHNjb3BpbmcgZm9yIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLmdldERvcmFNZXRyaWNzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU9wdGlvbnMge1xuICAvKiogUmVzdHJpY3QgdG8gYSBzaW5nbGUgcGlwZWxpbmUgKHBlci1waXBlbGluZSBET1JBKS4gKi9cbiAgcGlwZWxpbmVJZD86IHN0cmluZztcbiAgLyoqIENvdW50IG9ubHkgZXhlY3V0aW9ucyBkZXBsb3llZCB0byB0aGlzIGVudmlyb25tZW50IChkZXBsb3ktc2NvcGVkKS4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBDb3VudCBvbmx5IGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggQU5ZIGVudmlyb25tZW50IChyZWFsIGRlcGxveW1lbnRzKS4gKi9cbiAgZGVwbG95c09ubHk/OiBib29sZWFuO1xufVxuXG4vLyBET1JBIHBlcmZvcm1hbmNlIGJhbmRzICh0aHJlc2hvbGRzIGZyb20gdGhlIERPUkEvQWNjZWxlcmF0ZSByZXBvcnRzKS4gRWFjaFxuLy8gaGVscGVyIHJldHVybnMgYG51bGxgIHdoZW4gdGhlcmUncyBubyBzYW1wbGUgdG8gY2xhc3NpZnkuXG4vKiogRGVwbG95bWVudCBmcmVxdWVuY3kgYnkgZGVwbG95cy9kYXk6IGVsaXRlIOKJpTEvZGF5LCBoaWdoIOKJpTEvd2VlaywgbWVkaXVtIOKJpTEvbW9udGguICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JGcmVxdWVuY3kocGVyRGF5OiBudW1iZXIsIGRlcGxveW1lbnRzOiBudW1iZXIpOiBEb3JhTGV2ZWwge1xuICBpZiAoZGVwbG95bWVudHMgPD0gMCkgcmV0dXJuIG51bGw7XG4gIGlmIChwZXJEYXkgPj0gMSkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChwZXJEYXkgPj0gMSAvIDcpIHJldHVybiAnaGlnaCc7XG4gIGlmIChwZXJEYXkgPj0gMSAvIDMwKSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cbi8qKiBDaGFuZ2UgZmFpbHVyZSByYXRlIGJ5IHBlcmNlbnQ6IGVsaXRlIOKJpDUlLCBoaWdoIOKJpDEwJSwgbWVkaXVtIOKJpDE1JS4gKi9cbmZ1bmN0aW9uIGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUocGN0OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpOiBEb3JhTGV2ZWwge1xuICBpZiAodG90YWwgPD0gMCkgcmV0dXJuIG51bGw7XG4gIGlmIChwY3QgPD0gNSkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChwY3QgPD0gMTApIHJldHVybiAnaGlnaCc7XG4gIGlmIChwY3QgPD0gMTUpIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIFRpbWUgdG8gcmVzdG9yZSBieSBzZWNvbmRzOiBlbGl0ZSA8MWgsIGhpZ2ggPDEgZGF5LCBtZWRpdW0gPDEgd2Vlay4gKi9cbmZ1bmN0aW9uIGRvcmFMZXZlbEZvclJlc3RvcmUoYXZnU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChhdmdTZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAoYXZnU2Vjb25kcyA8IDM2MDApIHJldHVybiAnZWxpdGUnO1xuICBpZiAoYXZnU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAoYXZnU2Vjb25kcyA8IDYwNDgwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogTGVhZCB0aW1lIGJ5IHNlY29uZHM6IGVsaXRlIDwxIGRheSwgaGlnaCA8MSB3ZWVrLCBtZWRpdW0gPDEgbW9udGguICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JMZWFkVGltZShtZWRpYW5TZWNvbmRzOiBudW1iZXIgfCBudWxsKTogRG9yYUxldmVsIHtcbiAgaWYgKG1lZGlhblNlY29uZHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgODY0MDApIHJldHVybiAnZWxpdGUnO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDYwNDgwMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKG1lZGlhblNlY29uZHMgPCAyNTkyMDAwKSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cblxuLyoqXG4gKiBSb3VuZCBgdmFsdWVgIHRvIGBkaWdpdHNgIGRlY2ltYWwgcGxhY2VzLCByZXR1cm5pbmcgYSByZWFsIG51bWJlci4gU21hbGxcbiAqIG1vZHVsZS1wcml2YXRlIGhlbHBlciBzbyB0aGUgRE9SQSBzaGFwaW5nIGRvZXNuJ3QgcmVwZWF0IHRoZVxuICogYE51bWJlcihOdW1iZXIoeCkudG9GaXhlZChuKSlgIHBhdHRlcm4gKHRvRml4ZWQgYWxvbmUgeWllbGRzIGEgc3RyaW5nKS5cbiAqL1xuZnVuY3Rpb24gcm91bmQodmFsdWU6IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRml4ZWQoZGlnaXRzKSk7XG59XG5cbi8qKlxuICogU2hhcmVkIHBlci1leGVjdXRpb24gdGVybWluYWwtc3RhdHVzIHJvbGwtdXAgZm9yIHRoZSBET1JBIGBleGVjc2AgQ1RFczpcbiAqIEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgZWxzZSBDQU5DRUxFRC9TVE9QUEVELiBLZXB0IGluIG9uZSBwbGFjZSBzb1xuICogZ2V0RG9yYU1ldHJpY3MgYW5kIGdldERvcmFUcmVuZCBjYW4ndCBkcmlmdCBvbiB0aGUgcHJlY2VkZW5jZS5cbiAqL1xuY29uc3QgRE9SQV9URVJNSU5BTF9TVEFUVVNfQ0FTRSA9IHNxbGBcbiAgICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgV0hFTiBib29sX29yKGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ0ZBSUxFRCdcbiAgICAgICAgICAgICAgV0hFTiBib29sX29yKGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpIFRIRU4gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgICAgRUxTRSAnQ0FOQ0VMRUQnXG4gICAgICAgICAgICBFTkRgO1xuXG4vKipcbiAqIE9wdGlvbmFsIHBlci1waXBlbGluZSAvIGRlcGxveS1zY29waW5nIHByZWRpY2F0ZXMgKyB0aGUgcmVzdWx0aW5nIGBiYXNpc2AsXG4gKiBzaGFyZWQgYnkgZ2V0RG9yYU1ldHJpY3MgYW5kIGdldERvcmFUcmVuZCBzbyB0aGUgZW52L2RlcGxveXNPbmx5IHByZWNlZGVuY2VcbiAqIGNhbid0IGRpdmVyZ2UuIGBlbnZpcm9ubWVudGAgKG9uZSB0YXJnZXQpIHdpbnMgb3ZlciBgZGVwbG95c09ubHlgIChhbnkgZW52KS5cbiAqL1xuZnVuY3Rpb24gZG9yYVNjb3BlQ2xhdXNlcyhvcHRzOiBEb3JhT3B0aW9ucykge1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50LCBkZXBsb3lzT25seSB9ID0gb3B0cztcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkID8gc3FsYEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgY29uc3QgZGVwbG95Q2xhdXNlID0gZW52aXJvbm1lbnRcbiAgICA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YFxuICAgIDogZGVwbG95c09ubHkgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExgIDogc3FsYGA7XG4gIGNvbnN0IGJhc2lzOiAnZGVwbG95JyB8ICdydW4nID0gZW52aXJvbm1lbnQgfHwgZGVwbG95c09ubHkgPyAnZGVwbG95JyA6ICdydW4nO1xuICByZXR1cm4geyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBiYXNpcyB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBgZXhlY3NgIENURSBib2R5IOKAlCB0aGUgcGVyLWV4ZWN1dGlvbiB0ZXJtaW5hbCByb2xsLXVwIHRoYXQgQk9USCBET1JBXG4gKiBtZXRob2RzIHNjYW4uIE9ubHkgdGhlIFNFTEVDVGVkIGNvbHVtbnMgYW5kIHRoZSB1cHBlciByYW5nZSBib3VuZCBkaWZmZXJcbiAqIChnZXREb3JhTWV0cmljcyBuZWVkcyBwaXBlbGluZV9pZC9lbmRlZF9hdC9kdXJhdGlvbl9tcyBwbHVzIGEgbG9vay1haGVhZCB0YWlsXG4gKiBmb3IgTVRUUiByZWNvdmVyeTsgZ2V0RG9yYVRyZW5kIG5lZWRzIG9ubHkgc3RhcnRlZF9hdCBvdmVyIHRoZSBjb3JlIHdpbmRvdyksXG4gKiBzbyB0aG9zZSBhcmUgdGhlIHBhcmFtZXRlcnMuIFRoZSBgZXZlbnRfdHlwZT0nUElQRUxJTkUnYCBnYXRlLCB0aGVcbiAqIFNVQ0NFRURFRC9GQUlMRUQvQ0FOQ0VMRUQvU1RPUFBFRCBzdGF0dXMgc2V0LCB0aGUgYGV4ZWN1dGlvbl9pZGAgZmlsdGVyLCB0aGVcbiAqIG9yZyArIGRlcGxveS9waXBlbGluZSBzY29wZSBjbGF1c2VzLCBhbmQgdGhlIGBHUk9VUCBCWWAgYWxsIGxpdmUgaGVyZSBzbyB0aGVcbiAqIHR3byBjYWxsZXJzIGNhbid0IGRyaWZ0IG9uIHRoZSBzdGF0dXMgc2V0IG9yIHRoZSBwcmVkaWNhdGUuXG4gKlxuICogQHBhcmFtIGNvbHVtbnMgIHRyYWlsaW5nIFNFTEVDVCBjb2x1bW5zIChhZnRlciBgZS5leGVjdXRpb25faWQsYClcbiAqIEBwYXJhbSB0b0JvdW5kICB0aGUgYDw9YCB1cHBlci1ib3VuZCBleHByZXNzaW9uIG9uIGBlLnN0YXJ0ZWRfYXRgXG4gKiAgICAgICAgICAgICAgICAgKGNvcmUgd2luZG93IGZvciB0aGUgdHJlbmQ7IGNvcmUgKyBsb29rLWFoZWFkIGZvciBtZXRyaWNzKVxuICovXG5mdW5jdGlvbiBleGVjc0N0ZShhcmdzOiB7XG4gIHByZWQ6IFNRTDtcbiAgY29sdW1uczogU1FMO1xuICBwaXBlbGluZUNsYXVzZTogU1FMO1xuICBkZXBsb3lDbGF1c2U6IFNRTDtcbiAgZnJvbTogc3RyaW5nO1xuICB0b0JvdW5kOiBTUUw7XG59KTogU1FMIHtcbiAgY29uc3QgeyBwcmVkLCBjb2x1bW5zLCBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBmcm9tLCB0b0JvdW5kIH0gPSBhcmdzO1xuICByZXR1cm4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICAke2NvbHVtbnN9XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICAtLSBTVE9QUEVEIChtYW51YWxseSBhYm9ydGVkKSBqb2lucyBDQU5DRUxFRCBpbiB0aGUgRUxTRSBidWNrZXQ7IGJvdGhcbiAgICAgICAgICAtLSBhcmUgdGVybWluYWwgbm9uLWRlcGxveSBvdXRjb21lcy4gU1VQRVJTRURFRCBzdGF5cyBleGNsdWRlZCAoYVxuICAgICAgICAgIC0tIHJlcGxhY2VkIGV4ZWN1dGlvbiwgbm90IGFuIG91dGNvbWUpLlxuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnLCAnU1RPUFBFRCcpXG4gICAgICAgICAgQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX1cbiAgICAgICAgICAke2RlcGxveUNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6XG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvQm91bmR9XG4gICAgICAgIEdST1VQIEJZIGUuZXhlY3V0aW9uX2lkLCBlLnBpcGVsaW5lX2lkYDtcbn1cblxuaW50ZXJmYWNlIERvcmFSb3cge1xuICBkZl9kZXBsb3ltZW50cz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNmcl9mYWlsZWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjZnJfdG90YWw/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBsdF9kZXBsb3ltZW50cz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGx0X21lZGlhbl9tcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIG10dHJfZmFpbHVyZXM/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBtdHRyX3Jlc3RvcmVkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbXR0cl9hdmdfc2Vjb25kcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LCBvcmctc2NvcGVkIChzaW5nbGUtb3JnIG9yIHJvbGx1cCBzdWJ0cmVlKS5cbiAqXG4gKiBBIFwiZGVwbG95bWVudFwiIGlzIGEgVEVSTUlOQUwgcGlwZWxpbmUtbGV2ZWwgZXZlbnQsIHJvbGxlZCB1cCB0byBvbmUgcm93IHBlclxuICogYGV4ZWN1dGlvbl9pZGAgKEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRC9TVE9QUEVEIOKAlCBzYW1lXG4gKiBwcmVjZWRlbmNlIGFzIGBsaXN0UGlwZWxpbmVFeGVjdXRpb25zYCkuXG4gKlxuICogRElTQ0xPU1VSRSDigJQgdGhlc2UgYXJlIFJVTi1CQVNFRCBhcHByb3hpbWF0aW9ucyBvZiBET1JBLiBBIFwiZGVwbG95bWVudFwiIGhlcmVcbiAqIGlzIGFueSBzdWNjZXNzZnVsIHBpcGVsaW5lIFJVTiwgbm90IGEgdmVyaWZpZWQgcHJvZHVjdGlvbiBkZXBsb3ltZW50OiB0aGVcbiAqIGV2ZW50IHN0cmVhbSBjYXJyaWVzIG5vIGRlcGxveS1zdGFnZS9lbnZpcm9ubWVudCBtYXJrZXIsIHNvIGEgQ0ktb25seVxuICogYnVpbGQvdGVzdCBwaXBlbGluZSBjb3VudHMgdGhlIHNhbWUgYXMgb25lIHRoYXQgc2hpcHMgdG8gcHJvZC4gVGhhdCBtYWtlc1xuICogYGRlcGxveW1lbnRGcmVxdWVuY3lgIGEgcGlwZWxpbmUtdGhyb3VnaHB1dCBzaWduYWwgYW5kIGBjaGFuZ2VGYWlsdXJlUmF0ZWAgYVxuICogcGlwZWxpbmUtZmFpbHVyZSByYXRlIChidWlsZC90ZXN0IGZhaWx1cmVzIGNhdWdodCBpbiBDSSBjb3VudCB0b28pLCBhbmQgTVRUUlxuICogYSBwaXBlbGluZS1yZWNvdmVyeSB0aW1lLiBPbmx5IGBsZWFkVGltZWAgY2FycmllcyBhbiBleHBsaWNpdCBgYXBwcm94YCBmbGFnXG4gKiAoaXQgaXMgYWRkaXRpb25hbGx5IGEgcnVuLXRpbWUgcHJveHkpLCBidXQgQUxMIGZvdXIgc2hhcmUgdGhlIHJ1buKJoGRlcGxveVxuICogY2F2ZWF0IHVudGlsIGRlcGxveS9jb21taXQgbWV0YWRhdGEgaXMgY2FwdHVyZWQuIFNlZSBkb2NzL2RvcmEtbWV0cmljcy5tZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhTWV0cmljcyB7XG4gIC8qKiBUaGUgW2Zyb20sdG9dIHdpbmRvdyBlY2hvZWQgYmFjayAoc3RhcnRlZF9hdCByYW5nZSkuICovXG4gIHdpbmRvdzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG51bWJlcnMgY291bnQgcmVhbCBkZXBsb3ltZW50cyBvciBwaXBlbGluZSBydW5zOlxuICAgKiAtIGAnZGVwbG95J2Ag4oCUIHNjb3BlZCB0byBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIGEgZGVwbG95IGBlbnZpcm9ubWVudGBcbiAgICogICAodmlhIGBlbnZpcm9ubWVudGAvYGRlcGxveXNPbmx5YCk7IGEgZ2VudWluZSBkZXBsb3ltZW50IHNpZ25hbC5cbiAgICogLSBgJ3J1bidgIOKAlCBkZWZhdWx0OiBldmVyeSBzdWNjZXNzZnVsIFBJUEVMSU5FIHJ1biBjb3VudHMgKG5vIGRlcGxveVxuICAgKiAgIG1hcmtlciBhcHBsaWVkKS4gREYvQ0ZSL01UVFIgdGhlbiByZWZsZWN0IHBpcGVsaW5lIGFjdGl2aXR5LCBub3QgZGVwbG95cy5cbiAgICovXG4gIGJhc2lzOiAnZGVwbG95JyB8ICdydW4nO1xuICAvKiogVGhlIHNjb3BpbmcgYXBwbGllZCAoZWNob2VkIGZvciB0aGUgVUkpOyBgbnVsbGAgd2hlbiB1bnNjb3BlZC4gKi9cbiAgZmlsdGVyczogeyBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsOyBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbCB9O1xuICAvKiogRGVwbG95bWVudCBGcmVxdWVuY3kg4oCUIFNVQ0NFRURFRCB0ZXJtaW5hbCBkZXBsb3ltZW50cyBpbiB0aGUgd2luZG93LiAqL1xuICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7XG4gICAgLyoqIENvdW50IG9mIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ltZW50cyBwZXIgZGF5IG92ZXIgdGhlIHdpbmRvdy4gKi9cbiAgICBwZXJEYXk6IG51bWJlcjtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gZGVwbG95bWVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqIENoYW5nZSBGYWlsdXJlIFJhdGUg4oCUIGZhaWxlZCAvIChzdWNjZWVkZWQgKyBmYWlsZWQpOyBDQU5DRUxFRCBleGNsdWRlZC4gKi9cbiAgY2hhbmdlRmFpbHVyZVJhdGU6IHtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICAvKiogc3VjY2VlZGVkICsgZmFpbGVkICh0aGUgQ0ZSIGRlbm9taW5hdG9yKS4gKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50YWdlLCAw4oCTMTAwLCAxIGRlY2ltYWwuICovXG4gICAgcGN0OiBudW1iZXI7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIGRlcGxveW1lbnRzIHRvIGp1ZGdlLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBNZWFuIFRpbWUgVG8gUmVzdG9yZSDigJQgYXZnIGdhcCBmcm9tIGEgZmFpbHVyZSBJTkNJREVOVCB0byBpdHMgcmVjb3ZlcnkuXG4gICAqICBDb25zZWN1dGl2ZSBmYWlsZWQgcnVucyBvZiBhIHBpcGVsaW5lICh3aXRoIG5vIGdyZWVuIHJ1biBiZXR3ZWVuKSBjb2xsYXBzZVxuICAgKiAgaW50byBvbmUgaW5jaWRlbnQ7IHRoZSBnYXAgaXMgbWVhc3VyZWQgZnJvbSB0aGUgZmlyc3QgZmFpbHVyZSdzIEVORCB0byB0aGVcbiAgICogIHJlY292ZXJpbmcgcnVuJ3MgRU5ELiBUaGUgcmVjb3ZlcnkgaXMgdmlzaWJsZSB1cCB0byBhIGxvb2stYWhlYWQgcGFzdCBgdG9gXG4gICAqICBzbyBhIGZhaWx1cmUgbmVhciB0aGUgd2luZG93IGVkZ2UgaXNuJ3Qgc3B1cmlvdXNseSBjb3VudGVkIHVucmVzdG9yZWQuICovXG4gIG1lYW5UaW1lVG9SZXN0b3JlOiB7XG4gICAgLyoqIEZhaWx1cmUgaW5jaWRlbnRzIGluIHRoZSB3aW5kb3cgKG1heGltYWwgcnVucyBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcykuICovXG4gICAgZmFpbHVyZXM6IG51bWJlcjtcbiAgICAvKiogSW5jaWRlbnRzIHRoYXQgd2VyZSBmb2xsb3dlZCBieSBhIHN1Y2NlZWRlZCBydW4gKHJlY292ZXJlZCkuICovXG4gICAgcmVzdG9yZWQ6IG51bWJlcjtcbiAgICAvKiogQXZlcmFnZSByZXN0b3JlIGdhcCBpbiBzZWNvbmRzOyBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBpbmNpZGVudHMuICovXG4gICAgYXZnU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gaW5jaWRlbnRzLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBMZWFkIFRpbWUg4oCUIFBST1hZOiBtZWRpYW4gcGlwZWxpbmUgUlVOIFRJTUUgb2Ygc3VjY2VlZGVkIGRlcGxveW1lbnRzLlxuICAgKiAgTk9UIHRydWUgY29tbWl04oaScHJvZCBsZWFkIHRpbWUgKGV4ZWN1dGlvbnMgZG9uJ3QgY2FwdHVyZSBjb21taXQgdGltZSksXG4gICAqICBoZW5jZSBgYXBwcm94OiB0cnVlYCBzbyB0aGUgVUkvZG9jcyBjYW4gbGFiZWwgaXQuICovXG4gIGxlYWRUaW1lOiB7XG4gICAgLyoqIFN1Y2NlZWRlZCBkZXBsb3ltZW50cyB3aXRoIGEgZHVyYXRpb24gKHRoZSBtZWRpYW4gc2FtcGxlKS4gKi9cbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIC8qKiBNZWRpYW4gcnVuIHRpbWUgaW4gc2Vjb25kczsgbnVsbCB3aGVuIG5vIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgbWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBhcHByb3g6IHRydWU7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbn1cblxuLyoqIE9uZSBpbnRlcnZhbCBidWNrZXQgb2YgdGhlIERPUkEgdHJlbmQgKGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgY2hhbmdlIGZhaWx1cmUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhVHJlbmRQb2ludCB7XG4gIC8qKiBCdWNrZXQgc3RhcnQgKERBVEVfVFJVTkMgb2Ygc3RhcnRlZF9hdCksIElTTyB0ZXh0LiAqL1xuICBwZXJpb2Q6IHN0cmluZztcbiAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95bWVudHMgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgLyoqIEZhaWxlZCBkZXBsb3ltZW50cyBpbiB0aGUgYnVja2V0LiAqL1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIHN1Y2NlZWRlZCArIGZhaWxlZCBpbiB0aGUgYnVja2V0LiAqL1xuICB0b3RhbDogbnVtYmVyO1xuICAvKiogZmFpbGVkL3RvdGFsIGFzIGEgcGVyY2VudCAoMCB3aGVuIHRvdGFsIGlzIDApLiAqL1xuICBjaGFuZ2VGYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIC8qKiBTdGFibGUgcGlwZWxpbmUgaWQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZCBmcm9tIHRoZSBgUElQRUxJTkVfRVZFTlRfSURgXG4gICAqICB0YWcgKD0gdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGUgcmVnaXN0cnkgam9pbiBrZXkuICovXG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcbiAgZXZlbnRUeXBlOiAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiAoQWN0aW9uIGV2ZW50cykuICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgb2YgdGhlIGNoYW5nZSBiZWluZyBzaGlwcGVkIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFNoYT86IHN0cmluZztcbiAgLyoqIFNvdXJjZSByZWYvYnJhbmNoIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIERlcGxveSB0YXJnZXQgKGUuZy4gXCJwcm9kdWN0aW9uXCIpLiBJdHMgcHJlc2VuY2UgbWFya3MgYSByZWFsIGRlcGxveW1lbnQuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgdGhlIGNhbGxlciBjYW4gbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSZXN1bHQge1xuICBpbnNlcnRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSAIFNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW52ZW50b3J5Q2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICAgIHRpbWVzZXJpZXNDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGFyZSBkcm9wcGVkIChhbmQgbG9nZ2VkIGF0IFdBUk5cbiAgICogd2l0aCBzYW1wbGUgaWRzIHNvIGFuIG9wZXJhdG9yIGNhbiBzZWUgd2hlbiBFdmVudEJyaWRnZSBpcyBkZWxpdmVyaW5nXG4gICAqIGV2ZW50cyBmb3IgcGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCkuXG4gICAqXG4gICAqIFJldHVybnMgY291bnRzICsgYSBzYW1wbGUgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICovXG4gIGFzeW5jIGluZ2VzdEV2ZW50cyhldmVudHM6IEluZ2VzdEV2ZW50W10pOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIC8vIE11bHRpLW9yZyBiYXRjaCBpbnNlcnQ6IHRoZSBjYWxsZXIgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgb3JncyB2aWEgdGhlXG4gICAgLy8gcGlwZWxpbmUtcmVnaXN0cnkgbG9va3VwIGJlbG93LCBzbyB0aGUgcm91dGUgbGF5ZXIgTVVTVCBlc3RhYmxpc2ggYVxuICAgIC8vIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAuLi4pYCBzY29wZSBiZWZvcmUgY2FsbGluZ1xuICAgIC8vIHRoaXMgbWV0aG9kLiBVbmRlciBGT1JDRSdkIFJMUywgYSBzaW5nbGUgdHggd2l0aCBgYXBwLm9yZ19pZCA9IDxvbmVcbiAgICAvLyBvcmc+YCBjb3VsZCBvbmx5IHdyaXRlIGV2ZW50cyBmb3IgdGhhdCBvcmc7IGJ5cGFzcyB2aWEgc3lzYWRtaW4gaXNcbiAgICAvLyB0aGUgcmlnaHQgZ2F0ZSBmb3IgdGhpcyBzZXJ2ZXItaW50ZXJuYWwgY3Jvc3MtdGVuYW50IGVuZHBvaW50LiBTZWVcbiAgICAvLyBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzIGZvciB0aGUgd3JhcHBlci5cbiAgICAvLyBSdW4gaW5zZXJ0IGluc2lkZSB0aGUgdHgsIGJ1dCBDT0xMRUNUIGFmZmVjdGVkIG9yZ3MgYW5kIGludmFsaWRhdGVcbiAgICAvLyBjYWNoZXMgQUZURVIgdGhlIHR4IHJlc29sdmVzLiBLZWVwaW5nIGludmFsaWRhdGlvbiBpbnNpZGUgdGhlIHR4IGhlbGRcbiAgICAvLyB0aGUgcGcgbG9ja3Mgb3BlbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWNoZSByb3VuZC10cmlwcyAoUmVkaXMgb3JcbiAgICAvLyBpbi1tZW1vcnkgaW52YWxpZGF0aW9ucyBhcmUgdW5yZWxhdGVkIHRvIHRoZSB0eCBidXQgc3RpbGwgc2VyaWFsaXplZFxuICAgIC8vIGl0cyBjb21taXQpLiBDYWNoZSBUVEwgaXMgMi01IG1pbiBzbyBmaXJlLWFuZC1mb3JnZXQgcG9zdC1jb21taXQgaXNcbiAgICAvLyBhbiBhY2NlcHRhYmxlIHRyYWRlIGZvciB0aWdodGVyIGxvY2sgd2luZG93cy5cbiAgICBjb25zdCB7IGluc2VydGVkLCBza2lwcGVkLCB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcywgYWZmZWN0ZWRPcmdzIH0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAvLyBCYXRjaC1yZXNvbHZlIGFsbCB1bmlxdWUgcGlwZWxpbmUgaWRzIGluIG9uZSBxdWVyeVxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQoZXZlbnRzLm1hcChlID0+IGUucGlwZWxpbmVJZCkpXTtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5Um93cyA9IGF3YWl0IHR4XG4gICAgICAgIC5zZWxlY3Qoe1xuICAgICAgICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgICB9KVxuICAgICAgICAuZnJvbShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeSlcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCwgdW5pcXVlSWRzKSk7XG5cbiAgICAgIGNvbnN0IGlkTWFwID0gbmV3IE1hcChyZWdpc3RyeVJvd3MubWFwKHIgPT4gW3IucGlwZWxpbmVJZCwgcl0pKTtcblxuICAgICAgLy8gQnVpbGQgaW5zZXJ0IGJhdGNoIChza2lwIGV2ZW50cyB3aG9zZSBwaXBlbGluZSBpc24ndCByZWdpc3RlcmVkKVxuICAgICAgY29uc3Qgcm93czogQXJyYXk8dHlwZW9mIHNjaGVtYS5waXBlbGluZUV2ZW50LiRpbmZlckluc2VydD4gPSBbXTtcbiAgICAgIGxldCBza2lwcGVkTG9jYWwgPSAwO1xuICAgICAgY29uc3QgdW5yZWdpc3RlcmVkTG9jYWw6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaWRNYXAuZ2V0KGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgICAgc2tpcHBlZExvY2FsKys7XG4gICAgICAgICAgdW5yZWdpc3RlcmVkTG9jYWwucHVzaChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgLy8gcmVnaXN0cnkucGlwZWxpbmVJZCA9PT0gZXZlbnQucGlwZWxpbmVJZDsgdXNlIHRoZSByZWdpc3RyeSdzIHNvIHRoZVxuICAgICAgICAgIC8vIEZLIGlzIGFsd2F5cyBhIHJvdyB0aGF0IGV4aXN0cywgYW5kIHB1bGwgb3JnSWQgZnJvbSB0aGUgcmVnaXN0cnkgZm9yXG4gICAgICAgICAgLy8gdGVuYW5jeSAobmV2ZXIgdHJ1c3QgdGhlIGNhbGxlcidzIGNsYWltZWQgb3JnKS5cbiAgICAgICAgICBwaXBlbGluZUlkOiByZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiByZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgICBldmVudFNvdXJjZTogZXZlbnQuZXZlbnRTb3VyY2UsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgc3RhdHVzOiBldmVudC5zdGF0dXMsXG4gICAgICAgICAgLy8gZXhlY3V0aW9uSWQgaXMgYW4gQVdTLUFTU0lHTkVEIGlkZW50aWZpZXIgKGEgVVVJRCksIG5vdCBmcmVlLWZvcm1cbiAgICAgICAgICAvLyB1c2VyIHRleHQsIHNvIGl0IGNhbid0IGNhcnJ5IGFuIGFjY291bnQgaWQg4oCUIGFuZCBzY3J1YmJpbmcgYSBVVUlEXG4gICAgICAgICAgLy8gdGhhdCBoYXBwZW5zIHRvIGNvbnRhaW4gYSAxMi1kaWdpdCBydW4gd291bGQgY29ycnVwdCB0aGUgY29ycmVsYXRpb25cbiAgICAgICAgICAvLyBrZXkuIExlZnQgaW50YWN0IGJ5IGRlc2lnbi5cbiAgICAgICAgICBleGVjdXRpb25JZDogZXZlbnQuZXhlY3V0aW9uSWQsXG4gICAgICAgICAgLy8gc3RhZ2VOYW1lL2FjdGlvbk5hbWUgYXJlIFVTRVItQVVUSE9SRUQgcGlwZWxpbmUtc3RydWN0dXJlIG5hbWVzXG4gICAgICAgICAgLy8gcHJvbW90ZWQgZnJvbSB0aGUgQ29kZVBpcGVsaW5lIGRldGFpbCDigJQgc2FtZSB1bnRydXN0ZWQtQVdTLWRlcml2ZWRcbiAgICAgICAgICAvLyBvcmlnaW4gYXMgZXJyb3JNZXNzYWdlIGJlbG93LCBzbyBzY3J1YiB0aGVtIGF0IHRoaXMgcGVyc2lzdGVuY2VcbiAgICAgICAgICAvLyBib3VuZGFyeSB0b28gKGEgc3RhZ2UgbmFtZWQgd2l0aCBhbiBBUk4vMTItZGlnaXQgaWQgbXVzdCBub3QgcGVyc2lzdCkuXG4gICAgICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5zdGFnZU5hbWUpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBhY3Rpb25OYW1lOiBldmVudC5hY3Rpb25OYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuYWN0aW9uTmFtZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIC8vIEhBUkQgQ09OU1RSQUlOVDogYW4gQVdTIGFjY291bnQgaWQgbXVzdCBORVZFUiBiZSBwZXJzaXN0ZWQuIFRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgRFVSQUJMRSBwZXJzaXN0ZW5jZSBib3VuZGFyeSBhbmQgbXVzdCBub3QgdHJ1c3QgdXBzdHJlYW06XG4gICAgICAgICAgLy8gQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBmYWlsdXJlIGRldGFpbCAmIG1lc3NhZ2VzIHJvdXRpbmVseSBjYXJyeVxuICAgICAgICAgIC8vIEFSTnMgKGFybjphd3M64oCmOjxhY2NvdW50LWlkPjrigKYpIGFuZCBiYXJlIDEyLWRpZ2l0IGFjY291bnQgaWRzLiBTY3J1YlxuICAgICAgICAgIC8vIGJvdGggZnJlZS1mb3JtIGZpZWxkcyBoZXJlIGJlZm9yZSBpbnNlcnQgKHBlci1ldmVudCwgbm9uLW11dGF0aW5nKS5cbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGV2ZW50LmVycm9yTWVzc2FnZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGV2ZW50LmVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogZXZlbnQuc3RhcnRlZEF0ID8gbmV3IERhdGUoZXZlbnQuc3RhcnRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb21wbGV0ZWRBdDogZXZlbnQuY29tcGxldGVkQXQgPyBuZXcgRGF0ZShldmVudC5jb21wbGV0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZHVyYXRpb25NczogZXZlbnQuZHVyYXRpb25NcyxcbiAgICAgICAgICAvLyBEZXBsb3ktYXR0cmlidXRpb24gZmllbGRzIOKAlCBzY3J1YmJlZCBsaWtlIHRoZSBvdGhlciBmcmVlLWZvcm0gc3RyaW5nc1xuICAgICAgICAgIC8vIHNvIGFuIEFSTi9hY2NvdW50IGlkIGNhbiBuZXZlciBlbnRlciB2aWEgYSByZWYgb3IgZW52aXJvbm1lbnQgbmFtZS5cbiAgICAgICAgICBjb21taXRTaGE6IGV2ZW50LmNvbW1pdFNoYSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGV2ZW50LmNvbW1pdFNoYSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbW1pdFJlZjogZXZlbnQuY29tbWl0UmVmICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuY29tbWl0UmVmKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IGV2ZW50LmVudmlyb25tZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuZW52aXJvbm1lbnQpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LmRldGFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnMoZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTUVMgaXMgYXQtbGVhc3Qtb25jZSwgc28gRXZlbnRCcmlkZ2UgY2FuIGRlbGl2ZXIgdGhlIHNhbWUgc3RhdGUtY2hhbmdlXG4gICAgICAvLyB0d2ljZS4gYG9uQ29uZmxpY3REb05vdGhpbmdgICsgdGhlIHBhcnRpYWwgdW5pcXVlIGluZGV4IG9uXG4gICAgICAvLyAocGlwZWxpbmVfaWQsIGV4ZWN1dGlvbl9pZCwgZXZlbnRfdHlwZSwgc3RhdHVzLCBzdGFnZV9uYW1lLCBhY3Rpb25fbmFtZSlcbiAgICAgIC8vIG1ha2VzIHJlLWRlbGl2ZXJ5IGlkZW1wb3RlbnQuIGByZXR1cm5pbmdgIGdpdmVzIHRoZSBSRUFMIGluc2VydGVkIHNldCBzb1xuICAgICAgLy8gY291bnRzICsgY2FjaGUgaW52YWxpZGF0aW9uIGlnbm9yZSBkdXBsaWNhdGVzLlxuICAgICAgY29uc3QgaW5zZXJ0ZWRSb3dzID0gcm93cy5sZW5ndGggPiAwXG4gICAgICAgID8gYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5waXBlbGluZUV2ZW50KS52YWx1ZXMocm93cylcbiAgICAgICAgICAub25Db25mbGljdERvTm90aGluZygpXG4gICAgICAgICAgLnJldHVybmluZyh7IG9yZ0lkOiBzY2hlbWEucGlwZWxpbmVFdmVudC5vcmdJZCB9KVxuICAgICAgICA6IFtdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnNlcnRlZDogaW5zZXJ0ZWRSb3dzLmxlbmd0aCxcbiAgICAgICAgc2tpcHBlZDogc2tpcHBlZExvY2FsLFxuICAgICAgICB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkczogdW5yZWdpc3RlcmVkTG9jYWwsXG4gICAgICAgIGFmZmVjdGVkT3JnczogWy4uLm5ldyBTZXQoaW5zZXJ0ZWRSb3dzLm1hcChyID0+IHIub3JnSWQpKV0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gU3VyZmFjZSB0aGUgc2lsZW50IHNraXA6IGFuIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZCB1c3VhbGx5IG1lYW5zIHRoZVxuICAgIC8vIHBpcGVsaW5lIGhhc24ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCAob3IgaXRzXG4gICAgLy8gUElQRUxJTkVfRVZFTlRfSUQgdGFnIGlzIG1pc3NpbmcvdW5yZWFkYWJsZSBieSB0aGUgTGFtYmRhKS4gTG9nZ2luZyBpdFxuICAgIC8vIG1ha2VzIGEgYnJva2VuIGpvaW4gdmlzaWJsZSBpbnN0ZWFkIG9mIGxvb2tpbmcgbGlrZSBcIm5vIGFjdGl2aXR5XCIuXG4gICAgaWYgKHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKCdQaXBlbGluZSBldmVudHMgc2tpcHBlZDogcGlwZWxpbmUgaWQgbm90IGZvdW5kIGluIHJlZ2lzdHJ5Jywge1xuICAgICAgICBjb3VudDogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoLFxuICAgICAgICBzYW1wbGU6IHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLnNsaWNlKDAsIDMpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9zdC1jb21taXQgY2FjaGUgaW52YWxpZGF0aW9uLiBGaXJlLWFuZC1mb3JnZXQgd2l0aCBsb2dnaW5nIOKAlCBUVEwgaXNcbiAgICAvLyBzaG9ydCBlbm91Z2ggdGhhdCBhIG1pc3NlZCBpbnZhbGlkYXRpb24gc2VsZi1oZWFscy5cbiAgICBpZiAoYWZmZWN0ZWRPcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvaWQgUHJvbWlzZS5hbGwoYWZmZWN0ZWRPcmdzLm1hcCgob3JnKSA9PlxuICAgICAgICB0aGlzLmludmFsaWRhdGVPcmcob3JnKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZDogb3JnLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIH0pLFxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaW5zZXJ0ZWQsIHNraXBwZWQsIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzIH07XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgMTogUGlwZWxpbmUgRXhlY3V0aW9uICYgUGVyZm9ybWFuY2Ug4pSA4pSAXG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBvcmctc2NvcGUgcHJlZGljYXRlIGZvciBhIHJlcG9ydCBxdWVyeS4gV2l0aCBgb3JnSWRzYCAodGhlXG4gICAqIG9yZyDihpIgdGVhbSByb2xsdXAg4oCUIGEgcGFyZW50J3MgYFtzZWxmLCAuLi5kZXNjZW5kYW50c11gKSBpdCBiZWNvbWVzIGFuXG4gICAqIGBJTiAoLi4uKWAgb3ZlciB0aGUgc3VidHJlZTsgb3RoZXJ3aXNlIHRoZSBzaW5nbGUtb3JnIGA9ICRvcmdgLiBSZXR1cm5zIGFcbiAgICogYG11bHRpYCBmbGFnIHNvIGNhbGxlcnMgY2FuIHJ1biBtdWx0aS1vcmcgcmVhZHMgdW5kZXIgc3lzYWRtaW4gY29udGV4dFxuICAgKiAodGhlIHN1YnRyZWUgc3BhbnMgb3JncyBvdXRzaWRlIHRoZSByZXF1ZXN0J3MgUkxTIHNjb3BlKSBhbmQgc2FsdCB0aGVcbiAgICogY2FjaGUga2V5LlxuICAgKi9cbiAgcHJpdmF0ZSBvcmdTY29wZShvcmdJZDogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSkge1xuICAgIC8vIERlZmVuc2UtaW4tZGVwdGg6IHRoZSBtdWx0aS1vcmcgcm9sbHVwIHJ1bnMgdW5kZXIgc3lzYWRtaW4gY29udGV4dCAoUkxTXG4gICAgLy8gT0ZGLCBzZWUgcnVuUmVwb3J0KSwgc28gYG9yZ0lkc2AgaXMgdGhlIE9OTFkgdGVuYW5jeSBnYXRlIG9uIHRoZSByZWFkLiBUaGVcbiAgICAvLyByb3V0ZSByZXNvbHZlcyBpdCBmcm9tIHRoZSBwbGF0Zm9ybSdzIGF1dGhvcml0YXRpdmUgZGVzY2VuZGFudHMgZW5kcG9pbnQgYXNcbiAgICAvLyBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWAsIGJ1dCB2YWxpZGF0ZSB0aGUgc3VidHJlZSBkZWZlbnNpdmVseSBoZXJlIGJlZm9yZVxuICAgIC8vIHRoZSBieXBhc3M6IHRoZSByZXF1ZXN0aW5nIChhbmNob3IpIG9yZyBNVVNUIGFwcGVhciBpbiB0aGUgc2V0LiBBIHNldCB0aGF0XG4gICAgLy8gb21pdHMgdGhlIGNhbGxlcidzIG93biBvcmcgaXMgYSBtYWxmb3JtZWQvc3Bvb2ZlZCByb2xsdXAg4oCUIGNvbGxhcHNlIHRvIHRoZVxuICAgIC8vIHNhZmUgc2luZ2xlLW9yZyBzY29wZSByYXRoZXIgdGhhbiByZWFkaW5nIGFuIGFyYml0cmFyeSBvcmcgdW5kZXIgc3lzYWRtaW4uXG4gICAgLy8gKEZ1bGwgZGVzY2VuZGFudC1tZW1iZXJzaGlwIHZhbGlkYXRpb24gbmVlZHMgdGhlIG9yZyB0cmVlLCB3aGljaCB0aGlzXG4gICAgLy8gc2VydmljZSBkb2VzIG5vdCBob2xkIOKAlCBzZWUgdGhlIHJlcG9ydCBGTEFHLilcbiAgICBjb25zdCBhbmNob3IgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHByb3ZpZGVkID0gKG9yZ0lkcyA/PyBbXSkuZmlsdGVyKChpZCkgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBhbmNob3JlZCA9IHByb3ZpZGVkLnNvbWUoKGlkKSA9PiBpZC50b0xvd2VyQ2FzZSgpID09PSBhbmNob3IpO1xuICAgIGlmIChwcm92aWRlZC5sZW5ndGggPiAwICYmICFhbmNob3JlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyByb2xsdXAgcmVqZWN0ZWQ6IHJlcXVlc3Rpbmcgb3JnIGFic2VudCBmcm9tIHJlc29sdmVkIHN1YnRyZWU7IHVzaW5nIHNpbmdsZS1vcmcgc2NvcGUnLCB7XG4gICAgICAgIG9yZ0lkOiBhbmNob3IsIHN1YnRyZWVTaXplOiBwcm92aWRlZC5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaWRzID0gcHJvdmlkZWQubGVuZ3RoID4gMCAmJiBhbmNob3JlZCA/IHByb3ZpZGVkIDogW29yZ0lkXTtcbiAgICBjb25zdCBtdWx0aSA9IGlkcy5sZW5ndGggPiAxO1xuICAgIGNvbnN0IHByZWQgPSBtdWx0aVxuICAgICAgPyBzcWxgSU4gKCR7c3FsLmpvaW4oaWRzLm1hcCgoaWQpID0+IHNxbGAke2lkfWApLCBzcWxgLCBgKX0pYFxuICAgICAgOiBzcWxgPSAke2lkc1swXX1gO1xuICAgIHJldHVybiB7IHByZWQsIG11bHRpIH07XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcmVwb3J0IHJlYWQuIFNpbmdsZS1vcmcgcmVhZHMgdXNlIHRoZSBwZXItb3JnIGNhY2hlIChpbnZhbGlkYXRlZCBvblxuICAgKiB0aGF0IG9yZydzIGV2ZW50IGluZ2VzdCkuIFJvbGx1cCAobXVsdGktb3JnKSByZWFkcyAqKmJ5cGFzcyB0aGUgY2FjaGUqKiBhbmRcbiAgICogcnVuIHVuZGVyIHN5c2FkbWluIGNvbnRleHQ6IHRoZXkncmUgYWRtaW4tb25seSBhbmQgbG93ZXItZnJlcXVlbmN5LCBhbmQgYVxuICAgKiBjaGlsZCBvcmcncyBldmVudCBpbmdlc3QgY2FuJ3QgaW52YWxpZGF0ZSBhIHBhcmVudCdzIHJvbGx1cCBlbnRyeSAocmVwb3J0aW5nXG4gICAqIGhhcyBubyBvcmcgdHJlZSksIHNvIGNhY2hpbmcgdGhlbSB3b3VsZCBzZXJ2ZSBzdGFsZSBhZ2dyZWdhdGVzLiBBbHdheXMgZnJlc2guXG4gICAqL1xuICBwcml2YXRlIHJ1blJlcG9ydDxUPihjYWNoZUtleTogc3RyaW5nLCBtdWx0aTogYm9vbGVhbiwgZXhlYzogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBtdWx0aVxuICAgICAgPyBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBleGVjKVxuICAgICAgOiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoY2FjaGVLZXksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMSBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9KTogUHJvbWlzZTxFeGVjdXRpb25Db3VudFtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICAvLyBPcHRpb25hbCBbZnJvbSx0b10gd2luZG93IG9uIHRoZSBleGVjdXRpb24ncyBzdGFydGVkX2F0LCBtaXJyb3JpbmcgdGhlXG4gICAgLy8gc2libGluZyB0aW1lc2VyaWVzIHJlcG9ydHMgc28gdGhlIGRhc2hib2FyZCBkYXRlLXJhbmdlIHBpY2tlciBuYXJyb3dzIHRoZVxuICAgIC8vIGNvdW50IHRvbyAoYW4gZW1wdHkgcmFuZ2UgPSBhbGwtdGltZSwgcHJlc2VydmluZyB0aGUgcHJpb3IgYmVoYXZpb3IpLiBUaGVcbiAgICAvLyByYW5nZSByaWRlcyB0aGUgSk9JTiBzbyBwaXBlbGluZXMgd2l0aCBubyBpbi13aW5kb3cgZXZlbnRzIHN0aWxsIGxpc3RcbiAgICAvLyAoTEVGVCBzZW1hbnRpY3MgcHJlc2VydmVkIHZpYSB0aGUgaW5uZXItam9pbiBmaWx0ZXIg4oCUIGEgcGlwZWxpbmUgd2l0aCB6ZXJvXG4gICAgLy8gbWF0Y2hpbmcgZXZlbnRzIGRyb3BzIGZyb20gdGhlIGNvdW50LCBzYW1lIGFzIGJlZm9yZSBmb3IgaXRzIHdpbmRvdykuXG4gICAgY29uc3QgcmFuZ2VDbGF1c2UgPSByYW5nZT8uZnJvbSAmJiByYW5nZT8udG9cbiAgICAgID8gc3FsYEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtyYW5nZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3JhbmdlLnRvfTo6dGltZXN0YW1wdHpgXG4gICAgICA6IHNxbGBgO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBwLmlzX2FjdGl2ZSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgcC5pZFxuICAgICAgICBPUkRFUiBCWSB0b3RhbCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RXhlY3V0aW9uQ291bnQ+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmV4ZWMtY291bnQ6JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuMWIgUGVyLXBpcGVsaW5lIGV4ZWN1dGlvbiBoaXN0b3J5IOKAlCBESVNUSU5DVCBleGVjdXRpb25zIGZvciBvbmUgcGlwZWxpbmUsXG4gICAqIG5ld2VzdCBmaXJzdC4gR3JvdXBzIGFsbCBldmVudHMgYnkgYGV4ZWN1dGlvbl9pZGAgaW4gYSBzaW5nbGUgc2NhbiBhbmRcbiAgICogcm9sbHMgZWFjaCBleGVjdXRpb24gdXAgdG8gb25lIHJvdzpcbiAgICogICAtIHN0YXR1czogZGVyaXZlZCBmcm9tIHRoZSBQSVBFTElORS10eXBlIGV2ZW50cy4gRkFJTEVEIHdpbnMsIHRoZW5cbiAgICogICAgIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRDsgYW4gZXhlY3V0aW9uIHdpdGggbm8gdGVybWluYWwgUElQRUxJTkUgZXZlbnRcbiAgICogICAgIGlzIHN0aWxsIGBpbi1wcm9ncmVzc2AuXG4gICAqICAgLSBzdGFydGVkQXQvZW5kZWRBdC9kdXJhdGlvbk1zOiBmcm9tIHRoZSBQSVBFTElORSBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKiAgIC0gZmFpbGluZ1N0YWdlL2ZhaWxpbmdBY3Rpb246IHRoZSBmaXJzdCBGQUlMRUQgU1RBR0UvQUNUSU9OIGV2ZW50IChjaGVhcCDigJRcbiAgICogICAgIHNhbWUgc2Nhbiwgbm8gZXh0cmEgcXVlcnkpLlxuICAgKlxuICAgKiBPUkctU0NPUElORzogaWRlbnRpY2FsIHRvIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzIOKAlCBqb2lucyB0aGUgcGlwZWxpbmVcbiAgICogcmVnaXN0cnkgdGFibGUgKGBwaXBlbGluZWApIGFuZCBnYXRlcyBvbiBgcC5vcmdfaWQgJHtwcmVkfWAsIHdoZXJlIGBwcmVkYCBpc1xuICAgKiB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYCBvciAod2l0aCBhIHJvbGx1cCkgYW4gYElOICguLi4pYCBvdmVyIHRoZSBvcmfihpJ0ZWFtXG4gICAqIHN1YnRyZWUuIEEgcGlwZWxpbmVJZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBvcmcgeWllbGRzIHplcm8gcm93cy5cbiAgICovXG4gIGFzeW5jIGxpc3RQaXBlbGluZUV4ZWN1dGlvbnMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0sXG4gICAgbGltaXQ6IG51bWJlciA9IDUwLFxuICApOiBQcm9taXNlPFBpcGVsaW5lRXhlY3V0aW9uW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gcmFuZ2U/LmZyb20gJiYgcmFuZ2U/LnRvXG4gICAgICA/IHNxbGBBTkQgZS5zdGFydGVkX2F0ID49ICR7cmFuZ2UuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHtyYW5nZS50b306OnRpbWVzdGFtcHR6YFxuICAgICAgOiBzcWxgYDtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSBUSEVOICdmYWlsZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0NBTkNFTEVEJykgVEhFTiAnY2FuY2VsZWQnXG4gICAgICAgICAgICBFTFNFICdpbi1wcm9ncmVzcydcbiAgICAgICAgICBFTkQgQVMgc3RhdHVzLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OmludCBBUyBkdXJhdGlvbl9tcyxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuc3RhZ2VfbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19zdGFnZSxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuYWN0aW9uX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX2FjdGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfSBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZFxuICAgICAgICBPUkRFUiBCWSBNQVgoZS5jcmVhdGVkX2F0KSBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8UGlwZWxpbmVFeGVjdXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4yIFN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUgZm9yIGFuIG9yZy4gKi9cbiAgYXN5bmMgZ2V0U3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8VGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcpXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VGltZVNlcmllc0VudHJ5PihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpzdWNjZXNzLXJhdGU6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjMgQXZlcmFnZSBkdXJhdGlvbiBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldEF2ZXJhZ2VEdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxEdXJhdGlvblN0YXRzW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1JTihlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1pbl9tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuOTUpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZS5kdXJhdGlvbl9tcyk6OmludCBBUyBwOTVfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBleGVjdXRpb25zXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHAuaWQgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxEdXJhdGlvblN0YXRzPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTphdmctZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjUgU3RhZ2UgZmFpbHVyZSBoZWF0bWFwIOKAlCB3aGljaCBzdGFnZXMgZmFpbCBtb3N0LiAqL1xuICBhc3luYyBnZXRTdGFnZUZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFN0YWdlRmFpbHVyZVtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuc3RhZ2VfbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBmYWlsdXJlX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YWdlX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8U3RhZ2VGYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpzdGFnZS1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3RpbmN0IGRlcGxveSBgZW52aXJvbm1lbnRgIHZhbHVlcyBvYnNlcnZlZCBpbiB0aGUgd2luZG93IOKAlCBwb3dlcnMgdGhlXG4gICAqIERPUkEgZW52aXJvbm1lbnQtc2NvcGUgZGF0YWxpc3QuIE9yZy1zY29wZWQgKyByb2xsdXAtYXdhcmUgbGlrZSB0aGUgc2libGluZ1xuICAgKiByZXBvcnRzOyBvbmx5IG5vbi1udWxsIGVudmlyb25tZW50cyAoaS5lLiBkZXBsb3ktYXR0cmlidXRlZCBleGVjdXRpb25zKS5cbiAgICovXG4gIGFzeW5jIGdldFJlcG9ydEVudmlyb25tZW50cyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1QgRElTVElOQ1QgZS5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBPUkRFUiBCWSBlbnZpcm9ubWVudFxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPHsgZW52aXJvbm1lbnQ6IHN0cmluZyB9PihyLnJvd3MpLm1hcCgocm93KSA9PiByb3cuZW52aXJvbm1lbnQpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpyZXBvcnQtZW52czoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNiBTdGFnZSBib3R0bGVuZWNrcyDigJQgc2xvd2VzdCBzdGFnZXMgcGVyIHBpcGVsaW5lLiAqL1xuICBhc3luYyBnZXRTdGFnZUJvdHRsZW5lY2tzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFN0YWdlQm90dGxlbmVja1tdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucGlwZWxpbmVfbmFtZSwgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCwgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8U3RhZ2VCb3R0bGVuZWNrPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpzdGFnZS1ib3R0bGVuZWNrczoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNyBBY3Rpb24gZmFpbHVyZSByYXRlIOKAlCB3aGljaCBwbHVnaW4gc3RlcHMgZmFpbCBtb3N0LiAqL1xuICBhc3luYyBnZXRBY3Rpb25GYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxBY3Rpb25GYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5hY3Rpb25fbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBmYWlsdXJlX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5hY3Rpb25fbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5hY3Rpb25fbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QWN0aW9uRmFpbHVyZT4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06YWN0aW9uLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKipcbiAgICogMS44IEVycm9yIGNhdGVnb3JpemF0aW9uIOKAlCBncm91cCBmYWlsdXJlIG1lc3NhZ2VzLiBFeGVjdXRpb24gcmVwb3J0LCBzb1xuICAgKiByb2xsdXAtYXdhcmUgZXhhY3RseSBsaWtlIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzOiB3aXRoIGBvcmdJZHNgXG4gICAqICh0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlKSB0aGUgb3JnIGdhdGUgYmVjb21lcyBhbiBgSU4gKC4uLilgIGFuZCB0aGUgcmVhZCBydW5zXG4gICAqIGZyZXNoIHVuZGVyIHN5c2FkbWluIHZpYSBgcnVuUmVwb3J0YDsgc2luZ2xlLW9yZyByZWFkcyBrZWVwIHRoZSBwZXItb3JnIGNhY2hlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RXJyb3JzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8RXJyb3JFbnRyeVtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIFNVQlNUUklORyhlLmVycm9yX21lc3NhZ2UgRlJPTSAxIEZPUiAyMDApIEFTIGVycm9yX3BhdHRlcm4sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCBlLnBpcGVsaW5lX2lkKTo6aW50IEFTIGFmZmVjdGVkX3BpcGVsaW5lcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJyBBTkQgZS5lcnJvcl9tZXNzYWdlIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFcnJvckVudHJ5PihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTplcnJvcnM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjkgRE9SQSBtZXRyaWNzIG92ZXIgW2Zyb20sdG9dIChzdGFydGVkX2F0IHJhbmdlKSwgb3JnLXNjb3BlZCArIHJvbGx1cC1hd2FyZS5cbiAgICpcbiAgICogQWxsIGZvdXIgbWV0cmljcyBkZXJpdmUgZnJvbSBhIHBlci1leGVjdXRpb24gcm9sbC11cCBvZiBURVJNSU5BTCBQSVBFTElORVxuICAgKiBldmVudHMgKG9uZSByb3cgcGVyIGV4ZWN1dGlvbl9pZCtwaXBlbGluZV9pZDsgRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELFxuICAgKiB0aGVuIENBTkNFTEVEL1NUT1BQRUQg4oCUIG1pcnJvcmluZyBgbGlzdFBpcGVsaW5lRXhlY3V0aW9uc2ApLiBUaGUgc2NhbiBpc1xuICAgKiBnYXRlZCBieSB0aGUgYHAub3JnX2lkICR7cHJlZH1gIGpvaW4gZXhhY3RseSBsaWtlIHRoZSBzaWJsaW5nIHJlcG9ydHMsIHNvIGFcbiAgICogcm9sbHVwIHBhc3NlcyB0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlIGFuZCBhIGZvcmVpZ24gb3JnJ3MgZXhlY3V0aW9ucyBuZXZlclxuICAgKiBlbnRlciB0aGUgYWdncmVnYXRlLlxuICAgKlxuICAgKiBERi9DRlIvbGVhZC10aW1lIGNvdW50IG9ubHkgQ09SRS13aW5kb3cgZXhlY3V0aW9ucyAoW2Zyb20sdG9dKS4gTVRUUiBpc1xuICAgKiBwZXItSU5DSURFTlQ6IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGNvbGxhcHNlIGludG8gb25lIGluY2lkZW50IGFuZCB0aGVcbiAgICogcmVjb3ZlcnkgbG9va3VwIG1heSBzZWUgdGhlIG5leHQgc3VjY2VzcyB1cCB0byBNVFRSX1JFU1RPUkVfTE9PS0FIRUFEIHBhc3RcbiAgICogYHRvYCwgc28gYSBmYWlsdXJlIG5lYXIgdGhlIGVkZ2UgaXNuJ3QgcmlnaHQtY2Vuc29yZWQgaW50byBcIm5ldmVyIHJlc3RvcmVkXCIuXG4gICAqIFRoZSBzY2FuIGJvdW5kIGlzIHRoZXJlZm9yZSBgW2Zyb20sIHRvICsgbG9vay1haGVhZF1gOyB0aGUgc3RhcnRlZF9hdCByYW5nZVxuICAgKiBzdGlsbCByaWRlcyB0aGUgc2FtZSBpbmRleCBhcyB0aGUgc2libGluZyByZXBvcnRzLlxuICAgKlxuICAgKiBESVNDTE9TVVJFOiBieSBkZWZhdWx0IERGL0NGUi9NVFRSIGFyZSBSVU4tYmFzZWQgKGFueSBzdWNjZXNzZnVsIFBJUEVMSU5FXG4gICAqIHJ1biA9IGEgXCJkZXBsb3ltZW50XCIpLCBhbmQgTGVhZCBUaW1lIGlzIGFkZGl0aW9uYWxseSBhIHJ1bi10aW1lIFBST1hZXG4gICAqIGZsYWdnZWQgYGFwcHJveDogdHJ1ZWAuIFBhc3MgYGVudmlyb25tZW50YCBvciBgZGVwbG95c09ubHlgIHRvIHNjb3BlIHRvXG4gICAqIGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggYSByZWFsIGRlcGxveSB0YXJnZXQg4oCUIHRoZSByZXNwb25zZSBgYmFzaXNgIHJlcG9ydHNcbiAgICogd2hpY2ggd2FzIHVzZWQuIFNlZSB0aGUgRG9yYU1ldHJpY3MgZG9jICsgZG9jcy9kb3JhLW1ldHJpY3MubWQuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzLnBpcGVsaW5lSWQgICAgcmVzdHJpY3QgdG8gb25lIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSlcbiAgICogQHBhcmFtIG9wdHMuZW52aXJvbm1lbnQgICBjb3VudCBvbmx5IGV4ZWN1dGlvbnMgZGVwbG95ZWQgdG8gdGhpcyB0YXJnZXRcbiAgICogQHBhcmFtIG9wdHMuZGVwbG95c09ubHkgICBjb3VudCBvbmx5IGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggQU5ZIGVudmlyb25tZW50XG4gICAqL1xuICBhc3luYyBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYU1ldHJpY3M+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGRlcGxveXNPbmx5IH0gPSBvcHRzO1xuICAgIC8vIE9wdGlvbmFsIGRlcGxveS1zY29waW5nIC8gcGVyLXBpcGVsaW5lIHByZWRpY2F0ZXMsIGZvbGRlZCBpbnRvIHRoZSBleGVjc1xuICAgIC8vIHNjYW4gc28gZmFpbHVyZXMgQU5EIHRoZWlyIHJlY292ZXJ5IHN1Y2Nlc3NlcyBhcmUgZmlsdGVyZWQgY29uc2lzdGVudGx5LlxuICAgIGNvbnN0IHsgcGlwZWxpbmVDbGF1c2UsIGRlcGxveUNsYXVzZSwgYmFzaXMgfSA9IGRvcmFTY29wZUNsYXVzZXMob3B0cyk7XG4gICAgLy8gU2NhbiB0aGUgQ09SRSB3aW5kb3cgcGx1cyBhIGxvb2stYWhlYWQgdGFpbDogdGhlIGV4dHJhIHRhaWwgZXhpc3RzIG9ubHlcbiAgICAvLyBzbyBhIGxhdGUgZmFpbHVyZSBjYW4gc3RpbGwgZmluZCBpdHMgcmVjb3ZlcnkgKHNlZSB0aGUgcmVzdG9yZSBDVEUpLlxuICAgIGNvbnN0IGV4ZWNzID0gZXhlY3NDdGUoe1xuICAgICAgcHJlZCxcbiAgICAgIHBpcGVsaW5lQ2xhdXNlLFxuICAgICAgZGVwbG95Q2xhdXNlLFxuICAgICAgZnJvbSxcbiAgICAgIGNvbHVtbnM6IHNxbGBcbiAgICAgICAgICAgIGUucGlwZWxpbmVfaWQsXG4gICAgICAgICAgICAke0RPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0V9IEFTIHN0YXR1cyxcbiAgICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEFTIHN0YXJ0ZWRfYXQsXG4gICAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGVuZGVkX2F0LFxuICAgICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEFTIGR1cmF0aW9uX21zYCxcbiAgICAgIHRvQm91bmQ6IHNxbGAke3RvfTo6dGltZXN0YW1wdHogKyAke01UVFJfUkVTVE9SRV9MT09LQUhFQUR9OjppbnRlcnZhbGAsXG4gICAgfSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBXSVRIIGV4ZWNzIEFTICgke2V4ZWNzfVxuICAgICAgICApLFxuICAgICAgICAtLSBDb3JlLXdpbmRvdyBleGVjdXRpb25zIChbZnJvbSx0b10pOyBERi9DRlIvbGVhZC10aW1lIGNvdW50IG9ubHkgdGhlc2UuXG4gICAgICAgIC0tIFRoZSBsb29rLWFoZWFkIHJvd3MgYWJvdmUgYXJlIHVzZWQgT05MWSBhcyBNVFRSIHJlY292ZXJ5IGNhbmRpZGF0ZXMuXG4gICAgICAgIGNvcmUgQVMgKFxuICAgICAgICAgIFNFTEVDVCAqIEZST00gZXhlY3MgV0hFUkUgc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgKSxcbiAgICAgICAgZGYgQVMgKFxuICAgICAgICAgIFNFTEVDVCBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICksXG4gICAgICAgIGNmciBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICksXG4gICAgICAgIGx0IEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZGVwbG95bWVudHMsXG4gICAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC41KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6ZmxvYXQgQVMgbWVkaWFuX21zXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICAgV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcgQU5EIGR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICksXG4gICAgICAgIC0tIEZvciBlYWNoIGNvcmUtd2luZG93IGZhaWx1cmUsIGZpbmQgdGhlIEVORCBvZiBpdHMgcmVjb3ZlcmluZyBydW46IHRoZVxuICAgICAgICAtLSBuZXh0IFNVQ0NFRURFRCBydW4gb2YgdGhlIHNhbWUgcGlwZWxpbmUgdGhhdCBFTkRFRCBhZnRlciB0aGlzIGZhaWx1cmVcbiAgICAgICAgLS0gZW5kZWQgKHZpc2libGUgaW50byB0aGUgbG9vay1haGVhZCB0YWlsKS4gU0VMRUNUIGFuZCBNRUFTVVJFIGJvdGgga2V5XG4gICAgICAgIC0tIG9mZiBlbmRlZF9hdCBzbyB0aGV5IHN0YXkgY29uc2lzdGVudCAtLSB0aGUgaW5jaWRlbnQgZ2FwIGlzXG4gICAgICAgIC0tIHJlc3RvcmVkX2F0IChzdWNjZXNzIGVuZCkgbWludXMgaW5jaWRlbnRfc3RhcnRlZCAoZmlyc3QgZmFpbHVyZSBlbmQpLFxuICAgICAgICAtLSBzbyBwaWNraW5nIHRoZSByZWNvdmVyeSBieSBlbmRlZF9hdCAobm90IHN0YXJ0ZWRfYXQpIHJ1bGVzIG91dCB0aGVcbiAgICAgICAgLS0gbmVnYXRpdmUgZ2FwIHRoYXQgYSBjb25jdXJyZW50IHN1Y2Nlc3Mgd2hpY2ggU1RBUlRFRCBhZnRlciB0aGUgZmFpbHVyZVxuICAgICAgICAtLSBidXQgRU5ERUQgYmVmb3JlIGl0IHdvdWxkIG90aGVyd2lzZSBmb2xkIGludG8gQVZHLiBNZWFzdXJpbmcgZnJvbSB0aGVcbiAgICAgICAgLS0gZmFpbHVyZSdzIEVORCAobm90IHN0YXJ0KSBhbHNvIGtlZXBzIHRoZSBmYWlsZWQgcnVuJ3Mgb3duIGR1cmF0aW9uIG91dFxuICAgICAgICAtLSBvZiByZXN0b3JlIHRpbWUuIE9yZGVyaW5nIGJ5IGVuZGVkX2F0IG1ha2VzIHRoZSBpbmNpZGVudCBjb2xsYXBzZSBmYWxsXG4gICAgICAgIC0tIG91dCBuYXR1cmFsbHk6IGEgZ3JlZW4gcnVuIGVuZGluZyBiZXR3ZWVuIHR3byBmYWlsdXJlcyBzcGxpdHMgdGhlbS5cbiAgICAgICAgcmVzdG9yZSBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBmLnBpcGVsaW5lX2lkLFxuICAgICAgICAgICAgZi5lbmRlZF9hdCBBUyBmYWlsX2VuZGVkLFxuICAgICAgICAgICAgKFNFTEVDVCBzLmVuZGVkX2F0IEZST00gZXhlY3Mgc1xuICAgICAgICAgICAgICBXSEVSRSBzLnBpcGVsaW5lX2lkID0gZi5waXBlbGluZV9pZCBBTkQgcy5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgICAgICAgIEFORCBzLmVuZGVkX2F0ID4gZi5lbmRlZF9hdFxuICAgICAgICAgICAgICBPUkRFUiBCWSBzLmVuZGVkX2F0IEFTQyBMSU1JVCAxKSBBUyByZXN0b3JlZF9hdFxuICAgICAgICAgIEZST00gY29yZSBmXG4gICAgICAgICAgV0hFUkUgZi5zdGF0dXMgPSAnRkFJTEVEJ1xuICAgICAgICApLFxuICAgICAgICAtLSBDb2xsYXBzZSB0byBJTkNJREVOVFM6IGZhaWx1cmVzIHNoYXJpbmcgdGhlIHNhbWUgcmVjb3ZlcnkgKGkuZS4gd2l0aFxuICAgICAgICAtLSBubyBncmVlbiBydW4gYmV0d2VlbiB0aGVtKSBhcmUgb25lIGluY2lkZW50LCBzdGFydGluZyBhdCB0aGUgZmlyc3RcbiAgICAgICAgLS0gZmFpbHVyZSdzIGVuZC4gVW5yZWNvdmVyZWQgZmFpbHVyZXMgc2hhcmUgcmVzdG9yZWRfYXQgPSBOVUxMIGFuZCBmb3JtXG4gICAgICAgIC0tIHRoZSBzaW5nbGUgdHJhaWxpbmcgb3BlbiBpbmNpZGVudCBwZXIgcGlwZWxpbmUuXG4gICAgICAgIGluY2lkZW50cyBBUyAoXG4gICAgICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkLCByZXN0b3JlZF9hdCwgTUlOKGZhaWxfZW5kZWQpIEFTIGluY2lkZW50X3N0YXJ0ZWRcbiAgICAgICAgICBGUk9NIHJlc3RvcmVcbiAgICAgICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZCwgcmVzdG9yZWRfYXRcbiAgICAgICAgKSxcbiAgICAgICAgbXR0ciBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgICAgLS0gcmVzdG9yZWQgbXVzdCBlcXVhbCB0aGUgY291bnQgb2YgaW5jaWRlbnRzIHRoYXQgYWN0dWFsbHlcbiAgICAgICAgICAgIC0tIGNvbnRyaWJ1dGUgdG8gYXZnX3NlY29uZHMuIEd1YXJkIG9uIGluY2lkZW50X3N0YXJ0ZWQgdG9vOiBhXG4gICAgICAgICAgICAtLSBmYWlsdXJlIHdpdGggYSBOVUxMIGNvbXBsZXRlZF9hdCB5aWVsZHMgYSBOVUxMIGluY2lkZW50X3N0YXJ0ZWRcbiAgICAgICAgICAgIC0tIHRoYXQgY29udHJpYnV0ZXMgTlVMTCAobm90IGEgcmVhbCBnYXApIHRvIEFWRywgc28gaXQgbXVzdCBub3QgYmVcbiAgICAgICAgICAgIC0tIGNvdW50ZWQgYXMgcmVzdG9yZWQgZWl0aGVyIC0tIG90aGVyd2lzZSByZXN0b3JlZCBjb3VsZCBleGNlZWRcbiAgICAgICAgICAgIC0tIHRoZSBudW1iZXIgb2YgbWVhc3VyZWQgaW5jaWRlbnRzLlxuICAgICAgICAgICAgQ09VTlQoKikgRklMVEVSIChcbiAgICAgICAgICAgICAgV0hFUkUgcmVzdG9yZWRfYXQgSVMgTk9UIE5VTEwgQU5EIGluY2lkZW50X3N0YXJ0ZWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAgICk6OmludCBBUyByZXN0b3JlZCxcbiAgICAgICAgICAgIEFWRyhFWFRSQUNUKEVQT0NIIEZST00gKHJlc3RvcmVkX2F0IC0gaW5jaWRlbnRfc3RhcnRlZCkpKVxuICAgICAgICAgICAgICBGSUxURVIgKFdIRVJFIHJlc3RvcmVkX2F0IElTIE5PVCBOVUxMIEFORCBpbmNpZGVudF9zdGFydGVkIElTIE5PVCBOVUxMKTo6ZmxvYXQgQVMgYXZnX3NlY29uZHNcbiAgICAgICAgICBGUk9NIGluY2lkZW50c1xuICAgICAgICApXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGRmLmRlcGxveW1lbnRzIEFTIGRmX2RlcGxveW1lbnRzLFxuICAgICAgICAgIGNmci5mYWlsZWQgQVMgY2ZyX2ZhaWxlZCxcbiAgICAgICAgICBjZnIudG90YWwgQVMgY2ZyX3RvdGFsLFxuICAgICAgICAgIGx0LmRlcGxveW1lbnRzIEFTIGx0X2RlcGxveW1lbnRzLFxuICAgICAgICAgIGx0Lm1lZGlhbl9tcyBBUyBsdF9tZWRpYW5fbXMsXG4gICAgICAgICAgbXR0ci5mYWlsdXJlcyBBUyBtdHRyX2ZhaWx1cmVzLFxuICAgICAgICAgIG10dHIucmVzdG9yZWQgQVMgbXR0cl9yZXN0b3JlZCxcbiAgICAgICAgICBtdHRyLmF2Z19zZWNvbmRzIEFTIG10dHJfYXZnX3NlY29uZHNcbiAgICAgICAgRlJPTSBkZiwgY2ZyLCBsdCwgbXR0clxuICAgICAgYCkudGhlbihyID0+IHRoaXMuc2hhcGVEb3JhKGRyaXp6bGVSb3dzPERvcmFSb3c+KHIucm93cylbMF0sIGZyb20sIHRvLCBiYXNpcywgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCB9KSkpO1xuICAgIC8vIGBlbnZpcm9ubWVudGAgV0lOUyBvdmVyIGBkZXBsb3lzT25seWAgaW4gZG9yYVNjb3BlQ2xhdXNlcywgc28gd2l0aCBhblxuICAgIC8vIGVudmlyb25tZW50IHNldCB0aGUgZGVwbG95c09ubHkgZmxhZyBuZXZlciBhZmZlY3RzIHRoZSBTUUwg4oCUIGFwcGVuZCB0aGVcbiAgICAvLyAnZCcgbWFya2VyIG9ubHkgd2hlbiBpdCBnZW51aW5lbHkgY2hhbmdlcyB0aGUgcXVlcnkgKGVudmlyb25tZW50IGFic2VudCksXG4gICAgLy8gb3RoZXJ3aXNlIGB7ZW52aXJvbm1lbnQ6J3Byb2QnLCBkZXBsb3lzT25seTp0cnVlfWAgd291bGQgbWludCBhIHJlZHVuZGFudFxuICAgIC8vIGNhY2hlIGVudHJ5IGlkZW50aWNhbCB0byBge2Vudmlyb25tZW50Oidwcm9kJ31gLlxuICAgIGNvbnN0IGRlcGxveU1hcmtlciA9ICFlbnZpcm9ubWVudCAmJiBkZXBsb3lzT25seSA/ICdkJyA6ICcnO1xuICAgIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhOiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2RlcGxveU1hcmtlcn1gO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiBTaGFwZSBhIHNpbmdsZSBET1JBIGFnZ3JlZ2F0ZSByb3cgaW50byB0aGUgcHVibGljIHtAbGluayBEb3JhTWV0cmljc30uICovXG4gIHByaXZhdGUgc2hhcGVEb3JhKFxuICAgIHJvdzogRG9yYVJvdyB8IHVuZGVmaW5lZCxcbiAgICBmcm9tOiBzdHJpbmcsXG4gICAgdG86IHN0cmluZyxcbiAgICBiYXNpczogRG9yYU1ldHJpY3NbJ2Jhc2lzJ10sXG4gICAgZmlsdGVyczogeyBwaXBlbGluZUlkPzogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICApOiBEb3JhTWV0cmljcyB7XG4gICAgLy8gYEZST00gZGYsIGNmciwgbHQsIG10dHJgIGFsd2F5cyB5aWVsZHMgZXhhY3RseSBvbmUgcm93IChlYWNoIENURSBpcyBhXG4gICAgLy8gc2luZ2xlLXJvdyBhZ2dyZWdhdGUpLCBidXQgZ3VhcmQgYWdhaW5zdCBhbiBlbXB0eSByZXN1bHQgZGVmZW5zaXZlbHkuXG4gICAgY29uc3QgcjogRG9yYVJvdyA9IHJvdyA/PyB7fTtcblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gTnVtYmVyKHIuZGZfZGVwbG95bWVudHMpIHx8IDA7XG4gICAgLy8gRmxvb3IgdGhlIGRpdmlzb3IgYXQgb25lIGRheTogYSB3aW5kb3cgc2hvcnRlciB0aGFuIGEgZGF5IChpbmNsLiB0aGVcbiAgICAvLyBkZWdlbmVyYXRlIGZyb209PXRvKSBoYXMgbm8gbWVhbmluZ2Z1bCBzdWItZGF5IHJhdGUsIHNvIGl0J3MgdHJlYXRlZCBhcyBhXG4gICAgLy8gc2luZ2xlIGRheSByYXRoZXIgdGhhbiBleHRyYXBvbGF0ZWQgb3IgbWlzbGFiZWxlZCBhcyBhIHJhdyBjb3VudC5cbiAgICAvLyBGbG9vciBhdCBvbmUgZGF5IGFuZCBndWFyZCBhZ2FpbnN0IHVucGFyc2VhYmxlIGRhdGVzIChEYXRlLnBhcnNlIOKGkiBOYU4sXG4gICAgLy8gd2hpY2ggd291bGQgb3RoZXJ3aXNlIHByb3BhZ2F0ZSB0aHJvdWdoIHBlckRheSkuIEZhbGxzIGJhY2sgdG8gYSAxLWRheVxuICAgIC8vIHdpbmRvdyBzbyBhIGJhZCByYW5nZSB5aWVsZHMgdGhlIHJhdyBjb3VudCBhcyB0aGUgcmF0ZSwgbmV2ZXIgTmFOLlxuICAgIGNvbnN0IHNwYW5EYXlzID0gKERhdGUucGFyc2UodG8pIC0gRGF0ZS5wYXJzZShmcm9tKSkgLyA4NjQwMDAwMDtcbiAgICBjb25zdCBkYXlzID0gTnVtYmVyLmlzRmluaXRlKHNwYW5EYXlzKSA/IE1hdGgubWF4KHNwYW5EYXlzLCAxKSA6IDE7XG4gICAgLy8gQmFuZCBvbiB0aGUgVU5ST1VOREVEIHJhdGU7IHJvdW5kIG9ubHkgZm9yIGRpc3BsYXkuIFJvdW5kaW5nIGZpcnN0IHdvdWxkXG4gICAgLy8gbWlzbGFiZWwgZXhhY3Qgd2Vla2x5L21vbnRobHkgYm91bmRhcmllcyAoZS5nLiAxIGRlcGxveSAvIDMwIGRheXMg4oaSXG4gICAgLy8gMC4wMzMzIHJvdW5kcyB0byAwLjAzIDwgMS8zMCDihpIgd3JvbmdseSBcImxvd1wiIGluc3RlYWQgb2YgXCJtZWRpdW1cIikuXG4gICAgY29uc3QgcmF3UGVyRGF5ID0gZGVwbG95bWVudHMgLyBkYXlzO1xuICAgIGNvbnN0IHBlckRheSA9IHJvdW5kKHJhd1BlckRheSwgMik7XG5cbiAgICBjb25zdCBmYWlsZWQgPSBOdW1iZXIoci5jZnJfZmFpbGVkKSB8fCAwO1xuICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKHIuY2ZyX3RvdGFsKSB8fCAwO1xuICAgIGNvbnN0IHJhd1BjdCA9IHRvdGFsID4gMCA/IChmYWlsZWQgLyB0b3RhbCkgKiAxMDAgOiAwO1xuICAgIGNvbnN0IHBjdCA9IHJvdW5kKHJhd1BjdCwgMSk7XG5cbiAgICAvLyBCYW5kIHJlc3RvcmUvbGVhZC10aW1lIG9uIHRoZSBSQVcgKHByZS1yb3VuZCkgc2Vjb25kcywgdGhlIHNhbWUgXCJiYW5kIG9uXG4gICAgLy8gdGhlIHVucm91bmRlZCB2YWx1ZVwiIHByaW5jaXBsZSB1c2VkIGZvciBwZXJEYXkvcGN0IGFib3ZlOyBrZWVwIHRoZSByb3VuZGVkXG4gICAgLy8gdmFsdWVzIGZvciB0aGUgcmVzcG9uc2UgZmllbGRzLiBJbW1hdGVyaWFsIGF0IHRoZSBob3VyL2RheSB0aHJlc2hvbGRzLCBidXRcbiAgICAvLyBpdCBtYWtlcyB0aGUgcHJpbmNpcGxlIHVuaWZvcm0gYWNyb3NzIGFsbCBmb3VyIG1ldHJpY3MuXG4gICAgY29uc3QgZmFpbHVyZXMgPSBOdW1iZXIoci5tdHRyX2ZhaWx1cmVzKSB8fCAwO1xuICAgIGNvbnN0IHJlc3RvcmVkID0gTnVtYmVyKHIubXR0cl9yZXN0b3JlZCkgfHwgMDtcbiAgICBjb25zdCByYXdBdmdTZWNvbmRzID0gZmFpbHVyZXMgPiAwICYmIHIubXR0cl9hdmdfc2Vjb25kcyAhPSBudWxsXG4gICAgICA/IE51bWJlcihyLm10dHJfYXZnX3NlY29uZHMpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgYXZnU2Vjb25kcyA9IHJhd0F2Z1NlY29uZHMgIT0gbnVsbCA/IHJvdW5kKHJhd0F2Z1NlY29uZHMsIDEpIDogbnVsbDtcblxuICAgIGNvbnN0IGx0RGVwbG95bWVudHMgPSBOdW1iZXIoci5sdF9kZXBsb3ltZW50cykgfHwgMDtcbiAgICBjb25zdCByYXdNZWRpYW5TZWNvbmRzID0gci5sdF9tZWRpYW5fbXMgIT0gbnVsbFxuICAgICAgPyBOdW1iZXIoci5sdF9tZWRpYW5fbXMpIC8gMTAwMFxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IG1lZGlhblNlY29uZHMgPSByYXdNZWRpYW5TZWNvbmRzICE9IG51bGwgPyByb3VuZChyYXdNZWRpYW5TZWNvbmRzLCAxKSA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2luZG93OiB7IGZyb20sIHRvIH0sXG4gICAgICBiYXNpcyxcbiAgICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogZmlsdGVycy5waXBlbGluZUlkID8/IG51bGwsIGVudmlyb25tZW50OiBmaWx0ZXJzLmVudmlyb25tZW50ID8/IG51bGwgfSxcbiAgICAgIGRlcGxveW1lbnRGcmVxdWVuY3k6IHsgZGVwbG95bWVudHMsIHBlckRheSwgbGV2ZWw6IGRvcmFMZXZlbEZvckZyZXF1ZW5jeShyYXdQZXJEYXksIGRlcGxveW1lbnRzKSB9LFxuICAgICAgY2hhbmdlRmFpbHVyZVJhdGU6IHsgZmFpbGVkLCB0b3RhbCwgcGN0LCBsZXZlbDogZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShyYXdQY3QsIHRvdGFsKSB9LFxuICAgICAgbWVhblRpbWVUb1Jlc3RvcmU6IHsgZmFpbHVyZXMsIHJlc3RvcmVkLCBhdmdTZWNvbmRzLCBsZXZlbDogZG9yYUxldmVsRm9yUmVzdG9yZShyYXdBdmdTZWNvbmRzKSB9LFxuICAgICAgbGVhZFRpbWU6IHsgZGVwbG95bWVudHM6IGx0RGVwbG95bWVudHMsIG1lZGlhblNlY29uZHMsIGFwcHJveDogdHJ1ZSwgbGV2ZWw6IGRvcmFMZXZlbEZvckxlYWRUaW1lKHJhd01lZGlhblNlY29uZHMpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjliIERPUkEgdHJlbmQg4oCUIGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgY2hhbmdlLWZhaWx1cmUgcmF0ZSBidWNrZXRlZCBieVxuICAgKiBgaW50ZXJ2YWxgIChkYXkvd2Vlay9tb250aCkgZm9yIGEgc3BhcmtsaW5lLiBQZXItZXhlY3V0aW9uIHJvbGx1cCAob25lIHJvd1xuICAgKiBwZXIgZXhlY3V0aW9uLCBGQUlMRUQgd2lucykgYnVja2V0ZWQgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQuIFNoYXJlc1xuICAgKiB0aGUgYGdldERvcmFNZXRyaWNzYCBzY29waW5nIChvcmcvcm9sbHVwLCBwaXBlbGluZUlkLCBkZXBsb3ktc2NvcGluZyk7IE1UVFJcbiAgICogYW5kIGxlYWQgdGltZSBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkICh0b28gaGVhdnkgdG8gYnVja2V0IG1lYW5pbmdmdWxseSkuXG4gICAqL1xuICBhc3luYyBnZXREb3JhVHJlbmQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpbnRlcnZhbDogc3RyaW5nLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGRlcGxveXNPbmx5IH0gPSBvcHRzO1xuICAgIGNvbnN0IHsgcGlwZWxpbmVDbGF1c2UsIGRlcGxveUNsYXVzZSB9ID0gZG9yYVNjb3BlQ2xhdXNlcyhvcHRzKTtcbiAgICAvLyBTYW1lIGV4ZWNzIHJvbGwtdXAgYXMgZ2V0RG9yYU1ldHJpY3MgKHNoYXJlZCBidWlsZGVyIOKAlCBzdGF0dXMgc2V0ICtcbiAgICAvLyBwcmVkaWNhdGUgY2FuJ3QgZHJpZnQpOyB0aGUgdHJlbmQgbmVlZHMgb25seSBzdGFydGVkX2F0IG92ZXIgdGhlIGNvcmVcbiAgICAvLyB3aW5kb3cgKG5vIE1UVFIgbG9vay1haGVhZCwgbm8gZW5kZWRfYXQvZHVyYXRpb24gY29sdW1ucykuXG4gICAgY29uc3QgZXhlY3MgPSBleGVjc0N0ZSh7XG4gICAgICBwcmVkLFxuICAgICAgcGlwZWxpbmVDbGF1c2UsXG4gICAgICBkZXBsb3lDbGF1c2UsXG4gICAgICBmcm9tLFxuICAgICAgY29sdW1uczogc3FsYFxuICAgICAgICAgICAgJHtET1JBX1RFUk1JTkFMX1NUQVRVU19DQVNFfSBBUyBzdGF0dXMsXG4gICAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KSBBUyBzdGFydGVkX2F0YCxcbiAgICAgIHRvQm91bmQ6IHNxbGAke3RvfTo6dGltZXN0YW1wdHpgLFxuICAgIH0pO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgV0lUSCBleGVjcyBBUyAoJHtleGVjc31cbiAgICAgICAgKVxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBzdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBkZXBsb3ltZW50cyxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKSk6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICAtLSBxdW90ZWQgYWxpYXMgc28gdGhlIHJhdyByb3cga2V5IGlzIGV4YWN0bHkgdGhlIERvcmFUcmVuZFBvaW50IGZpZWxkXG4gICAgICAgICAgQ09BTEVTQ0UoUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKSwgMCkgKiAxMDAsIDEpLCAwKTo6ZmxvYXQgQVMgXCJjaGFuZ2VGYWlsdXJlUGN0XCJcbiAgICAgICAgRlJPTSBleGVjc1xuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RG9yYVRyZW5kUG9pbnQ+KHIucm93cykpKTtcbiAgICAvLyBPbWl0IHRoZSBkZXBsb3lzT25seSBtYXJrZXIgd2hlbiBlbnZpcm9ubWVudCBpcyBzZXQ6IGl0IHdpbnMgaW5cbiAgICAvLyBkb3JhU2NvcGVDbGF1c2VzLCBzbyB0aGUgU1FMIChhbmQgdGh1cyB0aGUgY29ycmVjdCBjYWNoZSBrZXkpIGlzIGlkZW50aWNhbFxuICAgIC8vIHRvIHRoZSBlbnZpcm9ubWVudC1vbmx5IGNhc2UuIE9ubHkgYXBwZW5kICdkJyB3aGVuIGl0IGNoYW5nZXMgdGhlIHF1ZXJ5LlxuICAgIGNvbnN0IGRlcGxveU1hcmtlciA9ICFlbnZpcm9ubWVudCAmJiBkZXBsb3lzT25seSA/ICdkJyA6ICcnO1xuICAgIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhLXRyZW5kOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2RlcGxveU1hcmtlcn1gO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAyOiBQbHVnaW4gSW52ZW50b3J5ICYgQnVpbGRzIOKUgOKUgFxuXG4gIC8qKiAyLjEgUGx1Z2luIHN1bW1hcnkg4oCUIGNvdW50cyBhbmQgYnJlYWtkb3ducy5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBhbiBvcmctb3duZWRcbiAgICogIGFzc2V0IGNvdW50LCBub3QgYW4gZXhlY3V0aW9uL2J1aWxkIGFjdGl2aXR5IHJlcG9ydCwgc28gYSBwYXJlbnQncyB2aWV3IGlzXG4gICAqICBpdHMgb3duIHBsdWdpbnMg4oCUIHRlYW1zIG1hbmFnZSB0aGVpciBvd24gaW52ZW50b3J5LiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblN1bW1hcnkob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luU3VtbWFyeT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXN1bW1hcnlgLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIE5PVCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGluYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmFjY2Vzc01vZGlmaWVyfSA9ICdwdWJsaWMnKTo6aW50IEFTIHB1YmxpYyxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5hY2Nlc3NNb2RpZmllcn0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIHByaXZhdGU6IDAsIHVuaXF1ZU5hbWVzOiAwIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIDIuMiBUeXBlICYgY29tcHV0ZSBkaXN0cmlidXRpb24uXG4gICAqICBJTlRFTlRJT05BTExZIFNJTkdMRS1PUkcgKG5vIHJvbGx1cCk6IHBsdWdpbiBpbnZlbnRvcnkgaXMgcGVyLW9yZyAoc2VlXG4gICAqICBnZXRQbHVnaW5TdW1tYXJ5KS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuICBhc3luYyBnZXRQbHVnaW5EaXN0cmlidXRpb24ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VHlwZUNvbXB1dGVEaXN0cmlidXRpb25bXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLWRpc3RyaWJ1dGlvbmAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9IEFTIHBsdWdpbl90eXBlLFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX0gQVMgY29tcHV0ZV90eXBlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgY291bnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9LCAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9XG4gICAgICAgIE9SREVSIEJZIGNvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbj4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi4zIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgLS0gSGlnaGVzdCB2ZXJzaW9uIGJ5IE5VTUVSSUMgc2VtdmVyIGNvcmUgKG5vdCBsZXhpY2FsOiAnMTAuMC4wJyA+ICc5LjAuMCcpLlxuICAgICAgICAgIC0tIFN0cmlwIGFueSAtcHJlcmVsZWFzZS8rYnVpbGQgc3VmZml4IGJlZm9yZSB0aGUgaW50W10gY2FzdCBzbyBpdCBjYW4ndFxuICAgICAgICAgIC0tIGVycm9yIG9uIHZhbGlkIHNlbXZlcjsga2VlcCB0aGUgb3JpZ2luYWwgc3RyaW5nIGZvciBkaXNwbGF5LlxuICAgICAgICAgIChhcnJheV9hZ2coJHtzY2hlbWEucGx1Z2luLnZlcnNpb259XG4gICAgICAgICAgICAgT1JERVIgQlkgc3RyaW5nX3RvX2FycmF5KHJlZ2V4cF9yZXBsYWNlKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufSwgJ1stK10uKiQnLCAnJyksICcuJyk6OmludFtdIERFU0NcbiAgICAgICAgICApKVsxXSBBUyBsYXRlc3RfdmVyc2lvbixcbiAgICAgICAgICBib29sX29yKCR7c2NoZW1hLnBsdWdpbi5pc0RlZmF1bHR9KSBBUyBoYXNfZGVmYXVsdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ubmFtZX1cbiAgICAgICAgT1JERVIgQlkgdmVyc2lvbl9jb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VmVyc2lvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAyLjQgQnVpbGQgc3VjY2VzcyByYXRlIG92ZXIgdGltZS5cbiAgICpcbiAgICogU1RBVFVTIENBU0lORyBOT1RFOiBUaGlzIHF1ZXJ5IGZpbHRlcnMgYnkgYGV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnYFxuICAgKiBhbmQgdXNlcyBsb3dlcmNhc2Ugc3RhdHVzIHZhbHVlcyAoYCdjb21wbGV0ZWQnYCwgYCdmYWlsZWQnYCksIHdoaWxlXG4gICAqIGBnZXRTdWNjZXNzUmF0ZWAgKDEuMikgZmlsdGVycyBieSBgZXZlbnRfdHlwZSA9ICdQSVBFTElORSdgIHdpdGhcbiAgICogdXBwZXJjYXNlIEFXUy1zdHlsZSBzdGF0dXNlcyAoYCdTVUNDRUVERUQnYCwgYCdGQUlMRUQnYCwgYCdDQU5DRUxFRCdgKS5cbiAgICogVGhlIGNhc2luZyBkcmlmdCBpcyBpbnRlbnRpb25hbCBhbmQgdHJhY2tzIHRoZSBwcm9kdWNlcjpcbiAgICogICAtIGBwbHVnaW4tYnVpbGRgIGV2ZW50cyBjb21lIGZyb20gb3VyIG93biBidWlsZCBwaXBlbGluZSAobG93ZXJjYXNlKVxuICAgKiAgIC0gYFBJUEVMSU5FYCBldmVudHMgY29tZSBmcm9tIEFXUyBDb2RlUGlwZWxpbmUgKHVwcGVyY2FzZSlcbiAgICogVGhlIGluZ2VzdCBab2Qgc2NoZW1hIGF0IGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHNcbiAgICogU0hPVUxEIGVudW0gdGhlc2UgcGVyLWV2ZW50U291cmNlIHNvIHdlIGNhdGNoIGRyaWZ0IGF0IGluZ2VzdCByYXRoZXJcbiAgICogdGhhbiBzaWxlbnRseSBwcm9kdWNpbmcgemVybyByb3dzIGhlcmUuIFNlZSBmaW5kaW5ncyBONzEuXG4gICAqL1xuICBhc3luYyBnZXRCdWlsZFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkVGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgLy8gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUgbGlrZSB0aGUgZXhlY3V0aW9uIHJlcG9ydHMuIFRoZXNlXG4gICAgLy8gcm93cyBhcmUgZ2F0ZWQgb24gdGhlIHBpcGVsaW5lX2V2ZW50IGBvcmdfaWRgIGRpcmVjdGx5IChubyBwaXBlbGluZSBqb2luKSxcbiAgICAvLyBzbyBgcHJlZGAgYXBwbGllcyB0byBgZS5vcmdfaWRgLlxuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnZmFpbGVkJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdjb21wbGV0ZWQnLCAnZmFpbGVkJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06YnVpbGQtc3VjY2Vzczoke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDIuNSBCdWlsZCBkdXJhdGlvbiBwZXIgcGx1Z2luLiBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZS4gKi9cbiAgYXN5bmMgZ2V0QnVpbGREdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZER1cmF0aW9uW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGJ1aWxkc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZER1cmF0aW9uPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpidWlsZC1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDIuNiBCdWlsZCBmYWlsdXJlcyDigJQgdG9wIGVycm9yIG1lc3NhZ2VzLiBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZS4gKi9cbiAgYXN5bmMgZ2V0QnVpbGRGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkRmFpbHVyZVtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIGUuZXJyb3JfbWVzc2FnZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUsIGUuZXJyb3JfbWVzc2FnZVxuICAgICAgICBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGRGYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpidWlsZC1mYWlsdXJlczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXBvcnRpbmdTZXJ2aWNlID0gbmV3IFJlcG9ydGluZ1NlcnZpY2UoKTtcbiJdfQ==
|
|
927
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQjtJQUM1QyxJQUFJLENBQUUsZ0JBQXNDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsUUFBUSxzQkFBc0IsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEgsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENB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cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUNhY2hlU2VydmljZSwgY3JlYXRlTG9nZ2VyLCBlcnJvck1lc3NhZ2UsIFJFUE9SVF9JTlRFUlZBTFMsIHNjcnViQXdzSWRlbnRpZmllcnMsIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgaW5BcnJheSwgc3FsLCB0eXBlIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcG9ydGluZy1zZXJ2aWNlJyk7XG5cbi8qKlxuICogRGVmZW5zZS1pbi1kZXB0aCBndWFyZCBmb3IgdGhlIGBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCDigKYpYCBidWNrZXQgYXJndW1lbnQuXG4gKiBUaGUgcm91dGUgbGF5ZXIgKGBwYXJzZVJlcG9ydEludGVydmFsYCkgaXMgdGhlIHNlY3VyaXR5IGJvdW5kYXJ5IGFuZCBhbHJlYWR5XG4gKiByZWplY3RzIHVua25vd24gaW50ZXJ2YWxzOyB0aGlzIGFzc2VydCBtYWtlcyBhbiBpbnZhbGlkIHZhbHVlIGZhaWwgZmFzdCBhdCB0aGVcbiAqIHNlcnZpY2UgYm91bmRhcnkgd2l0aCBhIGNsZWFyIGVycm9yIGluc3RlYWQgb2Ygc3VyZmFjaW5nIGEgcmF3IFBvc3RncmVzIGVycm9yXG4gKiBpZiBhIGNhbGxlciBldmVyIGJ5cGFzc2VzIHRoZSByb3V0ZSB2YWxpZGF0aW9uLiBTaGFyZXMgYXBpLWNvcmUnc1xuICogUkVQT1JUX0lOVEVSVkFMUyBhbGxvdy1saXN0IHNvIHRoZSB0d28gY2FuJ3QgZHJpZnQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCEoUkVQT1JUX0lOVEVSVkFMUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoaW50ZXJ2YWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcG9ydCBpbnRlcnZhbDogJHtpbnRlcnZhbH0uIEV4cGVjdGVkIG9uZSBvZjogJHtSRVBPUlRfSU5URVJWQUxTLmpvaW4oJywgJyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWNoZSBmb3IgcmVwb3J0aW5nIGFnZ3JlZ2F0aW9ucy4gVHdvIHRpZXJzOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMIOKAlCBjaGFuZ2VzIG9uIHBsdWdpbiBDUlVEXG4gKiAtIEV4ZWN1dGlvbi9idWlsZCBxdWVyaWVzIHdpdGggZGF0ZSByYW5nZXM6IDIgbWluIFRUTCDigJQgbmV3IGV2ZW50cyBhcnJpdmUgY29udGludW91c2x5XG4gKi9cbmNvbnN0IGludmVudG9yeUNhY2hlID0gY3JlYXRlQ2FjaGVTZXJ2aWNlKCdyZXBvcnQ6aW52OicsIHBhcnNlSW50KHByb2Nlc3MuZW52LkNBQ0hFX1RUTF9SRVBPUlRfSU5WRU5UT1JZIHx8ICczMDAnLCAxMCkpO1xuY29uc3QgdGltZXNlcmllc0NhY2hlID0gY3JlYXRlQ2FjaGVTZXJ2aWNlKCdyZXBvcnQ6dHM6JywgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ0FDSEVfVFRMX1JFUE9SVF9USU1FU0VSSUVTIHx8ICcxMjAnLCAxMCkpO1xuXG4vLyDilIDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBFeGVjdXRpb25Db3VudCB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgdG90YWw6IG51bWJlcjtcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBjYW5jZWxlZDogbnVtYmVyO1xuICBmaXJzdEV4ZWN1dGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgbGFzdEV4ZWN1dGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIER1cmF0aW9uU3RhdHMge1xuICBpZDogc3RyaW5nO1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWluTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgcDk1TXM6IG51bWJlcjtcbiAgZXhlY3V0aW9uczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUGlwZWxpbmVFeGVjdXRpb24ge1xuICBleGVjdXRpb25JZDogc3RyaW5nO1xuICAvKiogUm9sbGVkLXVwIHRlcm1pbmFsIHN0YXR1czogc3VjY2VlZGVkIHwgZmFpbGVkIHwgY2FuY2VsZWQgfCBpbi1wcm9ncmVzcy4gKi9cbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgZW5kZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgZHVyYXRpb25NczogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIEZpcnN0IGZhaWxpbmcgc3RhZ2UvYWN0aW9uIGZvciB0aGUgZXhlY3V0aW9uIChudWxsIHdoZW4gaXQgZGlkbid0IGZhaWwpLiAqL1xuICBmYWlsaW5nU3RhZ2U6IHN0cmluZyB8IG51bGw7XG4gIGZhaWxpbmdBY3Rpb246IHN0cmluZyB8IG51bGw7XG59XG5cbmludGVyZmFjZSBTdGFnZUZhaWx1cmUge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU3RhZ2VCb3R0bGVuZWNrIHtcbiAgaWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEFjdGlvbkZhaWx1cmUge1xuICBhY3Rpb25OYW1lOiBzdHJpbmc7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEVycm9yRW50cnkge1xuICBlcnJvclBhdHRlcm46IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgYWZmZWN0ZWRQaXBlbGluZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpblN1bW1hcnkge1xuICB0b3RhbDogbnVtYmVyO1xuICBhY3RpdmU6IG51bWJlcjtcbiAgaW5hY3RpdmU6IG51bWJlcjtcbiAgcHVibGljOiBudW1iZXI7XG4gIHByaXZhdGU6IG51bWJlcjtcbiAgdW5pcXVlTmFtZXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uIHtcbiAgcGx1Z2luVHlwZTogc3RyaW5nO1xuICBjb21wdXRlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVmVyc2lvbkNvdW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uQ291bnQ6IG51bWJlcjtcbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xuICBoYXNEZWZhdWx0OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBCdWlsZER1cmF0aW9uIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBidWlsZHM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRmFpbHVyZSB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XG4gIG9jY3VycmVuY2VzOiBudW1iZXI7XG4gIGxhc3RTZWVuOiBzdHJpbmc7XG59XG5cbi8qKiBSYXcgc2luZ2xlLXJvdyBzaGFwZSByZXR1cm5lZCBieSB0aGUgRE9SQSBhZ2dyZWdhdGUgcXVlcnkgKHByZS1zaGFwaW5nKS4gKi9cbi8qKlxuICogSG93IGZhciBwYXN0IHRoZSByZXBvcnQncyBgdG9gIGJvdW5kIHRoZSBET1JBIE1UVFIgcXVlcnkgbWF5IGxvb2sgZm9yIGFcbiAqIGZhaWx1cmUncyByZWNvdmVyaW5nIHJ1bi4gQm91bmRzIHRoZSBzY2FuIHdoaWxlIHN0b3BwaW5nIGEgZmFpbHVyZSBuZWFyIHRoZVxuICogd2luZG93IGVkZ2UgZnJvbSBiZWluZyBzcHVyaW91c2x5IHNjb3JlZCBcIm5ldmVyIHJlc3RvcmVkXCIuIEEgZmFpbHVyZSB0aGF0XG4gKiBoYXMgbm90IHJlY292ZXJlZCB3aXRoaW4gdGhpcyB3aW5kb3cgc3RheXMgY291bnRlZCBhcyBhbiBvcGVuIGluY2lkZW50LlxuICovXG5jb25zdCBNVFRSX1JFU1RPUkVfTE9PS0FIRUFEID0gJzMwIGRheXMnO1xuXG4vKipcbiAqIERPUkEgcGVyZm9ybWFuY2UgYmFuZC4gYG51bGxgID0gaW5zdWZmaWNpZW50IGRhdGEgdG8gY2xhc3NpZnkgKG5vXG4gKiBkZXBsb3ltZW50cy9mYWlsdXJlcy9sZWFkLXRpbWUgc2FtcGxlIGluIHRoZSB3aW5kb3cpLCBzbyB0aGUgVUkgc2hvd3MgYVxuICogbmV1dHJhbCBzdGF0ZSByYXRoZXIgdGhhbiBtaXNsYWJlbGluZyBhbiBlbXB0eSB3aW5kb3cgYXMgXCJsb3dcIi5cbiAqL1xuZXhwb3J0IHR5cGUgRG9yYUxldmVsID0gJ2VsaXRlJyB8ICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdycgfCBudWxsO1xuXG4vKiogT3B0aW9uYWwgc2NvcGluZyBmb3Ige0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuZ2V0RG9yYU1ldHJpY3N9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhT3B0aW9ucyB7XG4gIC8qKiBSZXN0cmljdCB0byBhIHNpbmdsZSBwaXBlbGluZSAocGVyLXBpcGVsaW5lIERPUkEpLiAqL1xuICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICAvKiogQ291bnQgb25seSBleGVjdXRpb25zIGRlcGxveWVkIHRvIHRoaXMgZW52aXJvbm1lbnQgKGRlcGxveS1zY29wZWQpLiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgLyoqIENvdW50IG9ubHkgZXhlY3V0aW9ucyB0YWdnZWQgd2l0aCBBTlkgZW52aXJvbm1lbnQgKHJlYWwgZGVwbG95bWVudHMpLiAqL1xuICBkZXBsb3lzT25seT86IGJvb2xlYW47XG59XG5cbi8vIERPUkEgcGVyZm9ybWFuY2UgYmFuZHMgKHRocmVzaG9sZHMgZnJvbSB0aGUgRE9SQS9BY2NlbGVyYXRlIHJlcG9ydHMpLiBFYWNoXG4vLyBoZWxwZXIgcmV0dXJucyBgbnVsbGAgd2hlbiB0aGVyZSdzIG5vIHNhbXBsZSB0byBjbGFzc2lmeS5cbi8qKiBEZXBsb3ltZW50IGZyZXF1ZW5jeSBieSBkZXBsb3lzL2RheTogZWxpdGUg4omlMS9kYXksIGhpZ2gg4omlMS93ZWVrLCBtZWRpdW0g4omlMS9tb250aC4gKi9cbmZ1bmN0aW9uIGRvcmFMZXZlbEZvckZyZXF1ZW5jeShwZXJEYXk6IG51bWJlciwgZGVwbG95bWVudHM6IG51bWJlcik6IERvcmFMZXZlbCB7XG4gIGlmIChkZXBsb3ltZW50cyA8PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBlckRheSA+PSAxKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKHBlckRheSA+PSAxIC8gNykgcmV0dXJuICdoaWdoJztcbiAgaWYgKHBlckRheSA+PSAxIC8gMzApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIENoYW5nZSBmYWlsdXJlIHJhdGUgYnkgcGVyY2VudDogZWxpdGUg4omkNSUsIGhpZ2gg4omkMTAlLCBtZWRpdW0g4omkMTUlLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShwY3Q6IG51bWJlciwgdG90YWw6IG51bWJlcik6IERvcmFMZXZlbCB7XG4gIGlmICh0b3RhbCA8PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBjdCA8PSA1KSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKHBjdCA8PSAxMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKHBjdCA8PSAxNSkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogVGltZSB0byByZXN0b3JlIGJ5IHNlY29uZHM6IGVsaXRlIDwxaCwgaGlnaCA8MSBkYXksIG1lZGl1bSA8MSB3ZWVrLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yUmVzdG9yZShhdmdTZWNvbmRzOiBudW1iZXIgfCBudWxsKTogRG9yYUxldmVsIHtcbiAgaWYgKGF2Z1NlY29uZHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmIChhdmdTZWNvbmRzIDwgMzYwMCkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChhdmdTZWNvbmRzIDwgODY0MDApIHJldHVybiAnaGlnaCc7XG4gIGlmIChhdmdTZWNvbmRzIDwgNjA0ODAwKSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cbi8qKiBMZWFkIHRpbWUgYnkgc2Vjb25kczogZWxpdGUgPDEgZGF5LCBoaWdoIDwxIHdlZWssIG1lZGl1bSA8MSBtb250aC4gKi9cbmZ1bmN0aW9uIGRvcmFMZXZlbEZvckxlYWRUaW1lKG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAobWVkaWFuU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgNjA0ODAwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDI1OTIwMDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuXG4vKipcbiAqIFJvdW5kIGB2YWx1ZWAgdG8gYGRpZ2l0c2AgZGVjaW1hbCBwbGFjZXMsIHJldHVybmluZyBhIHJlYWwgbnVtYmVyLiBTbWFsbFxuICogbW9kdWxlLXByaXZhdGUgaGVscGVyIHNvIHRoZSBET1JBIHNoYXBpbmcgZG9lc24ndCByZXBlYXQgdGhlXG4gKiBgTnVtYmVyKE51bWJlcih4KS50b0ZpeGVkKG4pKWAgcGF0dGVybiAodG9GaXhlZCBhbG9uZSB5aWVsZHMgYSBzdHJpbmcpLlxuICovXG5mdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyLCBkaWdpdHM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZChkaWdpdHMpKTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgcGVyLWV4ZWN1dGlvbiB0ZXJtaW5hbC1zdGF0dXMgcm9sbC11cCBmb3IgdGhlIERPUkEgYGV4ZWNzYCBDVEVzOlxuICogRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELCBlbHNlIENBTkNFTEVEL1NUT1BQRUQuIEtlcHQgaW4gb25lIHBsYWNlIHNvXG4gKiBnZXREb3JhTWV0cmljcyBhbmQgZ2V0RG9yYVRyZW5kIGNhbid0IGRyaWZ0IG9uIHRoZSBwcmVjZWRlbmNlLlxuICovXG5jb25zdCBET1JBX1RFUk1JTkFMX1NUQVRVU19DQVNFID0gc3FsYFxuICAgICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5zdGF0dXMgPSAnRkFJTEVEJykgVEhFTiAnRkFJTEVEJ1xuICAgICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnU1VDQ0VFREVEJ1xuICAgICAgICAgICAgICBFTFNFICdDQU5DRUxFRCdcbiAgICAgICAgICAgIEVORGA7XG5cbi8qKlxuICogT3B0aW9uYWwgcGVyLXBpcGVsaW5lIC8gZGVwbG95LXNjb3BpbmcgcHJlZGljYXRlcyArIHRoZSByZXN1bHRpbmcgYGJhc2lzYCxcbiAqIHNoYXJlZCBieSBnZXREb3JhTWV0cmljcyBhbmQgZ2V0RG9yYVRyZW5kIHNvIHRoZSBlbnYvZGVwbG95c09ubHkgcHJlY2VkZW5jZVxuICogY2FuJ3QgZGl2ZXJnZS4gYGVudmlyb25tZW50YCAob25lIHRhcmdldCkgd2lucyBvdmVyIGBkZXBsb3lzT25seWAgKGFueSBlbnYpLlxuICovXG5mdW5jdGlvbiBkb3JhU2NvcGVDbGF1c2VzKG9wdHM6IERvcmFPcHRpb25zKSB7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGRlcGxveXNPbmx5IH0gPSBvcHRzO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWQgPyBzcWxgQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9YCA6IHNxbGBgO1xuICBjb25zdCBkZXBsb3lDbGF1c2UgPSBlbnZpcm9ubWVudFxuICAgID8gc3FsYEFORCBlLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gXG4gICAgOiBkZXBsb3lzT25seSA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTGAgOiBzcWxgYDtcbiAgY29uc3QgYmFzaXM6ICdkZXBsb3knIHwgJ3J1bicgPSBlbnZpcm9ubWVudCB8fCBkZXBsb3lzT25seSA/ICdkZXBsb3knIDogJ3J1bic7XG4gIHJldHVybiB7IHBpcGVsaW5lQ2xhdXNlLCBkZXBsb3lDbGF1c2UsIGJhc2lzIH07XG59XG5cbi8qKlxuICogU2hhcmVkIGBleGVjc2AgQ1RFIGJvZHkg4oCUIHRoZSBwZXItZXhlY3V0aW9uIHRlcm1pbmFsIHJvbGwtdXAgdGhhdCBCT1RIIERPUkFcbiAqIG1ldGhvZHMgc2Nhbi4gT25seSB0aGUgU0VMRUNUZWQgY29sdW1ucyBhbmQgdGhlIHVwcGVyIHJhbmdlIGJvdW5kIGRpZmZlclxuICogKGdldERvcmFNZXRyaWNzIG5lZWRzIHBpcGVsaW5lX2lkL2VuZGVkX2F0L2R1cmF0aW9uX21zIHBsdXMgYSBsb29rLWFoZWFkIHRhaWxcbiAqIGZvciBNVFRSIHJlY292ZXJ5OyBnZXREb3JhVHJlbmQgbmVlZHMgb25seSBzdGFydGVkX2F0IG92ZXIgdGhlIGNvcmUgd2luZG93KSxcbiAqIHNvIHRob3NlIGFyZSB0aGUgcGFyYW1ldGVycy4gVGhlIGBldmVudF90eXBlPSdQSVBFTElORSdgIGdhdGUsIHRoZVxuICogU1VDQ0VFREVEL0ZBSUxFRC9DQU5DRUxFRC9TVE9QUEVEIHN0YXR1cyBzZXQsIHRoZSBgZXhlY3V0aW9uX2lkYCBmaWx0ZXIsIHRoZVxuICogb3JnICsgZGVwbG95L3BpcGVsaW5lIHNjb3BlIGNsYXVzZXMsIGFuZCB0aGUgYEdST1VQIEJZYCBhbGwgbGl2ZSBoZXJlIHNvIHRoZVxuICogdHdvIGNhbGxlcnMgY2FuJ3QgZHJpZnQgb24gdGhlIHN0YXR1cyBzZXQgb3IgdGhlIHByZWRpY2F0ZS5cbiAqXG4gKiBAcGFyYW0gY29sdW1ucyAgdHJhaWxpbmcgU0VMRUNUIGNvbHVtbnMgKGFmdGVyIGBlLmV4ZWN1dGlvbl9pZCxgKVxuICogQHBhcmFtIHRvQm91bmQgIHRoZSBgPD1gIHVwcGVyLWJvdW5kIGV4cHJlc3Npb24gb24gYGUuc3RhcnRlZF9hdGBcbiAqICAgICAgICAgICAgICAgICAoY29yZSB3aW5kb3cgZm9yIHRoZSB0cmVuZDsgY29yZSArIGxvb2stYWhlYWQgZm9yIG1ldHJpY3MpXG4gKi9cbmZ1bmN0aW9uIGV4ZWNzQ3RlKGFyZ3M6IHtcbiAgcHJlZDogU1FMO1xuICBjb2x1bW5zOiBTUUw7XG4gIHBpcGVsaW5lQ2xhdXNlOiBTUUw7XG4gIGRlcGxveUNsYXVzZTogU1FMO1xuICBmcm9tOiBzdHJpbmc7XG4gIHRvQm91bmQ6IFNRTDtcbn0pOiBTUUwge1xuICBjb25zdCB7IHByZWQsIGNvbHVtbnMsIHBpcGVsaW5lQ2xhdXNlLCBkZXBsb3lDbGF1c2UsIGZyb20sIHRvQm91bmQgfSA9IGFyZ3M7XG4gIHJldHVybiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgICR7Y29sdW1uc31cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJ1xuICAgICAgICAgIC0tIFNUT1BQRUQgKG1hbnVhbGx5IGFib3J0ZWQpIGpvaW5zIENBTkNFTEVEIGluIHRoZSBFTFNFIGJ1Y2tldDsgYm90aFxuICAgICAgICAgIC0tIGFyZSB0ZXJtaW5hbCBub24tZGVwbG95IG91dGNvbWVzLiBTVVBFUlNFREVEIHN0YXlzIGV4Y2x1ZGVkIChhXG4gICAgICAgICAgLS0gcmVwbGFjZWQgZXhlY3V0aW9uLCBub3QgYW4gb3V0Y29tZSkuXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJylcbiAgICAgICAgICBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3BpcGVsaW5lQ2xhdXNlfVxuICAgICAgICAgICR7ZGVwbG95Q2xhdXNlfVxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHpcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG9Cb3VuZH1cbiAgICAgICAgR1JPVVAgQlkgZS5leGVjdXRpb25faWQsIGUucGlwZWxpbmVfaWRgO1xufVxuXG5pbnRlcmZhY2UgRG9yYVJvdyB7XG4gIGRmX2RlcGxveW1lbnRzPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgY2ZyX2ZhaWxlZD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNmcl90b3RhbD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGx0X2RlcGxveW1lbnRzPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbHRfbWVkaWFuX21zPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbXR0cl9mYWlsdXJlcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIG10dHJfcmVzdG9yZWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBtdHRyX2F2Z19zZWNvbmRzPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBET1JBIG1ldHJpY3Mgb3ZlciBhIFtmcm9tLHRvXSB3aW5kb3csIG9yZy1zY29wZWQgKHNpbmdsZS1vcmcgb3Igcm9sbHVwIHN1YnRyZWUpLlxuICpcbiAqIEEgXCJkZXBsb3ltZW50XCIgaXMgYSBURVJNSU5BTCBwaXBlbGluZS1sZXZlbCBldmVudCwgcm9sbGVkIHVwIHRvIG9uZSByb3cgcGVyXG4gKiBgZXhlY3V0aW9uX2lkYCAoRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELCB0aGVuIENBTkNFTEVEL1NUT1BQRUQg4oCUIHNhbWVcbiAqIHByZWNlZGVuY2UgYXMgYGxpc3RQaXBlbGluZUV4ZWN1dGlvbnNgKS5cbiAqXG4gKiBESVNDTE9TVVJFIOKAlCB0aGVzZSBhcmUgUlVOLUJBU0VEIGFwcHJveGltYXRpb25zIG9mIERPUkEuIEEgXCJkZXBsb3ltZW50XCIgaGVyZVxuICogaXMgYW55IHN1Y2Nlc3NmdWwgcGlwZWxpbmUgUlVOLCBub3QgYSB2ZXJpZmllZCBwcm9kdWN0aW9uIGRlcGxveW1lbnQ6IHRoZVxuICogZXZlbnQgc3RyZWFtIGNhcnJpZXMgbm8gZGVwbG95LXN0YWdlL2Vudmlyb25tZW50IG1hcmtlciwgc28gYSBDSS1vbmx5XG4gKiBidWlsZC90ZXN0IHBpcGVsaW5lIGNvdW50cyB0aGUgc2FtZSBhcyBvbmUgdGhhdCBzaGlwcyB0byBwcm9kLiBUaGF0IG1ha2VzXG4gKiBgZGVwbG95bWVudEZyZXF1ZW5jeWAgYSBwaXBlbGluZS10aHJvdWdocHV0IHNpZ25hbCBhbmQgYGNoYW5nZUZhaWx1cmVSYXRlYCBhXG4gKiBwaXBlbGluZS1mYWlsdXJlIHJhdGUgKGJ1aWxkL3Rlc3QgZmFpbHVyZXMgY2F1Z2h0IGluIENJIGNvdW50IHRvbyksIGFuZCBNVFRSXG4gKiBhIHBpcGVsaW5lLXJlY292ZXJ5IHRpbWUuIE9ubHkgYGxlYWRUaW1lYCBjYXJyaWVzIGFuIGV4cGxpY2l0IGBhcHByb3hgIGZsYWdcbiAqIChpdCBpcyBhZGRpdGlvbmFsbHkgYSBydW4tdGltZSBwcm94eSksIGJ1dCBBTEwgZm91ciBzaGFyZSB0aGUgcnVu4omgZGVwbG95XG4gKiBjYXZlYXQgdW50aWwgZGVwbG95L2NvbW1pdCBtZXRhZGF0YSBpcyBjYXB0dXJlZC4gU2VlIGRvY3MvZG9yYS1tZXRyaWNzLm1kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFNZXRyaWNzIHtcbiAgLyoqIFRoZSBbZnJvbSx0b10gd2luZG93IGVjaG9lZCBiYWNrIChzdGFydGVkX2F0IHJhbmdlKS4gKi9cbiAgd2luZG93OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9O1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbnVtYmVycyBjb3VudCByZWFsIGRlcGxveW1lbnRzIG9yIHBpcGVsaW5lIHJ1bnM6XG4gICAqIC0gYCdkZXBsb3knYCDigJQgc2NvcGVkIHRvIGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggYSBkZXBsb3kgYGVudmlyb25tZW50YFxuICAgKiAgICh2aWEgYGVudmlyb25tZW50YC9gZGVwbG95c09ubHlgKTsgYSBnZW51aW5lIGRlcGxveW1lbnQgc2lnbmFsLlxuICAgKiAtIGAncnVuJ2Ag4oCUIGRlZmF1bHQ6IGV2ZXJ5IHN1Y2Nlc3NmdWwgUElQRUxJTkUgcnVuIGNvdW50cyAobm8gZGVwbG95XG4gICAqICAgbWFya2VyIGFwcGxpZWQpLiBERi9DRlIvTVRUUiB0aGVuIHJlZmxlY3QgcGlwZWxpbmUgYWN0aXZpdHksIG5vdCBkZXBsb3lzLlxuICAgKi9cbiAgYmFzaXM6ICdkZXBsb3knIHwgJ3J1bic7XG4gIC8qKiBUaGUgc2NvcGluZyBhcHBsaWVkIChlY2hvZWQgZm9yIHRoZSBVSSk7IGBudWxsYCB3aGVuIHVuc2NvcGVkLiAqL1xuICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ6IHN0cmluZyB8IG51bGw7IGVudmlyb25tZW50OiBzdHJpbmcgfCBudWxsIH07XG4gIC8qKiBEZXBsb3ltZW50IEZyZXF1ZW5jeSDigJQgU1VDQ0VFREVEIHRlcm1pbmFsIGRlcGxveW1lbnRzIGluIHRoZSB3aW5kb3cuICovXG4gIGRlcGxveW1lbnRGcmVxdWVuY3k6IHtcbiAgICAvKiogQ291bnQgb2Ygc3VjY2Vzc2Z1bCBkZXBsb3ltZW50cy4gKi9cbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIC8qKiBTdWNjZXNzZnVsIGRlcGxveW1lbnRzIHBlciBkYXkgb3ZlciB0aGUgd2luZG93LiAqL1xuICAgIHBlckRheTogbnVtYmVyO1xuICAgIC8qKiBQZXJmb3JtYW5jZSBiYW5kLCBvciBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBkZXBsb3ltZW50cy4gKi9cbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKiogQ2hhbmdlIEZhaWx1cmUgUmF0ZSDigJQgZmFpbGVkIC8gKHN1Y2NlZWRlZCArIGZhaWxlZCk7IENBTkNFTEVEIGV4Y2x1ZGVkLiAqL1xuICBjaGFuZ2VGYWlsdXJlUmF0ZToge1xuICAgIGZhaWxlZDogbnVtYmVyO1xuICAgIC8qKiBzdWNjZWVkZWQgKyBmYWlsZWQgKHRoZSBDRlIgZGVub21pbmF0b3IpLiAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgLyoqIGZhaWxlZC90b3RhbCBhcyBhIHBlcmNlbnRhZ2UsIDDigJMxMDAsIDEgZGVjaW1hbC4gKi9cbiAgICBwY3Q6IG51bWJlcjtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gZGVwbG95bWVudHMgdG8ganVkZ2UuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqIE1lYW4gVGltZSBUbyBSZXN0b3JlIOKAlCBhdmcgZ2FwIGZyb20gYSBmYWlsdXJlIElOQ0lERU5UIHRvIGl0cyByZWNvdmVyeS5cbiAgICogIENvbnNlY3V0aXZlIGZhaWxlZCBydW5zIG9mIGEgcGlwZWxpbmUgKHdpdGggbm8gZ3JlZW4gcnVuIGJldHdlZW4pIGNvbGxhcHNlXG4gICAqICBpbnRvIG9uZSBpbmNpZGVudDsgdGhlIGdhcCBpcyBtZWFzdXJlZCBmcm9tIHRoZSBmaXJzdCBmYWlsdXJlJ3MgRU5EIHRvIHRoZVxuICAgKiAgcmVjb3ZlcmluZyBydW4ncyBFTkQuIFRoZSByZWNvdmVyeSBpcyB2aXNpYmxlIHVwIHRvIGEgbG9vay1haGVhZCBwYXN0IGB0b2BcbiAgICogIHNvIGEgZmFpbHVyZSBuZWFyIHRoZSB3aW5kb3cgZWRnZSBpc24ndCBzcHVyaW91c2x5IGNvdW50ZWQgdW5yZXN0b3JlZC4gKi9cbiAgbWVhblRpbWVUb1Jlc3RvcmU6IHtcbiAgICAvKiogRmFpbHVyZSBpbmNpZGVudHMgaW4gdGhlIHdpbmRvdyAobWF4aW1hbCBydW5zIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzKS4gKi9cbiAgICBmYWlsdXJlczogbnVtYmVyO1xuICAgIC8qKiBJbmNpZGVudHMgdGhhdCB3ZXJlIGZvbGxvd2VkIGJ5IGEgc3VjY2VlZGVkIHJ1biAocmVjb3ZlcmVkKS4gKi9cbiAgICByZXN0b3JlZDogbnVtYmVyO1xuICAgIC8qKiBBdmVyYWdlIHJlc3RvcmUgZ2FwIGluIHNlY29uZHM7IG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIGluY2lkZW50cy4gKi9cbiAgICBhdmdTZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBQZXJmb3JtYW5jZSBiYW5kLCBvciBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBpbmNpZGVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqIExlYWQgVGltZSDigJQgUFJPWFk6IG1lZGlhbiBwaXBlbGluZSBSVU4gVElNRSBvZiBzdWNjZWVkZWQgZGVwbG95bWVudHMuXG4gICAqICBOT1QgdHJ1ZSBjb21taXTihpJwcm9kIGxlYWQgdGltZSAoZXhlY3V0aW9ucyBkb24ndCBjYXB0dXJlIGNvbW1pdCB0aW1lKSxcbiAgICogIGhlbmNlIGBhcHByb3g6IHRydWVgIHNvIHRoZSBVSS9kb2NzIGNhbiBsYWJlbCBpdC4gKi9cbiAgbGVhZFRpbWU6IHtcbiAgICAvKiogU3VjY2VlZGVkIGRlcGxveW1lbnRzIHdpdGggYSBkdXJhdGlvbiAodGhlIG1lZGlhbiBzYW1wbGUpLiAqL1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgLyoqIE1lZGlhbiBydW4gdGltZSBpbiBzZWNvbmRzOyBudWxsIHdoZW4gbm8gc3VjY2Vzc2Z1bCBkZXBsb3ltZW50cy4gKi9cbiAgICBtZWRpYW5TZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIGFwcHJveDogdHJ1ZTtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gc3VjY2Vzc2Z1bCBkZXBsb3ltZW50cy4gKi9cbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xufVxuXG4vKiogT25lIGludGVydmFsIGJ1Y2tldCBvZiB0aGUgRE9SQSB0cmVuZCAoZGVwbG95bWVudCBmcmVxdWVuY3kgKyBjaGFuZ2UgZmFpbHVyZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFUcmVuZFBvaW50IHtcbiAgLyoqIEJ1Y2tldCBzdGFydCAoREFURV9UUlVOQyBvZiBzdGFydGVkX2F0KSwgSVNPIHRleHQuICovXG4gIHBlcmlvZDogc3RyaW5nO1xuICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ltZW50cyBpbiB0aGUgYnVja2V0LiAqL1xuICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAvKiogRmFpbGVkIGRlcGxveW1lbnRzIGluIHRoZSBidWNrZXQuICovXG4gIGZhaWxlZDogbnVtYmVyO1xuICAvKiogc3VjY2VlZGVkICsgZmFpbGVkIGluIHRoZSBidWNrZXQuICovXG4gIHRvdGFsOiBudW1iZXI7XG4gIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50ICgwIHdoZW4gdG90YWwgaXMgMCkuICovXG4gIGNoYW5nZUZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuLyoqIEV2ZW50IHBheWxvYWQgYWNjZXB0ZWQgYnkgYFJlcG9ydGluZ1NlcnZpY2UuaW5nZXN0RXZlbnRzYC4gTWlycm9ycyB0aGUgcm91dGUncyBab2Qgc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdEV2ZW50IHtcbiAgLyoqIFN0YWJsZSBwaXBlbGluZSBpZCB0aGUgZXZlbnRzIExhbWJkYSByZWFkIGZyb20gdGhlIGBQSVBFTElORV9FVkVOVF9JRGBcbiAgICogIHRhZyAoPSB0aGUgcGxhdGZvcm0gcGlwZWxpbmVJZCkuIFRoZSByZWdpc3RyeSBqb2luIGtleS4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfCAnY29kZWJ1aWxkJyB8ICdwbHVnaW4tYnVpbGQnO1xuICBldmVudFR5cGU6ICdQSVBFTElORScgfCAnU1RBR0UnIHwgJ0FDVElPTicgfCAnQlVJTEQnO1xuICBzdGF0dXM6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ/OiBzdHJpbmc7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGZhaWx1cmUgcmVhc29uIChBY3Rpb24gZXZlbnRzKS4gKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICAvKiogU291cmNlIGNvbW1pdCBpZCBvZiB0aGUgY2hhbmdlIGJlaW5nIHNoaXBwZWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIHJlZi9icmFuY2ggKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gKi9cbiAgY29tbWl0UmVmPzogc3RyaW5nO1xuICAvKiogRGVwbG95IHRhcmdldCAoZS5nLiBcInByb2R1Y3Rpb25cIikuIEl0cyBwcmVzZW5jZSBtYXJrcyBhIHJlYWwgZGVwbG95bWVudC4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQ291bnRzICsgdGhlIChwb3NzaWJseSB0cnVuY2F0ZWQpIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyB0aGUgY2FsbGVyIGNhbiBsb2cuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdFJlc3VsdCB7XG4gIGluc2VydGVkOiBudW1iZXI7XG4gIHNraXBwZWQ6IG51bWJlcjtcbiAgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHM6IHN0cmluZ1tdO1xufVxuXG4vLyDilIDilIDilIAgU2VydmljZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSZWFkLW9ubHkgcmVwb3J0aW5nIHNlcnZpY2UgZm9yIHBpcGVsaW5lIGV4ZWN1dGlvbiBhbmQgcGx1Z2luIGludmVudG9yeSBhZ2dyZWdhdGlvbnMuXG4gKiBEb2VzIG5vdCBleHRlbmQgQ3J1ZFNlcnZpY2Ug4oCUIHJlcG9ydHMgYXJlIGFnZ3JlZ2F0ZSBxdWVyaWVzLCBub3QgZW50aXR5IENSVUQuXG4gKlxuICogQWxsIHF1ZXJpZXMgYXJlIGNhY2hlZCBpbi1tZW1vcnkgdG8gYXZvaWQgcmVwZWF0ZWQgZXhwZW5zaXZlIFNRTCBhZ2dyZWdhdGlvbnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVExcbiAqIC0gVGltZXNlcmllcyBxdWVyaWVzIChleGVjdXRpb24vYnVpbGQgbWV0cmljcyB3aXRoIGRhdGUgcmFuZ2VzKTogMiBtaW4gVFRMXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBvcnRpbmdTZXJ2aWNlIHtcblxuICAvKiogSW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlcG9ydHMgZm9yIGFuIG9yZyAoY2FsbCBhZnRlciBldmVudCBpbmdlc3QpLiAqL1xuICBhc3luYyBpbnZhbGlkYXRlT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBpbnZlbnRvcnlDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgICAgdGltZXNlcmllc0NhY2hlLmludmFsaWRhdGVQYXR0ZXJuKGAke29yZ0lkfToqYCksXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBpbmNvbWluZyBldmVudHMgYWdhaW5zdCB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIGJhdGNoLWluc2VydCB0aGVcbiAgICogbWF0Y2hlZCBvbmVzLCBhbmQgaW52YWxpZGF0ZSByZXBvcnRpbmcgY2FjaGVzIGZvciBhZmZlY3RlZCBvcmdzLlxuICAgKiBFdmVudHMgZm9yIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgYXJlIGRyb3BwZWQgKGFuZCBsb2dnZWQgYXQgV0FSTlxuICAgKiB3aXRoIHNhbXBsZSBpZHMgc28gYW4gb3BlcmF0b3IgY2FuIHNlZSB3aGVuIEV2ZW50QnJpZGdlIGlzIGRlbGl2ZXJpbmdcbiAgICogZXZlbnRzIGZvciBwaXBlbGluZXMgdGhhdCBoYXZlbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0KS5cbiAgICpcbiAgICogUmV0dXJucyBjb3VudHMgKyBhIHNhbXBsZSBvZiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGZvciBvYnNlcnZhYmlsaXR5LlxuICAgKi9cbiAgYXN5bmMgaW5nZXN0RXZlbnRzKGV2ZW50czogSW5nZXN0RXZlbnRbXSk6IFByb21pc2U8SW5nZXN0UmVzdWx0PiB7XG4gICAgLy8gTXVsdGktb3JnIGJhdGNoIGluc2VydDogdGhlIGNhbGxlciByZXNvbHZlcyB0byBtdWx0aXBsZSBvcmdzIHZpYSB0aGVcbiAgICAvLyBwaXBlbGluZS1yZWdpc3RyeSBsb29rdXAgYmVsb3csIHNvIHRoZSByb3V0ZSBsYXllciBNVVNUIGVzdGFibGlzaCBhXG4gICAgLy8gYHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIC4uLilgIHNjb3BlIGJlZm9yZSBjYWxsaW5nXG4gICAgLy8gdGhpcyBtZXRob2QuIFVuZGVyIEZPUkNFJ2QgUkxTLCBhIHNpbmdsZSB0eCB3aXRoIGBhcHAub3JnX2lkID0gPG9uZVxuICAgIC8vIG9yZz5gIGNvdWxkIG9ubHkgd3JpdGUgZXZlbnRzIGZvciB0aGF0IG9yZzsgYnlwYXNzIHZpYSBzeXNhZG1pbiBpc1xuICAgIC8vIHRoZSByaWdodCBnYXRlIGZvciB0aGlzIHNlcnZlci1pbnRlcm5hbCBjcm9zcy10ZW5hbnQgZW5kcG9pbnQuIFNlZVxuICAgIC8vIGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHMgZm9yIHRoZSB3cmFwcGVyLlxuICAgIC8vIFJ1biBpbnNlcnQgaW5zaWRlIHRoZSB0eCwgYnV0IENPTExFQ1QgYWZmZWN0ZWQgb3JncyBhbmQgaW52YWxpZGF0ZVxuICAgIC8vIGNhY2hlcyBBRlRFUiB0aGUgdHggcmVzb2x2ZXMuIEtlZXBpbmcgaW52YWxpZGF0aW9uIGluc2lkZSB0aGUgdHggaGVsZFxuICAgIC8vIHRoZSBwZyBsb2NrcyBvcGVuIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhY2hlIHJvdW5kLXRyaXBzIChSZWRpcyBvclxuICAgIC8vIGluLW1lbW9yeSBpbnZhbGlkYXRpb25zIGFyZSB1bnJlbGF0ZWQgdG8gdGhlIHR4IGJ1dCBzdGlsbCBzZXJpYWxpemVkXG4gICAgLy8gaXRzIGNvbW1pdCkuIENhY2hlIFRUTCBpcyAyLTUgbWluIHNvIGZpcmUtYW5kLWZvcmdldCBwb3N0LWNvbW1pdCBpc1xuICAgIC8vIGFuIGFjY2VwdGFibGUgdHJhZGUgZm9yIHRpZ2h0ZXIgbG9jayB3aW5kb3dzLlxuICAgIGNvbnN0IHsgaW5zZXJ0ZWQsIHNraXBwZWQsIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLCBhZmZlY3RlZE9yZ3MgfSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIC8vIEJhdGNoLXJlc29sdmUgYWxsIHVuaXF1ZSBwaXBlbGluZSBpZHMgaW4gb25lIHF1ZXJ5XG4gICAgICBjb25zdCB1bmlxdWVJZHMgPSBbLi4ubmV3IFNldChldmVudHMubWFwKGUgPT4gZS5waXBlbGluZUlkKSldO1xuICAgICAgY29uc3QgcmVnaXN0cnlSb3dzID0gYXdhaXQgdHhcbiAgICAgICAgLnNlbGVjdCh7XG4gICAgICAgICAgcGlwZWxpbmVJZDogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICAgICAgICBvcmdJZDogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkub3JnSWQsXG4gICAgICAgIH0pXG4gICAgICAgIC5mcm9tKHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5KVxuICAgICAgICAud2hlcmUoaW5BcnJheShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5waXBlbGluZUlkLCB1bmlxdWVJZHMpKTtcblxuICAgICAgY29uc3QgaWRNYXAgPSBuZXcgTWFwKHJlZ2lzdHJ5Um93cy5tYXAociA9PiBbci5waXBlbGluZUlkLCByXSkpO1xuXG4gICAgICAvLyBCdWlsZCBpbnNlcnQgYmF0Y2ggKHNraXAgZXZlbnRzIHdob3NlIHBpcGVsaW5lIGlzbid0IHJlZ2lzdGVyZWQpXG4gICAgICBjb25zdCByb3dzOiBBcnJheTx0eXBlb2Ygc2NoZW1hLnBpcGVsaW5lRXZlbnQuJGluZmVySW5zZXJ0PiA9IFtdO1xuICAgICAgbGV0IHNraXBwZWRMb2NhbCA9IDA7XG4gICAgICBjb25zdCB1bnJlZ2lzdGVyZWRMb2NhbDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBpZE1hcC5nZXQoZXZlbnQucGlwZWxpbmVJZCk7XG4gICAgICAgIGlmICghcmVnaXN0cnkpIHtcbiAgICAgICAgICBza2lwcGVkTG9jYWwrKztcbiAgICAgICAgICB1bnJlZ2lzdGVyZWRMb2NhbC5wdXNoKGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAvLyByZWdpc3RyeS5waXBlbGluZUlkID09PSBldmVudC5waXBlbGluZUlkOyB1c2UgdGhlIHJlZ2lzdHJ5J3Mgc28gdGhlXG4gICAgICAgICAgLy8gRksgaXMgYWx3YXlzIGEgcm93IHRoYXQgZXhpc3RzLCBhbmQgcHVsbCBvcmdJZCBmcm9tIHRoZSByZWdpc3RyeSBmb3JcbiAgICAgICAgICAvLyB0ZW5hbmN5IChuZXZlciB0cnVzdCB0aGUgY2FsbGVyJ3MgY2xhaW1lZCBvcmcpLlxuICAgICAgICAgIHBpcGVsaW5lSWQ6IHJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgICAgIGV2ZW50U291cmNlOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgICBzdGF0dXM6IGV2ZW50LnN0YXR1cyxcbiAgICAgICAgICAvLyBleGVjdXRpb25JZCBpcyBhbiBBV1MtQVNTSUdORUQgaWRlbnRpZmllciAoYSBVVUlEKSwgbm90IGZyZWUtZm9ybVxuICAgICAgICAgIC8vIHVzZXIgdGV4dCwgc28gaXQgY2FuJ3QgY2FycnkgYW4gYWNjb3VudCBpZCDigJQgYW5kIHNjcnViYmluZyBhIFVVSURcbiAgICAgICAgICAvLyB0aGF0IGhhcHBlbnMgdG8gY29udGFpbiBhIDEyLWRpZ2l0IHJ1biB3b3VsZCBjb3JydXB0IHRoZSBjb3JyZWxhdGlvblxuICAgICAgICAgIC8vIGtleS4gTGVmdCBpbnRhY3QgYnkgZGVzaWduLlxuICAgICAgICAgIGV4ZWN1dGlvbklkOiBldmVudC5leGVjdXRpb25JZCxcbiAgICAgICAgICAvLyBzdGFnZU5hbWUvYWN0aW9uTmFtZSBhcmUgVVNFUi1BVVRIT1JFRCBwaXBlbGluZS1zdHJ1Y3R1cmUgbmFtZXNcbiAgICAgICAgICAvLyBwcm9tb3RlZCBmcm9tIHRoZSBDb2RlUGlwZWxpbmUgZGV0YWlsIOKAlCBzYW1lIHVudHJ1c3RlZC1BV1MtZGVyaXZlZFxuICAgICAgICAgIC8vIG9yaWdpbiBhcyBlcnJvck1lc3NhZ2UgYmVsb3csIHNvIHNjcnViIHRoZW0gYXQgdGhpcyBwZXJzaXN0ZW5jZVxuICAgICAgICAgIC8vIGJvdW5kYXJ5IHRvbyAoYSBzdGFnZSBuYW1lZCB3aXRoIGFuIEFSTi8xMi1kaWdpdCBpZCBtdXN0IG5vdCBwZXJzaXN0KS5cbiAgICAgICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGV2ZW50LnN0YWdlTmFtZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFjdGlvbk5hbWU6IGV2ZW50LmFjdGlvbk5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5hY3Rpb25OYW1lKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgLy8gSEFSRCBDT05TVFJBSU5UOiBhbiBBV1MgYWNjb3VudCBpZCBtdXN0IE5FVkVSIGJlIHBlcnNpc3RlZC4gVGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBEVVJBQkxFIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGFuZCBtdXN0IG5vdCB0cnVzdCB1cHN0cmVhbTpcbiAgICAgICAgICAvLyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGZhaWx1cmUgZGV0YWlsICYgbWVzc2FnZXMgcm91dGluZWx5IGNhcnJ5XG4gICAgICAgICAgLy8gQVJOcyAoYXJuOmF3czrigKY6PGFjY291bnQtaWQ+OuKApikgYW5kIGJhcmUgMTItZGlnaXQgYWNjb3VudCBpZHMuIFNjcnViXG4gICAgICAgICAgLy8gYm90aCBmcmVlLWZvcm0gZmllbGRzIGhlcmUgYmVmb3JlIGluc2VydCAocGVyLWV2ZW50LCBub24tbXV0YXRpbmcpLlxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXZlbnQuZXJyb3JNZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBldmVudC5zdGFydGVkQXQgPyBuZXcgRGF0ZShldmVudC5zdGFydGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBldmVudC5jb21wbGV0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LmNvbXBsZXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkdXJhdGlvbk1zOiBldmVudC5kdXJhdGlvbk1zLFxuICAgICAgICAgIC8vIERlcGxveS1hdHRyaWJ1dGlvbiBmaWVsZHMg4oCUIHNjcnViYmVkIGxpa2UgdGhlIG90aGVyIGZyZWUtZm9ybSBzdHJpbmdzXG4gICAgICAgICAgLy8gc28gYW4gQVJOL2FjY291bnQgaWQgY2FuIG5ldmVyIGVudGVyIHZpYSBhIHJlZiBvciBlbnZpcm9ubWVudCBuYW1lLlxuICAgICAgICAgIGNvbW1pdFNoYTogZXZlbnQuY29tbWl0U2hhICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuY29tbWl0U2hhKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tbWl0UmVmOiBldmVudC5jb21taXRSZWYgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5jb21taXRSZWYpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbnZpcm9ubWVudDogZXZlbnQuZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5lbnZpcm9ubWVudClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRldGFpbDogZXZlbnQuZGV0YWlsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVycyhldmVudC5kZXRhaWwpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNRUyBpcyBhdC1sZWFzdC1vbmNlLCBzbyBFdmVudEJyaWRnZSBjYW4gZGVsaXZlciB0aGUgc2FtZSBzdGF0ZS1jaGFuZ2VcbiAgICAgIC8vIHR3aWNlLiBgb25Db25mbGljdERvTm90aGluZ2AgKyB0aGUgcGFydGlhbCB1bmlxdWUgaW5kZXggb25cbiAgICAgIC8vIChwaXBlbGluZV9pZCwgZXhlY3V0aW9uX2lkLCBldmVudF90eXBlLCBzdGF0dXMsIHN0YWdlX25hbWUsIGFjdGlvbl9uYW1lKVxuICAgICAgLy8gbWFrZXMgcmUtZGVsaXZlcnkgaWRlbXBvdGVudC4gYHJldHVybmluZ2AgZ2l2ZXMgdGhlIFJFQUwgaW5zZXJ0ZWQgc2V0IHNvXG4gICAgICAvLyBjb3VudHMgKyBjYWNoZSBpbnZhbGlkYXRpb24gaWdub3JlIGR1cGxpY2F0ZXMuXG4gICAgICBjb25zdCBpbnNlcnRlZFJvd3MgPSByb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBpcGVsaW5lRXZlbnQpLnZhbHVlcyhyb3dzKVxuICAgICAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKClcbiAgICAgICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50Lm9yZ0lkIH0pXG4gICAgICAgIDogW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluc2VydGVkOiBpbnNlcnRlZFJvd3MubGVuZ3RoLFxuICAgICAgICBza2lwcGVkOiBza2lwcGVkTG9jYWwsXG4gICAgICAgIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiB1bnJlZ2lzdGVyZWRMb2NhbCxcbiAgICAgICAgYWZmZWN0ZWRPcmdzOiBbLi4ubmV3IFNldChpbnNlcnRlZFJvd3MubWFwKHIgPT4gci5vcmdJZCkpXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBTdXJmYWNlIHRoZSBzaWxlbnQgc2tpcDogYW4gdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkIHVzdWFsbHkgbWVhbnMgdGhlXG4gICAgLy8gcGlwZWxpbmUgaGFzbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0IChvciBpdHNcbiAgICAvLyBQSVBFTElORV9FVkVOVF9JRCB0YWcgaXMgbWlzc2luZy91bnJlYWRhYmxlIGJ5IHRoZSBMYW1iZGEpLiBMb2dnaW5nIGl0XG4gICAgLy8gbWFrZXMgYSBicm9rZW4gam9pbiB2aXNpYmxlIGluc3RlYWQgb2YgbG9va2luZyBsaWtlIFwibm8gYWN0aXZpdHlcIi5cbiAgICBpZiAodW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGV2ZW50cyBza2lwcGVkOiBwaXBlbGluZSBpZCBub3QgZm91bmQgaW4gcmVnaXN0cnknLCB7XG4gICAgICAgIGNvdW50OiB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5sZW5ndGgsXG4gICAgICAgIHNhbXBsZTogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMuc2xpY2UoMCwgMyksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAgIC8vIHNob3J0IGVub3VnaCB0aGF0IGEgbWlzc2VkIGludmFsaWRhdGlvbiBzZWxmLWhlYWxzLlxuICAgIGlmIChhZmZlY3RlZE9yZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZU9yZyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkOiBvcmcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgfSksXG4gICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgdGhlIG9yZy1zY29wZSBwcmVkaWNhdGUgZm9yIGEgcmVwb3J0IHF1ZXJ5LiBXaXRoIGBvcmdJZHNgICh0aGVcbiAgICogb3JnIOKGkiB0ZWFtIHJvbGx1cCDigJQgYSBwYXJlbnQncyBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWApIGl0IGJlY29tZXMgYW5cbiAgICogYElOICguLi4pYCBvdmVyIHRoZSBzdWJ0cmVlOyBvdGhlcndpc2UgdGhlIHNpbmdsZS1vcmcgYD0gJG9yZ2AuIFJldHVybnMgYVxuICAgKiBgbXVsdGlgIGZsYWcgc28gY2FsbGVycyBjYW4gcnVuIG11bHRpLW9yZyByZWFkcyB1bmRlciBzeXNhZG1pbiBjb250ZXh0XG4gICAqICh0aGUgc3VidHJlZSBzcGFucyBvcmdzIG91dHNpZGUgdGhlIHJlcXVlc3QncyBSTFMgc2NvcGUpIGFuZCBzYWx0IHRoZVxuICAgKiBjYWNoZSBrZXkuXG4gICAqL1xuICBwcml2YXRlIG9yZ1Njb3BlKG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKSB7XG4gICAgLy8gRGVmZW5zZS1pbi1kZXB0aDogdGhlIG11bHRpLW9yZyByb2xsdXAgcnVucyB1bmRlciBzeXNhZG1pbiBjb250ZXh0IChSTFNcbiAgICAvLyBPRkYsIHNlZSBydW5SZXBvcnQpLCBzbyBgb3JnSWRzYCBpcyB0aGUgT05MWSB0ZW5hbmN5IGdhdGUgb24gdGhlIHJlYWQuIFRoZVxuICAgIC8vIHJvdXRlIHJlc29sdmVzIGl0IGZyb20gdGhlIHBsYXRmb3JtJ3MgYXV0aG9yaXRhdGl2ZSBkZXNjZW5kYW50cyBlbmRwb2ludCBhc1xuICAgIC8vIGBbc2VsZiwgLi4uZGVzY2VuZGFudHNdYCwgYnV0IHZhbGlkYXRlIHRoZSBzdWJ0cmVlIGRlZmVuc2l2ZWx5IGhlcmUgYmVmb3JlXG4gICAgLy8gdGhlIGJ5cGFzczogdGhlIHJlcXVlc3RpbmcgKGFuY2hvcikgb3JnIE1VU1QgYXBwZWFyIGluIHRoZSBzZXQuIEEgc2V0IHRoYXRcbiAgICAvLyBvbWl0cyB0aGUgY2FsbGVyJ3Mgb3duIG9yZyBpcyBhIG1hbGZvcm1lZC9zcG9vZmVkIHJvbGx1cCDigJQgY29sbGFwc2UgdG8gdGhlXG4gICAgLy8gc2FmZSBzaW5nbGUtb3JnIHNjb3BlIHJhdGhlciB0aGFuIHJlYWRpbmcgYW4gYXJiaXRyYXJ5IG9yZyB1bmRlciBzeXNhZG1pbi5cbiAgICAvLyAoRnVsbCBkZXNjZW5kYW50LW1lbWJlcnNoaXAgdmFsaWRhdGlvbiBuZWVkcyB0aGUgb3JnIHRyZWUsIHdoaWNoIHRoaXNcbiAgICAvLyBzZXJ2aWNlIGRvZXMgbm90IGhvbGQg4oCUIHNlZSB0aGUgcmVwb3J0IEZMQUcuKVxuICAgIGNvbnN0IGFuY2hvciA9IG9yZ0lkLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcHJvdmlkZWQgPSAob3JnSWRzID8/IFtdKS5maWx0ZXIoKGlkKSA9PiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIGlkLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGFuY2hvcmVkID0gcHJvdmlkZWQuc29tZSgoaWQpID0+IGlkLnRvTG93ZXJDYXNlKCkgPT09IGFuY2hvcik7XG4gICAgaWYgKHByb3ZpZGVkLmxlbmd0aCA+IDAgJiYgIWFuY2hvcmVkKSB7XG4gICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIHJvbGx1cCByZWplY3RlZDogcmVxdWVzdGluZyBvcmcgYWJzZW50IGZyb20gcmVzb2x2ZWQgc3VidHJlZTsgdXNpbmcgc2luZ2xlLW9yZyBzY29wZScsIHtcbiAgICAgICAgb3JnSWQ6IGFuY2hvciwgc3VidHJlZVNpemU6IHByb3ZpZGVkLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBpZHMgPSBwcm92aWRlZC5sZW5ndGggPiAwICYmIGFuY2hvcmVkID8gcHJvdmlkZWQgOiBbb3JnSWRdO1xuICAgIGNvbnN0IG11bHRpID0gaWRzLmxlbmd0aCA+IDE7XG4gICAgY29uc3QgcHJlZCA9IG11bHRpXG4gICAgICA/IHNxbGBJTiAoJHtzcWwuam9pbihpZHMubWFwKChpZCkgPT4gc3FsYCR7aWR9YCksIHNxbGAsIGApfSlgXG4gICAgICA6IHNxbGA9ICR7aWRzWzBdfWA7XG4gICAgcmV0dXJuIHsgcHJlZCwgbXVsdGkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByZXBvcnQgcmVhZC4gU2luZ2xlLW9yZyByZWFkcyB1c2UgdGhlIHBlci1vcmcgY2FjaGUgKGludmFsaWRhdGVkIG9uXG4gICAqIHRoYXQgb3JnJ3MgZXZlbnQgaW5nZXN0KS4gUm9sbHVwIChtdWx0aS1vcmcpIHJlYWRzICoqYnlwYXNzIHRoZSBjYWNoZSoqIGFuZFxuICAgKiBydW4gdW5kZXIgc3lzYWRtaW4gY29udGV4dDogdGhleSdyZSBhZG1pbi1vbmx5IGFuZCBsb3dlci1mcmVxdWVuY3ksIGFuZCBhXG4gICAqIGNoaWxkIG9yZydzIGV2ZW50IGluZ2VzdCBjYW4ndCBpbnZhbGlkYXRlIGEgcGFyZW50J3Mgcm9sbHVwIGVudHJ5IChyZXBvcnRpbmdcbiAgICogaGFzIG5vIG9yZyB0cmVlKSwgc28gY2FjaGluZyB0aGVtIHdvdWxkIHNlcnZlIHN0YWxlIGFnZ3JlZ2F0ZXMuIEFsd2F5cyBmcmVzaC5cbiAgICovXG4gIHByaXZhdGUgcnVuUmVwb3J0PFQ+KGNhY2hlS2V5OiBzdHJpbmcsIG11bHRpOiBib29sZWFuLCBleGVjOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG11bHRpXG4gICAgICA/IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGV4ZWMpXG4gICAgICA6IHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChjYWNoZUtleSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4xIEV4ZWN1dGlvbiBjb3VudCBwZXIgcGlwZWxpbmUgd2l0aCBzdGF0dXMgYnJlYWtkb3duLiAqL1xuICBhc3luYyBnZXRFeGVjdXRpb25Db3VudChvcmdJZDogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSwgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0pOiBQcm9taXNlPEV4ZWN1dGlvbkNvdW50W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIC8vIE9wdGlvbmFsIFtmcm9tLHRvXSB3aW5kb3cgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQsIG1pcnJvcmluZyB0aGVcbiAgICAvLyBzaWJsaW5nIHRpbWVzZXJpZXMgcmVwb3J0cyBzbyB0aGUgZGFzaGJvYXJkIGRhdGUtcmFuZ2UgcGlja2VyIG5hcnJvd3MgdGhlXG4gICAgLy8gY291bnQgdG9vIChhbiBlbXB0eSByYW5nZSA9IGFsbC10aW1lLCBwcmVzZXJ2aW5nIHRoZSBwcmlvciBiZWhhdmlvcikuIFRoZVxuICAgIC8vIHJhbmdlIHJpZGVzIHRoZSBKT0lOIHNvIHBpcGVsaW5lcyB3aXRoIG5vIGluLXdpbmRvdyBldmVudHMgc3RpbGwgbGlzdFxuICAgIC8vIChMRUZUIHNlbWFudGljcyBwcmVzZXJ2ZWQgdmlhIHRoZSBpbm5lci1qb2luIGZpbHRlciDigJQgYSBwaXBlbGluZSB3aXRoIHplcm9cbiAgICAvLyBtYXRjaGluZyBldmVudHMgZHJvcHMgZnJvbSB0aGUgY291bnQsIHNhbWUgYXMgYmVmb3JlIGZvciBpdHMgd2luZG93KS5cbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IHJhbmdlPy5mcm9tICYmIHJhbmdlPy50b1xuICAgICAgPyBzcWxgQU5EIGUuc3RhcnRlZF9hdCA+PSAke3JhbmdlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7cmFuZ2UudG99Ojp0aW1lc3RhbXB0emBcbiAgICAgIDogc3FsYGA7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAub3JnYW5pemF0aW9uLCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpOjppbnQgQVMgY2FuY2VsZWQsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgZmlyc3RfZXhlY3V0aW9uLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3RfZXhlY3V0aW9uXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmV9IHBcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlIE9OIGUucGlwZWxpbmVfaWQgPSBwLmlkXG4gICAgICAgICAgQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzICE9ICdTVEFSVEVEJ1xuICAgICAgICAgICR7cmFuZ2VDbGF1c2V9XG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIHAuaXNfYWN0aXZlID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSBwLmlkXG4gICAgICAgIE9SREVSIEJZIHRvdGFsIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFeGVjdXRpb25Db3VudD4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06ZXhlYy1jb3VudDoke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKipcbiAgICogMS4xYiBQZXItcGlwZWxpbmUgZXhlY3V0aW9uIGhpc3Rvcnkg4oCUIERJU1RJTkNUIGV4ZWN1dGlvbnMgZm9yIG9uZSBwaXBlbGluZSxcbiAgICogbmV3ZXN0IGZpcnN0LiBHcm91cHMgYWxsIGV2ZW50cyBieSBgZXhlY3V0aW9uX2lkYCBpbiBhIHNpbmdsZSBzY2FuIGFuZFxuICAgKiByb2xscyBlYWNoIGV4ZWN1dGlvbiB1cCB0byBvbmUgcm93OlxuICAgKiAgIC0gc3RhdHVzOiBkZXJpdmVkIGZyb20gdGhlIFBJUEVMSU5FLXR5cGUgZXZlbnRzLiBGQUlMRUQgd2lucywgdGhlblxuICAgKiAgICAgU1VDQ0VFREVELCB0aGVuIENBTkNFTEVEOyBhbiBleGVjdXRpb24gd2l0aCBubyB0ZXJtaW5hbCBQSVBFTElORSBldmVudFxuICAgKiAgICAgaXMgc3RpbGwgYGluLXByb2dyZXNzYC5cbiAgICogICAtIHN0YXJ0ZWRBdC9lbmRlZEF0L2R1cmF0aW9uTXM6IGZyb20gdGhlIFBJUEVMSU5FIGxpZmVjeWNsZSBldmVudHMuXG4gICAqICAgLSBmYWlsaW5nU3RhZ2UvZmFpbGluZ0FjdGlvbjogdGhlIGZpcnN0IEZBSUxFRCBTVEFHRS9BQ1RJT04gZXZlbnQgKGNoZWFwIOKAlFxuICAgKiAgICAgc2FtZSBzY2FuLCBubyBleHRyYSBxdWVyeSkuXG4gICAqXG4gICAqIE9SRy1TQ09QSU5HOiBpZGVudGljYWwgdG8gdGhlIHNpYmxpbmcgZXhlY3V0aW9uIHJlcG9ydHMg4oCUIGpvaW5zIHRoZSBwaXBlbGluZVxuICAgKiByZWdpc3RyeSB0YWJsZSAoYHBpcGVsaW5lYCkgYW5kIGdhdGVzIG9uIGBwLm9yZ19pZCAke3ByZWR9YCwgd2hlcmUgYHByZWRgIGlzXG4gICAqIHRoZSBzaW5nbGUtb3JnIGA9ICRvcmdgIG9yICh3aXRoIGEgcm9sbHVwKSBhbiBgSU4gKC4uLilgIG92ZXIgdGhlIG9yZ+KGknRlYW1cbiAgICogc3VidHJlZS4gQSBwaXBlbGluZUlkIGJlbG9uZ2luZyB0byBhbm90aGVyIG9yZyB5aWVsZHMgemVybyByb3dzLlxuICAgKi9cbiAgYXN5bmMgbGlzdFBpcGVsaW5lRXhlY3V0aW9ucyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSxcbiAgICBsaW1pdDogbnVtYmVyID0gNTAsXG4gICk6IFByb21pc2U8UGlwZWxpbmVFeGVjdXRpb25bXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgcmFuZ2VDbGF1c2UgPSByYW5nZT8uZnJvbSAmJiByYW5nZT8udG9cbiAgICAgID8gc3FsYEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtyYW5nZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3JhbmdlLnRvfTo6dGltZXN0YW1wdHpgXG4gICAgICA6IHNxbGBgO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5leGVjdXRpb25faWQsXG4gICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ2ZhaWxlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKSBUSEVOICdzdWNjZWVkZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKSBUSEVOICdjYW5jZWxlZCdcbiAgICAgICAgICAgIEVMU0UgJ2luLXByb2dyZXNzJ1xuICAgICAgICAgIEVORCBBUyBzdGF0dXMsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBzdGFydGVkX2F0LFxuICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBlbmRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6aW50IEFTIGR1cmF0aW9uX21zLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5zdGFnZV9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX3N0YWdlLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5hY3Rpb25fbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfYWN0aW9uXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9IEFORCBlLmV4ZWN1dGlvbl9pZCBJUyBOT1QgTlVMTFxuICAgICAgICAgICR7cmFuZ2VDbGF1c2V9XG4gICAgICAgIEdST1VQIEJZIGUuZXhlY3V0aW9uX2lkXG4gICAgICAgIE9SREVSIEJZIE1BWChlLmNyZWF0ZWRfYXQpIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxQaXBlbGluZUV4ZWN1dGlvbj4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06cGlwZWxpbmUtZXhlY3V0aW9uczoke3BpcGVsaW5lSWR9OiR7cmFuZ2U/LmZyb20gPz8gJyd9OiR7cmFuZ2U/LnRvID8/ICcnfToke2xpbWl0fWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjIgU3VjY2VzcyByYXRlIG92ZXIgdGltZSBmb3IgYW4gb3JnLiAqL1xuICBhc3luYyBnZXRTdWNjZXNzUmF0ZShvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxUaW1lU2VyaWVzRW50cnlbXT4ge1xuICAgIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN1Y2Nlc3MtcmF0ZToke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMyBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUlOKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWluX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45NSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBlLmR1cmF0aW9uX21zKTo6aW50IEFTIHA5NV9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGV4ZWN1dGlvbnNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPER1cmF0aW9uU3RhdHM+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNSBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKipcbiAgICogRGlzdGluY3QgZGVwbG95IGBlbnZpcm9ubWVudGAgdmFsdWVzIG9ic2VydmVkIGluIHRoZSB3aW5kb3cg4oCUIHBvd2VycyB0aGVcbiAgICogRE9SQSBlbnZpcm9ubWVudC1zY29wZSBkYXRhbGlzdC4gT3JnLXNjb3BlZCArIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBzaWJsaW5nXG4gICAqIHJlcG9ydHM7IG9ubHkgbm9uLW51bGwgZW52aXJvbm1lbnRzIChpLmUuIGRlcGxveS1hdHRyaWJ1dGVkIGV4ZWN1dGlvbnMpLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVwb3J0RW52aXJvbm1lbnRzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCBESVNUSU5DVCBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIE9SREVSIEJZIGVudmlyb25tZW50XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8eyBlbnZpcm9ubWVudDogc3RyaW5nIH0+KHIucm93cykubWFwKChyb3cpID0+IHJvdy5lbnZpcm9ubWVudCkpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnJlcG9ydC1lbnZzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS42IFN0YWdlIGJvdHRsZW5lY2tzIOKAlCBzbG93ZXN0IHN0YWdlcyBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5waXBlbGluZV9uYW1lLCBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkLCBlLnN0YWdlX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUJvdHRsZW5lY2s+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWJvdHRsZW5lY2tzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS43IEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxBY3Rpb25GYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTphY3Rpb24tZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjggRXJyb3IgY2F0ZWdvcml6YXRpb24g4oCUIGdyb3VwIGZhaWx1cmUgbWVzc2FnZXMuIEV4ZWN1dGlvbiByZXBvcnQsIHNvXG4gICAqIHJvbGx1cC1hd2FyZSBleGFjdGx5IGxpa2UgdGhlIHNpYmxpbmcgZXhlY3V0aW9uIHJlcG9ydHM6IHdpdGggYG9yZ0lkc2BcbiAgICogKHRoZSBvcmfihpJ0ZWFtIHN1YnRyZWUpIHRoZSBvcmcgZ2F0ZSBiZWNvbWVzIGFuIGBJTiAoLi4uKWAgYW5kIHRoZSByZWFkIHJ1bnNcbiAgICogZnJlc2ggdW5kZXIgc3lzYWRtaW4gdmlhIGBydW5SZXBvcnRgOyBzaW5nbGUtb3JnIHJlYWRzIGtlZXAgdGhlIHBlci1vcmcgY2FjaGUuXG4gICAqL1xuICBhc3luYyBnZXRFcnJvcnMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxFcnJvckVudHJ5W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgU1VCU1RSSU5HKGUuZXJyb3JfbWVzc2FnZSBGUk9NIDEgRk9SIDIwMCkgQVMgZXJyb3JfcGF0dGVybixcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgQVMgYWZmZWN0ZWRfcGlwZWxpbmVzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnIEFORCBlLmVycm9yX21lc3NhZ2UgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGVycm9yX3BhdHRlcm4gT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEVycm9yRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmVycm9yczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuOSBET1JBIG1ldHJpY3Mgb3ZlciBbZnJvbSx0b10gKHN0YXJ0ZWRfYXQgcmFuZ2UpLCBvcmctc2NvcGVkICsgcm9sbHVwLWF3YXJlLlxuICAgKlxuICAgKiBBbGwgZm91ciBtZXRyaWNzIGRlcml2ZSBmcm9tIGEgcGVyLWV4ZWN1dGlvbiByb2xsLXVwIG9mIFRFUk1JTkFMIFBJUEVMSU5FXG4gICAqIGV2ZW50cyAob25lIHJvdyBwZXIgZXhlY3V0aW9uX2lkK3BpcGVsaW5lX2lkOyBGQUlMRUQgd2lucywgdGhlbiBTVUNDRUVERUQsXG4gICAqIHRoZW4gQ0FOQ0VMRUQvU1RPUFBFRCDigJQgbWlycm9yaW5nIGBsaXN0UGlwZWxpbmVFeGVjdXRpb25zYCkuIFRoZSBzY2FuIGlzXG4gICAqIGdhdGVkIGJ5IHRoZSBgcC5vcmdfaWQgJHtwcmVkfWAgam9pbiBleGFjdGx5IGxpa2UgdGhlIHNpYmxpbmcgcmVwb3J0cywgc28gYVxuICAgKiByb2xsdXAgcGFzc2VzIHRoZSBvcmfihpJ0ZWFtIHN1YnRyZWUgYW5kIGEgZm9yZWlnbiBvcmcncyBleGVjdXRpb25zIG5ldmVyXG4gICAqIGVudGVyIHRoZSBhZ2dyZWdhdGUuXG4gICAqXG4gICAqIERGL0NGUi9sZWFkLXRpbWUgY291bnQgb25seSBDT1JFLXdpbmRvdyBleGVjdXRpb25zIChbZnJvbSx0b10pLiBNVFRSIGlzXG4gICAqIHBlci1JTkNJREVOVDogY29uc2VjdXRpdmUgZmFpbHVyZXMgY29sbGFwc2UgaW50byBvbmUgaW5jaWRlbnQgYW5kIHRoZVxuICAgKiByZWNvdmVyeSBsb29rdXAgbWF5IHNlZSB0aGUgbmV4dCBzdWNjZXNzIHVwIHRvIE1UVFJfUkVTVE9SRV9MT09LQUhFQUQgcGFzdFxuICAgKiBgdG9gLCBzbyBhIGZhaWx1cmUgbmVhciB0aGUgZWRnZSBpc24ndCByaWdodC1jZW5zb3JlZCBpbnRvIFwibmV2ZXIgcmVzdG9yZWRcIi5cbiAgICogVGhlIHNjYW4gYm91bmQgaXMgdGhlcmVmb3JlIGBbZnJvbSwgdG8gKyBsb29rLWFoZWFkXWA7IHRoZSBzdGFydGVkX2F0IHJhbmdlXG4gICAqIHN0aWxsIHJpZGVzIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBzaWJsaW5nIHJlcG9ydHMuXG4gICAqXG4gICAqIERJU0NMT1NVUkU6IGJ5IGRlZmF1bHQgREYvQ0ZSL01UVFIgYXJlIFJVTi1iYXNlZCAoYW55IHN1Y2Nlc3NmdWwgUElQRUxJTkVcbiAgICogcnVuID0gYSBcImRlcGxveW1lbnRcIiksIGFuZCBMZWFkIFRpbWUgaXMgYWRkaXRpb25hbGx5IGEgcnVuLXRpbWUgUFJPWFlcbiAgICogZmxhZ2dlZCBgYXBwcm94OiB0cnVlYC4gUGFzcyBgZW52aXJvbm1lbnRgIG9yIGBkZXBsb3lzT25seWAgdG8gc2NvcGUgdG9cbiAgICogZXhlY3V0aW9ucyB0YWdnZWQgd2l0aCBhIHJlYWwgZGVwbG95IHRhcmdldCDigJQgdGhlIHJlc3BvbnNlIGBiYXNpc2AgcmVwb3J0c1xuICAgKiB3aGljaCB3YXMgdXNlZC4gU2VlIHRoZSBEb3JhTWV0cmljcyBkb2MgKyBkb2NzL2RvcmEtbWV0cmljcy5tZC5cbiAgICpcbiAgICogQHBhcmFtIG9wdHMucGlwZWxpbmVJZCAgICByZXN0cmljdCB0byBvbmUgcGlwZWxpbmUgKHBlci1waXBlbGluZSBET1JBKVxuICAgKiBAcGFyYW0gb3B0cy5lbnZpcm9ubWVudCAgIGNvdW50IG9ubHkgZXhlY3V0aW9ucyBkZXBsb3llZCB0byB0aGlzIHRhcmdldFxuICAgKiBAcGFyYW0gb3B0cy5kZXBsb3lzT25seSAgIGNvdW50IG9ubHkgZXhlY3V0aW9ucyB0YWdnZWQgd2l0aCBBTlkgZW52aXJvbm1lbnRcbiAgICovXG4gIGFzeW5jIGdldERvcmFNZXRyaWNzKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxEb3JhTWV0cmljcz4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgZGVwbG95c09ubHkgfSA9IG9wdHM7XG4gICAgLy8gT3B0aW9uYWwgZGVwbG95LXNjb3BpbmcgLyBwZXItcGlwZWxpbmUgcHJlZGljYXRlcywgZm9sZGVkIGludG8gdGhlIGV4ZWNzXG4gICAgLy8gc2NhbiBzbyBmYWlsdXJlcyBBTkQgdGhlaXIgcmVjb3Zlcnkgc3VjY2Vzc2VzIGFyZSBmaWx0ZXJlZCBjb25zaXN0ZW50bHkuXG4gICAgY29uc3QgeyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBiYXNpcyB9ID0gZG9yYVNjb3BlQ2xhdXNlcyhvcHRzKTtcbiAgICAvLyBTY2FuIHRoZSBDT1JFIHdpbmRvdyBwbHVzIGEgbG9vay1haGVhZCB0YWlsOiB0aGUgZXh0cmEgdGFpbCBleGlzdHMgb25seVxuICAgIC8vIHNvIGEgbGF0ZSBmYWlsdXJlIGNhbiBzdGlsbCBmaW5kIGl0cyByZWNvdmVyeSAoc2VlIHRoZSByZXN0b3JlIENURSkuXG4gICAgY29uc3QgZXhlY3MgPSBleGVjc0N0ZSh7XG4gICAgICBwcmVkLFxuICAgICAgcGlwZWxpbmVDbGF1c2UsXG4gICAgICBkZXBsb3lDbGF1c2UsXG4gICAgICBmcm9tLFxuICAgICAgY29sdW1uczogc3FsYFxuICAgICAgICAgICAgZS5waXBlbGluZV9pZCxcbiAgICAgICAgICAgICR7RE9SQV9URVJNSU5BTF9TVEFUVVNfQ0FTRX0gQVMgc3RhdHVzLFxuICAgICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCkgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgQVMgZHVyYXRpb25fbXNgLFxuICAgICAgdG9Cb3VuZDogc3FsYCR7dG99Ojp0aW1lc3RhbXB0eiArICR7TVRUUl9SRVNUT1JFX0xPT0tBSEVBRH06OmludGVydmFsYCxcbiAgICB9KTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFdJVEggZXhlY3MgQVMgKCR7ZXhlY3N9XG4gICAgICAgICksXG4gICAgICAgIC0tIENvcmUtd2luZG93IGV4ZWN1dGlvbnMgKFtmcm9tLHRvXSk7IERGL0NGUi9sZWFkLXRpbWUgY291bnQgb25seSB0aGVzZS5cbiAgICAgICAgLS0gVGhlIGxvb2stYWhlYWQgcm93cyBhYm92ZSBhcmUgdXNlZCBPTkxZIGFzIE1UVFIgcmVjb3ZlcnkgY2FuZGlkYXRlcy5cbiAgICAgICAgY29yZSBBUyAoXG4gICAgICAgICAgU0VMRUNUICogRlJPTSBleGVjcyBXSEVSRSBzdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICApLFxuICAgICAgICBkZiBBUyAoXG4gICAgICAgICAgU0VMRUNUIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgZGVwbG95bWVudHNcbiAgICAgICAgICBGUk9NIGNvcmVcbiAgICAgICAgKSxcbiAgICAgICAgY2ZyIEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpOjppbnQgQVMgdG90YWxcbiAgICAgICAgICBGUk9NIGNvcmVcbiAgICAgICAgKSxcbiAgICAgICAgbHQgQVMgKFxuICAgICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgQ09VTlQoKik6OmludCBBUyBkZXBsb3ltZW50cyxcbiAgICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjUpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZHVyYXRpb25fbXMpOjpmbG9hdCBBUyBtZWRpYW5fbXNcbiAgICAgICAgICBGUk9NIGNvcmVcbiAgICAgICAgICBXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyBBTkQgZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgKSxcbiAgICAgICAgLS0gRm9yIGVhY2ggY29yZS13aW5kb3cgZmFpbHVyZSwgZmluZCB0aGUgRU5EIG9mIGl0cyByZWNvdmVyaW5nIHJ1bjogdGhlXG4gICAgICAgIC0tIG5leHQgU1VDQ0VFREVEIHJ1biBvZiB0aGUgc2FtZSBwaXBlbGluZSB0aGF0IEVOREVEIGFmdGVyIHRoaXMgZmFpbHVyZVxuICAgICAgICAtLSBlbmRlZCAodmlzaWJsZSBpbnRvIHRoZSBsb29rLWFoZWFkIHRhaWwpLiBTRUxFQ1QgYW5kIE1FQVNVUkUgYm90aCBrZXlcbiAgICAgICAgLS0gb2ZmIGVuZGVkX2F0IHNvIHRoZXkgc3RheSBjb25zaXN0ZW50IC0tIHRoZSBpbmNpZGVudCBnYXAgaXNcbiAgICAgICAgLS0gcmVzdG9yZWRfYXQgKHN1Y2Nlc3MgZW5kKSBtaW51cyBpbmNpZGVudF9zdGFydGVkIChmaXJzdCBmYWlsdXJlIGVuZCksXG4gICAgICAgIC0tIHNvIHBpY2tpbmcgdGhlIHJlY292ZXJ5IGJ5IGVuZGVkX2F0IChub3Qgc3RhcnRlZF9hdCkgcnVsZXMgb3V0IHRoZVxuICAgICAgICAtLSBuZWdhdGl2ZSBnYXAgdGhhdCBhIGNvbmN1cnJlbnQgc3VjY2VzcyB3aGljaCBTVEFSVEVEIGFmdGVyIHRoZSBmYWlsdXJlXG4gICAgICAgIC0tIGJ1dCBFTkRFRCBiZWZvcmUgaXQgd291bGQgb3RoZXJ3aXNlIGZvbGQgaW50byBBVkcuIE1lYXN1cmluZyBmcm9tIHRoZVxuICAgICAgICAtLSBmYWlsdXJlJ3MgRU5EIChub3Qgc3RhcnQpIGFsc28ga2VlcHMgdGhlIGZhaWxlZCBydW4ncyBvd24gZHVyYXRpb24gb3V0XG4gICAgICAgIC0tIG9mIHJlc3RvcmUgdGltZS4gT3JkZXJpbmcgYnkgZW5kZWRfYXQgbWFrZXMgdGhlIGluY2lkZW50IGNvbGxhcHNlIGZhbGxcbiAgICAgICAgLS0gb3V0IG5hdHVyYWxseTogYSBncmVlbiBydW4gZW5kaW5nIGJldHdlZW4gdHdvIGZhaWx1cmVzIHNwbGl0cyB0aGVtLlxuICAgICAgICByZXN0b3JlIEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIGYucGlwZWxpbmVfaWQsXG4gICAgICAgICAgICBmLmVuZGVkX2F0IEFTIGZhaWxfZW5kZWQsXG4gICAgICAgICAgICAoU0VMRUNUIHMuZW5kZWRfYXQgRlJPTSBleGVjcyBzXG4gICAgICAgICAgICAgIFdIRVJFIHMucGlwZWxpbmVfaWQgPSBmLnBpcGVsaW5lX2lkIEFORCBzLnN0YXR1cyA9ICdTVUNDRUVERUQnXG4gICAgICAgICAgICAgICAgQU5EIHMuZW5kZWRfYXQgPiBmLmVuZGVkX2F0XG4gICAgICAgICAgICAgIE9SREVSIEJZIHMuZW5kZWRfYXQgQVNDIExJTUlUIDEpIEFTIHJlc3RvcmVkX2F0XG4gICAgICAgICAgRlJPTSBjb3JlIGZcbiAgICAgICAgICBXSEVSRSBmLnN0YXR1cyA9ICdGQUlMRUQnXG4gICAgICAgICksXG4gICAgICAgIC0tIENvbGxhcHNlIHRvIElOQ0lERU5UUzogZmFpbHVyZXMgc2hhcmluZyB0aGUgc2FtZSByZWNvdmVyeSAoaS5lLiB3aXRoXG4gICAgICAgIC0tIG5vIGdyZWVuIHJ1biBiZXR3ZWVuIHRoZW0pIGFyZSBvbmUgaW5jaWRlbnQsIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdFxuICAgICAgICAtLSBmYWlsdXJlJ3MgZW5kLiBVbnJlY292ZXJlZCBmYWlsdXJlcyBzaGFyZSByZXN0b3JlZF9hdCA9IE5VTEwgYW5kIGZvcm1cbiAgICAgICAgLS0gdGhlIHNpbmdsZSB0cmFpbGluZyBvcGVuIGluY2lkZW50IHBlciBwaXBlbGluZS5cbiAgICAgICAgaW5jaWRlbnRzIEFTIChcbiAgICAgICAgICBTRUxFQ1QgcGlwZWxpbmVfaWQsIHJlc3RvcmVkX2F0LCBNSU4oZmFpbF9lbmRlZCkgQVMgaW5jaWRlbnRfc3RhcnRlZFxuICAgICAgICAgIEZST00gcmVzdG9yZVxuICAgICAgICAgIEdST1VQIEJZIHBpcGVsaW5lX2lkLCByZXN0b3JlZF9hdFxuICAgICAgICApLFxuICAgICAgICBtdHRyIEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgICAtLSByZXN0b3JlZCBtdXN0IGVxdWFsIHRoZSBjb3VudCBvZiBpbmNpZGVudHMgdGhhdCBhY3R1YWxseVxuICAgICAgICAgICAgLS0gY29udHJpYnV0ZSB0byBhdmdfc2Vjb25kcy4gR3VhcmQgb24gaW5jaWRlbnRfc3RhcnRlZCB0b286IGFcbiAgICAgICAgICAgIC0tIGZhaWx1cmUgd2l0aCBhIE5VTEwgY29tcGxldGVkX2F0IHlpZWxkcyBhIE5VTEwgaW5jaWRlbnRfc3RhcnRlZFxuICAgICAgICAgICAgLS0gdGhhdCBjb250cmlidXRlcyBOVUxMIChub3QgYSByZWFsIGdhcCkgdG8gQVZHLCBzbyBpdCBtdXN0IG5vdCBiZVxuICAgICAgICAgICAgLS0gY291bnRlZCBhcyByZXN0b3JlZCBlaXRoZXIgLS0gb3RoZXJ3aXNlIHJlc3RvcmVkIGNvdWxkIGV4Y2VlZFxuICAgICAgICAgICAgLS0gdGhlIG51bWJlciBvZiBtZWFzdXJlZCBpbmNpZGVudHMuXG4gICAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFxuICAgICAgICAgICAgICBXSEVSRSByZXN0b3JlZF9hdCBJUyBOT1QgTlVMTCBBTkQgaW5jaWRlbnRfc3RhcnRlZCBJUyBOT1QgTlVMTFxuICAgICAgICAgICAgKTo6aW50IEFTIHJlc3RvcmVkLFxuICAgICAgICAgICAgQVZHKEVYVFJBQ1QoRVBPQ0ggRlJPTSAocmVzdG9yZWRfYXQgLSBpbmNpZGVudF9zdGFydGVkKSkpXG4gICAgICAgICAgICAgIEZJTFRFUiAoV0hFUkUgcmVzdG9yZWRfYXQgSVMgTk9UIE5VTEwgQU5EIGluY2lkZW50X3N0YXJ0ZWQgSVMgTk9UIE5VTEwpOjpmbG9hdCBBUyBhdmdfc2Vjb25kc1xuICAgICAgICAgIEZST00gaW5jaWRlbnRzXG4gICAgICAgIClcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZGYuZGVwbG95bWVudHMgQVMgZGZfZGVwbG95bWVudHMsXG4gICAgICAgICAgY2ZyLmZhaWxlZCBBUyBjZnJfZmFpbGVkLFxuICAgICAgICAgIGNmci50b3RhbCBBUyBjZnJfdG90YWwsXG4gICAgICAgICAgbHQuZGVwbG95bWVudHMgQVMgbHRfZGVwbG95bWVudHMsXG4gICAgICAgICAgbHQubWVkaWFuX21zIEFTIGx0X21lZGlhbl9tcyxcbiAgICAgICAgICBtdHRyLmZhaWx1cmVzIEFTIG10dHJfZmFpbHVyZXMsXG4gICAgICAgICAgbXR0ci5yZXN0b3JlZCBBUyBtdHRyX3Jlc3RvcmVkLFxuICAgICAgICAgIG10dHIuYXZnX3NlY29uZHMgQVMgbXR0cl9hdmdfc2Vjb25kc1xuICAgICAgICBGUk9NIGRmLCBjZnIsIGx0LCBtdHRyXG4gICAgICBgKS50aGVuKHIgPT4gdGhpcy5zaGFwZURvcmEoZHJpenpsZVJvd3M8RG9yYVJvdz4oci5yb3dzKVswXSwgZnJvbSwgdG8sIGJhc2lzLCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50IH0pKSk7XG4gICAgLy8gYGVudmlyb25tZW50YCBXSU5TIG92ZXIgYGRlcGxveXNPbmx5YCBpbiBkb3JhU2NvcGVDbGF1c2VzLCBzbyB3aXRoIGFuXG4gICAgLy8gZW52aXJvbm1lbnQgc2V0IHRoZSBkZXBsb3lzT25seSBmbGFnIG5ldmVyIGFmZmVjdHMgdGhlIFNRTCDigJQgYXBwZW5kIHRoZVxuICAgIC8vICdkJyBtYXJrZXIgb25seSB3aGVuIGl0IGdlbnVpbmVseSBjaGFuZ2VzIHRoZSBxdWVyeSAoZW52aXJvbm1lbnQgYWJzZW50KSxcbiAgICAvLyBvdGhlcndpc2UgYHtlbnZpcm9ubWVudDoncHJvZCcsIGRlcGxveXNPbmx5OnRydWV9YCB3b3VsZCBtaW50IGEgcmVkdW5kYW50XG4gICAgLy8gY2FjaGUgZW50cnkgaWRlbnRpY2FsIHRvIGB7ZW52aXJvbm1lbnQ6J3Byb2QnfWAuXG4gICAgY29uc3QgZGVwbG95TWFya2VyID0gIWVudmlyb25tZW50ICYmIGRlcGxveXNPbmx5ID8gJ2QnIDogJyc7XG4gICAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmE6JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9OiR7ZGVwbG95TWFya2VyfWA7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGtleSwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIFNoYXBlIGEgc2luZ2xlIERPUkEgYWdncmVnYXRlIHJvdyBpbnRvIHRoZSBwdWJsaWMge0BsaW5rIERvcmFNZXRyaWNzfS4gKi9cbiAgcHJpdmF0ZSBzaGFwZURvcmEoXG4gICAgcm93OiBEb3JhUm93IHwgdW5kZWZpbmVkLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIGJhc2lzOiBEb3JhTWV0cmljc1snYmFzaXMnXSxcbiAgICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ/OiBzdHJpbmc7IGVudmlyb25tZW50Pzogc3RyaW5nIH0sXG4gICk6IERvcmFNZXRyaWNzIHtcbiAgICAvLyBgRlJPTSBkZiwgY2ZyLCBsdCwgbXR0cmAgYWx3YXlzIHlpZWxkcyBleGFjdGx5IG9uZSByb3cgKGVhY2ggQ1RFIGlzIGFcbiAgICAvLyBzaW5nbGUtcm93IGFnZ3JlZ2F0ZSksIGJ1dCBndWFyZCBhZ2FpbnN0IGFuIGVtcHR5IHJlc3VsdCBkZWZlbnNpdmVseS5cbiAgICBjb25zdCByOiBEb3JhUm93ID0gcm93ID8/IHt9O1xuXG4gICAgY29uc3QgZGVwbG95bWVudHMgPSBOdW1iZXIoci5kZl9kZXBsb3ltZW50cykgfHwgMDtcbiAgICAvLyBGbG9vciB0aGUgZGl2aXNvciBhdCBvbmUgZGF5OiBhIHdpbmRvdyBzaG9ydGVyIHRoYW4gYSBkYXkgKGluY2wuIHRoZVxuICAgIC8vIGRlZ2VuZXJhdGUgZnJvbT09dG8pIGhhcyBubyBtZWFuaW5nZnVsIHN1Yi1kYXkgcmF0ZSwgc28gaXQncyB0cmVhdGVkIGFzIGFcbiAgICAvLyBzaW5nbGUgZGF5IHJhdGhlciB0aGFuIGV4dHJhcG9sYXRlZCBvciBtaXNsYWJlbGVkIGFzIGEgcmF3IGNvdW50LlxuICAgIC8vIEZsb29yIGF0IG9uZSBkYXkgYW5kIGd1YXJkIGFnYWluc3QgdW5wYXJzZWFibGUgZGF0ZXMgKERhdGUucGFyc2Ug4oaSIE5hTixcbiAgICAvLyB3aGljaCB3b3VsZCBvdGhlcndpc2UgcHJvcGFnYXRlIHRocm91Z2ggcGVyRGF5KS4gRmFsbHMgYmFjayB0byBhIDEtZGF5XG4gICAgLy8gd2luZG93IHNvIGEgYmFkIHJhbmdlIHlpZWxkcyB0aGUgcmF3IGNvdW50IGFzIHRoZSByYXRlLCBuZXZlciBOYU4uXG4gICAgY29uc3Qgc3BhbkRheXMgPSAoRGF0ZS5wYXJzZSh0bykgLSBEYXRlLnBhcnNlKGZyb20pKSAvIDg2NDAwMDAwO1xuICAgIGNvbnN0IGRheXMgPSBOdW1iZXIuaXNGaW5pdGUoc3BhbkRheXMpID8gTWF0aC5tYXgoc3BhbkRheXMsIDEpIDogMTtcbiAgICAvLyBCYW5kIG9uIHRoZSBVTlJPVU5ERUQgcmF0ZTsgcm91bmQgb25seSBmb3IgZGlzcGxheS4gUm91bmRpbmcgZmlyc3Qgd291bGRcbiAgICAvLyBtaXNsYWJlbCBleGFjdCB3ZWVrbHkvbW9udGhseSBib3VuZGFyaWVzIChlLmcuIDEgZGVwbG95IC8gMzAgZGF5cyDihpJcbiAgICAvLyAwLjAzMzMgcm91bmRzIHRvIDAuMDMgPCAxLzMwIOKGkiB3cm9uZ2x5IFwibG93XCIgaW5zdGVhZCBvZiBcIm1lZGl1bVwiKS5cbiAgICBjb25zdCByYXdQZXJEYXkgPSBkZXBsb3ltZW50cyAvIGRheXM7XG4gICAgY29uc3QgcGVyRGF5ID0gcm91bmQocmF3UGVyRGF5LCAyKTtcblxuICAgIGNvbnN0IGZhaWxlZCA9IE51bWJlcihyLmNmcl9mYWlsZWQpIHx8IDA7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIoci5jZnJfdG90YWwpIHx8IDA7XG4gICAgY29uc3QgcmF3UGN0ID0gdG90YWwgPiAwID8gKGZhaWxlZCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgY29uc3QgcGN0ID0gcm91bmQocmF3UGN0LCAxKTtcblxuICAgIC8vIEJhbmQgcmVzdG9yZS9sZWFkLXRpbWUgb24gdGhlIFJBVyAocHJlLXJvdW5kKSBzZWNvbmRzLCB0aGUgc2FtZSBcImJhbmQgb25cbiAgICAvLyB0aGUgdW5yb3VuZGVkIHZhbHVlXCIgcHJpbmNpcGxlIHVzZWQgZm9yIHBlckRheS9wY3QgYWJvdmU7IGtlZXAgdGhlIHJvdW5kZWRcbiAgICAvLyB2YWx1ZXMgZm9yIHRoZSByZXNwb25zZSBmaWVsZHMuIEltbWF0ZXJpYWwgYXQgdGhlIGhvdXIvZGF5IHRocmVzaG9sZHMsIGJ1dFxuICAgIC8vIGl0IG1ha2VzIHRoZSBwcmluY2lwbGUgdW5pZm9ybSBhY3Jvc3MgYWxsIGZvdXIgbWV0cmljcy5cbiAgICBjb25zdCBmYWlsdXJlcyA9IE51bWJlcihyLm10dHJfZmFpbHVyZXMpIHx8IDA7XG4gICAgY29uc3QgcmVzdG9yZWQgPSBOdW1iZXIoci5tdHRyX3Jlc3RvcmVkKSB8fCAwO1xuICAgIGNvbnN0IHJhd0F2Z1NlY29uZHMgPSBmYWlsdXJlcyA+IDAgJiYgci5tdHRyX2F2Z19zZWNvbmRzICE9IG51bGxcbiAgICAgID8gTnVtYmVyKHIubXR0cl9hdmdfc2Vjb25kcylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBhdmdTZWNvbmRzID0gcmF3QXZnU2Vjb25kcyAhPSBudWxsID8gcm91bmQocmF3QXZnU2Vjb25kcywgMSkgOiBudWxsO1xuXG4gICAgY29uc3QgbHREZXBsb3ltZW50cyA9IE51bWJlcihyLmx0X2RlcGxveW1lbnRzKSB8fCAwO1xuICAgIGNvbnN0IHJhd01lZGlhblNlY29uZHMgPSByLmx0X21lZGlhbl9tcyAhPSBudWxsXG4gICAgICA/IE51bWJlcihyLmx0X21lZGlhbl9tcykgLyAxMDAwXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgbWVkaWFuU2Vjb25kcyA9IHJhd01lZGlhblNlY29uZHMgIT0gbnVsbCA/IHJvdW5kKHJhd01lZGlhblNlY29uZHMsIDEpIDogbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICB3aW5kb3c6IHsgZnJvbSwgdG8gfSxcbiAgICAgIGJhc2lzLFxuICAgICAgZmlsdGVyczogeyBwaXBlbGluZUlkOiBmaWx0ZXJzLnBpcGVsaW5lSWQgPz8gbnVsbCwgZW52aXJvbm1lbnQ6IGZpbHRlcnMuZW52aXJvbm1lbnQgPz8gbnVsbCB9LFxuICAgICAgZGVwbG95bWVudEZyZXF1ZW5jeTogeyBkZXBsb3ltZW50cywgcGVyRGF5LCBsZXZlbDogZG9yYUxldmVsRm9yRnJlcXVlbmN5KHJhd1BlckRheSwgZGVwbG95bWVudHMpIH0sXG4gICAgICBjaGFuZ2VGYWlsdXJlUmF0ZTogeyBmYWlsZWQsIHRvdGFsLCBwY3QsIGxldmVsOiBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlKHJhd1BjdCwgdG90YWwpIH0sXG4gICAgICBtZWFuVGltZVRvUmVzdG9yZTogeyBmYWlsdXJlcywgcmVzdG9yZWQsIGF2Z1NlY29uZHMsIGxldmVsOiBkb3JhTGV2ZWxGb3JSZXN0b3JlKHJhd0F2Z1NlY29uZHMpIH0sXG4gICAgICBsZWFkVGltZTogeyBkZXBsb3ltZW50czogbHREZXBsb3ltZW50cywgbWVkaWFuU2Vjb25kcywgYXBwcm94OiB0cnVlLCBsZXZlbDogZG9yYUxldmVsRm9yTGVhZFRpbWUocmF3TWVkaWFuU2Vjb25kcykgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIDEuOWIgRE9SQSB0cmVuZCDigJQgZGVwbG95bWVudCBmcmVxdWVuY3kgKyBjaGFuZ2UtZmFpbHVyZSByYXRlIGJ1Y2tldGVkIGJ5XG4gICAqIGBpbnRlcnZhbGAgKGRheS93ZWVrL21vbnRoKSBmb3IgYSBzcGFya2xpbmUuIFBlci1leGVjdXRpb24gcm9sbHVwIChvbmUgcm93XG4gICAqIHBlciBleGVjdXRpb24sIEZBSUxFRCB3aW5zKSBidWNrZXRlZCBvbiB0aGUgZXhlY3V0aW9uJ3Mgc3RhcnRlZF9hdC4gU2hhcmVzXG4gICAqIHRoZSBgZ2V0RG9yYU1ldHJpY3NgIHNjb3BpbmcgKG9yZy9yb2xsdXAsIHBpcGVsaW5lSWQsIGRlcGxveS1zY29waW5nKTsgTVRUUlxuICAgKiBhbmQgbGVhZCB0aW1lIGFyZSBpbnRlbnRpb25hbGx5IG9taXR0ZWQgKHRvbyBoZWF2eSB0byBidWNrZXQgbWVhbmluZ2Z1bGx5KS5cbiAgICovXG4gIGFzeW5jIGdldERvcmFUcmVuZChcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGludGVydmFsOiBzdHJpbmcsXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxEb3JhVHJlbmRQb2ludFtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgZGVwbG95c09ubHkgfSA9IG9wdHM7XG4gICAgY29uc3QgeyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlIH0gPSBkb3JhU2NvcGVDbGF1c2VzKG9wdHMpO1xuICAgIC8vIFNhbWUgZXhlY3Mgcm9sbC11cCBhcyBnZXREb3JhTWV0cmljcyAoc2hhcmVkIGJ1aWxkZXIg4oCUIHN0YXR1cyBzZXQgK1xuICAgIC8vIHByZWRpY2F0ZSBjYW4ndCBkcmlmdCk7IHRoZSB0cmVuZCBuZWVkcyBvbmx5IHN0YXJ0ZWRfYXQgb3ZlciB0aGUgY29yZVxuICAgIC8vIHdpbmRvdyAobm8gTVRUUiBsb29rLWFoZWFkLCBubyBlbmRlZF9hdC9kdXJhdGlvbiBjb2x1bW5zKS5cbiAgICBjb25zdCBleGVjcyA9IGV4ZWNzQ3RlKHtcbiAgICAgIHByZWQsXG4gICAgICBwaXBlbGluZUNsYXVzZSxcbiAgICAgIGRlcGxveUNsYXVzZSxcbiAgICAgIGZyb20sXG4gICAgICBjb2x1bW5zOiBzcWxgXG4gICAgICAgICAgICAke0RPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0V9IEFTIHN0YXR1cyxcbiAgICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEFTIHN0YXJ0ZWRfYXRgLFxuICAgICAgdG9Cb3VuZDogc3FsYCR7dG99Ojp0aW1lc3RhbXB0emAsXG4gICAgfSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBXSVRIIGV4ZWNzIEFTICgke2V4ZWNzfVxuICAgICAgICApXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIHN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIC0tIHF1b3RlZCBhbGlhcyBzbyB0aGUgcmF3IHJvdyBrZXkgaXMgZXhhY3RseSB0aGUgRG9yYVRyZW5kUG9pbnQgZmllbGRcbiAgICAgICAgICBDT0FMRVNDRShST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpLCAwKSAqIDEwMCwgMSksIDApOjpmbG9hdCBBUyBcImNoYW5nZUZhaWx1cmVQY3RcIlxuICAgICAgICBGUk9NIGV4ZWNzXG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxEb3JhVHJlbmRQb2ludD4oci5yb3dzKSkpO1xuICAgIC8vIE9taXQgdGhlIGRlcGxveXNPbmx5IG1hcmtlciB3aGVuIGVudmlyb25tZW50IGlzIHNldDogaXQgd2lucyBpblxuICAgIC8vIGRvcmFTY29wZUNsYXVzZXMsIHNvIHRoZSBTUUwgKGFuZCB0aHVzIHRoZSBjb3JyZWN0IGNhY2hlIGtleSkgaXMgaWRlbnRpY2FsXG4gICAgLy8gdG8gdGhlIGVudmlyb25tZW50LW9ubHkgY2FzZS4gT25seSBhcHBlbmQgJ2QnIHdoZW4gaXQgY2hhbmdlcyB0aGUgcXVlcnkuXG4gICAgY29uc3QgZGVwbG95TWFya2VyID0gIWVudmlyb25tZW50ICYmIGRlcGxveXNPbmx5ID8gJ2QnIDogJyc7XG4gICAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmEtdHJlbmQ6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9OiR7ZGVwbG95TWFya2VyfWA7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGtleSwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDI6IFBsdWdpbiBJbnZlbnRvcnkgJiBCdWlsZHMg4pSA4pSAXG5cbiAgLyoqIDIuMSBQbHVnaW4gc3VtbWFyeSDigJQgY291bnRzIGFuZCBicmVha2Rvd25zLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIGFuIG9yZy1vd25lZFxuICAgKiAgYXNzZXQgY291bnQsIG5vdCBhbiBleGVjdXRpb24vYnVpbGQgYWN0aXZpdHkgcmVwb3J0LCBzbyBhIHBhcmVudCdzIHZpZXcgaXNcbiAgICogIGl0cyBvd24gcGx1Z2lucyDigJQgdGVhbXMgbWFuYWdlIHRoZWlyIG93biBpbnZlbnRvcnkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luU3VtbWFyeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5TdW1tYXJ5PiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tc3VtbWFyeWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgTk9UICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgaW5hY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uYWNjZXNzTW9kaWZpZXJ9ID0gJ3B1YmxpYycpOjppbnQgQVMgcHVibGljLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmFjY2Vzc01vZGlmaWVyfSA9ICdwcml2YXRlJyk6OmludCBBUyBwcml2YXRlLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUICR7c2NoZW1hLnBsdWdpbi5uYW1lfSk6OmludCBBUyB1bmlxdWVfbmFtZXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfVxuICAgICAgYCkpO1xuICAgICAgcmV0dXJuIChkcml6emxlUm93czxQbHVnaW5TdW1tYXJ5Pihyb3dzLnJvd3MpWzBdIHx8IHsgdG90YWw6IDAsIGFjdGl2ZTogMCwgaW5hY3RpdmU6IDAsIHB1YmxpYzogMCwgcHJpdmF0ZTogMCwgdW5pcXVlTmFtZXM6IDAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogMi4yIFR5cGUgJiBjb21wdXRlIGRpc3RyaWJ1dGlvbi5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpbkRpc3RyaWJ1dGlvbihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbltdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tZGlzdHJpYnV0aW9uYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0gQVMgcGx1Z2luX3R5cGUsXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfSBBUyBjb21wdXRlX3R5cGUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBjb3VudFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0sICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX1cbiAgICAgICAgT1JERVIgQlkgY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAyLjMgVmVyc2lvbiBjb3VudHMgcGVyIHBsdWdpbiBuYW1lLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIHBlci1vcmcgKHNlZVxuICAgKiAgZ2V0UGx1Z2luU3VtbWFyeSkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luVmVyc2lvbnMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VmVyc2lvbkNvdW50W10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi12ZXJzaW9uc2AsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLm5hbWV9LFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdmVyc2lvbl9jb3VudCxcbiAgICAgICAgICAtLSBIaWdoZXN0IHZlcnNpb24gYnkgTlVNRVJJQyBzZW12ZXIgY29yZSAobm90IGxleGljYWw6ICcxMC4wLjAnID4gJzkuMC4wJykuXG4gICAgICAgICAgLS0gU3RyaXAgYW55IC1wcmVyZWxlYXNlLytidWlsZCBzdWZmaXggYmVmb3JlIHRoZSBpbnRbXSBjYXN0IHNvIGl0IGNhbid0XG4gICAgICAgICAgLS0gZXJyb3Igb24gdmFsaWQgc2VtdmVyOyBrZWVwIHRoZSBvcmlnaW5hbCBzdHJpbmcgZm9yIGRpc3BsYXkuXG4gICAgICAgICAgLS0gR1VBUkQ6IGEgbm9uLW51bWVyaWMtZG90dGVkIHZlcnNpb24gKCdsYXRlc3QnLCAnJywgJ3YxJykgd291bGQgbWFrZSB0aGVcbiAgICAgICAgICAtLSA6OmludFtdIGNhc3QgdGhyb3cgYW5kIGJsb3cgdXAgdGhlIFdIT0xFIG9yZyBzdW1tYXJ5LiBPbmx5IGNhc3Qgcm93c1xuICAgICAgICAgIC0tIHdob3NlIHN0cmlwcGVkIGNvcmUgbWF0Y2hlcyBhIG51bWVyaWMtZG90dGVkIHNoYXBlOyBzb3J0IGV2ZXJ5dGhpbmdcbiAgICAgICAgICAtLSBlbHNlIHRvIHRoZSBib3R0b20gdmlhIGEgc2VudGluZWwgQVJSQVlbLTFdIHNvIHRoZSByb3cgc3RpbGwgY291bnRzLlxuICAgICAgICAgIChhcnJheV9hZ2coJHtzY2hlbWEucGx1Z2luLnZlcnNpb259XG4gICAgICAgICAgICAgT1JERVIgQlkgQ0FTRVxuICAgICAgICAgICAgICAgV0hFTiByZWdleHBfcmVwbGFjZSgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0sICdbLStdLiokJywgJycpIH4gJ15bMC05XSsoWy5dWzAtOV0rKSokJ1xuICAgICAgICAgICAgICAgICBUSEVOIHN0cmluZ190b19hcnJheShyZWdleHBfcmVwbGFjZSgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0sICdbLStdLiokJywgJycpLCAnLicpOjppbnRbXVxuICAgICAgICAgICAgICAgRUxTRSBBUlJBWVstMV1cbiAgICAgICAgICAgICBFTkQgREVTQ1xuICAgICAgICAgICkpWzFdIEFTIGxhdGVzdF92ZXJzaW9uLFxuICAgICAgICAgIGJvb2xfb3IoJHtzY2hlbWEucGx1Z2luLmlzRGVmYXVsdH0pIEFTIGhhc19kZWZhdWx0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5uYW1lfVxuICAgICAgICBPUkRFUiBCWSB2ZXJzaW9uX2NvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxWZXJzaW9uQ291bnQ+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIDIuNCBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGRUaW1lU2VyaWVzRW50cnlbXT4ge1xuICAgIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgICAvLyBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBleGVjdXRpb24gcmVwb3J0cy4gVGhlc2VcbiAgICAvLyByb3dzIGFyZSBnYXRlZCBvbiB0aGUgcGlwZWxpbmVfZXZlbnQgYG9yZ19pZGAgZGlyZWN0bHkgKG5vIHBpcGVsaW5lIGpvaW4pLFxuICAgIC8vIHNvIGBwcmVkYCBhcHBsaWVzIHRvIGBlLm9yZ19pZGAuXG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdmYWlsZWQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJ1xuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ2NvbXBsZXRlZCcsICdmYWlsZWQnKVxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkVGltZVNlcmllc0VudHJ5PihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpidWlsZC1zdWNjZXNzOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMi41IEJ1aWxkIGR1cmF0aW9uIHBlciBwbHVnaW4uIEJ1aWxkIGFjdGl2aXR5IHJlcG9ydCDigJQgcm9sbHVwLWF3YXJlLiAqL1xuICBhc3luYyBnZXRCdWlsZER1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkRHVyYXRpb25bXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgYnVpbGRzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRHVyYXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLWR1cmF0aW9uOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMi42IEJ1aWxkIGZhaWx1cmVzIOKAlCB0b3AgZXJyb3IgbWVzc2FnZXMuIEJ1aWxkIGFjdGl2aXR5IHJlcG9ydCDigJQgcm9sbHVwLWF3YXJlLiAqL1xuICBhc3luYyBnZXRCdWlsZEZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGRGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgZS5lcnJvcl9tZXNzYWdlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSwgZS5lcnJvcl9tZXNzYWdlXG4gICAgICAgIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZEZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLWZhaWx1cmVzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydGluZ1NlcnZpY2UgPSBuZXcgUmVwb3J0aW5nU2VydmljZSgpO1xuIl19
|
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": "3.4.
|
|
28
|
+
"@pipeline-builder/api-core": "3.4.107"
|
|
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": "3.4.
|
|
84
|
+
"version": "3.4.112",
|
|
85
85
|
"bugs": {
|
|
86
86
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
87
87
|
},
|