@workflow/core 5.0.0-beta.44 → 5.0.0-beta.46

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.
Files changed (58) hide show
  1. package/dist/attribute-changes.d.ts +3 -5
  2. package/dist/attribute-changes.d.ts.map +1 -1
  3. package/dist/attribute-changes.js +2 -2
  4. package/dist/capabilities.d.ts +2 -2
  5. package/dist/capabilities.js +4 -4
  6. package/dist/events-consumer.d.ts +1 -1
  7. package/dist/events-consumer.d.ts.map +1 -1
  8. package/dist/events-consumer.js +3 -2
  9. package/dist/flushable-stream.js +2 -2
  10. package/dist/global.d.ts +3 -1
  11. package/dist/global.d.ts.map +1 -1
  12. package/dist/global.js +8 -5
  13. package/dist/private.d.ts +9 -7
  14. package/dist/private.d.ts.map +1 -1
  15. package/dist/private.js +11 -1
  16. package/dist/runtime/helpers.d.ts +3 -3
  17. package/dist/runtime/helpers.js +1 -1
  18. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-entrypoint.js +8 -1
  20. package/dist/runtime/quickjs-runtime.js +7 -1
  21. package/dist/runtime/resume-hook.d.ts +27 -12
  22. package/dist/runtime/resume-hook.d.ts.map +1 -1
  23. package/dist/runtime/resume-hook.js +182 -182
  24. package/dist/runtime/resume-latency.d.ts +16 -6
  25. package/dist/runtime/resume-latency.d.ts.map +1 -1
  26. package/dist/runtime/resume-latency.js +4 -2
  27. package/dist/runtime/run.d.ts +1 -1
  28. package/dist/runtime/run.d.ts.map +1 -1
  29. package/dist/runtime/run.js +3 -2
  30. package/dist/runtime/start.js +3 -3
  31. package/dist/runtime/step-latency.d.ts +31 -14
  32. package/dist/runtime/step-latency.d.ts.map +1 -1
  33. package/dist/runtime/step-latency.js +19 -13
  34. package/dist/runtime/suspension-handler.d.ts +9 -7
  35. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  36. package/dist/runtime/suspension-handler.js +41 -41
  37. package/dist/runtime.d.ts.map +1 -1
  38. package/dist/runtime.js +133 -66
  39. package/dist/serialization/hardened.d.ts +5 -4
  40. package/dist/serialization/hardened.d.ts.map +1 -1
  41. package/dist/serialization/hardened.js +7 -1
  42. package/dist/serialization-format.js +2 -2
  43. package/dist/serialization.d.ts +5 -6
  44. package/dist/serialization.d.ts.map +1 -1
  45. package/dist/serialization.js +19 -12
  46. package/dist/step.d.ts.map +1 -1
  47. package/dist/step.js +3 -11
  48. package/dist/telemetry/semantic-conventions.d.ts +14 -5
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +13 -4
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +2 -2
  53. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
  54. package/dist/workflow/attribute-dispatcher.js +3 -6
  55. package/dist/workflow/hook.d.ts.map +1 -1
  56. package/dist/workflow/hook.js +6 -15
  57. package/dist/workflow.js +7 -8
  58. package/package.json +4 -4
@@ -1,7 +1,5 @@
1
- import { type AttributeChange } from '@workflow/world';
2
- interface AttributeChangeOptions {
1
+ import { type AttributeChange } from '@workflow/world/attributes-validation';
2
+ export declare function normalizeAttributeChanges(attrs: Record<string, string | undefined>, options?: {
3
3
  allowReservedAttributes?: boolean;
4
- }
5
- export declare function normalizeAttributeChanges(attrs: Record<string, string | undefined>, options?: AttributeChangeOptions): AttributeChange[];
6
- export {};
4
+ }): AttributeChange[];
7
5
  //# sourceMappingURL=attribute-changes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attribute-changes.d.ts","sourceRoot":"","sources":["../src/attribute-changes.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;AAEzB,UAAU,sBAAsB;IAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE,sBAA2B,GACnC,eAAe,EAAE,CA4BnB"}
1
+ {"version":3,"file":"attribute-changes.d.ts","sourceRoot":"","sources":["../src/attribute-changes.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,uCAAuC,CAAC;AAE/C,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAO,GAClD,eAAe,EAAE,CA4BnB"}
@@ -1,5 +1,5 @@
1
1
  import { FatalError } from '@workflow/errors';
2
- import { AttributeValidationError, validateAttributeChanges, } from '@workflow/world';
2
+ import { AttributeValidationError, validateAttributeChanges, } from '@workflow/world/attributes-validation';
3
3
  export function normalizeAttributeChanges(attrs, options = {}) {
4
4
  if (attrs === null || typeof attrs !== 'object' || Array.isArray(attrs)) {
5
5
  throw new FatalError(`setAttributes requires a plain object, got ${attrs === null ? 'null' : Array.isArray(attrs) ? 'array' : typeof attrs}`);
@@ -22,4 +22,4 @@ export function normalizeAttributeChanges(attrs, options = {}) {
22
22
  }
23
23
  return changes;
24
24
  }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXR0cmlidXRlLWNoYW5nZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsd0JBQXdCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFNekIsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxLQUF5QyxFQUN6QyxVQUFrQyxFQUFFO0lBRXBDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxVQUFVLENBQ2xCLDhDQUNFLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQ3BFLEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFzQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FDMUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixHQUFHO1FBQ0gsS0FBSyxFQUFFLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztLQUMxQyxDQUFDLENBQ0gsQ0FBQztJQUNGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFekMsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsdUJBQXVCLEtBQUssSUFBSSxDQUFDO0lBQ3pFLElBQUksQ0FBQztRQUNILHdCQUF3QixDQUFDLE9BQU8sRUFBRSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxZQUFZLHdCQUF3QixFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICB0eXBlIEF0dHJpYnV0ZUNoYW5nZSxcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbmludGVyZmFjZSBBdHRyaWJ1dGVDaGFuZ2VPcHRpb25zIHtcbiAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhcbiAgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IEF0dHJpYnV0ZUNoYW5nZU9wdGlvbnMgPSB7fVxuKTogQXR0cmlidXRlQ2hhbmdlW10ge1xuICBpZiAoYXR0cnMgPT09IG51bGwgfHwgdHlwZW9mIGF0dHJzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGF0dHJzKSkge1xuICAgIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgICAgYHNldEF0dHJpYnV0ZXMgcmVxdWlyZXMgYSBwbGFpbiBvYmplY3QsIGdvdCAke1xuICAgICAgICBhdHRycyA9PT0gbnVsbCA/ICdudWxsJyA6IEFycmF5LmlzQXJyYXkoYXR0cnMpID8gJ2FycmF5JyA6IHR5cGVvZiBhdHRyc1xuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlczogQXR0cmlidXRlQ2hhbmdlW10gPSBPYmplY3QuZW50cmllcyhhdHRycykubWFwKFxuICAgIChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZSxcbiAgICB9KVxuICApO1xuICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHJldHVybiBjaGFuZ2VzO1xuXG4gIGNvbnN0IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID0gb3B0aW9ucy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoY2hhbmdlcywgeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICByZXR1cm4gY2hhbmdlcztcbn1cbiJdfQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXR0cmlidXRlLWNoYW5nZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsd0JBQXdCLEdBQ3pCLE1BQU0sdUNBQXVDLENBQUM7QUFFL0MsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxLQUF5QyxFQUN6QyxVQUFpRCxFQUFFO0lBRW5ELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxVQUFVLENBQ2xCLDhDQUNFLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQ3BFLEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFzQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FDMUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixHQUFHO1FBQ0gsS0FBSyxFQUFFLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztLQUMxQyxDQUFDLENBQ0gsQ0FBQztJQUNGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFekMsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsdUJBQXVCLEtBQUssSUFBSSxDQUFDO0lBQ3pFLElBQUksQ0FBQztRQUNILHdCQUF3QixDQUFDLE9BQU8sRUFBRSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxZQUFZLHdCQUF3QixFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICB0eXBlIEF0dHJpYnV0ZUNoYW5nZSxcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZC9hdHRyaWJ1dGVzLXZhbGlkYXRpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhcbiAgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuIH0gPSB7fVxuKTogQXR0cmlidXRlQ2hhbmdlW10ge1xuICBpZiAoYXR0cnMgPT09IG51bGwgfHwgdHlwZW9mIGF0dHJzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGF0dHJzKSkge1xuICAgIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgICAgYHNldEF0dHJpYnV0ZXMgcmVxdWlyZXMgYSBwbGFpbiBvYmplY3QsIGdvdCAke1xuICAgICAgICBhdHRycyA9PT0gbnVsbCA/ICdudWxsJyA6IEFycmF5LmlzQXJyYXkoYXR0cnMpID8gJ2FycmF5JyA6IHR5cGVvZiBhdHRyc1xuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlczogQXR0cmlidXRlQ2hhbmdlW10gPSBPYmplY3QuZW50cmllcyhhdHRycykubWFwKFxuICAgIChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZSxcbiAgICB9KVxuICApO1xuICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHJldHVybiBjaGFuZ2VzO1xuXG4gIGNvbnN0IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID0gb3B0aW9ucy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoY2hhbmdlcywgeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICByZXR1cm4gY2hhbmdlcztcbn1cbiJdfQ==
@@ -40,8 +40,8 @@
40
40
  * - Lazy hook resume ("consumer re-ensures `hook_received` from `hookInput`"):
41
41
  * deliberately NOT tracked here. Rather than predict a release cutoff, the
42
42
  * run's creating deployment stamps an explicit `hookResumeInputVersion`
43
- * execution-context marker; `resumeHook()` gates the parallel fast path on
44
- * that marker (mirrored onto the hook's resumeContext by the server).
43
+ * execution-context marker; `resumeHook()` gates the lazy path on that
44
+ * marker (mirrored onto the hook's resumeContext by the server).
45
45
  */
46
46
  import { type SerializationFormatType } from './serialization.js';
47
47
  /**
@@ -40,8 +40,8 @@
40
40
  * - Lazy hook resume ("consumer re-ensures `hook_received` from `hookInput`"):
41
41
  * deliberately NOT tracked here. Rather than predict a release cutoff, the
42
42
  * run's creating deployment stamps an explicit `hookResumeInputVersion`
43
- * execution-context marker; `resumeHook()` gates the parallel fast path on
44
- * that marker (mirrored onto the hook's resumeContext by the server).
43
+ * execution-context marker; `resumeHook()` gates the lazy path on that
44
+ * marker (mirrored onto the hook's resumeContext by the server).
45
45
  */
46
46
  import semver from 'semver';
47
47
  import { SerializationFormat, } from './serialization.js';
@@ -86,7 +86,7 @@ const CAPABILITY_VERSION_TABLE = [
86
86
  // version-compare against a predicted release cutoff is a guess; instead the
87
87
  // run's creating deployment stamps an explicit `hookResumeInputVersion`
88
88
  // marker into its execution context, which the server mirrors onto the hook's
89
- // resumeContext. `resumeHook()` gates the parallel fast path on that marker.
89
+ // resumeContext. `resumeHook()` gates the lazy path on that marker.
90
90
  ];
91
91
  /**
92
92
  * The set of formats supported by all specVersion 2 runs, regardless of
@@ -129,4 +129,4 @@ export function getRunCapabilities(workflowCoreVersion) {
129
129
  }
130
130
  return result;
131
131
  }
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NhcGFiaWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLG9CQUFvQixDQUFDO0FBd0I1Qjs7OztHQUlHO0FBQ0gsTUFBTSxvQkFBb0IsR0FHckI7SUFDSCxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUN0RSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLG9FQUFvRTtJQUNwRSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLG1FQUFtRTtJQUNuRSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNqRSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNqRSw4RUFBOEU7SUFDOUUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFO0lBQ25FLGtCQUFrQjtJQUNsQiw2REFBNkQ7SUFDN0QscUVBQXFFO0NBQ3RFLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUd6QjtJQUNILCtFQUErRTtJQUMvRSw2RUFBNkU7SUFDN0UsK0VBQStFO0lBQy9FLDBFQUEwRTtJQUMxRSxrQ0FBa0M7SUFDbEMsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNoRSw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsOEVBQThFO0lBQzlFLDZFQUE2RTtDQUM5RSxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sZ0JBQWdCLEdBQXlDLElBQUksR0FBRyxDQUFDO0lBQ3JFLG1CQUFtQixDQUFDLFVBQVU7Q0FDL0IsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLG1CQUF1QztJQUV2QyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUMvRCxPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLGlCQUFpQixFQUFFLEtBQUs7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBMEIsZ0JBQWdCLENBQUMsQ0FBQztJQUVuRSxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMxRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQW9CO1FBQzlCLGdCQUFnQixFQUFFLE9BQU87UUFDekIsaUJBQWlCLEVBQUUsS0FBSztLQUN6QixDQUFDO0lBRUYsS0FBSyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDbEUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhcGFiaWxpdGllcyB0YWJsZSBmb3Igd29ya2Zsb3cgcnVucyBiYXNlZCBvbiB0aGVpciBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uXG4gKlxuICogV2hlbiByZXN1bWluZyBhIGhvb2sgb3Igd2ViaG9vaywgdGhlIHBheWxvYWQgbXVzdCBiZSBlbmNvZGVkIGluIGEgZm9ybWF0XG4gKiB0aGF0IHRoZSAqdGFyZ2V0KiB3b3JrZmxvdyBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIFRoaXMgbW9kdWxlIHByb3ZpZGVzXG4gKiBhIHdheSB0byBsb29rIHVwIHdoYXQgc2VyaWFsaXphdGlvbiBmb3JtYXRzIGEgZ2l2ZW4gYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uXG4gKiBzdXBwb3J0cywgc28gdGhhdCBuZXdlciBkZXBsb3ltZW50cyBjYW4gYXZvaWQgZW5jb2RpbmcgcGF5bG9hZHMgaW4gZm9ybWF0c1xuICogdGhhdCBvbGRlciBkZXBsb3ltZW50cyBkb24ndCB1bmRlcnN0YW5kIChlLmcuLCB0aGUgYGVuY3JgIGVuY3J5cHRpb24gZm9ybWF0KS5cbiAqXG4gKiAjIyBBZGRpbmcgYSBuZXcgZm9ybWF0XG4gKlxuICogV2hlbiBhIG5ldyBzZXJpYWxpemF0aW9uIGZvcm1hdCBpcyBpbnRyb2R1Y2VkOlxuICogMS4gQWRkIHRoZSBmb3JtYXQgY29uc3RhbnQgdG8gYFNlcmlhbGl6YXRpb25Gb3JtYXRgIGluIGBzZXJpYWxpemF0aW9uLnRzYFxuICogMi4gQWRkIGFuIGVudHJ5IHRvIGBGT1JNQVRfVkVSU0lPTl9UQUJMRWAgYmVsb3cgd2l0aCB0aGUgbWluaW11bVxuICogICAgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgaXRcbiAqIDMuIFRoZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzKClgIGZ1bmN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBpbmNsdWRlIGl0XG4gKlxuICogIyMgQWRkaW5nIGEgbmV3IG5vbi1mb3JtYXQgY2FwYWJpbGl0eVxuICpcbiAqIFNvbWUgY2FwYWJpbGl0aWVzIGFyZW4ndCBzZXJpYWxpemF0aW9uIGZvcm1hdCBwcmVmaXhlczogZS5nLlxuICogYnl0ZS1zdHJlYW0gd2lyZSBmcmFtaW5nIGlzIGFuIGVudmVsb3BlIGFyb3VuZCBjaHVua3MgcmF0aGVyIHRoYW5cbiAqIGEgY29udGVudCBmb3JtYXQuIEZvciB0aG9zZSwgYWRkIGEgYm9vbGVhbiBmaWVsZCB0byBgUnVuQ2FwYWJpbGl0aWVzYFxuICogYW5kIGFuIGVudHJ5IGluIGBDQVBBQklMSVRZX1ZFUlNJT05fVEFCTEVgIGJlbG93LlxuICpcbiAqICMjIEhpc3RvcnlcbiAqXG4gKiAtIGBlbmNyYCAoQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbik6IGFkZGVkIGluIGA0LjIuMC1iZXRhLjY0YFxuICogICBDb21taXQ6IDc2MThhYzM2IFwiV2lyZSBBRVMtR0NNIGVuY3J5cHRpb24gaW50byBzZXJpYWxpemF0aW9uIGxheWVyICgjMTI1MSlcIlxuICogICBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2NvbW1pdC83NjE4YWMzNlxuICogLSBgZnJhbWVkQnl0ZVN0cmVhbXNgICh3aXJlLWxldmVsIGNodW5rIGZyYW1pbmcgZm9yIGJ5dGUgc3RyZWFtcyk6IGFkZGVkIGluIGA1LjAuMC1iZXRhLjE1YFxuICogLSBgZ3ppcGAgKGd6aXAgcGF5bG9hZCBjb21wcmVzc2lvbik6IGFkZGVkIGluIGA1LjAuMC1iZXRhLjE4YFxuICogLSBgenN0ZGAgKHpzdGQgcGF5bG9hZCBjb21wcmVzc2lvbiwgcHJlZmVycmVkIGNvZGVjKTogYWRkZWQgaW4gYDUuMC4wLWJldGEuMThgXG4gKiAgIGFsb25nc2lkZSBnemlwOyB0aGV5IGNvLXNoaXAsIHNvIGFueSBydW4gdGhhdCBjYW4gcmVhZCBvbmUgY2FuIHJlYWQgYm90aC5cbiAqIC0gYGVuY3BgIChYMjU1MTkgc2VhbGVkLWJveCBlbmNyeXB0aW9uIGZvciBjcm9zcy1ydW4gd3JpdGVzKTogYWRkZWQgaW5cbiAqICAgYDUuMC4wLWJldGEuMzdgLiBOb3RlIHRoYXQgcHJvZHVjZXJzIGRvICoqbm90KiogZ2F0ZSBgZW5jcGAgb24gdGhpcyB0YWJsZTpcbiAqICAgdGhleSBnYXRlIG9uIHRoZSBwcmVzZW5jZSBvZiBgZW5jcnlwdGlvblB1YmxpY0tleWAgb24gdGhlIHRhcmdldCBydW4sXG4gKiAgIHdoaWNoIGEgcnVuIG9ubHkgY2FycmllcyBpZiB0aGUgZGVwbG95bWVudCB0aGF0IGNyZWF0ZWQgaXQgY291bGQgYWxzb1xuICogICBvcGVuIGBlbmNwYC4gVGhlIGVudHJ5IGV4aXN0cyBzbyB0aGUgY2FwYWJpbGl0eSBzZXQgc3RheXMgYSBjb21wbGV0ZSxcbiAqICAgYXVkaXRhYmxlIGRlc2NyaXB0aW9uIG9mIGEgcnVuJ3MgZGVjb2RpbmcgYWJpbGl0eS5cbiAqIC0gTGF6eSBob29rIHJlc3VtZSAoXCJjb25zdW1lciByZS1lbnN1cmVzIGBob29rX3JlY2VpdmVkYCBmcm9tIGBob29rSW5wdXRgXCIpOlxuICogICBkZWxpYmVyYXRlbHkgTk9UIHRyYWNrZWQgaGVyZS4gUmF0aGVyIHRoYW4gcHJlZGljdCBhIHJlbGVhc2UgY3V0b2ZmLCB0aGVcbiAqICAgcnVuJ3MgY3JlYXRpbmcgZGVwbG95bWVudCBzdGFtcHMgYW4gZXhwbGljaXQgYGhvb2tSZXN1bWVJbnB1dFZlcnNpb25gXG4gKiAgIGV4ZWN1dGlvbi1jb250ZXh0IG1hcmtlcjsgYHJlc3VtZUhvb2soKWAgZ2F0ZXMgdGhlIHBhcmFsbGVsIGZhc3QgcGF0aCBvblxuICogICB0aGF0IG1hcmtlciAobWlycm9yZWQgb250byB0aGUgaG9vaydzIHJlc3VtZUNvbnRleHQgYnkgdGhlIHNlcnZlcikuXG4gKi9cblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcblxuLyoqXG4gKiBDYXBhYmlsaXRpZXMgb2YgYSB3b3JrZmxvdyBydW4gYmFzZWQgb24gaXRzIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5DYXBhYmlsaXRpZXMge1xuICAvKipcbiAgICogVGhlIHNldCBvZiBzZXJpYWxpemF0aW9uIGZvcm1hdCBwcmVmaXhlcyB0aGF0IHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUuXG4gICAqIFVzZSBgc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpYCB0byBjaGVja1xuICAgKiBpZiBlbmNyeXB0aW9uIGlzIHN1cHBvcnRlZCwgZXRjLlxuICAgKi9cbiAgc3VwcG9ydGVkRm9ybWF0czogUmVhZG9ubHlTZXQ8U2VyaWFsaXphdGlvbkZvcm1hdFR5cGU+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWQgYnl0ZSBzdHJlYW1zLiBXaGVuIHRydWUsXG4gICAqIGJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgIFJlYWRhYmxlU3RyZWFtcyBwYXNzZWQgYWNyb3NzIGJvdW5kYXJpZXMpXG4gICAqIGFyZSB3cmFwcGVkIGluIGEgbGVuZ3RoLXByZWZpeGVkIGZyYW1lIGVudmVsb3BlIG9uIHRoZSB3aXJlIHNvIHRoZVxuICAgKiByZWFkZXIgY2FuIGlkZW50aWZ5IGNodW5rIGJvdW5kYXJpZXMsIHdoaWNoIGVuYWJsZXMgYXV0by1yZWNvbm5lY3RcbiAgICogb24gdHJhbnNpZW50IHN0cmVhbSBlcnJvcnMuIFdoZW4gZmFsc2UsIGJ5dGUgc3RyZWFtcyBhcmUgd3JpdHRlbiBhc1xuICAgKiByYXcgYnl0ZXMgKHRoZSBsZWdhY3kgZm9ybWF0KSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gICAqL1xuICBmcmFtZWRCeXRlU3RyZWFtczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYXBzIHNlcmlhbGl6YXRpb24gZm9ybWF0IGlkZW50aWZpZXJzIHRvIHRoZSBtaW5pbXVtIGBAd29ya2Zsb3cvY29yZWBcbiAqIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZW0uIEZvcm1hdHMgbm90IGxpc3RlZCBoZXJlIGFyZVxuICogYXNzdW1lZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIHNwZWNWZXJzaW9uIDIgcnVucyAoZS5nLiwgYGRldmxgKS5cbiAqL1xuY29uc3QgRk9STUFUX1ZFUlNJT05fVEFCTEU6IFJlYWRvbmx5QXJyYXk8e1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBtaW5WZXJzaW9uOiBzdHJpbmc7XG59PiA9IFtcbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELCBtaW5WZXJzaW9uOiAnNC4yLjAtYmV0YS42NCcgfSxcbiAgLy8gVE9ETyhyZWxlYXNlKTogdmVyaWZ5IHRoaXMgbWF0Y2hlcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCBzaGlwcyBwYXlsb2FkXG4gIC8vIGNvbXByZXNzaW9uLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLFxuICAvLyBidW1wIHRvIHRoZSBuZXh0IGJldGEuIEEgdG9vLWxvdyBjdXRvZmYgbWFrZXMgbmV3IHByb2R1Y2VycyB3cml0ZVxuICAvLyBjb21wcmVzc2VkIHBheWxvYWRzIHRvIGNvbnN1bWVycyB0aGF0IGNhbm5vdCBkZWNvbXByZXNzIHRoZW07IHRvby1oaWdoXG4gIC8vIG1lcmVseSBkZWxheXMgdGhlIG9wdGltaXphdGlvbiAoc2FmZSkuIGd6aXAgYW5kIHpzdGQgc2hpcCB0b2dldGhlciwgc29cbiAgLy8gdGhleSBzaGFyZSBhIG1pbiB2ZXJzaW9uOiBhIHJ1biB0aGF0IGNhbiByZWFkIG9uZSBjYW4gcmVhZCBib3RoLlxuICB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQLCBtaW5WZXJzaW9uOiAnNS4wLjAtYmV0YS4xOCcgfSxcbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuWlNURCwgbWluVmVyc2lvbjogJzUuMC4wLWJldGEuMTgnIH0sXG4gIC8vIFRPRE8ocmVsZWFzZSk6IHZlcmlmeSB0aGlzIG1hdGNoZXMgdGhlIGFjdHVhbCB2ZXJzaW9uIHRoYXQgc2hpcHMgc2VhbGVkLWJveFxuICAvLyBlbmNyeXB0aW9uLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLFxuICAvLyBidW1wIHRvIHRoZSBuZXh0IGJldGEuIFVubGlrZSB0aGUgZW50cmllcyBhYm92ZSwgYSB3cm9uZyBjdXRvZmYgaGVyZSBpc1xuICAvLyBub3QgYSBjb3JyZWN0bmVzcyBoYXphcmQ6IHByb2R1Y2VycyBnYXRlIGBlbmNwYCBvbiB0aGUgdGFyZ2V0IHJ1biBjYXJyeWluZ1xuICAvLyBhbiBgZW5jcnlwdGlvblB1YmxpY0tleWAsIG5vdCBvbiB0aGlzIHRhYmxlIChzZWUgSGlzdG9yeSBhYm92ZSkuXG4gIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRCwgbWluVmVyc2lvbjogJzUuMC4wLWJldGEuMzcnIH0sXG4gIC8vIEZ1dHVyZSBlbnRyaWVzOlxuICAvLyB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5DQk9SLCBtaW5WZXJzaW9uOiAnNS54LnknIH0sXG4gIC8vIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRF9WMiwgbWluVmVyc2lvbjogJzUueC55JyB9LFxuXTtcblxuLyoqXG4gKiBNYXBzIG5vbi1mb3JtYXQgY2FwYWJpbGl0eSBmbGFncyAoYm9vbGVhbnMgb24gYFJ1bkNhcGFiaWxpdGllc2ApIHRvIHRoZVxuICogbWluaW11bSBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZW0uXG4gKi9cbmNvbnN0IENBUEFCSUxJVFlfVkVSU0lPTl9UQUJMRTogUmVhZG9ubHlBcnJheTx7XG4gIGNhcGFiaWxpdHk6IGtleW9mIE9taXQ8UnVuQ2FwYWJpbGl0aWVzLCAnc3VwcG9ydGVkRm9ybWF0cyc+O1xuICBtaW5WZXJzaW9uOiBzdHJpbmc7XG59PiA9IFtcbiAgLy8gVE9ETyhyZWxlYXNlKTogdmVyaWZ5IHRoaXMgbWF0Y2hlcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCBzaGlwcyBieXRlLXN0cmVhbVxuICAvLyBmcmFtaW5nLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLCBidW1wXG4gIC8vIHRvIHRoZSBuZXh0IGJldGEuIEEgdG9vLWxvdyBjdXRvZmYgbWFrZXMgbmV3IHByb2R1Y2VycyB3cml0ZSBmcmFtZWQgYnl0ZXMgdG9cbiAgLy8gY29uc3VtZXJzIHRoYXQgY2Fubm90IHVuZnJhbWUgdGhlbSAoc2lsZW50IGNvcnJ1cHRpb24pOyB0b28taGlnaCBtZXJlbHlcbiAgLy8gZGVsYXlzIHRoZSBvcHRpbWl6YXRpb24gKHNhZmUpLlxuICB7IGNhcGFiaWxpdHk6ICdmcmFtZWRCeXRlU3RyZWFtcycsIG1pblZlcnNpb246ICc1LjAuMC1iZXRhLjE1JyB9LFxuICAvLyBOT1RFOiBsYXp5IGhvb2sgcmVzdW1lIChcImRvZXMgdGhlIGNvbnN1bWVyIHJlLWVuc3VyZSBgaG9va19yZWNlaXZlZGAgZnJvbVxuICAvLyB0aGUgcXVldWUgbWVzc2FnZSdzIGBob29rSW5wdXRgP1wiKSBpcyBpbnRlbnRpb25hbGx5IE5PVCBnYXRlZCBoZXJlLiBBXG4gIC8vIHZlcnNpb24tY29tcGFyZSBhZ2FpbnN0IGEgcHJlZGljdGVkIHJlbGVhc2UgY3V0b2ZmIGlzIGEgZ3Vlc3M7IGluc3RlYWQgdGhlXG4gIC8vIHJ1bidzIGNyZWF0aW5nIGRlcGxveW1lbnQgc3RhbXBzIGFuIGV4cGxpY2l0IGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYFxuICAvLyBtYXJrZXIgaW50byBpdHMgZXhlY3V0aW9uIGNvbnRleHQsIHdoaWNoIHRoZSBzZXJ2ZXIgbWlycm9ycyBvbnRvIHRoZSBob29rJ3NcbiAgLy8gcmVzdW1lQ29udGV4dC4gYHJlc3VtZUhvb2soKWAgZ2F0ZXMgdGhlIHBhcmFsbGVsIGZhc3QgcGF0aCBvbiB0aGF0IG1hcmtlci5cbl07XG5cbi8qKlxuICogVGhlIHNldCBvZiBmb3JtYXRzIHN1cHBvcnRlZCBieSBhbGwgc3BlY1ZlcnNpb24gMiBydW5zLCByZWdhcmRsZXNzIG9mXG4gKiBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uIFRoZXNlIGFyZSB0aGUgYmFzZWxpbmUgZm9ybWF0cyB0aGF0IHdlcmUgcHJlc2VudFxuICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNwZWNWZXJzaW9uIDIgcHJvdG9jb2wuXG4gKi9cbmNvbnN0IEJBU0VMSU5FX0ZPUk1BVFM6IFJlYWRvbmx5U2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPiA9IG5ldyBTZXQoW1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG5dKTtcblxuLyoqXG4gKiBMb29rIHVwIHdoYXQgc2VyaWFsaXphdGlvbiBjYXBhYmlsaXRpZXMgYSB3b3JrZmxvdyBydW4gc3VwcG9ydHMgYmFzZWQgb25cbiAqIGl0cyBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gc3RyaW5nIChmcm9tIGBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Q29yZVZlcnNpb25gKS5cbiAqXG4gKiBXaGVuIHRoZSB2ZXJzaW9uIGlzIGB1bmRlZmluZWRgLCBub3QgYSBzdHJpbmcsIG9yIG5vdCBhIHZhbGlkIHNlbXZlciBzdHJpbmdcbiAqIChlLmcuIG9sZGVyIHJ1bnMgdGhhdCBwcmVkYXRlIHRoZSBmaWVsZCwgb3IgY29ycnVwdGVkIG1ldGFkYXRhKSxcbiAqIHdlIGFzc3VtZSB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgY2FwYWJpbGl0aWVzIChiYXNlbGluZSBmb3JtYXRzIG9ubHksXG4gKiBub24tZm9ybWF0IGNhcGFiaWxpdGllcyBhbGwgYGZhbHNlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5DYXBhYmlsaXRpZXMoXG4gIHdvcmtmbG93Q29yZVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUnVuQ2FwYWJpbGl0aWVzIHtcbiAgaWYgKCF3b3JrZmxvd0NvcmVWZXJzaW9uIHx8ICFzZW12ZXIudmFsaWQod29ya2Zsb3dDb3JlVmVyc2lvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VwcG9ydGVkRm9ybWF0czogQkFTRUxJTkVfRk9STUFUUyxcbiAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZm9ybWF0cyA9IG5ldyBTZXQ8U2VyaWFsaXphdGlvbkZvcm1hdFR5cGU+KEJBU0VMSU5FX0ZPUk1BVFMpO1xuXG4gIGZvciAoY29uc3QgeyBmb3JtYXQsIG1pblZlcnNpb24gfSBvZiBGT1JNQVRfVkVSU0lPTl9UQUJMRSkge1xuICAgIGlmIChzZW12ZXIuZ3RlKHdvcmtmbG93Q29yZVZlcnNpb24sIG1pblZlcnNpb24pKSB7XG4gICAgICBmb3JtYXRzLmFkZChmb3JtYXQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUnVuQ2FwYWJpbGl0aWVzID0ge1xuICAgIHN1cHBvcnRlZEZvcm1hdHM6IGZvcm1hdHMsXG4gICAgZnJhbWVkQnl0ZVN0cmVhbXM6IGZhbHNlLFxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBjYXBhYmlsaXR5LCBtaW5WZXJzaW9uIH0gb2YgQ0FQQUJJTElUWV9WRVJTSU9OX1RBQkxFKSB7XG4gICAgaWYgKHNlbXZlci5ndGUod29ya2Zsb3dDb3JlVmVyc2lvbiwgbWluVmVyc2lvbikpIHtcbiAgICAgIHJlc3VsdFtjYXBhYmlsaXR5XSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NhcGFiaWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLG9CQUFvQixDQUFDO0FBd0I1Qjs7OztHQUlHO0FBQ0gsTUFBTSxvQkFBb0IsR0FHckI7SUFDSCxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUN0RSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLG9FQUFvRTtJQUNwRSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLG1FQUFtRTtJQUNuRSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNqRSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNqRSw4RUFBOEU7SUFDOUUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFO0lBQ25FLGtCQUFrQjtJQUNsQiw2REFBNkQ7SUFDN0QscUVBQXFFO0NBQ3RFLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUd6QjtJQUNILCtFQUErRTtJQUMvRSw2RUFBNkU7SUFDN0UsK0VBQStFO0lBQy9FLDBFQUEwRTtJQUMxRSxrQ0FBa0M7SUFDbEMsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNoRSw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsOEVBQThFO0lBQzlFLG9FQUFvRTtDQUNyRSxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sZ0JBQWdCLEdBQXlDLElBQUksR0FBRyxDQUFDO0lBQ3JFLG1CQUFtQixDQUFDLFVBQVU7Q0FDL0IsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLG1CQUF1QztJQUV2QyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUMvRCxPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLGlCQUFpQixFQUFFLEtBQUs7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBMEIsZ0JBQWdCLENBQUMsQ0FBQztJQUVuRSxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMxRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQW9CO1FBQzlCLGdCQUFnQixFQUFFLE9BQU87UUFDekIsaUJBQWlCLEVBQUUsS0FBSztLQUN6QixDQUFDO0lBRUYsS0FBSyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDbEUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhcGFiaWxpdGllcyB0YWJsZSBmb3Igd29ya2Zsb3cgcnVucyBiYXNlZCBvbiB0aGVpciBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uXG4gKlxuICogV2hlbiByZXN1bWluZyBhIGhvb2sgb3Igd2ViaG9vaywgdGhlIHBheWxvYWQgbXVzdCBiZSBlbmNvZGVkIGluIGEgZm9ybWF0XG4gKiB0aGF0IHRoZSAqdGFyZ2V0KiB3b3JrZmxvdyBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIFRoaXMgbW9kdWxlIHByb3ZpZGVzXG4gKiBhIHdheSB0byBsb29rIHVwIHdoYXQgc2VyaWFsaXphdGlvbiBmb3JtYXRzIGEgZ2l2ZW4gYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uXG4gKiBzdXBwb3J0cywgc28gdGhhdCBuZXdlciBkZXBsb3ltZW50cyBjYW4gYXZvaWQgZW5jb2RpbmcgcGF5bG9hZHMgaW4gZm9ybWF0c1xuICogdGhhdCBvbGRlciBkZXBsb3ltZW50cyBkb24ndCB1bmRlcnN0YW5kIChlLmcuLCB0aGUgYGVuY3JgIGVuY3J5cHRpb24gZm9ybWF0KS5cbiAqXG4gKiAjIyBBZGRpbmcgYSBuZXcgZm9ybWF0XG4gKlxuICogV2hlbiBhIG5ldyBzZXJpYWxpemF0aW9uIGZvcm1hdCBpcyBpbnRyb2R1Y2VkOlxuICogMS4gQWRkIHRoZSBmb3JtYXQgY29uc3RhbnQgdG8gYFNlcmlhbGl6YXRpb25Gb3JtYXRgIGluIGBzZXJpYWxpemF0aW9uLnRzYFxuICogMi4gQWRkIGFuIGVudHJ5IHRvIGBGT1JNQVRfVkVSU0lPTl9UQUJMRWAgYmVsb3cgd2l0aCB0aGUgbWluaW11bVxuICogICAgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgaXRcbiAqIDMuIFRoZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzKClgIGZ1bmN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBpbmNsdWRlIGl0XG4gKlxuICogIyMgQWRkaW5nIGEgbmV3IG5vbi1mb3JtYXQgY2FwYWJpbGl0eVxuICpcbiAqIFNvbWUgY2FwYWJpbGl0aWVzIGFyZW4ndCBzZXJpYWxpemF0aW9uIGZvcm1hdCBwcmVmaXhlczogZS5nLlxuICogYnl0ZS1zdHJlYW0gd2lyZSBmcmFtaW5nIGlzIGFuIGVudmVsb3BlIGFyb3VuZCBjaHVua3MgcmF0aGVyIHRoYW5cbiAqIGEgY29udGVudCBmb3JtYXQuIEZvciB0aG9zZSwgYWRkIGEgYm9vbGVhbiBmaWVsZCB0byBgUnVuQ2FwYWJpbGl0aWVzYFxuICogYW5kIGFuIGVudHJ5IGluIGBDQVBBQklMSVRZX1ZFUlNJT05fVEFCTEVgIGJlbG93LlxuICpcbiAqICMjIEhpc3RvcnlcbiAqXG4gKiAtIGBlbmNyYCAoQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbik6IGFkZGVkIGluIGA0LjIuMC1iZXRhLjY0YFxuICogICBDb21taXQ6IDc2MThhYzM2IFwiV2lyZSBBRVMtR0NNIGVuY3J5cHRpb24gaW50byBzZXJpYWxpemF0aW9uIGxheWVyICgjMTI1MSlcIlxuICogICBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2NvbW1pdC83NjE4YWMzNlxuICogLSBgZnJhbWVkQnl0ZVN0cmVhbXNgICh3aXJlLWxldmVsIGNodW5rIGZyYW1pbmcgZm9yIGJ5dGUgc3RyZWFtcyk6IGFkZGVkIGluIGA1LjAuMC1iZXRhLjE1YFxuICogLSBgZ3ppcGAgKGd6aXAgcGF5bG9hZCBjb21wcmVzc2lvbik6IGFkZGVkIGluIGA1LjAuMC1iZXRhLjE4YFxuICogLSBgenN0ZGAgKHpzdGQgcGF5bG9hZCBjb21wcmVzc2lvbiwgcHJlZmVycmVkIGNvZGVjKTogYWRkZWQgaW4gYDUuMC4wLWJldGEuMThgXG4gKiAgIGFsb25nc2lkZSBnemlwOyB0aGV5IGNvLXNoaXAsIHNvIGFueSBydW4gdGhhdCBjYW4gcmVhZCBvbmUgY2FuIHJlYWQgYm90aC5cbiAqIC0gYGVuY3BgIChYMjU1MTkgc2VhbGVkLWJveCBlbmNyeXB0aW9uIGZvciBjcm9zcy1ydW4gd3JpdGVzKTogYWRkZWQgaW5cbiAqICAgYDUuMC4wLWJldGEuMzdgLiBOb3RlIHRoYXQgcHJvZHVjZXJzIGRvICoqbm90KiogZ2F0ZSBgZW5jcGAgb24gdGhpcyB0YWJsZTpcbiAqICAgdGhleSBnYXRlIG9uIHRoZSBwcmVzZW5jZSBvZiBgZW5jcnlwdGlvblB1YmxpY0tleWAgb24gdGhlIHRhcmdldCBydW4sXG4gKiAgIHdoaWNoIGEgcnVuIG9ubHkgY2FycmllcyBpZiB0aGUgZGVwbG95bWVudCB0aGF0IGNyZWF0ZWQgaXQgY291bGQgYWxzb1xuICogICBvcGVuIGBlbmNwYC4gVGhlIGVudHJ5IGV4aXN0cyBzbyB0aGUgY2FwYWJpbGl0eSBzZXQgc3RheXMgYSBjb21wbGV0ZSxcbiAqICAgYXVkaXRhYmxlIGRlc2NyaXB0aW9uIG9mIGEgcnVuJ3MgZGVjb2RpbmcgYWJpbGl0eS5cbiAqIC0gTGF6eSBob29rIHJlc3VtZSAoXCJjb25zdW1lciByZS1lbnN1cmVzIGBob29rX3JlY2VpdmVkYCBmcm9tIGBob29rSW5wdXRgXCIpOlxuICogICBkZWxpYmVyYXRlbHkgTk9UIHRyYWNrZWQgaGVyZS4gUmF0aGVyIHRoYW4gcHJlZGljdCBhIHJlbGVhc2UgY3V0b2ZmLCB0aGVcbiAqICAgcnVuJ3MgY3JlYXRpbmcgZGVwbG95bWVudCBzdGFtcHMgYW4gZXhwbGljaXQgYGhvb2tSZXN1bWVJbnB1dFZlcnNpb25gXG4gKiAgIGV4ZWN1dGlvbi1jb250ZXh0IG1hcmtlcjsgYHJlc3VtZUhvb2soKWAgZ2F0ZXMgdGhlIGxhenkgcGF0aCBvbiB0aGF0XG4gKiAgIG1hcmtlciAobWlycm9yZWQgb250byB0aGUgaG9vaydzIHJlc3VtZUNvbnRleHQgYnkgdGhlIHNlcnZlcikuXG4gKi9cblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcblxuLyoqXG4gKiBDYXBhYmlsaXRpZXMgb2YgYSB3b3JrZmxvdyBydW4gYmFzZWQgb24gaXRzIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5DYXBhYmlsaXRpZXMge1xuICAvKipcbiAgICogVGhlIHNldCBvZiBzZXJpYWxpemF0aW9uIGZvcm1hdCBwcmVmaXhlcyB0aGF0IHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUuXG4gICAqIFVzZSBgc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpYCB0byBjaGVja1xuICAgKiBpZiBlbmNyeXB0aW9uIGlzIHN1cHBvcnRlZCwgZXRjLlxuICAgKi9cbiAgc3VwcG9ydGVkRm9ybWF0czogUmVhZG9ubHlTZXQ8U2VyaWFsaXphdGlvbkZvcm1hdFR5cGU+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWQgYnl0ZSBzdHJlYW1zLiBXaGVuIHRydWUsXG4gICAqIGJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgIFJlYWRhYmxlU3RyZWFtcyBwYXNzZWQgYWNyb3NzIGJvdW5kYXJpZXMpXG4gICAqIGFyZSB3cmFwcGVkIGluIGEgbGVuZ3RoLXByZWZpeGVkIGZyYW1lIGVudmVsb3BlIG9uIHRoZSB3aXJlIHNvIHRoZVxuICAgKiByZWFkZXIgY2FuIGlkZW50aWZ5IGNodW5rIGJvdW5kYXJpZXMsIHdoaWNoIGVuYWJsZXMgYXV0by1yZWNvbm5lY3RcbiAgICogb24gdHJhbnNpZW50IHN0cmVhbSBlcnJvcnMuIFdoZW4gZmFsc2UsIGJ5dGUgc3RyZWFtcyBhcmUgd3JpdHRlbiBhc1xuICAgKiByYXcgYnl0ZXMgKHRoZSBsZWdhY3kgZm9ybWF0KSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gICAqL1xuICBmcmFtZWRCeXRlU3RyZWFtczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYXBzIHNlcmlhbGl6YXRpb24gZm9ybWF0IGlkZW50aWZpZXJzIHRvIHRoZSBtaW5pbXVtIGBAd29ya2Zsb3cvY29yZWBcbiAqIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZW0uIEZvcm1hdHMgbm90IGxpc3RlZCBoZXJlIGFyZVxuICogYXNzdW1lZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIHNwZWNWZXJzaW9uIDIgcnVucyAoZS5nLiwgYGRldmxgKS5cbiAqL1xuY29uc3QgRk9STUFUX1ZFUlNJT05fVEFCTEU6IFJlYWRvbmx5QXJyYXk8e1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBtaW5WZXJzaW9uOiBzdHJpbmc7XG59PiA9IFtcbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELCBtaW5WZXJzaW9uOiAnNC4yLjAtYmV0YS42NCcgfSxcbiAgLy8gVE9ETyhyZWxlYXNlKTogdmVyaWZ5IHRoaXMgbWF0Y2hlcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCBzaGlwcyBwYXlsb2FkXG4gIC8vIGNvbXByZXNzaW9uLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLFxuICAvLyBidW1wIHRvIHRoZSBuZXh0IGJldGEuIEEgdG9vLWxvdyBjdXRvZmYgbWFrZXMgbmV3IHByb2R1Y2VycyB3cml0ZVxuICAvLyBjb21wcmVzc2VkIHBheWxvYWRzIHRvIGNvbnN1bWVycyB0aGF0IGNhbm5vdCBkZWNvbXByZXNzIHRoZW07IHRvby1oaWdoXG4gIC8vIG1lcmVseSBkZWxheXMgdGhlIG9wdGltaXphdGlvbiAoc2FmZSkuIGd6aXAgYW5kIHpzdGQgc2hpcCB0b2dldGhlciwgc29cbiAgLy8gdGhleSBzaGFyZSBhIG1pbiB2ZXJzaW9uOiBhIHJ1biB0aGF0IGNhbiByZWFkIG9uZSBjYW4gcmVhZCBib3RoLlxuICB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQLCBtaW5WZXJzaW9uOiAnNS4wLjAtYmV0YS4xOCcgfSxcbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuWlNURCwgbWluVmVyc2lvbjogJzUuMC4wLWJldGEuMTgnIH0sXG4gIC8vIFRPRE8ocmVsZWFzZSk6IHZlcmlmeSB0aGlzIG1hdGNoZXMgdGhlIGFjdHVhbCB2ZXJzaW9uIHRoYXQgc2hpcHMgc2VhbGVkLWJveFxuICAvLyBlbmNyeXB0aW9uLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLFxuICAvLyBidW1wIHRvIHRoZSBuZXh0IGJldGEuIFVubGlrZSB0aGUgZW50cmllcyBhYm92ZSwgYSB3cm9uZyBjdXRvZmYgaGVyZSBpc1xuICAvLyBub3QgYSBjb3JyZWN0bmVzcyBoYXphcmQ6IHByb2R1Y2VycyBnYXRlIGBlbmNwYCBvbiB0aGUgdGFyZ2V0IHJ1biBjYXJyeWluZ1xuICAvLyBhbiBgZW5jcnlwdGlvblB1YmxpY0tleWAsIG5vdCBvbiB0aGlzIHRhYmxlIChzZWUgSGlzdG9yeSBhYm92ZSkuXG4gIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRCwgbWluVmVyc2lvbjogJzUuMC4wLWJldGEuMzcnIH0sXG4gIC8vIEZ1dHVyZSBlbnRyaWVzOlxuICAvLyB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5DQk9SLCBtaW5WZXJzaW9uOiAnNS54LnknIH0sXG4gIC8vIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRF9WMiwgbWluVmVyc2lvbjogJzUueC55JyB9LFxuXTtcblxuLyoqXG4gKiBNYXBzIG5vbi1mb3JtYXQgY2FwYWJpbGl0eSBmbGFncyAoYm9vbGVhbnMgb24gYFJ1bkNhcGFiaWxpdGllc2ApIHRvIHRoZVxuICogbWluaW11bSBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZW0uXG4gKi9cbmNvbnN0IENBUEFCSUxJVFlfVkVSU0lPTl9UQUJMRTogUmVhZG9ubHlBcnJheTx7XG4gIGNhcGFiaWxpdHk6IGtleW9mIE9taXQ8UnVuQ2FwYWJpbGl0aWVzLCAnc3VwcG9ydGVkRm9ybWF0cyc+O1xuICBtaW5WZXJzaW9uOiBzdHJpbmc7XG59PiA9IFtcbiAgLy8gVE9ETyhyZWxlYXNlKTogdmVyaWZ5IHRoaXMgbWF0Y2hlcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCBzaGlwcyBieXRlLXN0cmVhbVxuICAvLyBmcmFtaW5nLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLCBidW1wXG4gIC8vIHRvIHRoZSBuZXh0IGJldGEuIEEgdG9vLWxvdyBjdXRvZmYgbWFrZXMgbmV3IHByb2R1Y2VycyB3cml0ZSBmcmFtZWQgYnl0ZXMgdG9cbiAgLy8gY29uc3VtZXJzIHRoYXQgY2Fubm90IHVuZnJhbWUgdGhlbSAoc2lsZW50IGNvcnJ1cHRpb24pOyB0b28taGlnaCBtZXJlbHlcbiAgLy8gZGVsYXlzIHRoZSBvcHRpbWl6YXRpb24gKHNhZmUpLlxuICB7IGNhcGFiaWxpdHk6ICdmcmFtZWRCeXRlU3RyZWFtcycsIG1pblZlcnNpb246ICc1LjAuMC1iZXRhLjE1JyB9LFxuICAvLyBOT1RFOiBsYXp5IGhvb2sgcmVzdW1lIChcImRvZXMgdGhlIGNvbnN1bWVyIHJlLWVuc3VyZSBgaG9va19yZWNlaXZlZGAgZnJvbVxuICAvLyB0aGUgcXVldWUgbWVzc2FnZSdzIGBob29rSW5wdXRgP1wiKSBpcyBpbnRlbnRpb25hbGx5IE5PVCBnYXRlZCBoZXJlLiBBXG4gIC8vIHZlcnNpb24tY29tcGFyZSBhZ2FpbnN0IGEgcHJlZGljdGVkIHJlbGVhc2UgY3V0b2ZmIGlzIGEgZ3Vlc3M7IGluc3RlYWQgdGhlXG4gIC8vIHJ1bidzIGNyZWF0aW5nIGRlcGxveW1lbnQgc3RhbXBzIGFuIGV4cGxpY2l0IGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYFxuICAvLyBtYXJrZXIgaW50byBpdHMgZXhlY3V0aW9uIGNvbnRleHQsIHdoaWNoIHRoZSBzZXJ2ZXIgbWlycm9ycyBvbnRvIHRoZSBob29rJ3NcbiAgLy8gcmVzdW1lQ29udGV4dC4gYHJlc3VtZUhvb2soKWAgZ2F0ZXMgdGhlIGxhenkgcGF0aCBvbiB0aGF0IG1hcmtlci5cbl07XG5cbi8qKlxuICogVGhlIHNldCBvZiBmb3JtYXRzIHN1cHBvcnRlZCBieSBhbGwgc3BlY1ZlcnNpb24gMiBydW5zLCByZWdhcmRsZXNzIG9mXG4gKiBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uIFRoZXNlIGFyZSB0aGUgYmFzZWxpbmUgZm9ybWF0cyB0aGF0IHdlcmUgcHJlc2VudFxuICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNwZWNWZXJzaW9uIDIgcHJvdG9jb2wuXG4gKi9cbmNvbnN0IEJBU0VMSU5FX0ZPUk1BVFM6IFJlYWRvbmx5U2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPiA9IG5ldyBTZXQoW1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG5dKTtcblxuLyoqXG4gKiBMb29rIHVwIHdoYXQgc2VyaWFsaXphdGlvbiBjYXBhYmlsaXRpZXMgYSB3b3JrZmxvdyBydW4gc3VwcG9ydHMgYmFzZWQgb25cbiAqIGl0cyBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gc3RyaW5nIChmcm9tIGBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Q29yZVZlcnNpb25gKS5cbiAqXG4gKiBXaGVuIHRoZSB2ZXJzaW9uIGlzIGB1bmRlZmluZWRgLCBub3QgYSBzdHJpbmcsIG9yIG5vdCBhIHZhbGlkIHNlbXZlciBzdHJpbmdcbiAqIChlLmcuIG9sZGVyIHJ1bnMgdGhhdCBwcmVkYXRlIHRoZSBmaWVsZCwgb3IgY29ycnVwdGVkIG1ldGFkYXRhKSxcbiAqIHdlIGFzc3VtZSB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgY2FwYWJpbGl0aWVzIChiYXNlbGluZSBmb3JtYXRzIG9ubHksXG4gKiBub24tZm9ybWF0IGNhcGFiaWxpdGllcyBhbGwgYGZhbHNlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5DYXBhYmlsaXRpZXMoXG4gIHdvcmtmbG93Q29yZVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUnVuQ2FwYWJpbGl0aWVzIHtcbiAgaWYgKCF3b3JrZmxvd0NvcmVWZXJzaW9uIHx8ICFzZW12ZXIudmFsaWQod29ya2Zsb3dDb3JlVmVyc2lvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VwcG9ydGVkRm9ybWF0czogQkFTRUxJTkVfRk9STUFUUyxcbiAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZm9ybWF0cyA9IG5ldyBTZXQ8U2VyaWFsaXphdGlvbkZvcm1hdFR5cGU+KEJBU0VMSU5FX0ZPUk1BVFMpO1xuXG4gIGZvciAoY29uc3QgeyBmb3JtYXQsIG1pblZlcnNpb24gfSBvZiBGT1JNQVRfVkVSU0lPTl9UQUJMRSkge1xuICAgIGlmIChzZW12ZXIuZ3RlKHdvcmtmbG93Q29yZVZlcnNpb24sIG1pblZlcnNpb24pKSB7XG4gICAgICBmb3JtYXRzLmFkZChmb3JtYXQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUnVuQ2FwYWJpbGl0aWVzID0ge1xuICAgIHN1cHBvcnRlZEZvcm1hdHM6IGZvcm1hdHMsXG4gICAgZnJhbWVkQnl0ZVN0cmVhbXM6IGZhbHNlLFxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBjYXBhYmlsaXR5LCBtaW5WZXJzaW9uIH0gb2YgQ0FQQUJJTElUWV9WRVJTSU9OX1RBQkxFKSB7XG4gICAgaWYgKHNlbXZlci5ndGUod29ya2Zsb3dDb3JlVmVyc2lvbiwgbWluVmVyc2lvbikpIHtcbiAgICAgIHJlc3VsdFtjYXBhYmlsaXR5XSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { type Event } from '@workflow/world';
1
+ import type { Event } from '@workflow/world';
2
2
  /**
3
3
  * Delay before firing the deferred unconsumed-event check after the promise
4
4
  * queue has drained. Must be long enough for cross-VM microtask chains to
@@ -1 +1 @@
1
- {"version":3,"file":"events-consumer.d.ts","sourceRoot":"","sources":["../src/events-consumer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events-consumer.d.ts","sourceRoot":"","sources":["../src/events-consumer.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { entityEventClass, envNumber, isSealedNoopEvent, } from '@workflow/world';
1
+ import { envNumber } from '@workflow/world/env-config';
2
+ import { entityEventClass, isSealedNoopEvent, } from '@workflow/world/event-metadata';
2
3
  import { eventsLogger } from './logger.js';
3
4
  /**
4
5
  * Delay before firing the deferred unconsumed-event check after the promise
@@ -668,4 +669,4 @@ export class EventsConsumer {
668
669
  poll();
669
670
  }
670
671
  }
671
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbnN1bWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2V2ZW50cy1jb25zdW1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRTNDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsR0FBVyxFQUFFLENBQzNDLFNBQVMsQ0FBQyxrQ0FBa0MsRUFBRSx1QkFBdUIsRUFBRTtJQUNyRSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSwyQkFBMkI7Q0FDakMsQ0FBQyxDQUFDO0FBRUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsZUFBZTtDQUNoQixDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQW9DLElBQUksR0FBRyxDQUFDO0lBQ3BFLGdCQUFnQjtDQUNqQixDQUFDLENBQUM7QUFFSCxpRUFBaUU7QUFDakUsU0FBUyxhQUFhLENBQUMsU0FBaUIsRUFBRSxhQUFxQjtJQUM3RCxPQUFPLEdBQUcsU0FBUyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFl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Z0JBQ3ZFLHlFQUF5RTtnQkFDekUseUVBQXlFO2dCQUN6RSxzRUFBc0U7Z0JBQ3RFLHNFQUFzRTtnQkFDdEUseUVBQXlFO2dCQUN6RSx3RUFBd0U7Z0JBQ3hFLFVBQVU7Z0JBQ1YsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIGVudGl0eUV2ZW50Q2xhc3MsXG4gIGVudk51bWJlcixcbiAgaXNTZWFsZWROb29wRXZlbnQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBldmVudHNMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbi8qKlxuICogRGVsYXkgYmVmb3JlIGZpcmluZyB0aGUgZGVmZXJyZWQgdW5jb25zdW1lZC1ldmVudCBjaGVjayBhZnRlciB0aGUgcHJvbWlzZVxuICogcXVldWUgaGFzIGRyYWluZWQuIE11c3QgYmUgbG9uZyBlbm91Z2ggZm9yIGNyb3NzLVZNIG1pY3JvdGFzayBjaGFpbnMgdG9cbiAqIHByb3BhZ2F0ZSAocmVzb2x2ZSBpbiBob3N0IOKGkiB3b3JrZmxvdyBjb2RlIGluIFZNIOKGkiBzdWJzY3JpYmUgY2FsbCBiYWNrXG4gKiBpbiBob3N0KS4gQW55IHN1YnNjcmliZSgpIGFycml2aW5nIGR1cmluZyB0aGlzIHdpbmRvdyBjYW5jZWxzIHRoZSBjaGVjay5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkVSUkVEX0NIRUNLX0RFTEFZX01TID0gMTAwO1xuXG4vKipcbiAqIEZsb29yIGZvciB0aGUgZGVmZXJyZWQtY2hlY2sgZGVsYXksIHNvIGEgdG9vLWxvdyBvdmVycmlkZSBjYW4ndCBtYW51ZmFjdHVyZVxuICogc3B1cmlvdXMgZGl2ZXJnZW5jZSAoZWFjaCBmYWxzZSBwb3NpdGl2ZSBidXJucyBhIGRpdmVyZ2VuY2UtcmVjb3ZlcnkgcmV0cnlcbiAqIGFuZCBjYW4gZXNjYWxhdGUgdG8gYSB0ZXJtaW5hbCBgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcmApLlxuICpcbiAqIEV4cG9ydGVkIHNvIHRlc3RzIG5lZWRpbmcgdGhlIHNob3J0ZXN0IGxlZ2FsIGRlbGF5IGNhbiBhc2sgZm9yIGl0IGluc3RlYWQgb2ZcbiAqIGhhcmRjb2RpbmcgYSBudW1iZXIgdGhpcyBmbG9vciB3b3VsZCBzaWxlbnRseSBjbGFtcCB1cC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1JTl9ERUZFUlJFRF9DSEVDS19ERUxBWV9NUyA9IDEwO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBkZWZlcnJlZC1jaGVjayBkZWxheS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19ERUZFUlJFRF9DSEVDS19ERUxBWV9NU2AuXG4gKlxuICogVW5saWtlIHRoZSBvdGhlciB0aW1pbmcga25vYnMgdGhpcyBpcyBub3QgYSBwb2xsaW5nIGludGVydmFsIGJ1dCBhXG4gKiBkZXRlcm1pbmlzbSBzYWZldHkgbWFyZ2luOiBmaXJpbmcgdGhlIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYmVmb3JlIHRoZVxuICogY3Jvc3MtVk0gc3Vic2NyaWJlKCkgY2hhaW4gaGFzIGxhbmRlZCByZWplY3RzIGEgaGVhbHRoeSBydW4gd2l0aFxuICogYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuXG4gKi9cbmNvbnN0IGdldERlZmVycmVkQ2hlY2tEZWxheU1zID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX0RFRkVSUkVEX0NIRUNLX0RFTEFZX01TJywgREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogTUlOX0RFRkVSUkVEX0NIRUNLX0RFTEFZX01TLFxuICB9KTtcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGUgb3JkZXJlZCB3YWxrIG1heSBzdGVwIG92ZXIgYW5kIGRlbGl2ZXIgbGF0ZXIuXG4gKlxuICogTWVtYmVyc2hpcCBpcyBub3QgYWJvdXQgd2hvIHdyb3RlIHRoZSBldmVudC4gSXQgaXMgYWJvdXQgd2hldGhlciB0aGUgZXZlbnRcbiAqIGNhbiByZWFjaCB0aGUgaGVhZCBvZiB0aGUgd2FsayB3aXRoIG5vdGhpbmcgcmVnaXN0ZXJlZCB0byBjb25zdW1lIGl0LCB3aGljaFxuICogaXMgdGhlIG9ubHkgc2l0dWF0aW9uIHBhcmtpbmcgZXhpc3RzIGZvci5cbiAqXG4gKiBNb3N0IHR5cGVzIGNhbm5vdC4gVGhleSBhcmUgcmVwbGF5LW9yaWdpbjogYSByZXBsYXkgZW1pdHMgdGhlbSwgaW4gdGhlIG9yZGVyXG4gKiBpdHMgY29kZSByZWFjaGVzIHRoZW0sIHNvIHRoZWlyIHBvc2l0aW9uIGluIHRoZSBsb2cgaXMgdGhlIHJlY29yZCBvZiB3aGF0XG4gKiB0aGF0IHJlcGxheSBkZWNpZGVkLiBSZWFjaGluZyBvbmUgb2YgdGhvc2Ugb3V0IG9mIG9yZGVyIG1lYW5zIHRoaXMgcmVwbGF5XG4gKiBkZWNpZGVkIGRpZmZlcmVudGx5IHRoYW4gdGhlIGxvZyBob2xkcywgd2hpY2ggaXMgZGl2ZXJnZW5jZSBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBhcmUgbm90IHJlcGxheS1vcmlnaW4sIGFuZCBhcmUgc3RpbGwgYWJzZW50LCBiZWNhdXNlXG4gKiB0aGV5IGFsd2F5cyBoYXZlIGEgY2xhaW1hbnQuIGBzdGVwKClgIHN1YnNjcmliZXMgaXRzIGNvbnN1bWVyIGJlZm9yZSB0aGVcbiAqIHN0ZXAncyBmaXJzdCBldmVudCBjYW4gZXhpc3Q7IGBzdGVwX2NyZWF0ZWRgIGlzIG9yZGVyZWQsIHNvIHRoZSB3YWxrIGNhbm5vdFxuICogcGFzcyBpdCB1bmxlc3MgYSBjb25zdW1lciB0YWtlcyBpdDsgYW5kIHRoYXQgY29uc3VtZXIgc3RheXMgc3Vic2NyaWJlZCB1bnRpbFxuICogYHN0ZXBfY29tcGxldGVkYCBvciBgc3RlcF9mYWlsZWRgLCBhZnRlciB3aGljaCB0aGUgV29ybGQgcmVmdXNlcyBhbnkgZnVydGhlclxuICogd3JpdGUgZm9yIHRoYXQgc3RlcC4gVGhlcmUgaXMgbm8gd2luZG93IGluIHdoaWNoIGEgcmVwbGF5IGtub3dzIGFib3V0IGEgc3RlcFxuICogYW5kIGhhcyBub3RoaW5nIHJlZ2lzdGVyZWQgdG8gY29uc3VtZSBpdHMgZXZlbnRzLCBzbyBwYXJraW5nIHRoZW0gd291bGQgb25seVxuICogZGVmZXIgcmVwb3J0cyBvZiB3aGF0IGlzIGRpdmVyZ2VuY2UgZWl0aGVyIHdheS4gVGhlIHNhbWUgaG9sZHMgZm9yXG4gKiBgd2FpdF9jcmVhdGVkYCBhbmQgaXRzIGNvbnN1bWVyLiBgd2FpdF9jb21wbGV0ZWRgIGlzIGxpc3RlZCBhbnl3YXk6IGEgc2xlZXBcbiAqIGNhbiBhbHNvIGJlIGNvbXBsZXRlZCBvdXQgb2YgYmFuZCwgYnkgdGhlIEFQSSB0aGF0IGZvcmNlLWNvbXBsZXRlcyBwZW5kaW5nXG4gKiB3YWl0cywgYW5kIHRvbGVyYXRpbmcgYSBzdHJheSBvbmUgaXMgdGhlIGNoZWFwZXIgZGlyZWN0aW9uIHRvIGJlIHdyb25nIGluLlxuICpcbiAqIEFuIGFsbG93bGlzdCByYXRoZXIgdGhhbiB0aGUgY29tcGxlbWVudCBvZiB0aGUgb3JkZXJlZCBzZXQsIHNvIGEgdHlwZSB0aGlzXG4gKiBmaWxlIGhhcyBub3QgYmVlbiB0YXVnaHQgYWJvdXQga2VlcHMgdGhlIHN0cmljdCBvbGQgYmVoYXZpb3IuXG4gKlxuICogYGhvb2tfZGlzcG9zZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZGVzcGl0ZSBiZWluZyBhYm91dCBhIGhvb2s6IGl0IGlzXG4gKiB3cml0dGVuIHdoZW4gdGhlIHdvcmtmbG93J3Mgb3duIGB1c2luZ2Agc2NvcGUgZXhpdHMsIHNvIGl0IGlzIHJlcGxheS1vcmlnaW4uXG4gKlxuICogYGF0dHJfc2V0YCBpcyBsaXN0ZWQgYnkgdHlwZSBldmVuIHRob3VnaCBhIGdpdmVuIGluc3RhbmNlIG9mIGl0IG1heSBiZVxuICogcmVwbGF5LW9yaWdpbiwgc2luY2UgaXQgaXMgcmVwbGF5LW9yaWdpbiB3aGVuIGl0cyB3cml0ZXIgaXMgdGhlIHdvcmtmbG93LlxuICogU3BsaXR0aW5nIHRoYXQgb3V0IHBlciBldmVudCB3YXMgY29uc2lkZXJlZCBhbmQgcmVqZWN0ZWQuIEEgcmVwbGF5IHRoYXRcbiAqIHJlYWNoZXMgb25lIG9mIGl0cyBvd24gd3JpdGVzIG91dCBvZiBwb3NpdGlvbiBoYXMgZGl2ZXJnZWQsIGJ1dCBhIHJlcGxheSB0aGF0XG4gKiByZWFjaGVzIGFuIGV2ZW50IGl0IGRpZCBOT1Qgd3JpdGUsIHNpdHRpbmcgd2hlcmUgaXRzIG93biB3cml0ZSB3b3VsZCBnbywgaGFzXG4gKiBub3Q6IHRoZSB3cml0ZXIgZmllbGQgc2F5cyB3aG8gd3JvdGUgdGhlIGV2ZW50LCBhbmQgbm90IHdoZXRoZXIgdGhpcyByZXBsYXlcbiAqIGlzIHRoZSBzYW1lIG9uZS4gR3Vlc3Npbmcgd3JvbmcgaW4gdGhhdCBkaXJlY3Rpb24gZmFpbHMgaGVhbHRoeSBydW5zLCB3aGljaFxuICogaXMgdGhlIGZhaWx1cmUgdGhpcyBmaWxlIGV4aXN0cyB0byBzdG9wLCBzbyB0aGUgd2hvbGUgdHlwZSBpcyB0b2xlcmF0ZWQuIFRoZVxuICogY29zdCBpcyB0aGF0IGEgZGl2ZXJnZW5jZSBpbnZvbHZpbmcgYGF0dHJfc2V0YCBzdXJmYWNlcyBhdCB0aGUgZW5kIG9mIHRoZVxuICogcmVwbGF5LCB0aHJvdWdoIGBzdHJhbmRlZEV2ZW50YCwgcmF0aGVyIHRoYW4gYXQgdGhlIG9mZmVuZGluZyBldmVudC5cbiAqL1xuY29uc3QgUEFSS0FCTEVfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ2hvb2tfcmVjZWl2ZWQnLFxuICAnaG9va19jb25mbGljdCcsXG4gICd3YWl0X2NvbXBsZXRlZCcsXG4gICdhdHRyX3NldCcsXG4gICdydW5fY2FuY2VsbGVkJyxcbl0pO1xuXG4vKipcbiAqIFBhcmthYmxlIHR5cGVzIHRoYXQgY2FuIG9ubHkgZXZlciByZXNvbHZlIHRoZWlyIGNvcnJlbGF0aW9uIGlkIG9uY2UuXG4gKlxuICogQSBzZWNvbmQgb25lIGZvciB0aGUgc2FtZSBpZCBpcyBub3QgYSBkZWxpdmVyeSB0aGlzIHJlcGxheSBoYXMgbm90IHJlYWNoZWRcbiAqIHlldDogaXQgaXMgYSByZXNvbHV0aW9uIGZvciBzb21ldGhpbmcgYWxyZWFkeSByZXNvbHZlZCwgd2hpY2ggbm8gY29uc3VtZXJcbiAqIHRoaXMgcmVwbGF5IG9yIGFueSBsYXRlciBvbmUgcmVnaXN0ZXJzIGNhbiBldmVyIGNsYWltLiBgaG9va19yZWNlaXZlZGAgaXNcbiAqIGFic2VudCBiZWNhdXNlIGEgaG9vayBsZWdpdGltYXRlbHkgZmlyZXMgbWFueSB0aW1lcyB1bmRlciBvbmUgaWQuXG4gKlxuICogTXVzdCBzdGF5IGEgc3Vic2V0IG9mIHtAbGluayBQQVJLQUJMRV9FVkVOVF9UWVBFU306IHtAbGluayBwYXJrfSBpcyB0aGUgb25seVxuICogcmVhZGVyIG9mIHdoYXQgdGhpcyByZWNvcmRzLCBhbmQgaXQgcmVqZWN0cyBhIG5vbi1wYXJrYWJsZSB0eXBlIGJlZm9yZSBpdFxuICogbG9va3MsIHNvIGFuIGVudHJ5IG91dHNpZGUgdGhhdCBzZXQgaXMgZGVhZCB3ZWlnaHQgb24gYSBob3QgcGF0aC5cbiAqL1xuY29uc3QgT05FX1NIT1RfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ3dhaXRfY29tcGxldGVkJyxcbl0pO1xuXG4vKiogSWRlbnRpZmllcyB0aGUgdGhpbmcgYSBvbmUtc2hvdCByZXNvbHV0aW9uIGV2ZW50IHJlc29sdmVzLiAqL1xuZnVuY3Rpb24gcmVzb2x1dGlvbktleShldmVudFR5cGU6IHN0cmluZywgY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2V2ZW50VHlwZX06JHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogVHlwZXMgdGhhdCBlbmQgYSBydW4uIE9uY2Ugb25lIGlzIGluIHRoZSBsb2csIG5vIGNvbnN1bWVyIHdpbGwgZXZlciBiZVxuICogcmVnaXN0ZXJlZCBhZ2Fpbiwgc28gYSBwYXJrZWQgZXZlbnQgc3RpbGwgcGFya2VkIGhlcmUgd2lsbCBuZXZlciBiZSBjbGFpbWVkLlxuICovXG5jb25zdCBURVJNSU5BTF9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAncnVuX2NvbXBsZXRlZCcsXG4gICdydW5fZmFpbGVkJyxcbiAgJ3J1bl9jYW5jZWxsZWQnLFxuXSk7XG5cbmV4cG9ydCBlbnVtIEV2ZW50Q29uc3VtZXJSZXN1bHQge1xuICAvKipcbiAgICogQ2FsbGJhY2sgY29uc3VtZWQgdGhlIGV2ZW50LCBidXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqL1xuICBDb25zdW1lZCxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGRpZCBub3QgY29uc3VtZSB0aGUgZXZlbnQsIHNvIGl0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgY2FsbGJhY2tcbiAgICovXG4gIE5vdENvbnN1bWVkLFxuICAvKipcbiAgICogQ2FsbGJhY2sgY29uc3VtZWQgdGhlIGV2ZW50LCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICovXG4gIEZpbmlzaGVkLFxufVxuXG50eXBlIEV2ZW50Q29uc3VtZXJDYWxsYmFjayA9IChldmVudDogRXZlbnQgfCBudWxsKSA9PiBFdmVudENvbnN1bWVyUmVzdWx0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50c0NvbnN1bWVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBpbnZva2VkIGFmdGVyIGFuIGV2ZW50IGhhcyBiZWVuIGNvbnN1bWVkLiBDb25zdW1lcnMgc3VjaCBhcyB0aGVcbiAgICogZGV0ZXJtaW5pc3RpYyB3b3JrZmxvdyBjbG9jayBtdXN0IG5vdCBvYnNlcnZlIGV2ZW50cyB0aGF0IGFyZSBtZXJlbHlcbiAgICogaW5zcGVjdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgY29kZSB0byBzdWJzY3JpYmUgdG8gdGhlIG5leHQgb3BlcmF0aW9uLlxuICAgKi9cbiAgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIG5vbi1udWxsIGV2ZW50IGNhbm5vdCBiZSBjb25zdW1lZCBieSBhbnkgcmVnaXN0ZXJlZFxuICAgKiBjYWxsYmFjaywgaW5kaWNhdGluZyBhbiBvcnBoYW5lZCBvciBpbnZhbGlkIGV2ZW50IGluIHRoZSBldmVudCBsb2cuIFRoZVxuICAgKiBjaGVjayBpcyBkZWZlcnJlZCB1bnRpbCBhZnRlciB0aGUgcHJvbWlzZSBxdWV1ZSBoYXMgZHJhaW5lZCwgZW5zdXJpbmcgdGhhdFxuICAgKiBhbnkgcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLCBkZXNlcmlhbGl6YXRpb24vZGVjcnlwdGlvbikgY29tcGxldGVzIGFuZFxuICAgKiBkb3duc3RyZWFtIHN1YnNjcmliZSgpIGNhbGxzIGhhdmUgYSBjaGFuY2UgdG8gY2FuY2VsIHRoZSBjaGVjayBmaXJzdC5cbiAgICovXG4gIG9uVW5jb25zdW1lZEV2ZW50OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGFuIGV2ZW50IGlzIHNraXBwZWQgYmVjYXVzZSBpdCByZXBlYXRzIGFuIGV2ZW50XG4gICAqIGNsYXNzIHRoZSB3YWxrIGFscmVhZHkgY29uc3VtZWQgZm9yIHRoZSBzYW1lIGVudGl0eS4gYGZpcnN0RXZlbnRUeXBlYCBpc1xuICAgKiB0aGUgdHlwZSB0aGF0IHJlY29yZGVkIHRoZSBjbGFzcywgd2hpY2ggaXMgdGhlIG9uZSB0aGUgd29ya2Zsb3cgb2JzZXJ2ZWQuXG4gICAqIERpYWdub3N0aWNzIG9ubHk6IHNraXBwaW5nIGlzIGEgbm9ybWFsIG91dGNvbWUsIG5vdCBhbiBlcnJvciwgdGhvdWdoIGFcbiAgICogYGZpcnN0RXZlbnRUeXBlYCBkaWZmZXJpbmcgZnJvbSBgZXZlbnQuZXZlbnRUeXBlYCBzYXlzIHRoZSB0d28gd3JpdGVyc1xuICAgKiBkZWNpZGVkIHRoZSBlbnRpdHkncyBvdXRjb21lIGRpZmZlcmVudGx5LCB3aGljaCBpcyB3b3J0aCBtb3JlIHRoYW4gYW5cbiAgICogaW5mbyBsb2cuXG4gICAqL1xuICBvbkR1cGxpY2F0ZUV2ZW50PzogKGV2ZW50OiBFdmVudCwgZmlyc3RFdmVudFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJvbWlzZSBxdWV1ZS4gVGhlIHVuY29uc3VtZWQgZXZlbnQgY2hlY2sgaXMgY2hhaW5lZFxuICAgKiBvbnRvIHRoaXMgcXVldWUgc28gaXQgb25seSBmaXJlcyBhZnRlciBhbGwgcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLFxuICAgKiBkZXNlcmlhbGl6YXRpb24pIGhhcyBjb21wbGV0ZWQuIFRoaXMgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIHdoZW4gYXN5bmNcbiAgICogZGVzZXJpYWxpemF0aW9uIGRlbGF5cyB0aGUgcmVzb2x2ZSgpIHRoYXQgdHJpZ2dlcnMgdGhlIG5leHQgc3Vic2NyaWJlKCkuXG4gICAqL1xuICBnZXRQcm9taXNlUXVldWU6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBXaGV0aGVyIG5vIGRhdGEgZGVsaXZlcnkgaXMgaW4gZmxpZ2h0IChgaXNEZWxpdmVyeUlkbGVgIGluIHByaXZhdGUudHMpLlxuICAgKiBUaGUgdW5jb25zdW1lZC1ldmVudCBjaGVjayB3YWl0cyBmb3IgdGhpcyBiZWZvcmUgaXQgZmlyZXM6IGEgZGVsaXZlcnkgaW5cbiAgICogZmxpZ2h0IG1lYW5zIHRoZSB3b3JrZmxvdyBWTSBpcyBtaWQtcmVhY3Rpb24sIGFuZCBhbiBldmVudCBpdCBoYXMgbm90XG4gICAqIGNsYWltZWQgeWV0IGlzIGFuIGV2ZW50IGl0IGhhcyBub3QgcmVhY2hlZCB5ZXQuXG4gICAqXG4gICAqIFJlcXVpcmVkIHJhdGhlciB0aGFuIGRlZmF1bHRpbmcgdG8gYWx3YXlzLWlkbGU6IGFsd2F5cy1pZGxlIGlzIGV4YWN0bHkgdGhlXG4gICAqIHByZS1nYXRlIGJlaGF2aW9yLCBzbyBhIGRlZmF1bHRlZCBvcHRpb24gd291bGQgbGV0IGEgY29uc3RydWN0aW9uIHNpdGUgb3B0XG4gICAqIGEgd2hvbGUgcmVwbGF5IHBhdGggYmFjayBvdXQgd2l0aG91dCBzYXlpbmcgc28uIFRlc3RzIHRoYXQgZHJpdmUgYSBjb25zdW1lclxuICAgKiB3aXRoIG5vIG9yY2hlc3RyYXRvciBjb250ZXh0IHBhc3MgYCgpID0+IHRydWVgIHRvIGtlZXAgdGhlIHByZS1leGlzdGluZ1xuICAgKiB0aW1pbmcsIGFuZCBzYXkgc28gYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICovXG4gIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29uc3VtZXIge1xuICBldmVudEluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGV2ZW50czogRXZlbnRbXTtcbiAgcmVhZG9ubHkgY2FsbGJhY2tzOiBFdmVudENvbnN1bWVyQ2FsbGJhY2tbXSA9IFtdO1xuICAvKipcbiAgICogRXZlbnRzIHRoZSBvcmRlcmVkIHdhbGsgc3RlcHBlZCBvdmVyIGJlY2F1c2Ugbm9ib2R5IGNsYWltZWQgdGhlbSBhbmQgdGhlaXJcbiAgICogdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLiBFYWNoIGtlZXBzIHRoZSBpbmRleCBpdCBoZWxkIGluIHRoZSBsb2c6XG4gICAqIGNvbnN1bWVycyByZWFkIHtAbGluayBldmVudEluZGV4fSBhdCBjb25zdW1wdGlvbiB0aW1lIHRvIG9yZGVyIHRoZWlyXG4gICAqIGRlbGl2ZXJ5IGFnYWluc3QgdGhlIHJlc3Qgb2YgdGhlIGxvZywgYW5kIGEgbGF0ZSBkZWxpdmVyeSBtdXN0IHN0aWxsIG1ha2VcbiAgICogdGhlIGNsYWltIGl0cyBwb3NpdGlvbiBnYXZlIGl0LlxuICAgKlxuICAgKiBIZWxkIGluIGxvZyBvcmRlciwgZHJhaW5lZCBpbiBsb2cgb3JkZXIsIGFuZCBkcmFpbmVkIGJlZm9yZSBldmVyeSBvZmZlciBzb1xuICAgKiBhIGNvbnN1bWVyIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlIHdhbGsgcGFzc2VkIHRoZSBldmVudCBzdGlsbCByZWNlaXZlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFya2VkOiB7IGV2ZW50OiBFdmVudDsgaW5kZXg6IG51bWJlciB9W10gPSBbXTtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIGlkcyBvZiB0aGUge0BsaW5rIE9ORV9TSE9UX0VWRU5UX1RZUEVTfSBldmVudHMgY29uc3VtZWQgc29cbiAgICogZmFyLCBzbyBhIHNlY29uZCByZXNvbHV0aW9uIGZvciBvbmUgb2YgdGhlbSBpcyByZWNvZ25pemVkIGFzIHVuY2xhaW1hYmxlXG4gICAqIHJhdGhlciB0aGFuIHBhcmtlZCBmb3IgYSBjb25zdW1lciB0aGF0IGNhbm5vdCBleGlzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGA8Y2xhc3M+Ojxjb3JyZWxhdGlvbklkPmAgZm9yIGV2ZXJ5IGV2ZW50IGNsYXNzIHRoZSB3YWxrIGhhcyBhbHJlYWR5XG4gICAqIGNvbnN1bWVkLCBtYXBwZWQgdG8gdGhlIGV2ZW50IHR5cGUgdGhhdCByZWNvcmRlZCBpdC4gVGhlIHR5cGUgaXMga2VwdCBzbyBhXG4gICAqIHJlcGVhdCB0aGF0IGRlY2lkZWQgdGhlIHNhbWUgY2xhc3MgKmRpZmZlcmVudGx5KiAoYSBgc3RlcF9mYWlsZWRgIGJlaGluZCBhXG4gICAqIGBzdGVwX2NvbXBsZXRlZGApIGNhbiBiZSByZXBvcnRlZCBhcyBtb3JlIHRoYW4gYSByZS1jb21taXQuIFNlZVxuICAgKiB7QGxpbmsgRXZlbnRzQ29uc3VtZXIuZmlyc3RFdmVudFR5cGVPZkNsYXNzfS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VlbkV2ZW50Q2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFsnZXZlbnRUeXBlJ10+KCk7XG4gIHByaXZhdGUgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvbkR1cGxpY2F0ZUV2ZW50PzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXVxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHBlbmRpbmdVbmNvbnN1bWVkQ2hlY2s6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdW5jb25zdW1lZENoZWNrVmVyc2lvbiA9IDA7XG5cbiAgY29uc3RydWN0b3IoZXZlbnRzOiBFdmVudFtdLCBvcHRpb25zOiBFdmVudHNDb25zdW1lck9wdGlvbnMpIHtcbiAgICAvLyBPd24gY29weTogdGhlIHJ1bnRpbWUgbXV0YXRlcyBpdHMgZXZlbnQgYXJyYXkgaW4gcGxhY2UsIGFuZCBhIHJldGFpbmVkXG4gICAgLy8gc2Vzc2lvbiBtdXN0IG9ubHkgb2JzZXJ2ZSBuZXcgZXZlbnRzIHRocm91Z2ggYXBwZW5kKCkgc28gcmVzdW1lKCknc1xuICAgIC8vIHN0cmljdC1leHRlbnNpb24gY2hlY2sgc3RheXMgbWVhbmluZ2Z1bC5cbiAgICB0aGlzLmV2ZW50cyA9IFsuLi5ldmVudHNdO1xuICAgIHRoaXMuZXZlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQgPSBvcHRpb25zLm9uQ29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50ID0gb3B0aW9ucy5vblVuY29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uRHVwbGljYXRlRXZlbnQgPSBvcHRpb25zLm9uRHVwbGljYXRlRXZlbnQ7XG4gICAgdGhpcy5nZXRQcm9taXNlUXVldWUgPSBvcHRpb25zLmdldFByb21pc2VRdWV1ZTtcbiAgICB0aGlzLmlzRGVsaXZlcnlJZGxlID0gb3B0aW9ucy5pc0RlbGl2ZXJ5SWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2xkZXN0IGV2ZW50IHRoZSB3YWxrIHN0ZXBwZWQgb3ZlciB0aGF0IG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldCxcbiAgICogaWYgYW55LiBQYXJraW5nIGlzIGEgYmV0IHRoYXQgYSBjb25zdW1lciB3aWxsIGJlIHJlZ2lzdGVyZWQgbGF0ZXIsIHNvIGF0XG4gICAqIGFueSBwb2ludCB3aGVyZSBubyBjb25zdW1lciBldmVyIHdpbGwgYmUgYWdhaW4gKHRoZSByZXBsYXkgZmluaXNoaW5nIGlzXG4gICAqIHRoZSBkZWZpbml0aXZlIG9uZSksIHRoaXMgYW5zd2VycyB3aGljaCBldmVudCB0aGUgYmV0IGxvc3Qgb24uXG4gICAqL1xuICBnZXQgc3RyYW5kZWRFdmVudCgpOiBFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFya2VkWzBdPy5ldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSB3YWxrIGlzIHN0aWxsIGhvbGRpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaG9sZHMgbm90aGluZy5cbiAgICpcbiAgICogUmVhZCBhdCBldmVyeSBwb2ludCBhIHJlcGxheSBzdG9wcywgaW5jbHVkaW5nIHRoZSBzdXNwZW5zaW9ucyB0aGF0IGFyZSBub3RcbiAgICogc2V0dGxpbmcgcG9pbnRzLCBzbyB0aGUgaGVsZCBzdGF0ZSByZWFjaGVzIHRlbGVtZXRyeS4gQSByZXBsYXkgY2Fubm90IHRlbGxcbiAgICogYSBkZWxpdmVyeSBhd2FpdGluZyBhIGxhdGVyIGNvbnN1bWVyIGZyb20gb25lIG5vIGNvbnN1bWVyIHdpbGwgZXZlclxuICAgKiByZWdpc3Rlciwgc28gaXQgcmVwb3J0cyByYXRoZXIgdGhhbiBkZWNpZGVzOiB0aGUgc2FtZSBgZXZlbnRJZGAgcmVwb3J0ZWQgb25cbiAgICogc3VzcGVuc2lvbiBhZnRlciBzdXNwZW5zaW9uIG9mIG9uZSBydW4gaXMgdGhlIHNoYXBlIHRoYXQgc2F5cyB0aGUgYmV0XG4gICAqIHBhcmtpbmcgbWFkZSBpcyBub3QgZ29pbmcgdG8gcGF5IG9mZiwgYW5kIHRoYXQgc2hhcGUgaXMgb25seSB2aXNpYmxlIGFjcm9zc1xuICAgKiByZXBsYXlzLlxuICAgKi9cbiAgZ2V0IHBhcmtlZFN1bW1hcnkoKTpcbiAgICB8IHsgY291bnQ6IG51bWJlcjsgZXZlbnRJZDogc3RyaW5nOyBldmVudFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMucGFya2VkWzBdPy5ldmVudDtcbiAgICBpZiAoIW9sZGVzdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50OiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgICBldmVudElkOiBvbGRlc3QuZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZTogb2xkZXN0LmV2ZW50VHlwZSxcbiAgICB9O1xuICB9XG5cbiAgYXBwZW5kKGV2ZW50czogRXZlbnRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB0aGlzLmV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKHRoaXMuY29uc3VtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIGFuIGV2ZW50IGhhcyBiZWVuIGNvbnN1bWVkXG4gICAqIGJ5IGEgZGlmZmVyZW50IGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgY2FuIHJldHVybjpcbiAgICogIC0gYEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWRgIHRoZSBldmVudCBpcyBjb25zaWRlcmVkIGNvbnN1bWVkIGFuZCB3aWxsIG5vdCBiZSBwYXNzZWQgdG8gYW55IG90aGVyIGNhbGxiYWNrLCBidXQgdGhlIGNhbGxiYWNrIHdpbGwgcmVtYWluIGluIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZGAgdGhlIGV2ZW50IGlzIHBhc3NlZCB0byB0aGUgbmV4dCBjYWxsYmFja1xuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZGAgdGhlIGV2ZW50IGlzIGNvbnNpZGVyZWQgY29uc3VtZWQgYW5kIHRoZSBjYWxsYmFjayBpcyByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSBmbiAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byByZWdpc3Rlci5cbiAgICovXG4gIHN1YnNjcmliZShmbjogRXZlbnRDb25zdW1lckNhbGxiYWNrKSB7XG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChmbik7XG4gICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHVuY29uc3VtZWQgY2hlY2sgc2luY2UgYSBuZXcgY2FsbGJhY2sgbWF5IGNvbnN1bWUgdGhlIGV2ZW50LlxuICAgIC8vIEluY3JlbWVudGluZyB0aGUgdmVyc2lvbiBjYXVzZXMgYW55IGluLWZsaWdodCBwcm9taXNlIGNoYWluIGNoZWNrIHRvIG5vLW9wLlxuICAgIC8vIEFsc28gY2xlYXIgdGhlIHBlbmRpbmcgc2V0VGltZW91dCBpZiBpdCBoYXNuJ3QgZmlyZWQgeWV0LlxuICAgIGlmICh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbisrO1xuICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQpO1xuICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3MubmV4dFRpY2sodGhpcy5jb25zdW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29uc3VtZWRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMub25Db25zdW1lZEV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uQ29uc3VtZWRFdmVudChldmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGV2ZW50c0xvZ2dlci5lcnJvcignb25Db25zdW1lZEV2ZW50IGNhbGxiYWNrIHRocmV3IGFuIGVycm9yJywge1xuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSA9ICgpID0+IHtcbiAgICAvLyBEcmFpbiBjb25zZWN1dGl2ZWx5IGNvbnN1bWFibGUgZXZlbnRzIHN5bmNocm9ub3VzbHkgd2l0aGluIGEgc2luZ2xlXG4gICAgLy8gcGFzcyBpbnN0ZWFkIG9mIHBheWluZyBvbmUgYHByb2Nlc3MubmV4dFRpY2tgIHBlciBjb25zdW1lZCBldmVudC5cbiAgICAvL1xuICAgIC8vIFdoeSB0aGlzIGlzIHNhZmU6IGEgY2FsbGJhY2sgb25seSBjb25zdW1lcyBhbiBldmVudCB1c2luZyBhIGNvbnN1bWVyXG4gICAgLy8gdGhhdCBpcyBBTFJFQURZIHJlZ2lzdGVyZWQgKGUuZy4gYSBsb25nLWxpdmVkIHN0ZXAgY29uc3VtZXIgd2Fsa2luZ1xuICAgIC8vIGBzdGVwX2NyZWF0ZWRgIOKGkiBgc3RlcF9zdGFydGVkYCDihpIgYHN0ZXBfY29tcGxldGVkYCwgb3IgdGhlIHN0cnVjdHVyYWxcbiAgICAvLyBsaWZlY3ljbGUgY29uc3VtZXIpLiBOZXcgY29uc3VtZXJzIGFyZSBvbmx5IGV2ZXIgcmVnaXN0ZXJlZCBieSB3b3JrZmxvd1xuICAgIC8vIFZNIGJvZHkgY29kZSB0aGF0IHJ1bnMgYXN5bmNocm9ub3VzbHkgb2ZmIGBjdHgucHJvbWlzZVF1ZXVlYCBhZnRlciBhXG4gICAgLy8gZGVsaXZlcnkgYHJlc29sdmUoKWA7IG5vbmUgb2YgdGhlIGNhbGxiYWNrcyBoZXJlIGNhbGwgYHN1YnNjcmliZSgpYFxuICAgIC8vIHN5bmNocm9ub3VzbHkuIFNvIHdpdGhpbiBvbmUgcGFzcyBgdGhpcy5jYWxsYmFja3NgIGlzIG11dGF0ZWQgb25seSBieVxuICAgIC8vIHRoaXMgbG9vcCAodGhlIGBGaW5pc2hlZGAgc3BsaWNlKSwgYW5kIHRoZSBuZXh0IGV2ZW50J3MgY29uc3VtZXIgaXNcbiAgICAvLyBlaXRoZXIgYWxyZWFkeSBwcmVzZW50IChhZHZhbmNlIG5vdykgb3Igbm90IHlldCByZWdpc3RlcmVkLCBpbiB3aGljaFxuICAgIC8vIGNhc2Ugbm8gY2FsbGJhY2sgY29uc3VtZXMgdGhlIGV2ZW50IGFuZCB3ZSBmYWxsIHRocm91Z2ggdG8gdGhlXG4gICAgLy8gY3Jvc3MtVk0tc2FmZSBkZWZlcnJlZCB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGJlbG93LCBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQmVmb3JlIGV2ZXJ5IG9mZmVyLCBub3QganVzdCBvbiBzdWJzY3JpYmU6IGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCBieVxuICAgICAgLy8gdGhlIHdvcmsgdGhpcyBzYW1lIHBhc3Mga2lja2VkIG9mZiBtYXkgYmUgdGhlIG93bmVyIG9mIHNvbWV0aGluZ1xuICAgICAgLy8gcGFya2VkLCBhbmQgdGhlIHBhcmtlZCBldmVudCdzIGRlbGl2ZXJ5IGlzIG9yZGVyZWQgYWhlYWQgb2YgdGhlIGhlYWRcbiAgICAgIC8vIGV2ZW50J3MgYnkgdGhlIGluZGV4IGl0IGhvbGRzLlxuICAgICAgdGhpcy5kcmFpblBhcmtlZCgpO1xuICAgICAgY29uc3QgY3VycmVudEV2ZW50ID0gdGhpcy5ldmVudHNbdGhpcy5ldmVudEluZGV4XSA/PyBudWxsO1xuICAgICAgaWYgKGN1cnJlbnRFdmVudCAhPT0gbnVsbCAmJiBpc1NlYWxlZE5vb3BFdmVudChjdXJyZW50RXZlbnQpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNlYWxlZE5vb3AoY3VycmVudEV2ZW50KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdW1lZCA9IHRoaXMub2ZmZXIoY3VycmVudEV2ZW50KTtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRW5kIG9mIGxvZy4gQ29uc3VtZXJzIHJldHVybiBOb3RDb25zdW1lZCBmb3IgdGhlIGBudWxsYCBzZW50aW5lbFxuICAgICAgICAvLyAodGhlIG9uZSB0aGF0IHJlY29nbml6ZXMgaXQgYXMgaXRzIG93biBib3VuZGFyeSBzY2hlZHVsZXMgdGhlXG4gICAgICAgIC8vIHN1c3BlbnNpb24gYXMgYSBzaWRlIGVmZmVjdCBhbmQgc3RpbGwgZGVjbGluZXMgaXQpLCBzbyB0aGUgZHJhaW5cbiAgICAgICAgLy8gc3RvcHMgaGVyZSByYXRoZXIgdGhhbiBzcGlubmluZyBwYXN0IHRoZSBlbmQuIGBjb25zdW1lZGAgaXMgb25seVxuICAgICAgICAvLyB0cnVlIGZvciBhIGNhbGxiYWNrIHRoYXQgY2xhaW1zIHRoZSBzZW50aW5lbCBvdXRyaWdodCwgd2hpY2ggbm9cbiAgICAgICAgLy8gcHJvZHVjdGlvbiBjb25zdW1lciBkb2VzLlxuICAgICAgICBpZiAoIWNvbnN1bWVkKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmRPZkxvZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY29uc3VtZWQpIHtcbiAgICAgICAgLy8gTm9ib2R5IHdhbnRlZCBpdC4gSWYgaXQgcmVwZWF0cyBhIGNsYXNzIHRoaXMgd2FsayBhbHJlYWR5IGNvbnN1bWVkXG4gICAgICAgIC8vIGZvciB0aGUgc2FtZSBlbnRpdHkgaXQgaXMgYSBzdHJhZ2dsZXIgZnJvbSBhIGNvbmN1cnJlbnQgcmVwbGF5OlxuICAgICAgICAvLyBzdGVwIG92ZXIgaXQgaW4gdGhpcyBwYXNzIHJhdGhlciB0aGFuIHBheWluZyB0aGUgZGVmZXJyZWQgd2luZG93IGZvclxuICAgICAgICAvLyBhIGNvbnN1bWVyIHRoYXQgY2Fubm90IGNvbWUgKHNlZSBgZmlyc3RFdmVudFR5cGVPZkNsYXNzYCkuXG4gICAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IHRoaXMuZmlyc3RFdmVudFR5cGVPZkNsYXNzKGN1cnJlbnRFdmVudCk7XG4gICAgICAgIGlmIChmaXJzdFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuc2tpcER1cGxpY2F0ZUV2ZW50KGN1cnJlbnRFdmVudCwgZmlyc3RUeXBlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgcmVhbCBldmVudCB3YXMgY29uc3VtZWQsIHNvIGFkdmFuY2UgdG8gdGhlIG5leHQgaW4gdGhlIHNhbWUgcGFzcy5cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE9mZmVyIGBjdXJyZW50RXZlbnRgIHRvIGVhY2ggcmVnaXN0ZXJlZCBjYWxsYmFjayBpbiB0dXJuLiBSZXR1cm5zIHRydWVcbiAgICogd2hlbiBhIGNhbGxiYWNrIGNvbnN1bWVkIGl0LiBEb2VzIG5vdCBtb3ZlIHtAbGluayBldmVudEluZGV4fTogdGhlIG9yZGVyZWRcbiAgICogd2FsayBhbmQgdGhlIHBhcmtlZCBkcmFpbiBhZHZhbmNlIGRpZmZlcmVudGx5LCBzbyBlYWNoIGRvZXMgaXRzIG93bi5cbiAgICovXG4gIHByaXZhdGUgb2ZmZXIoY3VycmVudEV2ZW50OiBFdmVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2ldO1xuICAgICAgbGV0IGhhbmRsZWQgPSBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlZCA9IGNhbGxiYWNrKGN1cnJlbnRFdmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ0V2ZW50Q29uc3VtZXIgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBoYW5kbGVkICE9PSBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkICYmXG4gICAgICAgIGhhbmRsZWQgIT09IEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWRcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1cnJlbnRFdmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgT05FX1NIT1RfRVZFTlRfVFlQRVMuaGFzKGN1cnJlbnRFdmVudC5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWQuYWRkKFxuICAgICAgICAgICAgcmVzb2x1dGlvbktleShjdXJyZW50RXZlbnQuZXZlbnRUeXBlLCBjdXJyZW50RXZlbnQuY29ycmVsYXRpb25JZClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVjb3JkRXZlbnRDbGFzcyhjdXJyZW50RXZlbnQpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGUgY2FsbGJhY2sgaWYgaXQgaGFzIGZpbmlzaGVkXG4gICAgICBpZiAoaGFuZGxlZCA9PT0gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZmVyIGV2ZXJ5dGhpbmcgcGFya2VkLCBvbGRlc3QgZmlyc3QsIHVudGlsIGEgcGFzcyBjbGFpbXMgbm90aGluZy5cbiAgICpcbiAgICogRWFjaCBvZmZlciBydW5zIHdpdGgge0BsaW5rIGV2ZW50SW5kZXh9IG1vdmVkIGJhY2sgdG8gdGhlIHBvc2l0aW9uIHRoZVxuICAgKiBwYXJrZWQgZXZlbnQgaGVsZCBpbiB0aGUgbG9nLCBiZWNhdXNlIHRoYXQgaXMgdGhlIHBvc2l0aW9uIGl0cyBjb25zdW1lclxuICAgKiB3aWxsIHJlZ2lzdGVyIGEgZGVsaXZlcnkgYmFycmllciB1bmRlci4gUmVzdG9yaW5nIHRoZSB3YWxrIHBvaW50ZXJcbiAgICogYWZ0ZXJ3YXJkcyBpcyB3aGF0IGtlZXBzIHRoZSB0d28gcG9pbnRlcnMgZnJvbSBpbnRlcmZlcmluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhaW5QYXJrZWQoKTogdm9pZCB7XG4gICAgbGV0IHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgIHdoaWxlIChwcm9ncmVzc2VkKSB7XG4gICAgICBwcm9ncmVzc2VkID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFya2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5wYXJrZWRbaV07XG4gICAgICAgIGNvbnN0IHdhbGtJbmRleCA9IHRoaXMuZXZlbnRJbmRleDtcbiAgICAgICAgdGhpcy5ldmVudEluZGV4ID0gZW50cnkuaW5kZXg7XG4gICAgICAgIGxldCBjb25zdW1lZDogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdW1lZCA9IHRoaXMub2ZmZXIoZW50cnkuZXZlbnQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuZXZlbnRJbmRleCA9IHdhbGtJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgICB0aGlzLnBhcmtlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgLy8gQSBgRmluaXNoZWRgIGNhbGxiYWNrIHdhcyBzcGxpY2VkIG91dCBvZiB0aGUgbGlzdCB0aGlzIHBhc3MsIHNvXG4gICAgICAgICAgLy8gcmVzdGFydCByYXRoZXIgdGhhbiBrZWVwIHdhbGtpbmcgYSBtdXRhdGVkIGFycmF5LlxuICAgICAgICAgIHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdGhlIG9yZGVyZWQgd2FsayBvdmVyIGFuIGV2ZW50IG5vYm9keSBjbGFpbWVkLCBob2xkaW5nIG9uIHRvIGl0IGZvciBhXG4gICAqIGxhdGVyIGNvbnN1bWVyLiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIGV2ZW50J3MgdHlwZSBtYWtlcyBpdHMgcG9zaXRpb24gYVxuICAgKiBkZWNpc2lvbiByZWNvcmQsIHdoaWNoIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSBub2JvZHkgY2xhaW1pbmcgaXQgbWVhbnMgdGhlXG4gICAqIHJlcGxheSBkaXZlcmdlZC5cbiAgICovXG4gIHByaXZhdGUgcGFyayhldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIVBBUktBQkxFX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgIHRoaXMucmVzb2x2ZWQuaGFzKHJlc29sdXRpb25LZXkoZXZlbnQuZXZlbnRUeXBlLCBldmVudC5jb3JyZWxhdGlvbklkKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wYXJrZWQucHVzaCh7IGV2ZW50LCBpbmRleDogdGhpcy5ldmVudEluZGV4IH0pO1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnUGFya2VkIGFuIHVuY2xhaW1lZCBldmVudCBmb3IgbGF0ZXIgZGVsaXZlcnknLCB7XG4gICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleSBgZXZlbnRgJ3MgY2xhc3MgaXMgdHJhY2tlZCB1bmRlciwgb3IgYHVuZGVmaW5lZGAgZm9yIHRoZSBldmVudFxuICAgKiB0eXBlcyB0aGF0IGJlbG9uZyB0byBubyBjbGFzcyAoYGhvb2tfcmVjZWl2ZWRgLCBgaG9va19jb25mbGljdGAsXG4gICAqIGBhdHRyX3NldGAsIGBydW5fY3JlYXRlZGApIGFuZCBhcmUgdGhlcmVmb3JlIG5ldmVyIHNraXBwZWQuXG4gICAqXG4gICAqIFJ1biBldmVudHMgY2Fycnkgbm8gY29ycmVsYXRpb24gaWQuIFRoZXkgYXJlIGNsYXNzZXMgb2YgdGhlIHJ1biBpdHNlbGYsIHNvXG4gICAqIHRoZXkgYWxsIGtleSBvZmYgdGhlIHNhbWUgYnVja2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBldmVudENsYXNzS2V5KGV2ZW50OiBFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRDbGFzcyA9IGVudGl0eUV2ZW50Q2xhc3MoZXZlbnQuZXZlbnRUeXBlKTtcbiAgICByZXR1cm4gZXZlbnRDbGFzcyA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBgJHtldmVudENsYXNzfToke2V2ZW50LmNvcnJlbGF0aW9uSWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1lbWJlcnMgdGhhdCBgZXZlbnRgJ3MgY2xhc3MgaXMgbm93IGRlY2lkZWQgZm9yIGl0cyBlbnRpdHksIGlmIHRoZSB0eXBlXG4gICAqIGJlbG9uZ3MgdG8gYSBjbGFzcy4gRmlyc3Qgd3JpdGVyIHdpbnM6IHRoZSByZWNvcmRlZCB0eXBlIGlzIHRoZSBvbmUgdGhlXG4gICAqIHdvcmtmbG93IG9ic2VydmVkLCBhbmQgYSBsYXRlciByZXBlYXQgaXMgbWVhc3VyZWQgYWdhaW5zdCBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkRXZlbnRDbGFzcyhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmV2ZW50Q2xhc3NLZXkoZXZlbnQpO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLnNlZW5FdmVudENsYXNzZXMuc2V0KGtleSwgZXZlbnQuZXZlbnRUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgdGhhdCBhbHJlYWR5IGRlY2lkZWQgYGV2ZW50YCdzIGNsYXNzIGZvciB0aGUgc2FtZSBlbnRpdHksIG9yXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gbm90aGluZyBoYXM6IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIGZvciBvbmUgc3RlcCwgYVxuICAgKiBzZWNvbmQgdGVybWluYWwgb3V0Y29tZSwgYSBzZWNvbmQgYHN0ZXBfc3RhcnRlZGAgYWZ0ZXIgdGhlIHN0ZXAncyByZXN1bHQgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgbG9nLlxuICAgKlxuICAgKiBTdWNoIGFuIGV2ZW50IGlzIGNvbW1pdHRlZCBidXQgaW5lcnQuIENvbmN1cnJlbnQgcmVwbGF5cyB3cml0ZSBpbnRvIG9uZVxuICAgKiBsb2cgd2l0aG91dCBhIGN1cnJlbmN5IGd1YXJkLCBzbyBhIHJlcGxheSB3b3JraW5nIGZyb20gYSBwcmVmaXggdGhhdFxuICAgKiBwcmVkYXRlcyBhbm90aGVyIHJlcGxheSdzIHdyaXRlIGNhbiBjb21taXQgaXRzIG93biBjb3B5IG9mIHdvcmsgdGhlIGxvZ1xuICAgKiBhbHJlYWR5IHJlY29yZHMuIFRoYXQgY29weSBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVkOiB0aGVcbiAgICogb3V0Y29tZSB3YXMgZGVjaWRlZCBieSB0aGUgZmlyc3QgZXZlbnQgb2YgdGhlIGNsYXNzIGFuZCBldmVyeSBsYXRlciByZXBsYXlcbiAgICogcmVhZHMgdGhhdCBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIGxvZyBwb3NpdGlvbiwgc28gaWdub3JpbmcgdGhlIHN0cmFnZ2xlclxuICAgKiBpcyBkZXRlcm1pbmlzdGljIGFjcm9zcyByZXBsYXlzLlxuICAgKlxuICAgKiBDbGFzc2VzIGFyZSB0cmFja2VkIHNlcGFyYXRlbHksIHNvIHBhc3Npbmcgb25lIGRvZXMgbm90IHN1cHByZXNzIGFub3RoZXIuXG4gICAqIEEgc3RlcCB3aG9zZSByZXN1bHQgaXMgaW4gdGhlIGxvZyBzdGlsbCByZWFjaGVzIGl0cyBgc3RlcF9jcmVhdGVkYCBhbmRcbiAgICogYHN0ZXBfc3RhcnRlZGAgY29uc3VtZXJzIGlmIGl0IGhhcyB5ZXQgdG8gc2VlIHRob3NlIGNsYXNzZXMuXG4gICAqXG4gICAqIENvbnN1bHRlZCBvbmx5IGFmdGVyIGV2ZXJ5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIHRoZSBldmVudCwgc29cbiAgICogaXQgY2FuIG5ldmVyIHRha2UgYW4gZXZlbnQgYSBjb25zdW1lciB3YW50ZWQuIEEgcmV0cnkncyBgc3RlcF9zdGFydGVkYCBpc1xuICAgKiBjbGFpbWVkIGJ5IHRoZSBzdGVwJ3MgbGl2ZSBjb25zdW1lciBhbmQgY291bnRzIGFzIGFuIGF0dGVtcHQgZXhhY3RseSBhc1xuICAgKiBiZWZvcmUsIGFuZCBhIHNlY29uZCBgc3RlcF9jcmVhdGVkYCByZWFjaGluZyBhIHN0ZXAgdGhhdCBoYXMgbm90IGZpbmlzaGVkXG4gICAqIGlzIGxpa2V3aXNlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHNraXBwZWQ7IG9ubHkgdGhlIGNvcGllcyBub2JvZHkgY2xhaW1zIGFyZVxuICAgKiBza2lwcGVkLlxuICAgKlxuICAgKiBVbmxpa2UgdGhlIGRpdmVyZ2VuY2UgcmVwb3J0LCB0aGlzIGRvZXMgKm5vdCogd2FpdCBvdXQgdGhlIGRlZmVycmVkIHdpbmRvd1xuICAgKiBmaXJzdCwgYW5kIGl0IGRvZXMgbm90IG5lZWQgdG8uIFRoZSB3aW5kb3cgYnV5cyB0aW1lIGZvciBhIGNvbnN1bWVyIHRoYXRcbiAgICogaGFzIHlldCB0byByZWdpc3RlciwgYW5kIG5vIHN1Y2ggY29uc3VtZXIgY2FuIHdhbnQgdGhpcyBldmVudDogdGhlIGNsYXNzXG4gICAqIHdhcyByZWNvcmRlZCBieSBhIGNvbnN1bXB0aW9uIGluIHRoaXMgc2FtZSByZXBsYXksIHdoaWNoIG1lYW5zIHRoZSBlbnRpdHknc1xuICAgKiBjb25zdW1lciB3YXMgcmVnaXN0ZXJlZCBhbmQgdG9vayBhbiBldmVudCBvZiB0aGlzIGNsYXNzLCBhbmQgY29ycmVsYXRpb25cbiAgICogaWRzIGFyZSBtaW50ZWQgZnJvbSBhIG1vbm90b25pYyBVTElEIHBlciBib2R5IHBvc2l0aW9uLCBzbyBub3RoaW5nIGxhdGVyIGluXG4gICAqIHRoZSBib2R5IHJlZ2lzdGVycyBhIHNlY29uZCBjb25zdW1lciB1bmRlciB0aGlzIGlkLiBXYWl0aW5nIHdvdWxkIGNvc3RcbiAgICogYGdldERlZmVycmVkQ2hlY2tEZWxheU1zKClgIHBlciBzdHJhZ2dsZXIgcGVyIHJlcGxheSBmb3IgaW5mb3JtYXRpb24gdGhhdFxuICAgKiBjYW5ub3QgYXJyaXZlOiAwLjc1JSBvZiBwcm9kdWN0aW9uIHJ1bnMgY2FycnkgYXQgbGVhc3Qgb25lIHN0cmFnZ2xlciwgYW5kXG4gICAqIHRoZSBwOTkgYW1vbmcgdGhvc2UgY2FycmllcyAxNTUuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdG8gcHJlc2VydmUgaWYgaG9vayBpZGVudGl0eSBldmVyIGJlY29tZXMgY2FsbGVyLXN1cHBsaWVkXG4gICAqIChhbiBpZGVtcG90ZW5jeSBrZXkgcmF0aGVyIHRoYW4gYSBtaW50ZWQgaWQpOiB0d28gYGNyZWF0ZUhvb2tgIGNhbGxzIGluIG9uZVxuICAgKiBib2R5IGNvdWxkIHRoZW4gc2hhcmUgYSBjb3JyZWxhdGlvbiBpZCwgYW5kIHRoZSBzZWNvbmQgY29uc3VtZXInc1xuICAgKiBgaG9va19jcmVhdGVkYCB3b3VsZCBiZSBhIHJlcGVhdCBvZiBhIGNsYXNzIHRoaXMgcmVwbGF5IGFscmVhZHkgcmVjb3JkZWQuXG4gICAqIFRoYXQgd291bGQgbWFrZSBza2lwcGluZyB3cm9uZyBmb3IgYGhvb2tfY3JlYXRlZGAsIGFuZCBpcyB0aGUgcmVhc29uIHRoZVxuICAgKiBjbGFzcyBtYXAgbGl2ZXMgbmV4dCB0byB0aGUgZXZlbnQgdHlwZXMgcmF0aGVyIHRoYW4gYmVpbmcgaW5mZXJyZWQuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0RXZlbnRUeXBlT2ZDbGFzcyhldmVudDogRXZlbnQpOiBFdmVudFsnZXZlbnRUeXBlJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZlbnRDbGFzc0tleShldmVudCk7XG4gICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXBzIHRoZSB3YWxrIG92ZXIgYSBzZWFsZWQtbG9nIGBub29wYCAoc3BlY1ZlcnNpb24gPj0gNyk6IHRoZSBXb3JsZCdzXG4gICAqIGJhY2tlbmQgd3JvdGUgaXQgdG8gb2NjdXB5IGEgc2xvdCB3aG9zZSB3cml0ZXIgYWxsb2NhdGVkIHRoZSBwb3NpdGlvbiBhbmRcbiAgICogZGllZCwgc28gdGhlIGxvZydzIGRlbnNpdHkgYXJpdGhtZXRpYyBob2xkcy4gSXQgaXMgaW52aXNpYmxlIHRvIHRoZVxuICAgKiB3b3JrZmxvdzogbm8gY29uc3VtZXIgaXMgb2ZmZXJlZCBpdCwgbm8gZXZlbnQgY2xhc3MgaXMgcmVjb3JkZWQsIGFuZCB0aGVcbiAgICogZGV0ZXJtaW5pc3RpYyBjbG9jayBkb2VzIG5vdCBhZHZhbmNlLCBleGFjdGx5IGFzIHdpdGhcbiAgICoge0BsaW5rIHNraXBEdXBsaWNhdGVFdmVudH0sIHNvIGEgbG9nIHRoYXQgaGFwcGVucyB0byBjb250YWluIG9uZSBwcm9kdWNlcyB0aGUgc2FtZVxuICAgKiB0aW1lc3RhbXBzIGFzIGEgbG9nIHRoYXQgZG9lcyBub3QuIChJdHMgYGNyZWF0ZWRBdGAgaXMgdGhlIHNlYWwgdGltZSxcbiAgICogd2hpY2ggY2FuIGV2ZW4gcG9zdGRhdGUgbGF0ZXIgc2xvdHMnIGV2ZW50czsgbGV0dGluZyBpdCB0b3VjaCB0aGUgY2xvY2tcbiAgICogd291bGQgbGVhayB0aGUgc2VhbGVyJ3Mgd2FsbCBjbG9jayBpbnRvIHJlcGxheS4pXG4gICAqL1xuICBwcml2YXRlIHNraXBTZWFsZWROb29wKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgc2VhbGVkLWxvZyBub29wIGV2ZW50Jywge1xuICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdGVwcyB0aGUgd2FsayBvdmVyIGEgcmVwZWF0IG9mIGFuIGFscmVhZHktY29uc3VtZWQgY2xhc3MuICovXG4gIHByaXZhdGUgc2tpcER1cGxpY2F0ZUV2ZW50KGV2ZW50OiBFdmVudCwgZmlyc3RUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ10pIHtcbiAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAvLyBEZWxpYmVyYXRlbHkgbm90IHJvdXRlZCB0aHJvdWdoIGBub3RpZnlDb25zdW1lZEV2ZW50YDogdGhlIGRldGVybWluaXN0aWNcbiAgICAvLyBjbG9jayBhZHZhbmNlcyBvbmx5IG9uIGV2ZW50cyB0aGUgd29ya2Zsb3cgYWN0dWFsbHkgb2JzZXJ2ZWQuIEEgc2tpcHBlZFxuICAgIC8vIGV2ZW50IGlzIGludmlzaWJsZSB0byB0aGUgd29ya2Zsb3cgYm9keSwgYW5kIGEgbG9nIHRoYXQgaGFwcGVucyB0b1xuICAgIC8vIGNvbnRhaW4gb25lIG11c3QgcHJvZHVjZSB0aGUgc2FtZSB0aW1lc3RhbXBzIGFzIGEgbG9nIHRoYXQgZG9lcyBub3QuXG4gICAgZXZlbnRzTG9nZ2VyLmRlYnVnKFxuICAgICAgJ1NraXBwaW5nIGV2ZW50IHRoYXQgcmVwZWF0cyBhIGNsYXNzIGFscmVhZHkgaW4gdGhlIGxvZycsXG4gICAgICB7XG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBmaXJzdEV2ZW50VHlwZTogZmlyc3RUeXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgfVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25EdXBsaWNhdGVFdmVudD8uKGV2ZW50LCBmaXJzdFR5cGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ29uRHVwbGljYXRlRXZlbnQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7XG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFbmRPZkxvZygpIHtcbiAgICAvLyBFdmVyeXRoaW5nIHN0aWxsIHBhcmtlZCBpcyB3YWl0aW5nIGZvciBhIGNvbnN1bWVyIHNvbWUgbGF0ZXIgcmVwbGF5IHdpbGxcbiAgICAvLyByZWdpc3Rlciwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIHBhcmtpbmcsIGV4Y2VwdCBvbmNlIHRoZSBsb2dcbiAgICAvLyBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyB0ZXJtaW5hbCBldmVudCwgYmVjYXVzZSB0aGVuIHRoZXJlIGlzIG5vIGxhdGVyXG4gICAgLy8gcmVwbGF5IGFuZCBubyBjb25zdW1lciB3aWxsIGV2ZXIgY29tZS5cbiAgICBpZiAodGhpcy5wYXJrZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmV2ZW50cy5hdCgtMSk7XG4gICAgaWYgKCFsYXN0IHx8ICFURVJNSU5BTF9FVkVOVF9UWVBFUy5oYXMobGFzdC5ldmVudFR5cGUpKSB7XG4gICAgICAvLyBBIGxhdGVyIHJlcGxheSBpcyBzdGlsbCBleHBlY3RlZCwgc28gbm90aGluZyBoZXJlIGlzIGRlY2lkYWJsZSBhbmRcbiAgICAgIC8vIGVzY2FsYXRpbmcgd291bGQgZmFpbCB0aGUgaGVhbHRoeSBydW5zIHBhcmtpbmcgZXhpc3RzIHRvIGtlZXAgYWxpdmUuXG4gICAgICAvLyBSZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBsb2cgaG9sZGluZyBzb21ldGhpbmcgaXMgbm90IGJ5IGl0c2VsZiBhIGZhdWx0LFxuICAgICAgLy8gc28gdGhpcyBzdGF5cyBhdCBgZGVidWdgOyB7QGxpbmsgcGFya2VkU3VtbWFyeX0gaXMgd2hhdCBjYXJyaWVzIHRoZVxuICAgICAgLy8gc3RhdGUgdG8gdGhlIHNwYW4sIHdoZXJlIGEgcnVuIHRoYXQga2VlcHMgc3RvcHBpbmcgb24gdGhlIHNhbWUgaGVsZFxuICAgICAgLy8gZXZlbnQgaXMgdmlzaWJsZSBhbmQgYSBzaW5nbGUgcmVwbGF5J3MgdmlldyBpcyBub3QuXG4gICAgICBldmVudHNMb2dnZXIuZGVidWcoJ1JlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbG9nIHN0aWxsIGhvbGRpbmcgZXZlbnRzJywge1xuICAgICAgICBldmVudElkOiB0aGlzLnBhcmtlZFswXS5ldmVudC5ldmVudElkLFxuICAgICAgICBldmVudFR5cGU6IHRoaXMucGFya2VkWzBdLmV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5wYXJrZWRbMF0uZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY2hlZHVsZVVuY29uc3VtZWRDaGVjayh0aGlzLnBhcmtlZFswXS5ldmVudCwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVVuY29uc3VtZWRDaGVjayhjdXJyZW50RXZlbnQ6IEV2ZW50LCBtYXlQYXJrOiBib29sZWFuKSB7XG4gICAgLy8gQWxsIGNhbGxiYWNrcyByZXR1cm5lZCBOb3RDb25zdW1lZCBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuXG4gICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCBjaGVjay4gV2UgY2hhaW4gb250byB0aGUgcHJvbWlzZVF1ZXVlIHNvIHRoYXQgYW55XG4gICAgLy8gcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLCBkZXNlcmlhbGl6YXRpb24vZGVjcnlwdGlvbiB0aGF0IHRyaWdnZXJzXG4gICAgLy8gcmVzb2x2ZSgpIOKGkiB1c2VyIGNvZGUg4oaSIHN1YnNjcmliZSgpKSBjb21wbGV0ZXMgZmlyc3QuIElmIHRoZSBldmVudFxuICAgIC8vIGlzIHN0aWxsIHVuY29uc3VtZWQgYWZ0ZXIgdGhlIHF1ZXVlIGRyYWlucywgaXQncyB0cnVseSBvcnBoYW5lZCwgb3IsXG4gICAgLy8gd2hlbiBpdHMgdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLCBwYXJrZWQgZm9yIGEgbGF0ZXIgY29uc3VtZXIuXG4gICAgY29uc3QgY2hlY2tWZXJzaW9uID0gKyt0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb247XG4gICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrID0gdGhpcy5nZXRQcm9taXNlUXVldWUoKVxuICAgICAgLnRoZW4oXG4gICAgICAgIC8vIFlpZWxkIG9uY2UgYWZ0ZXIgdGhlIGZpcnN0IHF1ZXVlIGRyYWluIHNvIHByb21pc2UgY2hhaW5zIHJlc3VtZWQgYnlcbiAgICAgICAgLy8gdGhhdCBkcmFpbiBjYW4gcnVuIGFjcm9zcyB0aGUgVk0gYm91bmRhcnkgYW5kIGFwcGVuZCBhbnkgZm9sbG93LXVwXG4gICAgICAgIC8vIGFzeW5jIHdvcmsgKGZvciBleGFtcGxlOiBzdGVwX2NvbXBsZXRlZCByZXNvbHZlcyAtPiBmb3ItYXdhaXQgbG9vcFxuICAgICAgICAvLyByZXN1bWVzIC0+IHRoZSBuZXh0IGhvb2sgcGF5bG9hZCBzdGFydHMgaHlkcmF0aW5nKS5cbiAgICAgICAgKCkgPT4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpXG4gICAgICApXG4gICAgICAudGhlbigoKSA9PiB0aGlzLmdldFByb21pc2VRdWV1ZSgpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IG91dCBhbnkgZGVsaXZlcnkgc3RpbGwgaW4gZmxpZ2h0IGJlZm9yZSBzdGFydGluZyB0aGUgdGltZXIuXG4gICAgICAgIC8vIFRoZSBxdWV1ZSBkcmFpbmluZyBzYXlzIHRoZSBob3N0IGhhcyBubyBoeWRyYXRpb24gd29yayBsZWZ0OyBpdFxuICAgICAgICAvLyBkb2VzIG5vdCBzYXkgdGhlIFZNIGhhcyBmaW5pc2hlZCByZWFjdGluZyB0byB3aGF0IHdhcyBoeWRyYXRlZC5cbiAgICAgICAgdGhpcy53aGVuRGVsaXZlcnlJZGxlKGNoZWNrVmVyc2lvbiwgKCkgPT4ge1xuICAgICAgICAgIC8vIFVzZSBhIGRlbGF5ZWQgc2V0VGltZW91dCBvbmNlIGRlbGl2ZXJpZXMgYXJlIGlkbGUuIFRoZSBkZWxheSBtdXN0XG4gICAgICAgICAgLy8gYmUgbG9uZyBlbm91Z2ggZm9yIHByb21pc2UgY2hhaW5zIHRvIHByb3BhZ2F0ZSBhY3Jvc3MgdGhlIFZNXG4gICAgICAgICAgLy8gYm91bmRhcnkgKGZyb20gcmVzb2x2ZSgpIGluIHRoZSBob3N0IGNvbnRleHQgdGhyb3VnaCB0byB0aGVcbiAgICAgICAgICAvLyB3b3JrZmxvdyBjb2RlIGNhbGxpbmcgc3Vic2NyaWJlKCkgaW4gdGhlIFZNIGNvbnRleHQpLiBOb2RlLmpzIGRvZXNcbiAgICAgICAgICAvLyBub3QgZ3VhcmFudGVlIHRoYXQgc2V0VGltZW91dCgwKSBmaXJlcyBhZnRlciBhbGwgY3Jvc3MtY29udGV4dFxuICAgICAgICAgIC8vIG1pY3JvdGFza3Mgc2V0dGxlLCBzbyB3ZSB1c2UgYSBzbWFsbCBidXQgbm9uLXplcm8gZGVsYXkuIEFueVxuICAgICAgICAgIC8vIHN1YnNjcmliZSgpIGNhbGwgdGhhdCBhcnJpdmVzIGR1cmluZyB0aGlzIHdpbmRvdyB3aWxsIGNhbmNlbCB0aGVcbiAgICAgICAgICAvLyBjaGVjayB2aWEgdmVyc2lvbiBpbnZhbGlkYXRpb24gKyBjbGVhclRpbWVvdXQuXG4gICAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVW5jb25zdW1lZEV2ZW50KGN1cnJlbnRFdmVudCwgbWF5UGFyayk7XG4gICAgICAgICAgfSwgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlIHdoYXQgYSBzdGlsbC11bmNvbnN1bWVkIGV2ZW50IGlzLCBub3cgdGhhdCB0aGUgcHJvbWlzZSBxdWV1ZSBoYXNcbiAgICogZHJhaW5lZCBhbmQgdGhlIGRlbGl2ZXJ5IGdhdGUgc2F5cyB0aGUgVk0gaXMgbm90IG1pZC1yZWFjdGlvbi5cbiAgICpcbiAgICogYG1heVBhcmtgIGlzIGZhbHNlIG9ubHkgZm9yIHRoZSBlbmQtb2YtbG9nIHJlY2hlY2sgb2YgYW4gZXZlbnQge0BsaW5rIHBhcmt9XG4gICAqIGFscmVhZHkgaG9sZHMuIE5vdGhpbmcgaW4gdGhlIGZpcnN0IGJyYW5jaCBhcHBsaWVzIHRvIG9uZSBvZiB0aG9zZTogaXQgaXNcbiAgICogbm90IHRoZSBldmVudCBhdCB0aGUgY3Vyc29yLCBzbyB0aGUgaWRlbnRpdHkgZ3VhcmQgaXMgbm90IG1lYW5pbmdmdWwsIGFuZFxuICAgKiBpdCBpcyBwYXJrZWQgYWxyZWFkeS5cbiAgICpcbiAgICogQSBkdXBsaWNhdGUgY2xhc3MgbmV2ZXIgYXJyaXZlcyBoZXJlLiB7QGxpbmsgY29uc3VtZX0gc3RlcHMgb3ZlciBvbmUgaW4gdGhlXG4gICAqIHBhc3MgdGhhdCBvZmZlcmVkIGl0LCBiZWZvcmUgdGhpcyBjaGVjayBpcyBldmVyIHNjaGVkdWxlZCwgYW5kIGEgY2xhc3NcbiAgICogcmVjb3JkZWQgd2hpbGUgdGhlIGNoZWNrIHdhcyBpbiBmbGlnaHQgY2FuIG9ubHkgaGF2ZSBiZWVuIHJlY29yZGVkIGJ5IGFcbiAgICogY29uc3VtcHRpb24gaW5zaWRlIHtAbGluayBjb25zdW1lfSwgd2hvc2UgbmV4dCBwYXNzIHJlLW9mZmVycyB0aGlzIGV2ZW50XG4gICAqIGFuZCBzdGVwcyBvdmVyIGl0IHRoZXJlLCBsZWF2aW5nIHRoZSBpZGVudGl0eSBndWFyZCBhYm92ZSB0byBkcm9wIHRoZVxuICAgKiBpbi1mbGlnaHQgY2hlY2suXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVVbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50OiBFdmVudCwgbWF5UGFyazogYm9vbGVhbikge1xuICAgIGlmIChtYXlQYXJrKSB7XG4gICAgICBpZiAodGhpcy5ldmVudHNbdGhpcy5ldmVudEluZGV4XSAhPT0gY3VycmVudEV2ZW50KSB7XG4gICAgICAgIC8vIEFuIGFwcGVuZCgpIGRyYWluIGNsYWltZWQgaXQgd2hpbGUgdGhlIGNoZWNrIHdhcyBpbiBmbGlnaHQuXG4gICAgICAgIC8vIE9ubHkgc3Vic2NyaWJlKCkgY2FuY2VscyB0aGUgY2hlY2ssIHNvIHRoaXMgaXMgcmVhY2hhYmxlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wYXJrKGN1cnJlbnRFdmVudCkpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblVuY29uc3VtZWRFdmVudChjdXJyZW50RXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBgZm5gIG9uY2Ugbm8gZGF0YSBkZWxpdmVyeSBpcyBpbiBmbGlnaHQsIHBvbGxpbmcgdGhlIHdheVxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZG9lczogbGV0IHRoZSBwcm9taXNlIHF1ZXVlIGRyYWluLCByZS1jaGVjayBhIHRpbWVyXG4gICAqIHRpY2sgbGF0ZXIsIHJlcGVhdC5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIHRoZSBjaGVjayBpcyBhIGJldCB0aGF0IGV2ZXJ5IGRlbGl2ZXJ5IHRoZSB3YWxrIGlzIHJ1bm5pbmdcbiAgICogYWhlYWQgb2YgbGFuZHMgaW5zaWRlIGEgZml4ZWQgd2luZG93LiBDb25zdW1wdGlvbiBpcyBzeW5jaHJvbm91cyB3aGlsZSB0aGVcbiAgICogcmVzb2x1dGlvbiBpdCB0cmlnZ2VycyBpcyBub3Q6IGEgc3RlcCByZXN1bHQgaHlkcmF0ZXMgaW4gdGhlIGhvc3QsIHJlc29sdmVzXG4gICAqIGZyb20gYSBkZXRhY2hlZCBjb250aW51YXRpb24gYmVoaW5kIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYCwgYW5kIG9ubHkgdGhlblxuICAgKiBkb2VzIFZNIGNvZGUgcnVuIGZhciBlbm91Z2ggdG8gc3Vic2NyaWJlIHRoZSBuZXh0IGNvbnN1bWVyLiBSZXBsYXlpbmcgYVxuICAgKiBiYXRjaCBvZiBOIHBhcmFsbGVsIHN0ZXAgcmVzdWx0cyBsZWF2ZXMgTi0xIG9mIHRoZW0gb24gdGhhdCBkZXRhY2hlZCBwYXRoXG4gICAqIHdpdGggdGhlIHF1ZXVlIGFscmVhZHkgZHJhaW5lZCwgc28gdGhlIHdhbGsgc2l0cyBvbiB0aGUgb3JkZXJlZCBldmVudCB0aGVcbiAgICogVk0gaXMgYWJvdXQgdG8gZHJhdyBhbmQgdGhlIHdpbmRvdyBpcyB0aGUgb25seSB0aGluZyBzdGFuZGluZyBiZXR3ZWVuIGFcbiAgICogaGVhbHRoeSBydW4gYW5kIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLlxuICAgKlxuICAgKiBTaG9ydGVuaW5nIHRoZSB3aW5kb3cgc2hvd3MgdGhhdCBtZWNoYW5pc20gZGlyZWN0bHk6IG9uIGlkZW50aWNhbCBldmVudCBsb2dzXG4gICAqIHRoZSBsb2NhbCByYWNlIHJlcHJvIGNvcnJ1cHRzIDM0IG9mIDQyIHJ1bnMgYXQgYSAxMG1zIHdpbmRvdyBhbmQgMCBvZiAxMTQgYXRcbiAgICogdGhlIDEwMG1zIGRlZmF1bHQuIFRoYXQgbWVhc3VyZXMgaG93IHRoZSBiZXQgbG9zZXMsIG5vdCB0aGF0IHRoZSBkZWZhdWx0XG4gICAqIGxvc2VzIGl0LCBhbmQgbm8gbWVhc3VyZW1lbnQgb2YgYSBkZWxpdmVyeSBvdXRydW5uaW5nIDEwMG1zIGV4aXN0cyBlaXRoZXJcbiAgICogd2F5LiBTbyByZWFkIHRoaXMgYXMgcmV0aXJpbmcgdGhlIGJldCByYXRoZXIgdGhhbiBhcyByZXBhaXJpbmcgYW4gb2JzZXJ2ZWRcbiAgICogZmFpbHVyZSBvZiB0aGF0IG51bWJlcjogdGhlIGRlbGF5IGlzIGEgdXNlci1zZXR0YWJsZSBlbnYgb3ZlcnJpZGUsIHdoaWNoXG4gICAqIGxlYXZlcyB0aGUgb2xkIGJlaGF2aW9yIG9uZSBjb25maWd1cmF0aW9uIGF3YXkgZnJvbSBsb3Npbmcgb24gYW55IGJhY2tlbmQuXG4gICAqXG4gICAqIFRlcm1pbmF0aW9uIGlzIGBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeWAnczogaXQgY291bnRzIG9ubHkgZGVsaXZlcmllc1xuICAgKiB0aGF0IHJlc29sdmUgb24gdGhlaXIgb3duLCBzbyBub3RoaW5nIGhlcmUgY2FuIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBBXG4gICAqIGdlbnVpbmVseSBvcnBoYW5lZCBldmVudCBoYXMgbm8gZGVsaXZlcnkgdG8gd2FpdCBvbiBhbmQgcmVhY2hlcyBgZm5gIG9uIHRoZVxuICAgKiBmaXJzdCBwb2xsLlxuICAgKlxuICAgKiBXaGF0IHRoZSBnYXRlIGdpdmVzIHVwOiBmb3IgdGhlIG9yZGVyZWQgZXZlbnRzIHRoYXQgc3RpbGwgcmVhY2hcbiAgICogYG9uVW5jb25zdW1lZEV2ZW50YCByYXRoZXIgdGhhbiB7QGxpbmsgcGFya30sIHRoaXMgc3RvcHMgYmVpbmcgdGhlIHRoaW5nXG4gICAqIHRoYXQgY2F0Y2hlcyBhIGRpdmVyZ2VkIGxvZyB3aGlsZSBhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodC4gVGhlIHN1c3BlbnNpb25cbiAgICogYW5kIHRoaXMgY2hlY2sgbm93IHdha2UgZnJvbSB0aGUgc2FtZSBgaXNEZWxpdmVyeUlkbGVgIGVkZ2UsIGFuZFxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZmlyZXMgb24gdGhlIGZpcnN0IHRpbWVyIHRpY2sgYWZ0ZXIgaWRsZSB3aGlsZSB0aGlzIHdhaXRzXG4gICAqIGEgZnVydGhlciBgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKWAuIFNvIGEgcnVuIHdpdGggYSBwZW5kaW5nIGBzbGVlcCgpYFxuICAgKiBzdXNwZW5kcyBmaXJzdCwgYW5kIGBvbldvcmtmbG93RXJyb3JgIGRyb3BzIHRoZSBkaXZlcmdlbmNlIGFycml2aW5nIHNlY29uZFxuICAgKiAoaXRzIGAnc3VzcGVuZGVkJ2AgYnJhbmNoIGRlbW90ZXMgdG8gYCdyZXBsYXknYCBhbmQgc3VyZmFjZXMgbm90aGluZyksXG4gICAqIGxlYXZpbmcgYSBsYXRlciBgcmVzdW1lKClgIHRvIGRlY2xpbmUgaW50byBhIGNvbGQgcmVwbGF5LiBQcmUtZ2F0ZSB0aGVcbiAgICogc3VzcGVuc2lvbiBhbHJlYWR5IHdvbiB0aGF0IHJhY2Ugd2hlbmV2ZXIgdGhlIGRlbGl2ZXJ5IGxhbmRlZCBpbnNpZGUgdGhlXG4gICAqIGZpeGVkIHdpbmRvdywgc28gd2hhdCBjaGFuZ2VkIGlzIHRoYXQgdGhlIG91dGNvbWUgc3RvcHBlZCBkZXBlbmRpbmcgb25cbiAgICogdGltaW5nLiBOb3RoaW5nIHNob3VsZCB0cmVhdCB0aGlzIGNoZWNrIGFzIHRoZSBtZWNoYW5pc20gdGhhdCByZXBvcnRzXG4gICAqIGRpdmVyZ2VuY2Ugb24gYSBsb2cgdGhlIHJ1biBpcyBzdGlsbCBkZWxpdmVyaW5nIGludG8uXG4gICAqL1xuICBwcml2YXRlIHdoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uOiBudW1iZXIsIGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgcG9sbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0RlbGl2ZXJ5SWRsZSgpKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBIZWxkIGluIHRoZSBzYW1lIGZpZWxkIHRoZSBmaXJlZCBjaGVjayB1c2VzIHNvIHN1YnNjcmliZSgpIGNhbmNlbHMgYVxuICAgICAgICAvLyBwb2xsIGluIHByb2dyZXNzIHRvby4gVGhlIHR3byBjYW5jZWxsYXRpb25zIGFyZSBub3QgaWRlbnRpY2FsOiBmb3IgdGhlXG4gICAgICAgIC8vIHBvbGwgaXQgaXMgdGhlIHZlcnNpb24gYnVtcCB0aGF0IGRvZXMgdGhlIHdvcmsgYW5kIHRoZSBjbGVhclRpbWVvdXQgaXNcbiAgICAgICAgLy8gYmVsdC1hbmQtYnJhY2VzLiBUd28gc3RhdGUgbWFjaGluZXMgd3JpdGUgdGhpcyBvbmUgZmllbGQsIHNvIGEgcG9sbFxuICAgICAgICAvLyBpbnZhbGlkYXRlZCBiZXR3ZWVuIHNjaGVkdWxpbmcgYW5kIGZpcmluZyBjYW4gbnVsbCBvdXQgYSBoYW5kbGUgdGhlXG4gICAgICAgIC8vIGxpdmUgY2hhaW4gaGFzIHNpbmNlIHN0b3JlZCwgd2hpY2ggaXMgd2h5IGV2ZXJ5IHBhdGggb3V0IG9mIGBwb2xsYCBhbmRcbiAgICAgICAgLy8gb3V0IG9mIHRoZSBmaXJlZCBjaGVjayByZS1jaGVja3MgdGhlIHZlcnNpb24gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlXG4gICAgICAgIC8vIGhhbmRsZS5cbiAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHBvbGwsIDApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBwb2xsKCk7XG4gIH1cbn1cbiJdfQ==
672
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbnN1bWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2V2ZW50cy1jb25zdW1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsR0FDbEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRTNDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsR0FBVyxFQUFFLENBQzNDLFNBQVMsQ0FBQyxrQ0FBa0MsRUFBRSx1QkFBdUIsRUFBRTtJQUNyRSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSwyQkFBMkI7Q0FDakMsQ0FBQyxDQUFDO0FBRUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsZUFBZTtDQUNoQixDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQW9DLElBQUksR0FBRyxDQUFDO0lBQ3BFLGdCQUFnQjtDQUNqQixDQUFDLENBQUM7QUFFSCxpRUFBaUU7QUFDakUsU0FBUyxhQUFhLENBQUMsU0FBaUIsRUFBRSxhQUFxQjtJQUM3RCxPQUFPLEdBQUcsU0FBUyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLG9CQUFv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Q2pELE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCx1RUFBdUU7Z0JBQ3ZFLHlFQUF5RTtnQkFDekUseUVBQXlFO2dCQUN6RSxzRUFBc0U7Z0JBQ3RFLHNFQUFzRTtnQkFDdEUseUVBQXlFO2dCQUN6RSx3RUFBd0U7Z0JBQ3hFLFVBQVU7Z0JBQ1YsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL2Vudi1jb25maWcnO1xuaW1wb3J0IHtcbiAgZW50aXR5RXZlbnRDbGFzcyxcbiAgaXNTZWFsZWROb29wRXZlbnQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZC9ldmVudC1tZXRhZGF0YSc7XG5pbXBvcnQgeyBldmVudHNMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbi8qKlxuICogRGVsYXkgYmVmb3JlIGZpcmluZyB0aGUgZGVmZXJyZWQgdW5jb25zdW1lZC1ldmVudCBjaGVjayBhZnRlciB0aGUgcHJvbWlzZVxuICogcXVldWUgaGFzIGRyYWluZWQuIE11c3QgYmUgbG9uZyBlbm91Z2ggZm9yIGNyb3NzLVZNIG1pY3JvdGFzayBjaGFpbnMgdG9cbiAqIHByb3BhZ2F0ZSAocmVzb2x2ZSBpbiBob3N0IOKGkiB3b3JrZmxvdyBjb2RlIGluIFZNIOKGkiBzdWJzY3JpYmUgY2FsbCBiYWNrXG4gKiBpbiBob3N0KS4gQW55IHN1YnNjcmliZSgpIGFycml2aW5nIGR1cmluZyB0aGlzIHdpbmRvdyBjYW5jZWxzIHRoZSBjaGVjay5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkVSUkVEX0NIRUNLX0RFTEFZX01TID0gMTAwO1xuXG4vKipcbiAqIEZsb29yIGZvciB0aGUgZGVmZXJyZWQtY2hlY2sgZGVsYXksIHNvIGEgdG9vLWxvdyBvdmVycmlkZSBjYW4ndCBtYW51ZmFjdHVyZVxuICogc3B1cmlvdXMgZGl2ZXJnZW5jZSAoZWFjaCBmYWxzZSBwb3NpdGl2ZSBidXJucyBhIGRpdmVyZ2VuY2UtcmVjb3ZlcnkgcmV0cnlcbiAqIGFuZCBjYW4gZXNjYWxhdGUgdG8gYSB0ZXJtaW5hbCBgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcmApLlxuICpcbiAqIEV4cG9ydGVkIHNvIHRlc3RzIG5lZWRpbmcgdGhlIHNob3J0ZXN0IGxlZ2FsIGRlbGF5IGNhbiBhc2sgZm9yIGl0IGluc3RlYWQgb2ZcbiAqIGhhcmRjb2RpbmcgYSBudW1iZXIgdGhpcyBmbG9vciB3b3VsZCBzaWxlbnRseSBjbGFtcCB1cC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1JTl9ERUZFUlJFRF9DSEVDS19ERUxBWV9NUyA9IDEwO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBkZWZlcnJlZC1jaGVjayBkZWxheS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19ERUZFUlJFRF9DSEVDS19ERUxBWV9NU2AuXG4gKlxuICogVW5saWtlIHRoZSBvdGhlciB0aW1pbmcga25vYnMgdGhpcyBpcyBub3QgYSBwb2xsaW5nIGludGVydmFsIGJ1dCBhXG4gKiBkZXRlcm1pbmlzbSBzYWZldHkgbWFyZ2luOiBmaXJpbmcgdGhlIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYmVmb3JlIHRoZVxuICogY3Jvc3MtVk0gc3Vic2NyaWJlKCkgY2hhaW4gaGFzIGxhbmRlZCByZWplY3RzIGEgaGVhbHRoeSBydW4gd2l0aFxuICogYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuXG4gKi9cbmNvbnN0IGdldERlZmVycmVkQ2hlY2tEZWxheU1zID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX0RFRkVSUkVEX0NIRUNLX0RFTEFZX01TJywgREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogTUlOX0RFRkVSUkVEX0NIRUNLX0RFTEFZX01TLFxuICB9KTtcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGUgb3JkZXJlZCB3YWxrIG1heSBzdGVwIG92ZXIgYW5kIGRlbGl2ZXIgbGF0ZXIuXG4gKlxuICogTWVtYmVyc2hpcCBpcyBub3QgYWJvdXQgd2hvIHdyb3RlIHRoZSBldmVudC4gSXQgaXMgYWJvdXQgd2hldGhlciB0aGUgZXZlbnRcbiAqIGNhbiByZWFjaCB0aGUgaGVhZCBvZiB0aGUgd2FsayB3aXRoIG5vdGhpbmcgcmVnaXN0ZXJlZCB0byBjb25zdW1lIGl0LCB3aGljaFxuICogaXMgdGhlIG9ubHkgc2l0dWF0aW9uIHBhcmtpbmcgZXhpc3RzIGZvci5cbiAqXG4gKiBNb3N0IHR5cGVzIGNhbm5vdC4gVGhleSBhcmUgcmVwbGF5LW9yaWdpbjogYSByZXBsYXkgZW1pdHMgdGhlbSwgaW4gdGhlIG9yZGVyXG4gKiBpdHMgY29kZSByZWFjaGVzIHRoZW0sIHNvIHRoZWlyIHBvc2l0aW9uIGluIHRoZSBsb2cgaXMgdGhlIHJlY29yZCBvZiB3aGF0XG4gKiB0aGF0IHJlcGxheSBkZWNpZGVkLiBSZWFjaGluZyBvbmUgb2YgdGhvc2Ugb3V0IG9mIG9yZGVyIG1lYW5zIHRoaXMgcmVwbGF5XG4gKiBkZWNpZGVkIGRpZmZlcmVudGx5IHRoYW4gdGhlIGxvZyBob2xkcywgd2hpY2ggaXMgZGl2ZXJnZW5jZSBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBhcmUgbm90IHJlcGxheS1vcmlnaW4sIGFuZCBhcmUgc3RpbGwgYWJzZW50LCBiZWNhdXNlXG4gKiB0aGV5IGFsd2F5cyBoYXZlIGEgY2xhaW1hbnQuIGBzdGVwKClgIHN1YnNjcmliZXMgaXRzIGNvbnN1bWVyIGJlZm9yZSB0aGVcbiAqIHN0ZXAncyBmaXJzdCBldmVudCBjYW4gZXhpc3Q7IGBzdGVwX2NyZWF0ZWRgIGlzIG9yZGVyZWQsIHNvIHRoZSB3YWxrIGNhbm5vdFxuICogcGFzcyBpdCB1bmxlc3MgYSBjb25zdW1lciB0YWtlcyBpdDsgYW5kIHRoYXQgY29uc3VtZXIgc3RheXMgc3Vic2NyaWJlZCB1bnRpbFxuICogYHN0ZXBfY29tcGxldGVkYCBvciBgc3RlcF9mYWlsZWRgLCBhZnRlciB3aGljaCB0aGUgV29ybGQgcmVmdXNlcyBhbnkgZnVydGhlclxuICogd3JpdGUgZm9yIHRoYXQgc3RlcC4gVGhlcmUgaXMgbm8gd2luZG93IGluIHdoaWNoIGEgcmVwbGF5IGtub3dzIGFib3V0IGEgc3RlcFxuICogYW5kIGhhcyBub3RoaW5nIHJlZ2lzdGVyZWQgdG8gY29uc3VtZSBpdHMgZXZlbnRzLCBzbyBwYXJraW5nIHRoZW0gd291bGQgb25seVxuICogZGVmZXIgcmVwb3J0cyBvZiB3aGF0IGlzIGRpdmVyZ2VuY2UgZWl0aGVyIHdheS4gVGhlIHNhbWUgaG9sZHMgZm9yXG4gKiBgd2FpdF9jcmVhdGVkYCBhbmQgaXRzIGNvbnN1bWVyLiBgd2FpdF9jb21wbGV0ZWRgIGlzIGxpc3RlZCBhbnl3YXk6IGEgc2xlZXBcbiAqIGNhbiBhbHNvIGJlIGNvbXBsZXRlZCBvdXQgb2YgYmFuZCwgYnkgdGhlIEFQSSB0aGF0IGZvcmNlLWNvbXBsZXRlcyBwZW5kaW5nXG4gKiB3YWl0cywgYW5kIHRvbGVyYXRpbmcgYSBzdHJheSBvbmUgaXMgdGhlIGNoZWFwZXIgZGlyZWN0aW9uIHRvIGJlIHdyb25nIGluLlxuICpcbiAqIEFuIGFsbG93bGlzdCByYXRoZXIgdGhhbiB0aGUgY29tcGxlbWVudCBvZiB0aGUgb3JkZXJlZCBzZXQsIHNvIGEgdHlwZSB0aGlzXG4gKiBmaWxlIGhhcyBub3QgYmVlbiB0YXVnaHQgYWJvdXQga2VlcHMgdGhlIHN0cmljdCBvbGQgYmVoYXZpb3IuXG4gKlxuICogYGhvb2tfZGlzcG9zZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZGVzcGl0ZSBiZWluZyBhYm91dCBhIGhvb2s6IGl0IGlzXG4gKiB3cml0dGVuIHdoZW4gdGhlIHdvcmtmbG93J3Mgb3duIGB1c2luZ2Agc2NvcGUgZXhpdHMsIHNvIGl0IGlzIHJlcGxheS1vcmlnaW4uXG4gKlxuICogYGF0dHJfc2V0YCBpcyBsaXN0ZWQgYnkgdHlwZSBldmVuIHRob3VnaCBhIGdpdmVuIGluc3RhbmNlIG9mIGl0IG1heSBiZVxuICogcmVwbGF5LW9yaWdpbiwgc2luY2UgaXQgaXMgcmVwbGF5LW9yaWdpbiB3aGVuIGl0cyB3cml0ZXIgaXMgdGhlIHdvcmtmbG93LlxuICogU3BsaXR0aW5nIHRoYXQgb3V0IHBlciBldmVudCB3YXMgY29uc2lkZXJlZCBhbmQgcmVqZWN0ZWQuIEEgcmVwbGF5IHRoYXRcbiAqIHJlYWNoZXMgb25lIG9mIGl0cyBvd24gd3JpdGVzIG91dCBvZiBwb3NpdGlvbiBoYXMgZGl2ZXJnZWQsIGJ1dCBhIHJlcGxheSB0aGF0XG4gKiByZWFjaGVzIGFuIGV2ZW50IGl0IGRpZCBOT1Qgd3JpdGUsIHNpdHRpbmcgd2hlcmUgaXRzIG93biB3cml0ZSB3b3VsZCBnbywgaGFzXG4gKiBub3Q6IHRoZSB3cml0ZXIgZmllbGQgc2F5cyB3aG8gd3JvdGUgdGhlIGV2ZW50LCBhbmQgbm90IHdoZXRoZXIgdGhpcyByZXBsYXlcbiAqIGlzIHRoZSBzYW1lIG9uZS4gR3Vlc3Npbmcgd3JvbmcgaW4gdGhhdCBkaXJlY3Rpb24gZmFpbHMgaGVhbHRoeSBydW5zLCB3aGljaFxuICogaXMgdGhlIGZhaWx1cmUgdGhpcyBmaWxlIGV4aXN0cyB0byBzdG9wLCBzbyB0aGUgd2hvbGUgdHlwZSBpcyB0b2xlcmF0ZWQuIFRoZVxuICogY29zdCBpcyB0aGF0IGEgZGl2ZXJnZW5jZSBpbnZvbHZpbmcgYGF0dHJfc2V0YCBzdXJmYWNlcyBhdCB0aGUgZW5kIG9mIHRoZVxuICogcmVwbGF5LCB0aHJvdWdoIGBzdHJhbmRlZEV2ZW50YCwgcmF0aGVyIHRoYW4gYXQgdGhlIG9mZmVuZGluZyBldmVudC5cbiAqL1xuY29uc3QgUEFSS0FCTEVfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ2hvb2tfcmVjZWl2ZWQnLFxuICAnaG9va19jb25mbGljdCcsXG4gICd3YWl0X2NvbXBsZXRlZCcsXG4gICdhdHRyX3NldCcsXG4gICdydW5fY2FuY2VsbGVkJyxcbl0pO1xuXG4vKipcbiAqIFBhcmthYmxlIHR5cGVzIHRoYXQgY2FuIG9ubHkgZXZlciByZXNvbHZlIHRoZWlyIGNvcnJlbGF0aW9uIGlkIG9uY2UuXG4gKlxuICogQSBzZWNvbmQgb25lIGZvciB0aGUgc2FtZSBpZCBpcyBub3QgYSBkZWxpdmVyeSB0aGlzIHJlcGxheSBoYXMgbm90IHJlYWNoZWRcbiAqIHlldDogaXQgaXMgYSByZXNvbHV0aW9uIGZvciBzb21ldGhpbmcgYWxyZWFkeSByZXNvbHZlZCwgd2hpY2ggbm8gY29uc3VtZXJcbiAqIHRoaXMgcmVwbGF5IG9yIGFueSBsYXRlciBvbmUgcmVnaXN0ZXJzIGNhbiBldmVyIGNsYWltLiBgaG9va19yZWNlaXZlZGAgaXNcbiAqIGFic2VudCBiZWNhdXNlIGEgaG9vayBsZWdpdGltYXRlbHkgZmlyZXMgbWFueSB0aW1lcyB1bmRlciBvbmUgaWQuXG4gKlxuICogTXVzdCBzdGF5IGEgc3Vic2V0IG9mIHtAbGluayBQQVJLQUJMRV9FVkVOVF9UWVBFU306IHtAbGluayBwYXJrfSBpcyB0aGUgb25seVxuICogcmVhZGVyIG9mIHdoYXQgdGhpcyByZWNvcmRzLCBhbmQgaXQgcmVqZWN0cyBhIG5vbi1wYXJrYWJsZSB0eXBlIGJlZm9yZSBpdFxuICogbG9va3MsIHNvIGFuIGVudHJ5IG91dHNpZGUgdGhhdCBzZXQgaXMgZGVhZCB3ZWlnaHQgb24gYSBob3QgcGF0aC5cbiAqL1xuY29uc3QgT05FX1NIT1RfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ3dhaXRfY29tcGxldGVkJyxcbl0pO1xuXG4vKiogSWRlbnRpZmllcyB0aGUgdGhpbmcgYSBvbmUtc2hvdCByZXNvbHV0aW9uIGV2ZW50IHJlc29sdmVzLiAqL1xuZnVuY3Rpb24gcmVzb2x1dGlvbktleShldmVudFR5cGU6IHN0cmluZywgY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2V2ZW50VHlwZX06JHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogVHlwZXMgdGhhdCBlbmQgYSBydW4uIE9uY2Ugb25lIGlzIGluIHRoZSBsb2csIG5vIGNvbnN1bWVyIHdpbGwgZXZlciBiZVxuICogcmVnaXN0ZXJlZCBhZ2Fpbiwgc28gYSBwYXJrZWQgZXZlbnQgc3RpbGwgcGFya2VkIGhlcmUgd2lsbCBuZXZlciBiZSBjbGFpbWVkLlxuICovXG5jb25zdCBURVJNSU5BTF9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAncnVuX2NvbXBsZXRlZCcsXG4gICdydW5fZmFpbGVkJyxcbiAgJ3J1bl9jYW5jZWxsZWQnLFxuXSk7XG5cbmV4cG9ydCBlbnVtIEV2ZW50Q29uc3VtZXJSZXN1bHQge1xuICAvKipcbiAgICogQ2FsbGJhY2sgY29uc3VtZWQgdGhlIGV2ZW50LCBidXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqL1xuICBDb25zdW1lZCxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGRpZCBub3QgY29uc3VtZSB0aGUgZXZlbnQsIHNvIGl0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgY2FsbGJhY2tcbiAgICovXG4gIE5vdENvbnN1bWVkLFxuICAvKipcbiAgICogQ2FsbGJhY2sgY29uc3VtZWQgdGhlIGV2ZW50LCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICovXG4gIEZpbmlzaGVkLFxufVxuXG50eXBlIEV2ZW50Q29uc3VtZXJDYWxsYmFjayA9IChldmVudDogRXZlbnQgfCBudWxsKSA9PiBFdmVudENvbnN1bWVyUmVzdWx0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50c0NvbnN1bWVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBpbnZva2VkIGFmdGVyIGFuIGV2ZW50IGhhcyBiZWVuIGNvbnN1bWVkLiBDb25zdW1lcnMgc3VjaCBhcyB0aGVcbiAgICogZGV0ZXJtaW5pc3RpYyB3b3JrZmxvdyBjbG9jayBtdXN0IG5vdCBvYnNlcnZlIGV2ZW50cyB0aGF0IGFyZSBtZXJlbHlcbiAgICogaW5zcGVjdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgY29kZSB0byBzdWJzY3JpYmUgdG8gdGhlIG5leHQgb3BlcmF0aW9uLlxuICAgKi9cbiAgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIG5vbi1udWxsIGV2ZW50IGNhbm5vdCBiZSBjb25zdW1lZCBieSBhbnkgcmVnaXN0ZXJlZFxuICAgKiBjYWxsYmFjaywgaW5kaWNhdGluZyBhbiBvcnBoYW5lZCBvciBpbnZhbGlkIGV2ZW50IGluIHRoZSBldmVudCBsb2cuIFRoZVxuICAgKiBjaGVjayBpcyBkZWZlcnJlZCB1bnRpbCBhZnRlciB0aGUgcHJvbWlzZSBxdWV1ZSBoYXMgZHJhaW5lZCwgZW5zdXJpbmcgdGhhdFxuICAgKiBhbnkgcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLCBkZXNlcmlhbGl6YXRpb24vZGVjcnlwdGlvbikgY29tcGxldGVzIGFuZFxuICAgKiBkb3duc3RyZWFtIHN1YnNjcmliZSgpIGNhbGxzIGhhdmUgYSBjaGFuY2UgdG8gY2FuY2VsIHRoZSBjaGVjayBmaXJzdC5cbiAgICovXG4gIG9uVW5jb25zdW1lZEV2ZW50OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGFuIGV2ZW50IGlzIHNraXBwZWQgYmVjYXVzZSBpdCByZXBlYXRzIGFuIGV2ZW50XG4gICAqIGNsYXNzIHRoZSB3YWxrIGFscmVhZHkgY29uc3VtZWQgZm9yIHRoZSBzYW1lIGVudGl0eS4gYGZpcnN0RXZlbnRUeXBlYCBpc1xuICAgKiB0aGUgdHlwZSB0aGF0IHJlY29yZGVkIHRoZSBjbGFzcywgd2hpY2ggaXMgdGhlIG9uZSB0aGUgd29ya2Zsb3cgb2JzZXJ2ZWQuXG4gICAqIERpYWdub3N0aWNzIG9ubHk6IHNraXBwaW5nIGlzIGEgbm9ybWFsIG91dGNvbWUsIG5vdCBhbiBlcnJvciwgdGhvdWdoIGFcbiAgICogYGZpcnN0RXZlbnRUeXBlYCBkaWZmZXJpbmcgZnJvbSBgZXZlbnQuZXZlbnRUeXBlYCBzYXlzIHRoZSB0d28gd3JpdGVyc1xuICAgKiBkZWNpZGVkIHRoZSBlbnRpdHkncyBvdXRjb21lIGRpZmZlcmVudGx5LCB3aGljaCBpcyB3b3J0aCBtb3JlIHRoYW4gYW5cbiAgICogaW5mbyBsb2cuXG4gICAqL1xuICBvbkR1cGxpY2F0ZUV2ZW50PzogKGV2ZW50OiBFdmVudCwgZmlyc3RFdmVudFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJvbWlzZSBxdWV1ZS4gVGhlIHVuY29uc3VtZWQgZXZlbnQgY2hlY2sgaXMgY2hhaW5lZFxuICAgKiBvbnRvIHRoaXMgcXVldWUgc28gaXQgb25seSBmaXJlcyBhZnRlciBhbGwgcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLFxuICAgKiBkZXNlcmlhbGl6YXRpb24pIGhhcyBjb21wbGV0ZWQuIFRoaXMgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIHdoZW4gYXN5bmNcbiAgICogZGVzZXJpYWxpemF0aW9uIGRlbGF5cyB0aGUgcmVzb2x2ZSgpIHRoYXQgdHJpZ2dlcnMgdGhlIG5leHQgc3Vic2NyaWJlKCkuXG4gICAqL1xuICBnZXRQcm9taXNlUXVldWU6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBXaGV0aGVyIG5vIGRhdGEgZGVsaXZlcnkgaXMgaW4gZmxpZ2h0IChgaXNEZWxpdmVyeUlkbGVgIGluIHByaXZhdGUudHMpLlxuICAgKiBUaGUgdW5jb25zdW1lZC1ldmVudCBjaGVjayB3YWl0cyBmb3IgdGhpcyBiZWZvcmUgaXQgZmlyZXM6IGEgZGVsaXZlcnkgaW5cbiAgICogZmxpZ2h0IG1lYW5zIHRoZSB3b3JrZmxvdyBWTSBpcyBtaWQtcmVhY3Rpb24sIGFuZCBhbiBldmVudCBpdCBoYXMgbm90XG4gICAqIGNsYWltZWQgeWV0IGlzIGFuIGV2ZW50IGl0IGhhcyBub3QgcmVhY2hlZCB5ZXQuXG4gICAqXG4gICAqIFJlcXVpcmVkIHJhdGhlciB0aGFuIGRlZmF1bHRpbmcgdG8gYWx3YXlzLWlkbGU6IGFsd2F5cy1pZGxlIGlzIGV4YWN0bHkgdGhlXG4gICAqIHByZS1nYXRlIGJlaGF2aW9yLCBzbyBhIGRlZmF1bHRlZCBvcHRpb24gd291bGQgbGV0IGEgY29uc3RydWN0aW9uIHNpdGUgb3B0XG4gICAqIGEgd2hvbGUgcmVwbGF5IHBhdGggYmFjayBvdXQgd2l0aG91dCBzYXlpbmcgc28uIFRlc3RzIHRoYXQgZHJpdmUgYSBjb25zdW1lclxuICAgKiB3aXRoIG5vIG9yY2hlc3RyYXRvciBjb250ZXh0IHBhc3MgYCgpID0+IHRydWVgIHRvIGtlZXAgdGhlIHByZS1leGlzdGluZ1xuICAgKiB0aW1pbmcsIGFuZCBzYXkgc28gYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICovXG4gIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29uc3VtZXIge1xuICBldmVudEluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGV2ZW50czogRXZlbnRbXTtcbiAgcmVhZG9ubHkgY2FsbGJhY2tzOiBFdmVudENvbnN1bWVyQ2FsbGJhY2tbXSA9IFtdO1xuICAvKipcbiAgICogRXZlbnRzIHRoZSBvcmRlcmVkIHdhbGsgc3RlcHBlZCBvdmVyIGJlY2F1c2Ugbm9ib2R5IGNsYWltZWQgdGhlbSBhbmQgdGhlaXJcbiAgICogdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLiBFYWNoIGtlZXBzIHRoZSBpbmRleCBpdCBoZWxkIGluIHRoZSBsb2c6XG4gICAqIGNvbnN1bWVycyByZWFkIHtAbGluayBldmVudEluZGV4fSBhdCBjb25zdW1wdGlvbiB0aW1lIHRvIG9yZGVyIHRoZWlyXG4gICAqIGRlbGl2ZXJ5IGFnYWluc3QgdGhlIHJlc3Qgb2YgdGhlIGxvZywgYW5kIGEgbGF0ZSBkZWxpdmVyeSBtdXN0IHN0aWxsIG1ha2VcbiAgICogdGhlIGNsYWltIGl0cyBwb3NpdGlvbiBnYXZlIGl0LlxuICAgKlxuICAgKiBIZWxkIGluIGxvZyBvcmRlciwgZHJhaW5lZCBpbiBsb2cgb3JkZXIsIGFuZCBkcmFpbmVkIGJlZm9yZSBldmVyeSBvZmZlciBzb1xuICAgKiBhIGNvbnN1bWVyIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlIHdhbGsgcGFzc2VkIHRoZSBldmVudCBzdGlsbCByZWNlaXZlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFya2VkOiB7IGV2ZW50OiBFdmVudDsgaW5kZXg6IG51bWJlciB9W10gPSBbXTtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIGlkcyBvZiB0aGUge0BsaW5rIE9ORV9TSE9UX0VWRU5UX1RZUEVTfSBldmVudHMgY29uc3VtZWQgc29cbiAgICogZmFyLCBzbyBhIHNlY29uZCByZXNvbHV0aW9uIGZvciBvbmUgb2YgdGhlbSBpcyByZWNvZ25pemVkIGFzIHVuY2xhaW1hYmxlXG4gICAqIHJhdGhlciB0aGFuIHBhcmtlZCBmb3IgYSBjb25zdW1lciB0aGF0IGNhbm5vdCBleGlzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGA8Y2xhc3M+Ojxjb3JyZWxhdGlvbklkPmAgZm9yIGV2ZXJ5IGV2ZW50IGNsYXNzIHRoZSB3YWxrIGhhcyBhbHJlYWR5XG4gICAqIGNvbnN1bWVkLCBtYXBwZWQgdG8gdGhlIGV2ZW50IHR5cGUgdGhhdCByZWNvcmRlZCBpdC4gVGhlIHR5cGUgaXMga2VwdCBzbyBhXG4gICAqIHJlcGVhdCB0aGF0IGRlY2lkZWQgdGhlIHNhbWUgY2xhc3MgKmRpZmZlcmVudGx5KiAoYSBgc3RlcF9mYWlsZWRgIGJlaGluZCBhXG4gICAqIGBzdGVwX2NvbXBsZXRlZGApIGNhbiBiZSByZXBvcnRlZCBhcyBtb3JlIHRoYW4gYSByZS1jb21taXQuIFNlZVxuICAgKiB7QGxpbmsgRXZlbnRzQ29uc3VtZXIuZmlyc3RFdmVudFR5cGVPZkNsYXNzfS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VlbkV2ZW50Q2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFsnZXZlbnRUeXBlJ10+KCk7XG4gIHByaXZhdGUgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvbkR1cGxpY2F0ZUV2ZW50PzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXVxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHBlbmRpbmdVbmNvbnN1bWVkQ2hlY2s6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdW5jb25zdW1lZENoZWNrVmVyc2lvbiA9IDA7XG5cbiAgY29uc3RydWN0b3IoZXZlbnRzOiBFdmVudFtdLCBvcHRpb25zOiBFdmVudHNDb25zdW1lck9wdGlvbnMpIHtcbiAgICAvLyBPd24gY29weTogdGhlIHJ1bnRpbWUgbXV0YXRlcyBpdHMgZXZlbnQgYXJyYXkgaW4gcGxhY2UsIGFuZCBhIHJldGFpbmVkXG4gICAgLy8gc2Vzc2lvbiBtdXN0IG9ubHkgb2JzZXJ2ZSBuZXcgZXZlbnRzIHRocm91Z2ggYXBwZW5kKCkgc28gcmVzdW1lKCknc1xuICAgIC8vIHN0cmljdC1leHRlbnNpb24gY2hlY2sgc3RheXMgbWVhbmluZ2Z1bC5cbiAgICB0aGlzLmV2ZW50cyA9IFsuLi5ldmVudHNdO1xuICAgIHRoaXMuZXZlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQgPSBvcHRpb25zLm9uQ29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50ID0gb3B0aW9ucy5vblVuY29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uRHVwbGljYXRlRXZlbnQgPSBvcHRpb25zLm9uRHVwbGljYXRlRXZlbnQ7XG4gICAgdGhpcy5nZXRQcm9taXNlUXVldWUgPSBvcHRpb25zLmdldFByb21pc2VRdWV1ZTtcbiAgICB0aGlzLmlzRGVsaXZlcnlJZGxlID0gb3B0aW9ucy5pc0RlbGl2ZXJ5SWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2xkZXN0IGV2ZW50IHRoZSB3YWxrIHN0ZXBwZWQgb3ZlciB0aGF0IG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldCxcbiAgICogaWYgYW55LiBQYXJraW5nIGlzIGEgYmV0IHRoYXQgYSBjb25zdW1lciB3aWxsIGJlIHJlZ2lzdGVyZWQgbGF0ZXIsIHNvIGF0XG4gICAqIGFueSBwb2ludCB3aGVyZSBubyBjb25zdW1lciBldmVyIHdpbGwgYmUgYWdhaW4gKHRoZSByZXBsYXkgZmluaXNoaW5nIGlzXG4gICAqIHRoZSBkZWZpbml0aXZlIG9uZSksIHRoaXMgYW5zd2VycyB3aGljaCBldmVudCB0aGUgYmV0IGxvc3Qgb24uXG4gICAqL1xuICBnZXQgc3RyYW5kZWRFdmVudCgpOiBFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFya2VkWzBdPy5ldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSB3YWxrIGlzIHN0aWxsIGhvbGRpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaG9sZHMgbm90aGluZy5cbiAgICpcbiAgICogUmVhZCBhdCBldmVyeSBwb2ludCBhIHJlcGxheSBzdG9wcywgaW5jbHVkaW5nIHRoZSBzdXNwZW5zaW9ucyB0aGF0IGFyZSBub3RcbiAgICogc2V0dGxpbmcgcG9pbnRzLCBzbyB0aGUgaGVsZCBzdGF0ZSByZWFjaGVzIHRlbGVtZXRyeS4gQSByZXBsYXkgY2Fubm90IHRlbGxcbiAgICogYSBkZWxpdmVyeSBhd2FpdGluZyBhIGxhdGVyIGNvbnN1bWVyIGZyb20gb25lIG5vIGNvbnN1bWVyIHdpbGwgZXZlclxuICAgKiByZWdpc3Rlciwgc28gaXQgcmVwb3J0cyByYXRoZXIgdGhhbiBkZWNpZGVzOiB0aGUgc2FtZSBgZXZlbnRJZGAgcmVwb3J0ZWQgb25cbiAgICogc3VzcGVuc2lvbiBhZnRlciBzdXNwZW5zaW9uIG9mIG9uZSBydW4gaXMgdGhlIHNoYXBlIHRoYXQgc2F5cyB0aGUgYmV0XG4gICAqIHBhcmtpbmcgbWFkZSBpcyBub3QgZ29pbmcgdG8gcGF5IG9mZiwgYW5kIHRoYXQgc2hhcGUgaXMgb25seSB2aXNpYmxlIGFjcm9zc1xuICAgKiByZXBsYXlzLlxuICAgKi9cbiAgZ2V0IHBhcmtlZFN1bW1hcnkoKTpcbiAgICB8IHsgY291bnQ6IG51bWJlcjsgZXZlbnRJZDogc3RyaW5nOyBldmVudFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMucGFya2VkWzBdPy5ldmVudDtcbiAgICBpZiAoIW9sZGVzdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50OiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgICBldmVudElkOiBvbGRlc3QuZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZTogb2xkZXN0LmV2ZW50VHlwZSxcbiAgICB9O1xuICB9XG5cbiAgYXBwZW5kKGV2ZW50czogRXZlbnRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB0aGlzLmV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKHRoaXMuY29uc3VtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIGFuIGV2ZW50IGhhcyBiZWVuIGNvbnN1bWVkXG4gICAqIGJ5IGEgZGlmZmVyZW50IGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgY2FuIHJldHVybjpcbiAgICogIC0gYEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWRgIHRoZSBldmVudCBpcyBjb25zaWRlcmVkIGNvbnN1bWVkIGFuZCB3aWxsIG5vdCBiZSBwYXNzZWQgdG8gYW55IG90aGVyIGNhbGxiYWNrLCBidXQgdGhlIGNhbGxiYWNrIHdpbGwgcmVtYWluIGluIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZGAgdGhlIGV2ZW50IGlzIHBhc3NlZCB0byB0aGUgbmV4dCBjYWxsYmFja1xuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZGAgdGhlIGV2ZW50IGlzIGNvbnNpZGVyZWQgY29uc3VtZWQgYW5kIHRoZSBjYWxsYmFjayBpcyByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSBmbiAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byByZWdpc3Rlci5cbiAgICovXG4gIHN1YnNjcmliZShmbjogRXZlbnRDb25zdW1lckNhbGxiYWNrKSB7XG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChmbik7XG4gICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHVuY29uc3VtZWQgY2hlY2sgc2luY2UgYSBuZXcgY2FsbGJhY2sgbWF5IGNvbnN1bWUgdGhlIGV2ZW50LlxuICAgIC8vIEluY3JlbWVudGluZyB0aGUgdmVyc2lvbiBjYXVzZXMgYW55IGluLWZsaWdodCBwcm9taXNlIGNoYWluIGNoZWNrIHRvIG5vLW9wLlxuICAgIC8vIEFsc28gY2xlYXIgdGhlIHBlbmRpbmcgc2V0VGltZW91dCBpZiBpdCBoYXNuJ3QgZmlyZWQgeWV0LlxuICAgIGlmICh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbisrO1xuICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQpO1xuICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3MubmV4dFRpY2sodGhpcy5jb25zdW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29uc3VtZWRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMub25Db25zdW1lZEV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uQ29uc3VtZWRFdmVudChldmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGV2ZW50c0xvZ2dlci5lcnJvcignb25Db25zdW1lZEV2ZW50IGNhbGxiYWNrIHRocmV3IGFuIGVycm9yJywge1xuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSA9ICgpID0+IHtcbiAgICAvLyBEcmFpbiBjb25zZWN1dGl2ZWx5IGNvbnN1bWFibGUgZXZlbnRzIHN5bmNocm9ub3VzbHkgd2l0aGluIGEgc2luZ2xlXG4gICAgLy8gcGFzcyBpbnN0ZWFkIG9mIHBheWluZyBvbmUgYHByb2Nlc3MubmV4dFRpY2tgIHBlciBjb25zdW1lZCBldmVudC5cbiAgICAvL1xuICAgIC8vIFdoeSB0aGlzIGlzIHNhZmU6IGEgY2FsbGJhY2sgb25seSBjb25zdW1lcyBhbiBldmVudCB1c2luZyBhIGNvbnN1bWVyXG4gICAgLy8gdGhhdCBpcyBBTFJFQURZIHJlZ2lzdGVyZWQgKGUuZy4gYSBsb25nLWxpdmVkIHN0ZXAgY29uc3VtZXIgd2Fsa2luZ1xuICAgIC8vIGBzdGVwX2NyZWF0ZWRgIOKGkiBgc3RlcF9zdGFydGVkYCDihpIgYHN0ZXBfY29tcGxldGVkYCwgb3IgdGhlIHN0cnVjdHVyYWxcbiAgICAvLyBsaWZlY3ljbGUgY29uc3VtZXIpLiBOZXcgY29uc3VtZXJzIGFyZSBvbmx5IGV2ZXIgcmVnaXN0ZXJlZCBieSB3b3JrZmxvd1xuICAgIC8vIFZNIGJvZHkgY29kZSB0aGF0IHJ1bnMgYXN5bmNocm9ub3VzbHkgb2ZmIGBjdHgucHJvbWlzZVF1ZXVlYCBhZnRlciBhXG4gICAgLy8gZGVsaXZlcnkgYHJlc29sdmUoKWA7IG5vbmUgb2YgdGhlIGNhbGxiYWNrcyBoZXJlIGNhbGwgYHN1YnNjcmliZSgpYFxuICAgIC8vIHN5bmNocm9ub3VzbHkuIFNvIHdpdGhpbiBvbmUgcGFzcyBgdGhpcy5jYWxsYmFja3NgIGlzIG11dGF0ZWQgb25seSBieVxuICAgIC8vIHRoaXMgbG9vcCAodGhlIGBGaW5pc2hlZGAgc3BsaWNlKSwgYW5kIHRoZSBuZXh0IGV2ZW50J3MgY29uc3VtZXIgaXNcbiAgICAvLyBlaXRoZXIgYWxyZWFkeSBwcmVzZW50IChhZHZhbmNlIG5vdykgb3Igbm90IHlldCByZWdpc3RlcmVkLCBpbiB3aGljaFxuICAgIC8vIGNhc2Ugbm8gY2FsbGJhY2sgY29uc3VtZXMgdGhlIGV2ZW50IGFuZCB3ZSBmYWxsIHRocm91Z2ggdG8gdGhlXG4gICAgLy8gY3Jvc3MtVk0tc2FmZSBkZWZlcnJlZCB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGJlbG93LCBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQmVmb3JlIGV2ZXJ5IG9mZmVyLCBub3QganVzdCBvbiBzdWJzY3JpYmU6IGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCBieVxuICAgICAgLy8gdGhlIHdvcmsgdGhpcyBzYW1lIHBhc3Mga2lja2VkIG9mZiBtYXkgYmUgdGhlIG93bmVyIG9mIHNvbWV0aGluZ1xuICAgICAgLy8gcGFya2VkLCBhbmQgdGhlIHBhcmtlZCBldmVudCdzIGRlbGl2ZXJ5IGlzIG9yZGVyZWQgYWhlYWQgb2YgdGhlIGhlYWRcbiAgICAgIC8vIGV2ZW50J3MgYnkgdGhlIGluZGV4IGl0IGhvbGRzLlxuICAgICAgdGhpcy5kcmFpblBhcmtlZCgpO1xuICAgICAgY29uc3QgY3VycmVudEV2ZW50ID0gdGhpcy5ldmVudHNbdGhpcy5ldmVudEluZGV4XSA/PyBudWxsO1xuICAgICAgaWYgKGN1cnJlbnRFdmVudCAhPT0gbnVsbCAmJiBpc1NlYWxlZE5vb3BFdmVudChjdXJyZW50RXZlbnQpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNlYWxlZE5vb3AoY3VycmVudEV2ZW50KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdW1lZCA9IHRoaXMub2ZmZXIoY3VycmVudEV2ZW50KTtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRW5kIG9mIGxvZy4gQ29uc3VtZXJzIHJldHVybiBOb3RDb25zdW1lZCBmb3IgdGhlIGBudWxsYCBzZW50aW5lbFxuICAgICAgICAvLyAodGhlIG9uZSB0aGF0IHJlY29nbml6ZXMgaXQgYXMgaXRzIG93biBib3VuZGFyeSBzY2hlZHVsZXMgdGhlXG4gICAgICAgIC8vIHN1c3BlbnNpb24gYXMgYSBzaWRlIGVmZmVjdCBhbmQgc3RpbGwgZGVjbGluZXMgaXQpLCBzbyB0aGUgZHJhaW5cbiAgICAgICAgLy8gc3RvcHMgaGVyZSByYXRoZXIgdGhhbiBzcGlubmluZyBwYXN0IHRoZSBlbmQuIGBjb25zdW1lZGAgaXMgb25seVxuICAgICAgICAvLyB0cnVlIGZvciBhIGNhbGxiYWNrIHRoYXQgY2xhaW1zIHRoZSBzZW50aW5lbCBvdXRyaWdodCwgd2hpY2ggbm9cbiAgICAgICAgLy8gcHJvZHVjdGlvbiBjb25zdW1lciBkb2VzLlxuICAgICAgICBpZiAoIWNvbnN1bWVkKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmRPZkxvZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY29uc3VtZWQpIHtcbiAgICAgICAgLy8gTm9ib2R5IHdhbnRlZCBpdC4gSWYgaXQgcmVwZWF0cyBhIGNsYXNzIHRoaXMgd2FsayBhbHJlYWR5IGNvbnN1bWVkXG4gICAgICAgIC8vIGZvciB0aGUgc2FtZSBlbnRpdHkgaXQgaXMgYSBzdHJhZ2dsZXIgZnJvbSBhIGNvbmN1cnJlbnQgcmVwbGF5OlxuICAgICAgICAvLyBzdGVwIG92ZXIgaXQgaW4gdGhpcyBwYXNzIHJhdGhlciB0aGFuIHBheWluZyB0aGUgZGVmZXJyZWQgd2luZG93IGZvclxuICAgICAgICAvLyBhIGNvbnN1bWVyIHRoYXQgY2Fubm90IGNvbWUgKHNlZSBgZmlyc3RFdmVudFR5cGVPZkNsYXNzYCkuXG4gICAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IHRoaXMuZmlyc3RFdmVudFR5cGVPZkNsYXNzKGN1cnJlbnRFdmVudCk7XG4gICAgICAgIGlmIChmaXJzdFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuc2tpcER1cGxpY2F0ZUV2ZW50KGN1cnJlbnRFdmVudCwgZmlyc3RUeXBlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgcmVhbCBldmVudCB3YXMgY29uc3VtZWQsIHNvIGFkdmFuY2UgdG8gdGhlIG5leHQgaW4gdGhlIHNhbWUgcGFzcy5cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE9mZmVyIGBjdXJyZW50RXZlbnRgIHRvIGVhY2ggcmVnaXN0ZXJlZCBjYWxsYmFjayBpbiB0dXJuLiBSZXR1cm5zIHRydWVcbiAgICogd2hlbiBhIGNhbGxiYWNrIGNvbnN1bWVkIGl0LiBEb2VzIG5vdCBtb3ZlIHtAbGluayBldmVudEluZGV4fTogdGhlIG9yZGVyZWRcbiAgICogd2FsayBhbmQgdGhlIHBhcmtlZCBkcmFpbiBhZHZhbmNlIGRpZmZlcmVudGx5LCBzbyBlYWNoIGRvZXMgaXRzIG93bi5cbiAgICovXG4gIHByaXZhdGUgb2ZmZXIoY3VycmVudEV2ZW50OiBFdmVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2ldO1xuICAgICAgbGV0IGhhbmRsZWQgPSBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlZCA9IGNhbGxiYWNrKGN1cnJlbnRFdmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ0V2ZW50Q29uc3VtZXIgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBoYW5kbGVkICE9PSBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkICYmXG4gICAgICAgIGhhbmRsZWQgIT09IEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWRcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1cnJlbnRFdmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgT05FX1NIT1RfRVZFTlRfVFlQRVMuaGFzKGN1cnJlbnRFdmVudC5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWQuYWRkKFxuICAgICAgICAgICAgcmVzb2x1dGlvbktleShjdXJyZW50RXZlbnQuZXZlbnRUeXBlLCBjdXJyZW50RXZlbnQuY29ycmVsYXRpb25JZClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVjb3JkRXZlbnRDbGFzcyhjdXJyZW50RXZlbnQpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGUgY2FsbGJhY2sgaWYgaXQgaGFzIGZpbmlzaGVkXG4gICAgICBpZiAoaGFuZGxlZCA9PT0gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZmVyIGV2ZXJ5dGhpbmcgcGFya2VkLCBvbGRlc3QgZmlyc3QsIHVudGlsIGEgcGFzcyBjbGFpbXMgbm90aGluZy5cbiAgICpcbiAgICogRWFjaCBvZmZlciBydW5zIHdpdGgge0BsaW5rIGV2ZW50SW5kZXh9IG1vdmVkIGJhY2sgdG8gdGhlIHBvc2l0aW9uIHRoZVxuICAgKiBwYXJrZWQgZXZlbnQgaGVsZCBpbiB0aGUgbG9nLCBiZWNhdXNlIHRoYXQgaXMgdGhlIHBvc2l0aW9uIGl0cyBjb25zdW1lclxuICAgKiB3aWxsIHJlZ2lzdGVyIGEgZGVsaXZlcnkgYmFycmllciB1bmRlci4gUmVzdG9yaW5nIHRoZSB3YWxrIHBvaW50ZXJcbiAgICogYWZ0ZXJ3YXJkcyBpcyB3aGF0IGtlZXBzIHRoZSB0d28gcG9pbnRlcnMgZnJvbSBpbnRlcmZlcmluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhaW5QYXJrZWQoKTogdm9pZCB7XG4gICAgbGV0IHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgIHdoaWxlIChwcm9ncmVzc2VkKSB7XG4gICAgICBwcm9ncmVzc2VkID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFya2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5wYXJrZWRbaV07XG4gICAgICAgIGNvbnN0IHdhbGtJbmRleCA9IHRoaXMuZXZlbnRJbmRleDtcbiAgICAgICAgdGhpcy5ldmVudEluZGV4ID0gZW50cnkuaW5kZXg7XG4gICAgICAgIGxldCBjb25zdW1lZDogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdW1lZCA9IHRoaXMub2ZmZXIoZW50cnkuZXZlbnQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuZXZlbnRJbmRleCA9IHdhbGtJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgICB0aGlzLnBhcmtlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgLy8gQSBgRmluaXNoZWRgIGNhbGxiYWNrIHdhcyBzcGxpY2VkIG91dCBvZiB0aGUgbGlzdCB0aGlzIHBhc3MsIHNvXG4gICAgICAgICAgLy8gcmVzdGFydCByYXRoZXIgdGhhbiBrZWVwIHdhbGtpbmcgYSBtdXRhdGVkIGFycmF5LlxuICAgICAgICAgIHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdGhlIG9yZGVyZWQgd2FsayBvdmVyIGFuIGV2ZW50IG5vYm9keSBjbGFpbWVkLCBob2xkaW5nIG9uIHRvIGl0IGZvciBhXG4gICAqIGxhdGVyIGNvbnN1bWVyLiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIGV2ZW50J3MgdHlwZSBtYWtlcyBpdHMgcG9zaXRpb24gYVxuICAgKiBkZWNpc2lvbiByZWNvcmQsIHdoaWNoIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSBub2JvZHkgY2xhaW1pbmcgaXQgbWVhbnMgdGhlXG4gICAqIHJlcGxheSBkaXZlcmdlZC5cbiAgICovXG4gIHByaXZhdGUgcGFyayhldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIVBBUktBQkxFX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgIHRoaXMucmVzb2x2ZWQuaGFzKHJlc29sdXRpb25LZXkoZXZlbnQuZXZlbnRUeXBlLCBldmVudC5jb3JyZWxhdGlvbklkKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wYXJrZWQucHVzaCh7IGV2ZW50LCBpbmRleDogdGhpcy5ldmVudEluZGV4IH0pO1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnUGFya2VkIGFuIHVuY2xhaW1lZCBldmVudCBmb3IgbGF0ZXIgZGVsaXZlcnknLCB7XG4gICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleSBgZXZlbnRgJ3MgY2xhc3MgaXMgdHJhY2tlZCB1bmRlciwgb3IgYHVuZGVmaW5lZGAgZm9yIHRoZSBldmVudFxuICAgKiB0eXBlcyB0aGF0IGJlbG9uZyB0byBubyBjbGFzcyAoYGhvb2tfcmVjZWl2ZWRgLCBgaG9va19jb25mbGljdGAsXG4gICAqIGBhdHRyX3NldGAsIGBydW5fY3JlYXRlZGApIGFuZCBhcmUgdGhlcmVmb3JlIG5ldmVyIHNraXBwZWQuXG4gICAqXG4gICAqIFJ1biBldmVudHMgY2Fycnkgbm8gY29ycmVsYXRpb24gaWQuIFRoZXkgYXJlIGNsYXNzZXMgb2YgdGhlIHJ1biBpdHNlbGYsIHNvXG4gICAqIHRoZXkgYWxsIGtleSBvZmYgdGhlIHNhbWUgYnVja2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBldmVudENsYXNzS2V5KGV2ZW50OiBFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRDbGFzcyA9IGVudGl0eUV2ZW50Q2xhc3MoZXZlbnQuZXZlbnRUeXBlKTtcbiAgICByZXR1cm4gZXZlbnRDbGFzcyA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBgJHtldmVudENsYXNzfToke2V2ZW50LmNvcnJlbGF0aW9uSWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1lbWJlcnMgdGhhdCBgZXZlbnRgJ3MgY2xhc3MgaXMgbm93IGRlY2lkZWQgZm9yIGl0cyBlbnRpdHksIGlmIHRoZSB0eXBlXG4gICAqIGJlbG9uZ3MgdG8gYSBjbGFzcy4gRmlyc3Qgd3JpdGVyIHdpbnM6IHRoZSByZWNvcmRlZCB0eXBlIGlzIHRoZSBvbmUgdGhlXG4gICAqIHdvcmtmbG93IG9ic2VydmVkLCBhbmQgYSBsYXRlciByZXBlYXQgaXMgbWVhc3VyZWQgYWdhaW5zdCBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkRXZlbnRDbGFzcyhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmV2ZW50Q2xhc3NLZXkoZXZlbnQpO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLnNlZW5FdmVudENsYXNzZXMuc2V0KGtleSwgZXZlbnQuZXZlbnRUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgdGhhdCBhbHJlYWR5IGRlY2lkZWQgYGV2ZW50YCdzIGNsYXNzIGZvciB0aGUgc2FtZSBlbnRpdHksIG9yXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gbm90aGluZyBoYXM6IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIGZvciBvbmUgc3RlcCwgYVxuICAgKiBzZWNvbmQgdGVybWluYWwgb3V0Y29tZSwgYSBzZWNvbmQgYHN0ZXBfc3RhcnRlZGAgYWZ0ZXIgdGhlIHN0ZXAncyByZXN1bHQgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgbG9nLlxuICAgKlxuICAgKiBTdWNoIGFuIGV2ZW50IGlzIGNvbW1pdHRlZCBidXQgaW5lcnQuIENvbmN1cnJlbnQgcmVwbGF5cyB3cml0ZSBpbnRvIG9uZVxuICAgKiBsb2cgd2l0aG91dCBhIGN1cnJlbmN5IGd1YXJkLCBzbyBhIHJlcGxheSB3b3JraW5nIGZyb20gYSBwcmVmaXggdGhhdFxuICAgKiBwcmVkYXRlcyBhbm90aGVyIHJlcGxheSdzIHdyaXRlIGNhbiBjb21taXQgaXRzIG93biBjb3B5IG9mIHdvcmsgdGhlIGxvZ1xuICAgKiBhbHJlYWR5IHJlY29yZHMuIFRoYXQgY29weSBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVkOiB0aGVcbiAgICogb3V0Y29tZSB3YXMgZGVjaWRlZCBieSB0aGUgZmlyc3QgZXZlbnQgb2YgdGhlIGNsYXNzIGFuZCBldmVyeSBsYXRlciByZXBsYXlcbiAgICogcmVhZHMgdGhhdCBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIGxvZyBwb3NpdGlvbiwgc28gaWdub3JpbmcgdGhlIHN0cmFnZ2xlclxuICAgKiBpcyBkZXRlcm1pbmlzdGljIGFjcm9zcyByZXBsYXlzLlxuICAgKlxuICAgKiBDbGFzc2VzIGFyZSB0cmFja2VkIHNlcGFyYXRlbHksIHNvIHBhc3Npbmcgb25lIGRvZXMgbm90IHN1cHByZXNzIGFub3RoZXIuXG4gICAqIEEgc3RlcCB3aG9zZSByZXN1bHQgaXMgaW4gdGhlIGxvZyBzdGlsbCByZWFjaGVzIGl0cyBgc3RlcF9jcmVhdGVkYCBhbmRcbiAgICogYHN0ZXBfc3RhcnRlZGAgY29uc3VtZXJzIGlmIGl0IGhhcyB5ZXQgdG8gc2VlIHRob3NlIGNsYXNzZXMuXG4gICAqXG4gICAqIENvbnN1bHRlZCBvbmx5IGFmdGVyIGV2ZXJ5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIHRoZSBldmVudCwgc29cbiAgICogaXQgY2FuIG5ldmVyIHRha2UgYW4gZXZlbnQgYSBjb25zdW1lciB3YW50ZWQuIEEgcmV0cnkncyBgc3RlcF9zdGFydGVkYCBpc1xuICAgKiBjbGFpbWVkIGJ5IHRoZSBzdGVwJ3MgbGl2ZSBjb25zdW1lciBhbmQgY291bnRzIGFzIGFuIGF0dGVtcHQgZXhhY3RseSBhc1xuICAgKiBiZWZvcmUsIGFuZCBhIHNlY29uZCBgc3RlcF9jcmVhdGVkYCByZWFjaGluZyBhIHN0ZXAgdGhhdCBoYXMgbm90IGZpbmlzaGVkXG4gICAqIGlzIGxpa2V3aXNlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHNraXBwZWQ7IG9ubHkgdGhlIGNvcGllcyBub2JvZHkgY2xhaW1zIGFyZVxuICAgKiBza2lwcGVkLlxuICAgKlxuICAgKiBVbmxpa2UgdGhlIGRpdmVyZ2VuY2UgcmVwb3J0LCB0aGlzIGRvZXMgKm5vdCogd2FpdCBvdXQgdGhlIGRlZmVycmVkIHdpbmRvd1xuICAgKiBmaXJzdCwgYW5kIGl0IGRvZXMgbm90IG5lZWQgdG8uIFRoZSB3aW5kb3cgYnV5cyB0aW1lIGZvciBhIGNvbnN1bWVyIHRoYXRcbiAgICogaGFzIHlldCB0byByZWdpc3RlciwgYW5kIG5vIHN1Y2ggY29uc3VtZXIgY2FuIHdhbnQgdGhpcyBldmVudDogdGhlIGNsYXNzXG4gICAqIHdhcyByZWNvcmRlZCBieSBhIGNvbnN1bXB0aW9uIGluIHRoaXMgc2FtZSByZXBsYXksIHdoaWNoIG1lYW5zIHRoZSBlbnRpdHknc1xuICAgKiBjb25zdW1lciB3YXMgcmVnaXN0ZXJlZCBhbmQgdG9vayBhbiBldmVudCBvZiB0aGlzIGNsYXNzLCBhbmQgY29ycmVsYXRpb25cbiAgICogaWRzIGFyZSBtaW50ZWQgZnJvbSBhIG1vbm90b25pYyBVTElEIHBlciBib2R5IHBvc2l0aW9uLCBzbyBub3RoaW5nIGxhdGVyIGluXG4gICAqIHRoZSBib2R5IHJlZ2lzdGVycyBhIHNlY29uZCBjb25zdW1lciB1bmRlciB0aGlzIGlkLiBXYWl0aW5nIHdvdWxkIGNvc3RcbiAgICogYGdldERlZmVycmVkQ2hlY2tEZWxheU1zKClgIHBlciBzdHJhZ2dsZXIgcGVyIHJlcGxheSBmb3IgaW5mb3JtYXRpb24gdGhhdFxuICAgKiBjYW5ub3QgYXJyaXZlOiAwLjc1JSBvZiBwcm9kdWN0aW9uIHJ1bnMgY2FycnkgYXQgbGVhc3Qgb25lIHN0cmFnZ2xlciwgYW5kXG4gICAqIHRoZSBwOTkgYW1vbmcgdGhvc2UgY2FycmllcyAxNTUuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdG8gcHJlc2VydmUgaWYgaG9vayBpZGVudGl0eSBldmVyIGJlY29tZXMgY2FsbGVyLXN1cHBsaWVkXG4gICAqIChhbiBpZGVtcG90ZW5jeSBrZXkgcmF0aGVyIHRoYW4gYSBtaW50ZWQgaWQpOiB0d28gYGNyZWF0ZUhvb2tgIGNhbGxzIGluIG9uZVxuICAgKiBib2R5IGNvdWxkIHRoZW4gc2hhcmUgYSBjb3JyZWxhdGlvbiBpZCwgYW5kIHRoZSBzZWNvbmQgY29uc3VtZXInc1xuICAgKiBgaG9va19jcmVhdGVkYCB3b3VsZCBiZSBhIHJlcGVhdCBvZiBhIGNsYXNzIHRoaXMgcmVwbGF5IGFscmVhZHkgcmVjb3JkZWQuXG4gICAqIFRoYXQgd291bGQgbWFrZSBza2lwcGluZyB3cm9uZyBmb3IgYGhvb2tfY3JlYXRlZGAsIGFuZCBpcyB0aGUgcmVhc29uIHRoZVxuICAgKiBjbGFzcyBtYXAgbGl2ZXMgbmV4dCB0byB0aGUgZXZlbnQgdHlwZXMgcmF0aGVyIHRoYW4gYmVpbmcgaW5mZXJyZWQuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0RXZlbnRUeXBlT2ZDbGFzcyhldmVudDogRXZlbnQpOiBFdmVudFsnZXZlbnRUeXBlJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZlbnRDbGFzc0tleShldmVudCk7XG4gICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXBzIHRoZSB3YWxrIG92ZXIgYSBzZWFsZWQtbG9nIGBub29wYCAoc3BlY1ZlcnNpb24gPj0gNyk6IHRoZSBXb3JsZCdzXG4gICAqIGJhY2tlbmQgd3JvdGUgaXQgdG8gb2NjdXB5IGEgc2xvdCB3aG9zZSB3cml0ZXIgYWxsb2NhdGVkIHRoZSBwb3NpdGlvbiBhbmRcbiAgICogZGllZCwgc28gdGhlIGxvZydzIGRlbnNpdHkgYXJpdGhtZXRpYyBob2xkcy4gSXQgaXMgaW52aXNpYmxlIHRvIHRoZVxuICAgKiB3b3JrZmxvdzogbm8gY29uc3VtZXIgaXMgb2ZmZXJlZCBpdCwgbm8gZXZlbnQgY2xhc3MgaXMgcmVjb3JkZWQsIGFuZCB0aGVcbiAgICogZGV0ZXJtaW5pc3RpYyBjbG9jayBkb2VzIG5vdCBhZHZhbmNlLCBleGFjdGx5IGFzIHdpdGhcbiAgICoge0BsaW5rIHNraXBEdXBsaWNhdGVFdmVudH0sIHNvIGEgbG9nIHRoYXQgaGFwcGVucyB0byBjb250YWluIG9uZSBwcm9kdWNlcyB0aGUgc2FtZVxuICAgKiB0aW1lc3RhbXBzIGFzIGEgbG9nIHRoYXQgZG9lcyBub3QuIChJdHMgYGNyZWF0ZWRBdGAgaXMgdGhlIHNlYWwgdGltZSxcbiAgICogd2hpY2ggY2FuIGV2ZW4gcG9zdGRhdGUgbGF0ZXIgc2xvdHMnIGV2ZW50czsgbGV0dGluZyBpdCB0b3VjaCB0aGUgY2xvY2tcbiAgICogd291bGQgbGVhayB0aGUgc2VhbGVyJ3Mgd2FsbCBjbG9jayBpbnRvIHJlcGxheS4pXG4gICAqL1xuICBwcml2YXRlIHNraXBTZWFsZWROb29wKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgc2VhbGVkLWxvZyBub29wIGV2ZW50Jywge1xuICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdGVwcyB0aGUgd2FsayBvdmVyIGEgcmVwZWF0IG9mIGFuIGFscmVhZHktY29uc3VtZWQgY2xhc3MuICovXG4gIHByaXZhdGUgc2tpcER1cGxpY2F0ZUV2ZW50KGV2ZW50OiBFdmVudCwgZmlyc3RUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ10pIHtcbiAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAvLyBEZWxpYmVyYXRlbHkgbm90IHJvdXRlZCB0aHJvdWdoIGBub3RpZnlDb25zdW1lZEV2ZW50YDogdGhlIGRldGVybWluaXN0aWNcbiAgICAvLyBjbG9jayBhZHZhbmNlcyBvbmx5IG9uIGV2ZW50cyB0aGUgd29ya2Zsb3cgYWN0dWFsbHkgb2JzZXJ2ZWQuIEEgc2tpcHBlZFxuICAgIC8vIGV2ZW50IGlzIGludmlzaWJsZSB0byB0aGUgd29ya2Zsb3cgYm9keSwgYW5kIGEgbG9nIHRoYXQgaGFwcGVucyB0b1xuICAgIC8vIGNvbnRhaW4gb25lIG11c3QgcHJvZHVjZSB0aGUgc2FtZSB0aW1lc3RhbXBzIGFzIGEgbG9nIHRoYXQgZG9lcyBub3QuXG4gICAgZXZlbnRzTG9nZ2VyLmRlYnVnKFxuICAgICAgJ1NraXBwaW5nIGV2ZW50IHRoYXQgcmVwZWF0cyBhIGNsYXNzIGFscmVhZHkgaW4gdGhlIGxvZycsXG4gICAgICB7XG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBmaXJzdEV2ZW50VHlwZTogZmlyc3RUeXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgfVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25EdXBsaWNhdGVFdmVudD8uKGV2ZW50LCBmaXJzdFR5cGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ29uRHVwbGljYXRlRXZlbnQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7XG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFbmRPZkxvZygpIHtcbiAgICAvLyBFdmVyeXRoaW5nIHN0aWxsIHBhcmtlZCBpcyB3YWl0aW5nIGZvciBhIGNvbnN1bWVyIHNvbWUgbGF0ZXIgcmVwbGF5IHdpbGxcbiAgICAvLyByZWdpc3Rlciwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIHBhcmtpbmcsIGV4Y2VwdCBvbmNlIHRoZSBsb2dcbiAgICAvLyBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyB0ZXJtaW5hbCBldmVudCwgYmVjYXVzZSB0aGVuIHRoZXJlIGlzIG5vIGxhdGVyXG4gICAgLy8gcmVwbGF5IGFuZCBubyBjb25zdW1lciB3aWxsIGV2ZXIgY29tZS5cbiAgICBpZiAodGhpcy5wYXJrZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmV2ZW50cy5hdCgtMSk7XG4gICAgaWYgKCFsYXN0IHx8ICFURVJNSU5BTF9FVkVOVF9UWVBFUy5oYXMobGFzdC5ldmVudFR5cGUpKSB7XG4gICAgICAvLyBBIGxhdGVyIHJlcGxheSBpcyBzdGlsbCBleHBlY3RlZCwgc28gbm90aGluZyBoZXJlIGlzIGRlY2lkYWJsZSBhbmRcbiAgICAgIC8vIGVzY2FsYXRpbmcgd291bGQgZmFpbCB0aGUgaGVhbHRoeSBydW5zIHBhcmtpbmcgZXhpc3RzIHRvIGtlZXAgYWxpdmUuXG4gICAgICAvLyBSZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBsb2cgaG9sZGluZyBzb21ldGhpbmcgaXMgbm90IGJ5IGl0c2VsZiBhIGZhdWx0LFxuICAgICAgLy8gc28gdGhpcyBzdGF5cyBhdCBgZGVidWdgOyB7QGxpbmsgcGFya2VkU3VtbWFyeX0gaXMgd2hhdCBjYXJyaWVzIHRoZVxuICAgICAgLy8gc3RhdGUgdG8gdGhlIHNwYW4sIHdoZXJlIGEgcnVuIHRoYXQga2VlcHMgc3RvcHBpbmcgb24gdGhlIHNhbWUgaGVsZFxuICAgICAgLy8gZXZlbnQgaXMgdmlzaWJsZSBhbmQgYSBzaW5nbGUgcmVwbGF5J3MgdmlldyBpcyBub3QuXG4gICAgICBldmVudHNMb2dnZXIuZGVidWcoJ1JlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbG9nIHN0aWxsIGhvbGRpbmcgZXZlbnRzJywge1xuICAgICAgICBldmVudElkOiB0aGlzLnBhcmtlZFswXS5ldmVudC5ldmVudElkLFxuICAgICAgICBldmVudFR5cGU6IHRoaXMucGFya2VkWzBdLmV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5wYXJrZWRbMF0uZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY2hlZHVsZVVuY29uc3VtZWRDaGVjayh0aGlzLnBhcmtlZFswXS5ldmVudCwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVVuY29uc3VtZWRDaGVjayhjdXJyZW50RXZlbnQ6IEV2ZW50LCBtYXlQYXJrOiBib29sZWFuKSB7XG4gICAgLy8gQWxsIGNhbGxiYWNrcyByZXR1cm5lZCBOb3RDb25zdW1lZCBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuXG4gICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCBjaGVjay4gV2UgY2hhaW4gb250byB0aGUgcHJvbWlzZVF1ZXVlIHNvIHRoYXQgYW55XG4gICAgLy8gcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLCBkZXNlcmlhbGl6YXRpb24vZGVjcnlwdGlvbiB0aGF0IHRyaWdnZXJzXG4gICAgLy8gcmVzb2x2ZSgpIOKGkiB1c2VyIGNvZGUg4oaSIHN1YnNjcmliZSgpKSBjb21wbGV0ZXMgZmlyc3QuIElmIHRoZSBldmVudFxuICAgIC8vIGlzIHN0aWxsIHVuY29uc3VtZWQgYWZ0ZXIgdGhlIHF1ZXVlIGRyYWlucywgaXQncyB0cnVseSBvcnBoYW5lZCwgb3IsXG4gICAgLy8gd2hlbiBpdHMgdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLCBwYXJrZWQgZm9yIGEgbGF0ZXIgY29uc3VtZXIuXG4gICAgY29uc3QgY2hlY2tWZXJzaW9uID0gKyt0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb247XG4gICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrID0gdGhpcy5nZXRQcm9taXNlUXVldWUoKVxuICAgICAgLnRoZW4oXG4gICAgICAgIC8vIFlpZWxkIG9uY2UgYWZ0ZXIgdGhlIGZpcnN0IHF1ZXVlIGRyYWluIHNvIHByb21pc2UgY2hhaW5zIHJlc3VtZWQgYnlcbiAgICAgICAgLy8gdGhhdCBkcmFpbiBjYW4gcnVuIGFjcm9zcyB0aGUgVk0gYm91bmRhcnkgYW5kIGFwcGVuZCBhbnkgZm9sbG93LXVwXG4gICAgICAgIC8vIGFzeW5jIHdvcmsgKGZvciBleGFtcGxlOiBzdGVwX2NvbXBsZXRlZCByZXNvbHZlcyAtPiBmb3ItYXdhaXQgbG9vcFxuICAgICAgICAvLyByZXN1bWVzIC0+IHRoZSBuZXh0IGhvb2sgcGF5bG9hZCBzdGFydHMgaHlkcmF0aW5nKS5cbiAgICAgICAgKCkgPT4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpXG4gICAgICApXG4gICAgICAudGhlbigoKSA9PiB0aGlzLmdldFByb21pc2VRdWV1ZSgpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IG91dCBhbnkgZGVsaXZlcnkgc3RpbGwgaW4gZmxpZ2h0IGJlZm9yZSBzdGFydGluZyB0aGUgdGltZXIuXG4gICAgICAgIC8vIFRoZSBxdWV1ZSBkcmFpbmluZyBzYXlzIHRoZSBob3N0IGhhcyBubyBoeWRyYXRpb24gd29yayBsZWZ0OyBpdFxuICAgICAgICAvLyBkb2VzIG5vdCBzYXkgdGhlIFZNIGhhcyBmaW5pc2hlZCByZWFjdGluZyB0byB3aGF0IHdhcyBoeWRyYXRlZC5cbiAgICAgICAgdGhpcy53aGVuRGVsaXZlcnlJZGxlKGNoZWNrVmVyc2lvbiwgKCkgPT4ge1xuICAgICAgICAgIC8vIFVzZSBhIGRlbGF5ZWQgc2V0VGltZW91dCBvbmNlIGRlbGl2ZXJpZXMgYXJlIGlkbGUuIFRoZSBkZWxheSBtdXN0XG4gICAgICAgICAgLy8gYmUgbG9uZyBlbm91Z2ggZm9yIHByb21pc2UgY2hhaW5zIHRvIHByb3BhZ2F0ZSBhY3Jvc3MgdGhlIFZNXG4gICAgICAgICAgLy8gYm91bmRhcnkgKGZyb20gcmVzb2x2ZSgpIGluIHRoZSBob3N0IGNvbnRleHQgdGhyb3VnaCB0byB0aGVcbiAgICAgICAgICAvLyB3b3JrZmxvdyBjb2RlIGNhbGxpbmcgc3Vic2NyaWJlKCkgaW4gdGhlIFZNIGNvbnRleHQpLiBOb2RlLmpzIGRvZXNcbiAgICAgICAgICAvLyBub3QgZ3VhcmFudGVlIHRoYXQgc2V0VGltZW91dCgwKSBmaXJlcyBhZnRlciBhbGwgY3Jvc3MtY29udGV4dFxuICAgICAgICAgIC8vIG1pY3JvdGFza3Mgc2V0dGxlLCBzbyB3ZSB1c2UgYSBzbWFsbCBidXQgbm9uLXplcm8gZGVsYXkuIEFueVxuICAgICAgICAgIC8vIHN1YnNjcmliZSgpIGNhbGwgdGhhdCBhcnJpdmVzIGR1cmluZyB0aGlzIHdpbmRvdyB3aWxsIGNhbmNlbCB0aGVcbiAgICAgICAgICAvLyBjaGVjayB2aWEgdmVyc2lvbiBpbnZhbGlkYXRpb24gKyBjbGVhclRpbWVvdXQuXG4gICAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVW5jb25zdW1lZEV2ZW50KGN1cnJlbnRFdmVudCwgbWF5UGFyayk7XG4gICAgICAgICAgfSwgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlIHdoYXQgYSBzdGlsbC11bmNvbnN1bWVkIGV2ZW50IGlzLCBub3cgdGhhdCB0aGUgcHJvbWlzZSBxdWV1ZSBoYXNcbiAgICogZHJhaW5lZCBhbmQgdGhlIGRlbGl2ZXJ5IGdhdGUgc2F5cyB0aGUgVk0gaXMgbm90IG1pZC1yZWFjdGlvbi5cbiAgICpcbiAgICogYG1heVBhcmtgIGlzIGZhbHNlIG9ubHkgZm9yIHRoZSBlbmQtb2YtbG9nIHJlY2hlY2sgb2YgYW4gZXZlbnQge0BsaW5rIHBhcmt9XG4gICAqIGFscmVhZHkgaG9sZHMuIE5vdGhpbmcgaW4gdGhlIGZpcnN0IGJyYW5jaCBhcHBsaWVzIHRvIG9uZSBvZiB0aG9zZTogaXQgaXNcbiAgICogbm90IHRoZSBldmVudCBhdCB0aGUgY3Vyc29yLCBzbyB0aGUgaWRlbnRpdHkgZ3VhcmQgaXMgbm90IG1lYW5pbmdmdWwsIGFuZFxuICAgKiBpdCBpcyBwYXJrZWQgYWxyZWFkeS5cbiAgICpcbiAgICogQSBkdXBsaWNhdGUgY2xhc3MgbmV2ZXIgYXJyaXZlcyBoZXJlLiB7QGxpbmsgY29uc3VtZX0gc3RlcHMgb3ZlciBvbmUgaW4gdGhlXG4gICAqIHBhc3MgdGhhdCBvZmZlcmVkIGl0LCBiZWZvcmUgdGhpcyBjaGVjayBpcyBldmVyIHNjaGVkdWxlZCwgYW5kIGEgY2xhc3NcbiAgICogcmVjb3JkZWQgd2hpbGUgdGhlIGNoZWNrIHdhcyBpbiBmbGlnaHQgY2FuIG9ubHkgaGF2ZSBiZWVuIHJlY29yZGVkIGJ5IGFcbiAgICogY29uc3VtcHRpb24gaW5zaWRlIHtAbGluayBjb25zdW1lfSwgd2hvc2UgbmV4dCBwYXNzIHJlLW9mZmVycyB0aGlzIGV2ZW50XG4gICAqIGFuZCBzdGVwcyBvdmVyIGl0IHRoZXJlLCBsZWF2aW5nIHRoZSBpZGVudGl0eSBndWFyZCBhYm92ZSB0byBkcm9wIHRoZVxuICAgKiBpbi1mbGlnaHQgY2hlY2suXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVVbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50OiBFdmVudCwgbWF5UGFyazogYm9vbGVhbikge1xuICAgIGlmIChtYXlQYXJrKSB7XG4gICAgICBpZiAodGhpcy5ldmVudHNbdGhpcy5ldmVudEluZGV4XSAhPT0gY3VycmVudEV2ZW50KSB7XG4gICAgICAgIC8vIEFuIGFwcGVuZCgpIGRyYWluIGNsYWltZWQgaXQgd2hpbGUgdGhlIGNoZWNrIHdhcyBpbiBmbGlnaHQuXG4gICAgICAgIC8vIE9ubHkgc3Vic2NyaWJlKCkgY2FuY2VscyB0aGUgY2hlY2ssIHNvIHRoaXMgaXMgcmVhY2hhYmxlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wYXJrKGN1cnJlbnRFdmVudCkpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblVuY29uc3VtZWRFdmVudChjdXJyZW50RXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBgZm5gIG9uY2Ugbm8gZGF0YSBkZWxpdmVyeSBpcyBpbiBmbGlnaHQsIHBvbGxpbmcgdGhlIHdheVxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZG9lczogbGV0IHRoZSBwcm9taXNlIHF1ZXVlIGRyYWluLCByZS1jaGVjayBhIHRpbWVyXG4gICAqIHRpY2sgbGF0ZXIsIHJlcGVhdC5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIHRoZSBjaGVjayBpcyBhIGJldCB0aGF0IGV2ZXJ5IGRlbGl2ZXJ5IHRoZSB3YWxrIGlzIHJ1bm5pbmdcbiAgICogYWhlYWQgb2YgbGFuZHMgaW5zaWRlIGEgZml4ZWQgd2luZG93LiBDb25zdW1wdGlvbiBpcyBzeW5jaHJvbm91cyB3aGlsZSB0aGVcbiAgICogcmVzb2x1dGlvbiBpdCB0cmlnZ2VycyBpcyBub3Q6IGEgc3RlcCByZXN1bHQgaHlkcmF0ZXMgaW4gdGhlIGhvc3QsIHJlc29sdmVzXG4gICAqIGZyb20gYSBkZXRhY2hlZCBjb250aW51YXRpb24gYmVoaW5kIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYCwgYW5kIG9ubHkgdGhlblxuICAgKiBkb2VzIFZNIGNvZGUgcnVuIGZhciBlbm91Z2ggdG8gc3Vic2NyaWJlIHRoZSBuZXh0IGNvbnN1bWVyLiBSZXBsYXlpbmcgYVxuICAgKiBiYXRjaCBvZiBOIHBhcmFsbGVsIHN0ZXAgcmVzdWx0cyBsZWF2ZXMgTi0xIG9mIHRoZW0gb24gdGhhdCBkZXRhY2hlZCBwYXRoXG4gICAqIHdpdGggdGhlIHF1ZXVlIGFscmVhZHkgZHJhaW5lZCwgc28gdGhlIHdhbGsgc2l0cyBvbiB0aGUgb3JkZXJlZCBldmVudCB0aGVcbiAgICogVk0gaXMgYWJvdXQgdG8gZHJhdyBhbmQgdGhlIHdpbmRvdyBpcyB0aGUgb25seSB0aGluZyBzdGFuZGluZyBiZXR3ZWVuIGFcbiAgICogaGVhbHRoeSBydW4gYW5kIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLlxuICAgKlxuICAgKiBTaG9ydGVuaW5nIHRoZSB3aW5kb3cgc2hvd3MgdGhhdCBtZWNoYW5pc20gZGlyZWN0bHk6IG9uIGlkZW50aWNhbCBldmVudCBsb2dzXG4gICAqIHRoZSBsb2NhbCByYWNlIHJlcHJvIGNvcnJ1cHRzIDM0IG9mIDQyIHJ1bnMgYXQgYSAxMG1zIHdpbmRvdyBhbmQgMCBvZiAxMTQgYXRcbiAgICogdGhlIDEwMG1zIGRlZmF1bHQuIFRoYXQgbWVhc3VyZXMgaG93IHRoZSBiZXQgbG9zZXMsIG5vdCB0aGF0IHRoZSBkZWZhdWx0XG4gICAqIGxvc2VzIGl0LCBhbmQgbm8gbWVhc3VyZW1lbnQgb2YgYSBkZWxpdmVyeSBvdXRydW5uaW5nIDEwMG1zIGV4aXN0cyBlaXRoZXJcbiAgICogd2F5LiBTbyByZWFkIHRoaXMgYXMgcmV0aXJpbmcgdGhlIGJldCByYXRoZXIgdGhhbiBhcyByZXBhaXJpbmcgYW4gb2JzZXJ2ZWRcbiAgICogZmFpbHVyZSBvZiB0aGF0IG51bWJlcjogdGhlIGRlbGF5IGlzIGEgdXNlci1zZXR0YWJsZSBlbnYgb3ZlcnJpZGUsIHdoaWNoXG4gICAqIGxlYXZlcyB0aGUgb2xkIGJlaGF2aW9yIG9uZSBjb25maWd1cmF0aW9uIGF3YXkgZnJvbSBsb3Npbmcgb24gYW55IGJhY2tlbmQuXG4gICAqXG4gICAqIFRlcm1pbmF0aW9uIGlzIGBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeWAnczogaXQgY291bnRzIG9ubHkgZGVsaXZlcmllc1xuICAgKiB0aGF0IHJlc29sdmUgb24gdGhlaXIgb3duLCBzbyBub3RoaW5nIGhlcmUgY2FuIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBBXG4gICAqIGdlbnVpbmVseSBvcnBoYW5lZCBldmVudCBoYXMgbm8gZGVsaXZlcnkgdG8gd2FpdCBvbiBhbmQgcmVhY2hlcyBgZm5gIG9uIHRoZVxuICAgKiBmaXJzdCBwb2xsLlxuICAgKlxuICAgKiBXaGF0IHRoZSBnYXRlIGdpdmVzIHVwOiBmb3IgdGhlIG9yZGVyZWQgZXZlbnRzIHRoYXQgc3RpbGwgcmVhY2hcbiAgICogYG9uVW5jb25zdW1lZEV2ZW50YCByYXRoZXIgdGhhbiB7QGxpbmsgcGFya30sIHRoaXMgc3RvcHMgYmVpbmcgdGhlIHRoaW5nXG4gICAqIHRoYXQgY2F0Y2hlcyBhIGRpdmVyZ2VkIGxvZyB3aGlsZSBhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodC4gVGhlIHN1c3BlbnNpb25cbiAgICogYW5kIHRoaXMgY2hlY2sgbm93IHdha2UgZnJvbSB0aGUgc2FtZSBgaXNEZWxpdmVyeUlkbGVgIGVkZ2UsIGFuZFxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZmlyZXMgb24gdGhlIGZpcnN0IHRpbWVyIHRpY2sgYWZ0ZXIgaWRsZSB3aGlsZSB0aGlzIHdhaXRzXG4gICAqIGEgZnVydGhlciBgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKWAuIFNvIGEgcnVuIHdpdGggYSBwZW5kaW5nIGBzbGVlcCgpYFxuICAgKiBzdXNwZW5kcyBmaXJzdCwgYW5kIGBvbldvcmtmbG93RXJyb3JgIGRyb3BzIHRoZSBkaXZlcmdlbmNlIGFycml2aW5nIHNlY29uZFxuICAgKiAoaXRzIGAnc3VzcGVuZGVkJ2AgYnJhbmNoIGRlbW90ZXMgdG8gYCdyZXBsYXknYCBhbmQgc3VyZmFjZXMgbm90aGluZyksXG4gICAqIGxlYXZpbmcgYSBsYXRlciBgcmVzdW1lKClgIHRvIGRlY2xpbmUgaW50byBhIGNvbGQgcmVwbGF5LiBQcmUtZ2F0ZSB0aGVcbiAgICogc3VzcGVuc2lvbiBhbHJlYWR5IHdvbiB0aGF0IHJhY2Ugd2hlbmV2ZXIgdGhlIGRlbGl2ZXJ5IGxhbmRlZCBpbnNpZGUgdGhlXG4gICAqIGZpeGVkIHdpbmRvdywgc28gd2hhdCBjaGFuZ2VkIGlzIHRoYXQgdGhlIG91dGNvbWUgc3RvcHBlZCBkZXBlbmRpbmcgb25cbiAgICogdGltaW5nLiBOb3RoaW5nIHNob3VsZCB0cmVhdCB0aGlzIGNoZWNrIGFzIHRoZSBtZWNoYW5pc20gdGhhdCByZXBvcnRzXG4gICAqIGRpdmVyZ2VuY2Ugb24gYSBsb2cgdGhlIHJ1biBpcyBzdGlsbCBkZWxpdmVyaW5nIGludG8uXG4gICAqL1xuICBwcml2YXRlIHdoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uOiBudW1iZXIsIGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgcG9sbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0RlbGl2ZXJ5SWRsZSgpKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBIZWxkIGluIHRoZSBzYW1lIGZpZWxkIHRoZSBmaXJlZCBjaGVjayB1c2VzIHNvIHN1YnNjcmliZSgpIGNhbmNlbHMgYVxuICAgICAgICAvLyBwb2xsIGluIHByb2dyZXNzIHRvby4gVGhlIHR3byBjYW5jZWxsYXRpb25zIGFyZSBub3QgaWRlbnRpY2FsOiBmb3IgdGhlXG4gICAgICAgIC8vIHBvbGwgaXQgaXMgdGhlIHZlcnNpb24gYnVtcCB0aGF0IGRvZXMgdGhlIHdvcmsgYW5kIHRoZSBjbGVhclRpbWVvdXQgaXNcbiAgICAgICAgLy8gYmVsdC1hbmQtYnJhY2VzLiBUd28gc3RhdGUgbWFjaGluZXMgd3JpdGUgdGhpcyBvbmUgZmllbGQsIHNvIGEgcG9sbFxuICAgICAgICAvLyBpbnZhbGlkYXRlZCBiZXR3ZWVuIHNjaGVkdWxpbmcgYW5kIGZpcmluZyBjYW4gbnVsbCBvdXQgYSBoYW5kbGUgdGhlXG4gICAgICAgIC8vIGxpdmUgY2hhaW4gaGFzIHNpbmNlIHN0b3JlZCwgd2hpY2ggaXMgd2h5IGV2ZXJ5IHBhdGggb3V0IG9mIGBwb2xsYCBhbmRcbiAgICAgICAgLy8gb3V0IG9mIHRoZSBmaXJlZCBjaGVjayByZS1jaGVja3MgdGhlIHZlcnNpb24gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlXG4gICAgICAgIC8vIGhhbmRsZS5cbiAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHBvbGwsIDApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBwb2xsKCk7XG4gIH1cbn1cbiJdfQ==