footprintjs 9.45.0 → 9.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +9 -9
- package/dist/esm/lib/memory/RecordFrame.d.ts +197 -0
- package/dist/esm/lib/memory/RecordFrame.js +265 -0
- package/dist/esm/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/esm/lib/memory/SharedMemory.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +52 -143
- package/dist/esm/lib/memory/StageContext.js +106 -223
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +2 -2
- package/dist/esm/lib/memory/TransactionBuffer.js +3 -3
- package/dist/esm/lib/memory/utils.d.ts +2 -2
- package/dist/esm/lib/memory/utils.js +3 -3
- package/dist/esm/lib/reactive/structuralWrite.d.ts +1 -1
- package/dist/esm/lib/reactive/structuralWrite.js +2 -2
- package/dist/lib/memory/RecordFrame.js +269 -0
- package/dist/lib/memory/SharedMemory.js +2 -2
- package/dist/lib/memory/StageContext.js +106 -223
- package/dist/lib/memory/TransactionBuffer.js +3 -3
- package/dist/lib/memory/utils.js +3 -3
- package/dist/lib/reactive/structuralWrite.js +2 -2
- package/dist/types/lib/memory/RecordFrame.d.ts +197 -0
- package/dist/types/lib/memory/SharedMemory.d.ts +1 -1
- package/dist/types/lib/memory/StageContext.d.ts +52 -143
- package/dist/types/lib/memory/TransactionBuffer.d.ts +2 -2
- package/dist/types/lib/memory/utils.d.ts +2 -2
- package/dist/types/lib/reactive/structuralWrite.d.ts +1 -1
- package/package.json +1 -1
|
@@ -356,8 +356,8 @@ class TransactionBuffer {
|
|
|
356
356
|
* Keep the diff base exact under a read the working copy cannot answer.
|
|
357
357
|
*
|
|
358
358
|
* When `workingCopy` holds nothing at `path` — the stage deleted or unset
|
|
359
|
-
* it, or a write replaced a container above it — `
|
|
360
|
-
*
|
|
359
|
+
* it, or a write replaced a container above it — `RecordFrame · read`
|
|
360
|
+
* serves the read from LIVE committed state, exactly as 9.28.0
|
|
361
361
|
* did, so the value it hands out is committed state itself. On 9.28.0 the
|
|
362
362
|
* diff base was a whole-state clone taken at the stage's first write, and
|
|
363
363
|
* an in-place edit of that value (out of contract — reads are borrowed)
|
|
@@ -947,4 +947,4 @@ function flattenedTraceRow(op) {
|
|
|
947
947
|
function provenance(readKeys) {
|
|
948
948
|
return readKeys !== undefined ? { readKeys } : undefined;
|
|
949
949
|
}
|
|
950
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStERzs7O0FBRUgsaURBQWdIO0FBQ2hILHlEQUFvSDtBQUNwSCwrQ0FBeUM7QUFDekMsNkNBVXNCO0FBRXRCLHlDQUFzRjtBQUV0RixNQUFhLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixDQUFrQjtJQUVuRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdEM7Ozs7OztPQU1HO0lBQ0ssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdkM7Ozs7O09BS0c7SUFDSyxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0ssU0FBUyxDQUFtQjtJQUVwQzs7O09BR0c7SUFDSyxZQUFZLENBQW1CO0lBRXZDOzs7Ozs7T0FNRztJQUNjLE9BQU8sQ0FBb0I7SUFFNUMsb0VBQW9FO0lBQzVELFlBQVksR0FBRyxDQUFDLENBQUM7SUFDekIsb0ZBQW9GO0lBQzVFLFNBQVMsR0FBRyxDQUFDLENBQUM7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O0lBQ2hGLE9BQU8sRUFBRSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQ3pCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ3RHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLFNBQVMsVUFBVSxDQUFDLFFBQThCO0lBQ2hELE9BQU8sUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zYWN0aW9uQnVmZmVyIOKAlCBQZXItc3RhZ2UgU1RBR0lORyBidWZmZXIgZm9yIHN0YXRlIG11dGF0aW9uc1xuICpcbiAqIFdoYXQgaXQgSVM6IGEgc3RhZ2luZyBidWZmZXIgd2l0aCByZWFkLXlvdXItd3JpdGVzIGFuZCBuZXQtY2hhbmdlIGNvbW1pdHMuXG4gKiAtIENoYW5nZXMgYXJlIHN0YWdlZCBoZXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24gYW5kIGZsdXNoZWQgdG9cbiAqICAgU2hhcmVkTWVtb3J5IGluIE9ORSBiYXRjaCBwZXIgc3RhZ2UgKGBjb21taXQoKWApIOKAlCBvdGhlciBzdGFnZXMgYW5kXG4gKiAgIHBhcmFsbGVsIHNpYmxpbmdzIG5ldmVyIG9ic2VydmUgYSBzdGFnZSdzIGhhbGYtZmluaXNoZWQgd3JpdGVzLlxuICogLSBSZWFkLWFmdGVyLXdyaXRlIGNvbnNpc3RlbmN5IHdpdGhpbiBhIHN0YWdlIOKAlCBhIHN0YWdlIHNlZXMgaXRzIG93blxuICogICBzdGFnZWQgd3JpdGVzIGltbWVkaWF0ZWx5LlxuICogLSBgY29tbWl0KClgIHJlY29yZHMgdGhlIHN0YWdlJ3MgTkVUIGNoYW5nZSAoc2VlIHtAbGluayBjb21taXR9KSwgcGx1cyBhblxuICogICBvcGVyYXRpb24gdHJhY2UgZm9yIGRldGVybWluaXN0aWMgcmVwbGF5LlxuICpcbiAqIFdoYXQgaXQgaXMgTk9UOiBhIHJvbGxiYWNrIG1lY2hhbmlzbS4gRGVzcGl0ZSB0aGUgbmFtZSwgdGhlcmUgaXMgbm9cbiAqIGFib3J0L3JvbGxiYWNrIHBhdGgg4oCUIHdoZW4gYSBzdGFnZSBUSFJPV1MsIHRoZSBlbmdpbmUgc3RpbGwgY29tbWl0c1xuICogZXZlcnl0aGluZyBzdGFnZWQgc28gZmFyIGJlZm9yZSByZS10aHJvd2luZyAoY29tbWl0LW9uLWVycm9yIGluXG4gKiBgRmxvd2NoYXJ0VHJhdmVyc2VyYCkuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIGF1ZGl0IHRyYWlsIG11c3QgcmVjb3JkXG4gKiB3aGF0IHRoZSBmYWlsaW5nIHN0YWdlIGNoYW5nZWQuIERvIG5vdCByZWx5IG9uIFwic3RhZ2UgZmFpbGVkIOKGkiBpdHNcbiAqIHdyaXRlcyB2YW5pc2hlZFwiLlxuICpcbiAqIFRoZSBwYXRjaCB0cmVlcyBob2xkIFJFRkVSRU5DRVMgdW50aWwgY29tbWl0ICg5LjIzLjApLiBBIGBzZXRgIHN0b3JlcyB0aGVcbiAqIGNhbGxlcidzIG93biB2YWx1ZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGRpZCBpblxuICogYHdvcmtpbmdDb3B5YDsgdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyB0YWtlbiBPTkNFIHBlciBzdXJ2aXZpbmcgcGF0aFxuICogd2hlbiB0aGUgcGF5bG9hZCBsZWF2ZXMgdGhlIGJ1ZmZlciAoYHRvQ2hhbmdlT25seVBheWxvYWRgIC9cbiAqIGB0b0RlbHRhUGF5bG9hZGAg4oCUIGV2ZXJ5IHZhbHVlIHRoZXkgZW1pdCBwYXNzZXMgdGhyb3VnaCBgc3RydWN0dXJlZENsb25lYFxuICogdGhlcmUpLiBUaGUgbGF3IFwidGhlIHJlY29yZCBuZXZlciBhbGlhc2VzIGEgY2FsbGVyJ3Mgb2JqZWN0XCIgaXMga2VwdCBhdFxuICogdGhlIGNvbW1pdCBib3VuZGFyeSBpbnN0ZWFkIG9mIGF0IGV2ZXJ5IHdyaXRlLCB3aGljaCBpcyB3aGF0IG1ha2VzIE5cbiAqIHdyaXRlcyB0byBvbmUgcGF0aCBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHNpemUpLiBDb25zZXF1ZW5jZSwgYnkgZGVzaWduOiBhXG4gKiBjYWxsZXIgd2hvIG11dGF0ZXMgaXRzIG93biBvYmplY3QgQUZURVIgdGhlIHdyaXRlIGFuZCBCRUZPUkUgdGhlIHN0YWdlXG4gKiBlbmRzIGNvbW1pdHMgdGhlIHZhbHVlIGFzIHRoZSBzdGFnZSByZWFkIGl0IGJhY2sg4oCUIHRoZSByZWNvcmQgYWdyZWVzIHdpdGhcbiAqIHRoZSBzdGFnZSAoQ0xBVURFLm1kIGxhbmRtaW5lIDMncyBmaXJzdCBiaXRlLCBjbG9zZWQpLiBUaGUgb25lIHBsYWNlIHRoZVxuICogZW5naW5lIGl0c2VsZiBlZGl0cyBUSFJPVUdIIGEgc3RhZ2VkIHZhbHVlIOKAlCBhIGxhdGVyIG5lc3RlZCBvcCB1bmRlciBhXG4gKiBgc2V0YCBwYXRoIOKAlCBkZXRhY2hlcyB0aGF0IHZhbHVlIGZpcnN0ICh7QGxpbmsgZGV0YWNoSGVsZEFuY2VzdG9yc30pLCBzb1xuICogYHdvcmtpbmdDb3B5YCBhbmQgYG92ZXJ3cml0ZVBhdGNoYCBuZXZlciBzaGFyZSBhIGNvbnRhaW5lciB0aGUgZW5naW5lXG4gKiBtdXRhdGVzIG9uIG9uZSBzaWRlIG9ubHkuXG4gKlxuICogQ09QWS1PTi1XUklURSAoOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS4gVGhlXG4gKiBidWZmZXIgbm8gbG9uZ2VyIGNsb25lcyB0aGUgY29tbWl0dGVkIHN0YXRlIGl0IHN0YXJ0cyBmcm9tLiBgYmFzZVNuYXBzaG90YFxuICogSVMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIChoZWxkIGJ5IHJlZmVyZW5jZSDigJRcbiAqIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcCksIGFuZCBgd29ya2luZ0NvcHlgIHN0YXJ0cyBhcyBhXG4gKiBjb3B5IG9mIGl0cyBST09UIG9ubHk6IGVhY2ggd3JpdGUgY29waWVzIHRoZSBjb250YWluZXJzIG9uIGl0cyBvd24gcGF0aFxuICogKHtAbGluayBvd25TcGluZX0pLCBhbmQgdGhlIGZpcnN0IFJFQUQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgb2YgYVxuICogY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSB0YWtlcyBhIHByaXZhdGUgZGVlcCBjb3B5IG9mXG4gKiBpdCAoe0BsaW5rIHByaXZhdGlzZX0pIOKAlCB3aGF0IHRoZSB3aG9sZS1zdGF0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgZXZlcnlcbiAqIHJlYWQsIHNvIGFuIGluLXBsYWNlIGVkaXQgb2YgYSByZWFkIHZhbHVlIHN0YXlzIHByaXZhdGUgZXhhY3RseSBhcyBpdCBkaWQuXG4gKiBBIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyIGlzIHNlcnZlZCBmcm9tIGxpdmUgc3RhdGUgYnkgdGhlXG4gKiBjYWxsZXIsIGFzIGJlZm9yZTsgdGhlIGJ1ZmZlciB0aGVuIHJlcGxhY2VzIHRoYXQgcGF0aCBvZiBpdHMgZGlmZiBiYXNlXG4gKiB3aXRoIGEgcHJpdmF0ZSBjb3B5ICh7QGxpbmsgZGV0YWNoQmFzZX0pLCBhcyB0aGUgY2xvbmUgaGFkIGl0LlxuICpcbiAqIFRIRSBBRE1JVFRFRCBSRUNPUkQgKDkuMzAuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1hZG1pdHRlZC1yZWNvcmQubWQpLiBBXG4gKiBjb21taXQgaXMgYWRtaXR0ZWQgb25seSBpZiBpdHMgYnVuZGxlIGZvbGRzIGJhY2sgdG8gdGhlIHN0YWdlJ3NcbiAqIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkIChhbmQgYXQgZXZlcnlcbiAqIGNvbnRhaW5lciBpdHMgd3JpdGVzIGNyZWF0ZWQgb24gdGhlIHdheSB0aGVyZSwgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcykuXG4gKiBCb3RoIGVuY29kZXJzIGNvbW1pdCB0aGUgdmFsdWUgdGhlIHN0YWdlIHJlYWQ6IGEgY29tcGFjdCByb3cg4oCUIGEgYG1lcmdlYFxuICogZGVsdGEsIGFuIGBhcHBlbmRgIHRhaWwg4oCUIGlzIGtlcHQgd2hlcmUgaXQgcHJvdmFibHkgZm9sZHMgYmFjazsgYSBmYW1pbHkgb2ZcbiAqIHJvd3MgdGhhdCBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyBgc2V0YCByb3dzIG9mIHRoZSB2YWx1ZXMgdGhlIHN0YWdlIHJlYWRcbiAqICh7QGxpbmsgYWRtaXR9KS4gQmVmb3JlIDkuMzAuMCB0aGUgb25lIGFjY3VtdWxhdGVkIG1lcmdlIGRlbHRhIHBlciBwYXRoIHdhc1xuICogcmVwbGF5ZWQgYXQgZXZlcnkgYG1lcmdlYCByb3cgb2YgdGhhdCBwYXRoLCB3aGljaCBsaWVkIGFjcm9zcyBhIGhhcmQgd3JpdGVcbiAqIChgJHVwZGF0ZShrLHt4fSk7IGsgPSB7eX07ICR1cGRhdGUoayx7en0pYCBjb21taXR0ZWQgYHt5LCB4LCB6fWAgZm9yIGFcbiAqIHJlYWQtYmFjayBvZiBge3ksIHp9YCksIGFuIGBbXWAgY2xlYXIsIGEga2luZCBjaGFuZ2Ugb3IgYW4gYXJyYXkgdW5pb25cbiAqIGRlZHVwbGljYXRlZCBieSByZWZlcmVuY2UuIFZlcmlmaWVkIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBhIGBtZXJnZWAgb3IgYVxuICogbmVzdGVkIG9wOyBhIHN0YWdlIHRoYXQgc3RhZ2VkIG9ubHkgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyXG4gKiBpdHMgYWRkcmVzcyBpcyBjb2hlcmVudCBieSBjb25zdHJ1Y3Rpb24g4oCUIGJvdGggdHJlZXMgcmVjZWl2ZSB0aGUgc2FtZVxuICogd3JpdGUg4oCUIGFuZCBpcyBhZG1pdHRlZCB3aXRob3V0IHRoZSBmb2xkLlxuICovXG5cbmltcG9ydCB7IHR5cGUgRmFtaWx5LCB0eXBlIExvc3N5LCB0eXBlIE1lbWJlciwgdHlwZSBSb3dzLCBhZGRyZXNzRGVwdGhPZiwgbG9zc3lGYW1pbGllcyB9IGZyb20gJy4vYWRtaXNzaW9uLmpzJztcbmltcG9ydCB7IHR5cGUgT3BWZXJiLCB0eXBlIFN1cnZpdm9yLCBlbWl0SW5GYW1pbHlPcmRlciwgZ3JvdXBJbnRvRmFtaWxpZXMsIHB1c2hWYWx1ZVJvdyB9IGZyb20gJy4vZGVsdGFFbmNvZGluZy5qcyc7XG5pbXBvcnQgeyByZWxhdGlvbiB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHtcbiAgYWRvcHQsXG4gIGlzQ29udGFpbmVyLFxuICBuYXRpdmVHZXQgYXMgX2dldCxcbiAgbmF0aXZlU2V0IGFzIF9zZXQsXG4gIG93bixcbiAgb3duQ2hpbGQsXG4gIG93bmVkUm9vdE9mLFxuICBvd25TcGluZSxcbiAgc2hhbGxvd0NvcHksXG59IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdFZhbHVlc01vZGUsIE1lbW9yeVBhdGNoLCBUcmFjZUVudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRlZXBTbWFydE1lcmdlLCBERUxJTSwgZHJ5Rm9sZCwgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWZmZXIge1xuICAvKipcbiAgICogVGhlIG5ldC1jaGFuZ2UgZGlmZiBiYXNlOiB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0XG4gICAqIHRvdWNoZWQsIGJ5IHJlZmVyZW5jZSDigJQgZXhjZXB0IHdoZXJlIHtAbGluayBkZXRhY2hCYXNlfSByZXBsYWNlZCBhIHBhdGhcbiAgICogb2YgaXQgd2l0aCBhIHByaXZhdGUgY29weSAoaXRzIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgYXJlXG4gICAqIHRoZW4gY29waWVzIHRvbywgb3duZWQgYnkge0BsaW5rIGJhc2VPd25lZH0pLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBQYXRocyB3aG9zZSBgb3ZlcndyaXRlUGF0Y2hgIHZhbHVlIGlzIHRoZSBjYWxsZXIncyBvd24gb2JqZWN0ICg5LjIzLjApOlxuICAgKiBhIGBzZXRgIG9mIGEgY29udGFpbmVyIHN0b3JlcyB0aGUgcmVmZXJlbmNlLCBhbmQgdGhpcyBpcyB0aGUgbGVkZ2VyIG9mXG4gICAqIHdoaWNoIG9uZXMgYXJlIHN0aWxsIHNoYXJlZCB3aXRoIHRoZSBjYWxsZXIgKGFuZCB3aXRoIGB3b3JraW5nQ29weWApLlxuICAgKiBDb25zdWx0ZWQgb25seSBieSB0aGUgZW5naW5lJ3MgbmVzdGVkIG9wcyDigJQgc2VlXG4gICAqIHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfTsgdGhlIGNvbW1pdCBwYXlsb2FkIGNsb25lcyBldmVyeSBzdXJ2aXZpbmdcbiAgICogdmFsdWUgYW55d2F5IGFuZCBuZXZlciBhc2tzLiBDbGVhcmVkIHdpdGggdGhlIHJlc3QgYXQgYGNvbW1pdCgpYC5cbiAgICovXG4gIHByaXZhdGUgaGVsZFJlZnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqIENvbW1pdC12YWx1ZSBlbmNvZGluZyBwb2xpY3kgKCMxM2MtQikuIGAnZnVsbCdgID0gaGlzdG9yaWNhbCBieXRlcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG5cbiAgLyoqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2Ugc291cmNlICgjUDEpLiBXaGVuIHNldCAodGhlXG4gICAqICBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZGlhbCksIGV2ZXJ5IHN0YWdlZCBvcCBzbmFwc2hvdHMgdGhlXG4gICAqICBrZXlzIHRyYWNrZWQtcmVhZCBzbyBmYXIg4oCUIHRoZSB0ZW1wb3JhbC1wcmVmaXggYXR0cmlidXRpb24gY29uc3VtZWQgYnlcbiAgICogIGNhdXNhbCBzbGljaW5nLiBVbmRlZmluZWQgKGRlZmF1bHQpID0gemVybyBjb3N0LCBieXRlLWlkZW50aWNhbCBvcHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZEtleXNQcm92aWRlcj86ICgpID0+IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBpbiBgd29ya2luZ0NvcHlgIHRoaXMgYnVmZmVyIENSRUFURUQ6IGl0cyByb290IGNvcHksIHRoZVxuICAgKiBwYXRoIGNvcGllcyBpdHMgd3JpdGVzIG1hZGUsIHRoZSBtZXJnZSByZXN1bHRzIGl0IGJ1aWx0LCBhbmQgZXZlcnlcbiAgICogY29udGFpbmVyIG9mIHRoZSBwcml2YXRlIGNvcGllcyBpdHMgcmVhZHMgdG9vay4gQSB3cml0ZSBlZGl0cyB0aGVzZSBpblxuICAgKiBwbGFjZS4gRXZlcnl0aGluZyBlbHNlIGluIGB3b3JraW5nQ29weWAgaXMgU0hBUkVEIOKAlCB3aXRoIHRoZSBjb21taXR0ZWRcbiAgICogZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCwgb3Igd2l0aCBhIHZhbHVlIHRoZSBzdGFnZSBzdGFnZWQg4oCUXG4gICAqIGFuZCBpcyBjb3BpZWQgYmVmb3JlIGEgd3JpdGUgcGFzc2VzIHRocm91Z2ggaXQgKHtAbGluayBvd25TcGluZX0pLlxuICAgKi9cbiAgcHJpdmF0ZSBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogQ29udGFpbmVyIHZhbHVlcyB0aGUgc3RhZ2Ugc3RhZ2VkIHdpdGgge0BsaW5rIHNldH0g4oCUIGl0cyBvd24gb2JqZWN0cyxcbiAgICogaGVsZCBieSByZWZlcmVuY2UgKDkuMjMuMCkuIEEgcmVhZCBoYW5kcyB0aGVtIGJhY2sgYXMgdGhleSBhcmUsIGV4YWN0bHlcbiAgICogYXMgdGhlIHByaXZhdGUgd29ya2luZyBjb3B5IGFsd2F5cyBkaWQsIGFuZCBuZXZlciBwcml2YXRpc2VzIHRoZW06IGFcbiAgICogcHJpdmF0ZSBjb3B5IG9mIGEgc3RhZ2VkIHZhbHVlIHdvdWxkIGxlYXZlIGB3b3JraW5nQ29weWAgYW5kXG4gICAqIGBvdmVyd3JpdGVQYXRjaGAgZGlzYWdyZWVpbmcgYWJvdXQgYSB2YWx1ZSB0aGUgc3RhZ2Ugd3JvdGUuXG4gICAqL1xuICBwcml2YXRlIHN0YWdlZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogT3duZWQgY29udGFpbmVycyB3aXRoIG5vIGNvbnRhaW5lciBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGVcbiAgICogYW55d2hlcmUgYmVsb3cgdGhlbSAoYSBwcml2YXRlIGRlZXAgY29weSwgYSBtZXJnZSByZXN1bHQgYnVpbHQgb24gYVxuICAgKiBwcml2YXRlIGJhc2UsIGEgcGF0aCBjb3B5IHdob3NlIHNoYXJlZCBjaGlsZHJlbiB3ZXJlIHByaXZhdGlzZWQpLiBBIHJlYWRcbiAgICogdGhhdCBsYW5kcyBvbiBvbmUgbmVlZHMgbm8gd2FsayDigJQgc2VlIHtAbGluayBwcml2YXRpc2VCZWxvd30uXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lcnMgb2Yge0BsaW5rIGJhc2VTbmFwc2hvdH0gdGhhdCB7QGxpbmsgZGV0YWNoQmFzZX0gY3JlYXRlZDpcbiAgICogaXRzIHJvb3QgY29weSBhbmQgdGhlIGNvcGllcyBvbiB0aGUgd2F5IHRvIGEgZGV0YWNoZWQgcGF0aC4gQWxsb2NhdGVkXG4gICAqIG9ubHkgYnkgdGhlIGZpcnN0IGRldGFjaCDigJQgdGhlIGluLWNvbnRyYWN0IHN0YWdlIG5ldmVyIHBheXMgZm9yIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlT3duZWQ/OiBXZWFrU2V0PG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFRoZSBwcml2YXRlIGRlZXAgY29waWVzIHtAbGluayBkZXRhY2hCYXNlfSBwdXQgaW50byB0aGUgZGlmZiBiYXNlOiBub3RoaW5nXG4gICAqIGF0IG9yIGJlbG93IG9uZSBpcyBjb21taXR0ZWQgc3RhdGUsIHNvIGEgbGF0ZXIgZGV0YWNoIGluc2lkZSBpdCBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRhY2hlZEJhc2U/OiBXZWFrU2V0PG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBzdGFnZSB3cml0ZXMgKDkuMzAuMCk6IGEgcGF0aCBwcmVmaXggaXRzIGZyYW1lIGNvbXB1dGVkIGFuZFxuICAgKiBoYW5kcyBvdmVyIGFzIGRhdGEgKEMyIOKAlCBmb3IgdGhlIGVuZ2luZSwgdGhlIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZSwgb3JcbiAgICogYFtdYCBmb3IgdGhlIHJvb3QpLiBJdHMgY29udGFpbmVycyBhcmUgdGhlIHN0YWdlJ3MgQUREUkVTUywgbm90IGEgdmFsdWVcbiAgICogdGhlIHN0YWdlIHJlYWRzIChldmVyeSByZWFkIGl0IG1ha2VzIGlzIGEga2V5IGJlbG93IGl0KSwgc28gYSBzaGVsbCBhXG4gICAqIHdyaXRlIGxlYXZlcyB0aGVyZSBpcyBubyBwYXJ0IG9mIHRoZSByZWFkLWJhY2sgdGhlIHJlY29yZCBtdXN0IGhvbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBgbWVyZ2VgIG9wcyBzdGFnZWQgc2luY2UgdGhlIGxhc3QgY29tbWl0IOKAlCBzZWUge0BsaW5rIGFkbWl0fS4gKi9cbiAgcHJpdmF0ZSBzdGFnZWRNZXJnZXMgPSAwO1xuICAvKiogT3BzIHN0YWdlZCBkZWVwZXIgdGhhbiBvbmUga2V5IGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3Mg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIG5lc3RlZE9wcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZTogYW55LFxuICAgIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZSA9ICdmdWxsJyxcbiAgICByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW10sXG4gICAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKSB7XG4gICAgLy8gYGJhc2VgIGlzIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCDigJRcbiAgICAvLyBpbW11dGFibGUtYWZ0ZXItc3dhcCwgdGhlIGludmFyaWFudCB0aGUgZmlyc3QtdG91Y2ggdmlldyBhbHJlYWR5IHJlc3RzXG4gICAgLy8gb24g4oCUIHNvIHRoZSBkaWZmIGJhc2UgaXMgaGVsZCBieSBSRUZFUkVOQ0UsIGFuZCB0aGUgd29ya2luZyBjb3B5IHN0YXJ0c1xuICAgIC8vIGFzIGEgY29weSBvZiBpdHMgUk9PVCBvbmx5LiBCZWZvcmUgOS4yOS4wIHRoZXNlIHR3byBsaW5lcyB3ZXJlIHR3b1xuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgd2hvbGUgc3RhdGUsIHBhaWQgYnkgZXZlcnkgc3RhZ2UgdGhhdCB3cm90ZS5cbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IGJhc2U7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IG93bmVkUm9vdE9mKGJhc2UsIHRoaXMub3duZWQpO1xuICAgIHRoaXMuY29tbWl0VmFsdWVzID0gY29tbWl0VmFsdWVzO1xuICAgIHRoaXMucmVhZEtleXNQcm92aWRlciA9IHJlYWRLZXlzUHJvdmlkZXI7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgY3VycmVudCByZWFkIHByZWZpeCBvbnRvIGEgc3RhZ2VkIG9wIOKAlCBvbmx5IHdoZW4gdGhlXG4gICAqICBwcm92ZW5hbmNlIGRpYWwgaXMgb24gKHByb3ZpZGVyIHByZXNlbnQpLCBzbyB0aGUgZGVmYXVsdCBwYXRoIGFsbG9jYXRlc1xuICAgKiAgbm90aGluZyBhbmQgY29tbWl0IGJ1bmRsZXMgc3RheSBieXRlLWlkZW50aWNhbC4gKi9cbiAgcHJpdmF0ZSBzdGFtcFJlYWRLZXlzKG9wOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH0pOiB0eXBlb2Ygb3Age1xuICAgIGlmICh0aGlzLnJlYWRLZXlzUHJvdmlkZXIpIG9wLnJlYWRLZXlzID0gdGhpcy5yZWFkS2V5c1Byb3ZpZGVyKCk7XG4gICAgcmV0dXJuIG9wO1xuICB9XG5cbiAgLyoqIFN0YWdlIGFuIG9wIGludG8gYG9wVHJhY2VgLCBjb3VudGluZyB3aGF0IGRlY2lkZXMgd2hldGhlciB7QGxpbmsgYWRtaXR9IG11c3QgZm9sZC4gKi9cbiAgcHJpdmF0ZSBzdGFnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBrZXk6IHN0cmluZywgdmVyYjogT3BWZXJiKTogdm9pZCB7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHRoaXMuc3RhZ2VkTWVyZ2VzKys7XG4gICAgaWYgKHBhdGgubGVuZ3RoIC0gYWRkcmVzc0RlcHRoT2YocGF0aCwgdGhpcy5hZGRyZXNzKSA+IDEpIHRoaXMubmVzdGVkT3BzKys7XG4gICAgdGhpcy5vcFRyYWNlLnB1c2godGhpcy5zdGFtcFJlYWRLZXlzKHsgcGF0aDoga2V5LCB2ZXJiIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIFN0b3JlcyB0aGUgUkVGRVJFTkNFIGluIGJvdGggdHJlZXNcbiAgICogKDkuMjMuMCkg4oCUIHRoZSByZWNvcmQncyBjb3B5IGlzIHRha2VuIG9uY2UsIGF0IGNvbW1pdDsgc2VlIHRoZSBoZWFkZXIuXG4gICAqL1xuICBzZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoaXNDb250YWluZXIodmFsdWUpKSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmFkZChrZXkpO1xuICAgICAgdGhpcy5zdGFnZWQuYWRkKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ3NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbmVzdGVkIG9wIGlzIGFib3V0IHRvIHdyaXRlIFRIUk9VR0ggYSBwYXRoIHdob3NlIGBvdmVyd3JpdGVQYXRjaGBcbiAgICogdmFsdWUgaXMgYSBoZWxkIHJlZmVyZW5jZSAoOS4yMy4wKS4gVG9kYXkncyBsYXcgaXMgdGhhdCB0aGUgdHdvIHRyZWVzXG4gICAqIHJlY2VpdmUgdGhlIHNhbWUgbmVzdGVkIGBzZXRgL2BkZWxldGVgIG11dGF0aW9ucyBidXQgT05MWSBgd29ya2luZ0NvcHlgXG4gICAqIHJlY2VpdmVzIGEgbmVzdGVkIGBtZXJnZWAncyByZXN1bHQgKGB1cGRhdGVQYXRjaGAgZ2V0cyB0aGUgZGVsdGEpIOKAlCBzbyBhXG4gICAqIGNvbnRhaW5lciBzaGFyZWQgYmV0d2VlbiB0aGUgdHJlZXMgd291bGQgbGVhayB0aGUgbWVyZ2VkIHZhbHVlIGludG8gdGhlXG4gICAqIG92ZXJ3cml0ZSBwYXlsb2FkLCBhbmQgYSBzaGFyZWQgY29udGFpbmVyIGlzIGFsc28gdGhlIGNhbGxlcidzIG93blxuICAgKiBvYmplY3QsIHdoaWNoIHRoZSBlbmdpbmUgbXVzdCBub3QgZWRpdCBvbiB0aGUgcmVjb3JkJ3MgYmVoYWxmLiBSZXBsYWNpbmdcbiAgICogdGhlIGhlbGQgYW5jZXN0b3Igd2l0aCBpdHMgY2xvbmUgaW4gYG92ZXJ3cml0ZVBhdGNoYCByZXN0b3JlcyBleGFjdGx5XG4gICAqIHRoZSBwcml2YXRlIHRyZWUgdGhlIHBlci13cml0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgaXQsIHBhaWQgb25jZSBwZXJcbiAgICogYW5jZXN0b3IgYW5kIG9ubHkgb24gdGhlIG5lc3RlZC1vcCBwYXRoIHRoZSBwdWJsaWMgc3VyZmFjZSBuZXZlciB0YWtlc1xuICAgKiAodGhlIHNjb3BlIHByb3h5IHdyaXRlcyBST09UIGtleXMpLiBgd29ya2luZ0NvcHlgIGtlZXBzIHRoZSByZWZlcmVuY2UsXG4gICAqIGFzIGl0IGFsd2F5cyBkaWQuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaEhlbGRBbmNlc3RvcnMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlbGRSZWZzLnNpemUgPT09IDApIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGF0aC5zbGljZSgwLCBpKTtcbiAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgoYW5jZXN0b3IpO1xuICAgICAgaWYgKCF0aGlzLmhlbGRSZWZzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGhlbGQgPSBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yKTtcbiAgICAgIGlmIChoZWxkICE9PSBudWxsICYmIHR5cGVvZiBoZWxkID09PSAnb2JqZWN0JykgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBhbmNlc3Rvciwgc3RydWN0dXJlZENsb25lKGhlbGQpKTtcbiAgICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGtleSBkZWxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKCMxM2MtQjsgYWJzb3JicyBiYWNrbG9nIEI4KS5cbiAgICpcbiAgICogU3RhZ2VzIEVYQUNUTFkgdGhlIHNhbWUgYnVmZmVyIG11dGF0aW9ucyBhcyBgc2V0KHBhdGgsIHVuZGVmaW5lZClgIOKAlFxuICAgKiBgd29ya2luZ0NvcHlgL2BvdmVyd3JpdGVQYXRjaGAgZ2V0IGFuIG93biBgdW5kZWZpbmVkYCBhdCB0aGUgcGF0aCAodGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZywgcHJlc2VydmluZyByZWFkIGJlaGF2aW9yIGFuZCB0aGUgZGVkdXAgZGlmZiBiYXNlXG4gICAqIGFjcm9zcyBtb2Rlcykg4oCUIGJ1dCByZWNvcmRzIHRoZSBvcCB2ZXJiIGFzIGAnZGVsZXRlJ2AuIEF0IGNvbW1pdDpcbiAgICogYCdmdWxsJ2AgbW9kZSBtYXBzIGl0IGJhY2sgdG8gYSBgJ3NldCdgIHRyYWNlIGVudHJ5IChieXRlLWlkZW50aWNhbCB0b1xuICAgKiB0b2RheSk7IGAnZGVsdGEnYCBtb2RlIGVtaXRzIGEgcmVhbCBgJ2RlbGV0ZSdgIGVudHJ5IHdob3NlIHJlcGxheVxuICAgKiBSRU1PVkVTIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGBrZXk6IHVuZGVmaW5lZGAgYmVoaW5kLlxuICAgKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBmaWx0ZXIgcmVhZHMgdGhhdCBzdGFnZWQgb3duIGB1bmRlZmluZWRgIGFzIEFCU0VOVFxuICAgKiAoYGRlZXBFcXVhbGAsIDkuMTkuMSkg4oCUIHNvIHVuZGVyIGAnZGVsdGEnYCwgd2hvc2UgY29tbWl0dGVkIHN0YXRlIHJlYWxseVxuICAgKiBsYWNrcyB0aGUga2V5LCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGluc2lkZSBhIGNvbnRhaW5lciB0aGUgc3RhZ2UgYWxzb1xuICAgKiByZS13cm90ZSBpcyB0aGUgbm8tb3AgaXQgaXMsIG5vdCBhIGBzZXRgIG9mIHRoZSB3aG9sZSBjb250YWluZXIuXG4gICAqL1xuICBkZWxldGUocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBgZGVlcFNtYXJ0TWVyZ2VgIGJ1aWxkcyBmcmVzaFxuICAgKiAgY29udGFpbmVycywgc28gbmVpdGhlciB0cmVlIGV2ZXIgaG9sZHMgdGhlIG1lcmdlIElOUFVUIGJ5IHJlZmVyZW5jZTtcbiAgICogIHRoZSBuZXN0ZWQtb3AgZGV0YWNoIGd1YXJkcyB0aGUgYW5jZXN0b3IgaXQgd3JpdGVzIElOVE8uXG4gICAqXG4gICAqICBUaGUgdmFsdWUgbWVyZ2VkIElOVE8gaXMgbWFkZSBwcml2YXRlIGZpcnN0IChgcHJpdmF0aXNlYCksIGFzIHRoZVxuICAgKiAgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBpdCBiZWZvcmUgOS4yOS4wLiBOb3Qgb25seSBmb3IgdGhlIHJlYWRzIHRoYXRcbiAgICogIGZvbGxvdzogYGRlZXBTbWFydE1lcmdlYCB1bmlvbnMgYXJyYXlzIEJZIFJFRkVSRU5DRSwgc28gd2hldGhlciBhblxuICAgKiAgZWxlbWVudCB0aGUgc3RhZ2UgcGFzc2VzIGluIGlzIFwiYWxyZWFkeSB0aGVyZVwiIGRlcGVuZHMgb24gd2hpY2ggb2JqZWN0c1xuICAgKiAgdGhlIGJhc2UgaG9sZHMg4oCUIGEgY29tbWl0dGVkIGFycmF5IHdvdWxkIGRlZHVwIGFuIGVsZW1lbnQgdGhlIHN0YWdlXG4gICAqICByZWFkIGZyb20gaXQgYmVmb3JlIGl0cyBmaXJzdCB3cml0ZSwgd2hlcmUgdGhlIHByaXZhdGUgY29weSAoYW5kXG4gICAqICA5LjI4LjApIGFwcGVuZHMgaXQuICovXG4gIG1lcmdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpID8/IHt9O1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBTbWFydE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgb3duKG1lcmdlZCwgdGhpcy5vd25lZCk7XG4gICAgaWYgKGlzQ29udGFpbmVyKG1lcmdlZCkpIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChtZXJnZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ21lcmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmllbGQtbGV2ZWwgcmVkYWN0aW9uICg5LjE5LjApOiBtYXJrIGRvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlIHN0YWdlZCBhdFxuICAgKiBgcGF0aGAgYXMgc2VjcmV0LCBzbyBgc2NydWJQYXRjaGAgc2NydWJzIHRoZW0gaW4gdGhlIGNvbW1pdCBsb2cgYW5kIHRoZVxuICAgKiBtaXJyb3IgdGhlIHNhbWUgd2F5IGEgd2hvbGUta2V5IHJlZGFjdGlvbiBpcyBzY3J1YmJlZC4gQSBmaWVsZCBpc1xuICAgKiByZWdpc3RlcmVkIGFzIGEgbGl0ZXJhbCBrZXkgQU5ELCB3aGVuIGRvdHRlZCwgYXMgdGhlIG5lc3RlZCBwYXRoIGl0XG4gICAqIG5hbWVzIOKAlCB3aGljaGV2ZXIgZXhpc3RzIGluIHRoZSBwYXRjaCBpcyB0aGUgb25lIGBzY3J1YlBhdGNoYCBmaW5kcy5cbiAgICogTWFya2VkIHBhdGhzIHN1cnZpdmUgY29tbWl0IG9ubHkgd2hpbGUgdGhlIG9wIHBhdGggdGhleSBzaXQgdW5kZXIgZG9lc1xuICAgKiAoc2VlIHtAbGluayBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzfSkuXG4gICAqL1xuICBtYXJrUmVkYWN0ZWRGaWVsZHMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgoWy4uLnBhdGgsIGZpZWxkXSkpO1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKCcuJykpIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgLi4uZmllbGQuc3BsaXQoJy4nKV0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHJlZGFjdGlvbiBtYXJrIGFkZHJlc3MgYW4gYXJyYXkgRUxFTUVOVCByaWdodCBiZWxvdyBgcGF0aGBcbiAgICogKGBsaXN0LjEudG9rZW5gKT8gQW4gYGFwcGVuZGAgcm93IHJlLWJhc2VzIHRoZSBpbmRpY2VzIG9udG8gdGhlIHRhaWwsIHNvXG4gICAqIHN1Y2ggYSBwYXRoIHRha2VzIHRoZSB3aG9sZS12YWx1ZSBgc2V0YCAoYGRlbHRhRW5jb2RpbmcgwrcgcHVzaFZhbHVlUm93YCkuXG4gICAqIEEgbWFyayBieSBOQU1FIGJlbG93IGFuIGFycmF5IChgb2JqLnlgKSBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiB0aGUgdGFpbFxuICAgKiBhcyBvbiB0aGUgd2hvbGUgdmFsdWUsIHNvIHRoZSBjb21wYWN0IHJvdyBzdGF5cyAoYnl0ZS1pZGVudGljYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWRCZWxvdyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXggPSBwYXRoICsgREVMSU07XG4gICAgZm9yIChjb25zdCBtYXJrZWQgb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoIW1hcmtlZC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmV4dCA9IG1hcmtlZC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdChERUxJTSlbMF07XG4gICAgICBpZiAoL14oMHxbMS05XVxcZCopJC8udGVzdChuZXh0KSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0ZWQgcGF0aHMgdGhhdCBzdXJ2aXZlIHRoZSBuZXQtY2hhbmdlIGZpbHRlcjogYSBwYXRoIHN1cnZpdmVzXG4gICAqIHdoZW4gaXQgSVMgYSBzdXJ2aXZpbmcgb3AgcGF0aCAoYSB3aG9sZS1rZXkgcmVkYWN0aW9uKSBvciBzaXRzIFVOREVSIG9uZVxuICAgKiAoYSBmaWVsZCBpbnNpZGUgYSBzdXJ2aXZpbmcgd3JpdGUpLiBBIGRyb3BwZWQgb3AgdGFrZXMgaXRzIGZpZWxkcyB3aXRoIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKHN1cnZpdmluZ1BhdGhzOiBTZXQ8c3RyaW5nPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgIG91dC5hZGQocGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcCBvZiBzdXJ2aXZpbmdQYXRocykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKG9wICsgREVMSU0pKSB7XG4gICAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gVGhlIHZhbHVlIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biDigJQgcHJpdmF0ZSB0byBpdCwgYXMgdGhlIHdob2xlLXN0YXRlIGNsb25lIG1hZGUgZXZlcnkgcmVhZFxuICAgKiBhZnRlciB0aGUgZmlyc3Qgd3JpdGUgYmVmb3JlIDkuMjkuMCAoYHByaXZhdGlzZWApLlxuICAgKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHRoaXMucHJpdmF0aXNlKHBhdGgpO1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgd29ya2luZyBjb3B5IGF0IGBwYXRoYCBXSVRIT1VUIHRha2luZyBhIHByaXZhdGUgY29weSDigJQgZm9yIGFcbiAgICogcmVhZGVyIHRoYXQgb25seSBjb21wYXJlcyAodGhlIGRldi1tb2RlIGJvcnJvd2VkLW11dGF0aW9uIHJlcG9ydCBpblxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdGApLCBuZXZlciBmb3IgYSB2YWx1ZSBoYW5kZWQgdG8gYSBzdGFnZS5cbiAgICovXG4gIHBlZWsocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCB1bmRlciBhIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyLlxuICAgKlxuICAgKiBXaGVuIGB3b3JraW5nQ29weWAgaG9sZHMgbm90aGluZyBhdCBgcGF0aGAg4oCUIHRoZSBzdGFnZSBkZWxldGVkIG9yIHVuc2V0XG4gICAqIGl0LCBvciBhIHdyaXRlIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0IOKAlCBgU3RhZ2VDb250ZXh0IMK3XG4gICAqIHJlYWRTdGF0ZWAgc2VydmVzIHRoZSByZWFkIGZyb20gTElWRSBjb21taXR0ZWQgc3RhdGUsIGV4YWN0bHkgYXMgOS4yOC4wXG4gICAqIGRpZCwgc28gdGhlIHZhbHVlIGl0IGhhbmRzIG91dCBpcyBjb21taXR0ZWQgc3RhdGUgaXRzZWxmLiBPbiA5LjI4LjAgdGhlXG4gICAqIGRpZmYgYmFzZSB3YXMgYSB3aG9sZS1zdGF0ZSBjbG9uZSB0YWtlbiBhdCB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSwgYW5kXG4gICAqIGFuIGluLXBsYWNlIGVkaXQgb2YgdGhhdCB2YWx1ZSAob3V0IG9mIGNvbnRyYWN0IOKAlCByZWFkcyBhcmUgYm9ycm93ZWQpXG4gICAqIGNvdWxkIG5vdCBtb3ZlIGl0OiB3cml0dGVuIGJhY2ssIHRoZSBlZGl0IHdhcyByZWNvcmRlZC4gSGVyZSB0aGUgZGlmZlxuICAgKiBiYXNlIElTIGEgY29tbWl0dGVkIGdlbmVyYXRpb24sIGFuZCBpdCB2ZXJ5IG9mdGVuIGhvbGRzIHRoYXQgc2FtZVxuICAgKiBjb250YWluZXIgYXQgYHBhdGhgIOKAlCB0aGUgZWRpdCB3b3VsZCBtb3ZlIHRoZSBiYXNlIHdpdGggaXQsIGFuZCB0aGVcbiAgICogd3JpdGUtYmFjayB3b3VsZCBjb21taXQgbm8gY2hhbmdlLiBTbyBiZWZvcmUgdGhlIHZhbHVlIGdvZXMgb3V0LCB0aGVcbiAgICogYmFzZSdzIHZhbHVlIGF0IGBwYXRoYCBpcyByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5ICh0aGUgYmFzZSdzXG4gICAqIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgY29waWVkIHNoYWxsb3dseSkg4oCUIHdoYXQgOS4yOC4wJ3NcbiAgICogYmFzZSBoZWxkIHRoZXJlLiBUaGUgY29tbWl0J3MgbmV0LWNoYW5nZSB0ZXN0IGNvbXBhcmVzIGFnYWluc3QgaXQgYW5kXG4gICAqIHRoZSBkZWx0YSBlbmNvZGVyIHJlcGxheXMgZnJvbSBpdDsgdGhlIHZhbHVlIGhhbmRlZCBvdXQgc3RheXMgdGhlIGxpdmVcbiAgICogb25lLCBzbyB3aGF0ZXZlciBlbHNlIGFuIGVkaXQgb2YgaXQgcmVhY2hlcyAobGl2ZSBzdGF0ZSwgdGhlIG5leHRcbiAgICogZ2VuZXJhdGlvbikgYmVoYXZlcyBhcyBvbiA5LjI4LjAgdG9vLlxuICAgKlxuICAgKiBOb3QgYHByaXZhdGlzZWA6IGEgcHJpdmF0ZSBjb3B5IGhhbmRlZCB0byB0aGUgc3RhZ2Ugd291bGQgYWxzbyBrZWVwIHRoZVxuICAgKiBlZGl0IG91dCBvZiBsaXZlIHN0YXRlLCB3aGVyZSA5LjI4LjAgbGV0IGl0IGluIOKAlCBhIHJ1bi1uYW1lc3BhY2VkIHJlYWRcbiAgICogdGhhdCBmYWxscyBiYWNrIHRvIGEgZ2xvYmFsIGtleSB3b3VsZCB0aGVuIGVuZCBkaWZmZXJlbnRseSAodGhlXG4gICAqIGRpZmZlcmVudGlhbCdzIE5FU1RFRCBmYW1pbHkgZmFpbHMgd2l0aGluIDEwMCBwcm9ncmFtcyB0aGF0IHdheSkuXG4gICAqXG4gICAqIENvcGllcyBub3RoaW5nIHdoZW4gdGhlIGJhc2UgaG9sZHMgbm8gY29udGFpbmVyIGF0IGBwYXRoYCwgYW5kIG5vdGhpbmdcbiAgICogdHdpY2U6IGEgcGF0aCBhdCBvciBiZWxvdyBhbiBlYXJsaWVyIGRldGFjaCBpcyBhbHJlYWR5IHByaXZhdGUuIE8ocGF0aClcbiAgICogb3RoZXJ3aXNlLCBwbHVzIE8odmFsdWUpIG9uY2UgcGVyIGRldGFjaGVkIHBhdGguXG4gICAqL1xuICBkZXRhY2hCYXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgfHwgIWlzQ29udGFpbmVyKHRoaXMuYmFzZVNuYXBzaG90KSkgcmV0dXJuO1xuICAgIGxldCBhdDogb2JqZWN0ID0gdGhpcy5iYXNlU25hcHNob3Q7XG4gICAgZm9yIChjb25zdCBrIG9mIHBhdGgpIHtcbiAgICAgIGlmICh0aGlzLmRldGFjaGVkQmFzZT8uaGFzKGF0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGNoaWxkKSkgcmV0dXJuO1xuICAgICAgYXQgPSBjaGlsZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgY29uc3Qgb3duZWQgPSAodGhpcy5iYXNlT3duZWQgPz89IG5ldyBXZWFrU2V0PG9iamVjdD4oKSk7XG4gICAgaWYgKCFvd25lZC5oYXModGhpcy5iYXNlU25hcHNob3QpKSB0aGlzLmJhc2VTbmFwc2hvdCA9IG93bmVkUm9vdE9mKHRoaXMuYmFzZVNuYXBzaG90LCBvd25lZCk7XG4gICAgb3duU3BpbmUodGhpcy5iYXNlU25hcHNob3QsIHBhdGgsIG93bmVkKTtcbiAgICBjb25zdCBjb3B5OiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYXQpO1xuICAgICh0aGlzLmRldGFjaGVkQmFzZSA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKS5hZGQoY29weSk7XG4gICAgX3NldCh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgY29weSk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSByZWFkcyAoOS4yOS4wKTogbWFrZSB0aGUgdmFsdWUgYXQgYHBhdGhgIHRoZSBzdGFnZSdzIG93biBiZWZvcmVcbiAgICogYSByZWFkIGhhbmRzIGl0IG91dCDigJQgc28gYSByZWFkIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIGJlaGF2ZXNcbiAgICogZXhhY3RseSBhcyBpdCBkaWQgd2hlbiB0aGUgYnVmZmVyIGJlZ2FuIHdpdGggYSBkZWVwIGNsb25lIG9mIHRoZSB3aG9sZVxuICAgKiBzdGF0ZS4gQW4gaW4tcGxhY2UgZWRpdCBvZiB3aGF0IHRoZSByZWFkIHJldHVybmVkIChvdXQgb2YgY29udHJhY3Qg4oCUXG4gICAqIHJlYWRzIGFyZSBib3Jyb3dlZCkgc3RheXMgaW5zaWRlIHRoZSBidWZmZXIsIGFuZCBjb21taXR0ZWQgc3RhdGUgaXMgbmV2ZXJcbiAgICogdG91Y2hlZC4gV2hldGhlciB0aGUgUkVDT1JEIGtlZXBzIGl0IGlzIHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXdcbiAgICogKDkuMzAuMCwgb3duZXIgcnVsaW5nIFIxIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHdoYXQgdGhlIHN0YWdlIHJlYWQgYmFjayk6IGl0XG4gICAqIGlzIGtlcHQgd2hlbiB0aGUgZWRpdGVkIHZhbHVlIGxpZXMgYXQgb3IgYmVsb3cgYSBwYXRoIHRoZSBzdGFnZSB3cm90ZSBpblxuICAgKiB0aGlzIHN0YWdlIOKAlCBzZXQsIG1lcmdlZCBvciB3cml0dGVuIGJhY2sgYWxpa2Ug4oCUIGFuZCBsb3N0IG90aGVyd2lzZS5cbiAgICpcbiAgICogV2Fsa2luZyB0aGUgcGF0aCBmcm9tIHRoZSAob3duZWQpIHJvb3Q6XG4gICAqICAtIGEgY29udGFpbmVyIHN0aWxsIFNIQVJFRCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpc1xuICAgKiAgICByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5IHdoZW4gaXQgaXMgdGhlIHZhbHVlIHJlYWQsIG9yIGJ5IGFcbiAgICogICAgc2hhbGxvdyBjb3B5IHdoZW4gaXQgaXMgYSBjb250YWluZXIgb24gdGhlIHdheSB0byBpdCAoc28gYSByZWFkIG9mXG4gICAqICAgIGBrYCB1bmRlciBhIGZvcmsgY2hpbGQncyBhZGRyZXNzIGNvcGllcyBga2AsIG5vdCBldmVyeSBjaGlsZCdzIG5hbWVzcGFjZSk7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBzdGFnZSBTVEFHRUQgKG9yIGFueXRoaW5nIGVsc2UgdGhlIGJ1ZmZlciBkaWQgbm90XG4gICAqICAgIHRha2UgZnJvbSBjb21taXR0ZWQgc3RhdGUpIGlzIGhhbmRlZCBiYWNrIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlO1xuICAgKiAgLSBhIGNvbnRhaW5lciB0aGUgYnVmZmVyIG93bnMgaXMgd2Fsa2VkIG9uIOKAlCBhbmQgd2hlbiBpdCBpcyB0aGUgdmFsdWVcbiAgICogICAgcmVhZCwgaXRzIHN0aWxsLXNoYXJlZCBkZXNjZW5kYW50cyBhcmUgcHJpdmF0aXNlZFxuICAgKiAgICAoe0BsaW5rIHByaXZhdGlzZUJlbG93fSkuXG4gICAqXG4gICAqIENvc3Q6IE8ocGF0aCkgcGVyIHJlYWQsIHBsdXMgTyh2YWx1ZSkgT05DRSBwZXIgc2hhcmVkIGNvbnRhaW5lciBhIHN0YWdlXG4gICAqIHJlYWRzIGFmdGVyIGl0cyBmaXJzdCB3cml0ZS4gQSBzdGFnZSB0aGF0IG5ldmVyIHJlYWRzIGFmdGVyIHdyaXRpbmcgcGF5c1xuICAgKiBub3RoaW5nOyBhIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBuZXZlciByZWFjaGVzIHRoZSBidWZmZXIuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgLy8gUmVzb2x2ZSBmaXJzdDogYSByZWFkIHRoYXQgbGFuZHMgb24gbm90aGluZyAoYSBtaXNzaW5nIGtleSwgYSByZWZ1c2VkXG4gICAgLy8gc2VnbWVudCwgYSBwcmltaXRpdmUpIHJldHVybnMgbm90aGluZyBhbmQgbXVzdCBjb3B5IG5vdGhpbmcuXG4gICAgY29uc3QgY2hhaW46IG9iamVjdFtdID0gW107XG4gICAgbGV0IGF0OiB1bmtub3duID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgYXQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGF0KSkgcmV0dXJuO1xuICAgICAgY2hhaW4ucHVzaChhdCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMud29ya2luZ0NvcHk7XG4gICAgbGV0IGJhc2U6IHVua25vd24gPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQoYmFzZSwgayk7XG4gICAgICBsZXQgdmFsdWUgPSBjaGFpbltpXTtcbiAgICAgIGlmICghdGhpcy5vd25lZC5oYXModmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gYXRCYXNlIHx8IHRoaXMuc3RhZ2VkLmhhcyh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKGkgPT09IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBhcmVudFtrXSA9IHRoaXMucHJpdmF0ZUNvcHlPZih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm93bmVkLmFkZCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudFtrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gdmFsdWU7XG4gICAgICBiYXNlID0gYXRCYXNlO1xuICAgIH1cbiAgICB0aGlzLnByaXZhdGlzZUJlbG93KHBhcmVudCwgYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gT1dORUQgY29udGFpbmVyIGlzIGFib3V0IHRvIGJlIHJlYWQgd2hvbGUgKGEgcGF0aCBjb3B5IGEgbmVzdGVkIHdyaXRlXG4gICAqIG1hZGUsIHNheSk6IGl0cyBkZXNjZW5kYW50cyBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXJlXG4gICAqIHJlcGxhY2VkIGJ5IHByaXZhdGUgZGVlcCBjb3BpZXMsIHNvIG5vdGhpbmcgdGhlIHJlYWQgaGFuZHMgb3V0IGlzXG4gICAqIGNvbW1pdHRlZCBzdGF0ZS4gV2Fsa3Mgb3duZWQgY29udGFpbmVycyBvbmx5OyBtYXJrcyBlYWNoIG9uZSBmaW5pc2hlZFxuICAgKiAoe0BsaW5rIHByaXZhdGVUcmVlc30pLCBzbyBhIGNvbnRhaW5lciBpcyBzY2FubmVkIG9uY2UgcGVyIHN0YWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2VCZWxvdyhjb250YWluZXI6IG9iamVjdCwgYmFzZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHdvcms6IEFycmF5PFtvYmplY3QsIHVua25vd25dPiA9IFtbY29udGFpbmVyLCBiYXNlXV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW25vZGUsIG5vZGVCYXNlXSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKHRoaXMucHJpdmF0ZVRyZWVzLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKG5vZGUsIGtleSk7XG4gICAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQobm9kZUJhc2UsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLm93bmVkLmhhcyhjaGlsZCkpIHdvcmsucHVzaChbY2hpbGQsIGF0QmFzZV0pO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCA9PT0gYXRCYXNlICYmICF0aGlzLnN0YWdlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB0aGlzLnByaXZhdGVDb3B5T2YoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgcHJpdmF0ZSBkZWVwIGNvcHkgb2YgYSBjb21taXR0ZWQgY29udGFpbmVyIOKAlCBvd25lZCB0aHJvdWdoIGFuZCB0aHJvdWdoLiAqL1xuICBwcml2YXRlIHByaXZhdGVDb3B5T2YodmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgYWRvcHQoY29weSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5wcml2YXRlVHJlZXMuYWRkKGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCBhbnkgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCwgb3IgYSBwYXRoIGFib3ZlIG9yIGJlbG93IGl0P1xuICAgKlxuICAgKiBUaGUgZGV2LW1vZGUgYm9ycm93ZWQtcmVhZCBjaGVjayAoYFN0YWdlQ29udGV4dC5jb21taXRgKSBhc2tzIHRoaXMgYmVmb3JlXG4gICAqIGFjY3VzaW5nIGEgc3RhZ2Ugb2YgbXV0YXRpbmcgYSB2YWx1ZSBpbiBwbGFjZTogYSBrZXkgdGhlIHN0YWdlIGxlZ2l0aW1hdGVseVxuICAgKiBXUk9URSBpcyBleHBlY3RlZCB0byBkaWZmZXIgZnJvbSB3aGF0IGl0IHJlYWQsIGFuZCB3cml0ZXMgcmVhY2ggdGhlIGJ1ZmZlclxuICAgKiBmcm9tIHBhdGhzIHRoYXQgYnlwYXNzIHVzZXItbGV2ZWwgd3JpdGUgdHJhY2tpbmcgdG9vICh0aGUgc3ViZmxvdyBzZWVkLFxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCB0aGUgcmVzdW1lIHJlLXNlZWQpLiBEZXYtbW9kZSBvbmx5IOKAlCBub3RoaW5nIG9uXG4gICAqIHRoZSBob3QgcGF0aCBjYWxscyBpdC5cbiAgICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgLy8gT24gdGhlIHBhdGgsIGJlbG93IGl0IG9yIGFib3ZlIGl0IOKAlCB0aGUgb25lIHBhdGggcmVsYXRpb24gZXZlcnkga2V5IHF1ZXJ5IGFza3MuXG4gICAgICBpZiAocmVsYXRpb24ob3AucGF0aCwgdGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gdGhpcy5zdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKG5ldyBTZXQocm93cy50cmFjZS5tYXAoKHQpID0+IHQucGF0aCkpKTtcbiAgICAvLyBUaGUgYnVuZGxlJ3Mga2V5IG9yZGVyIGlzIGByZWNvcmRDb21taXRgJ3M7IGEgZGlyZWN0IGNhbGxlciBrZWVwcyB0aGlzIHNhbWUgb3JkZXIuXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgb3ZlcndyaXRlOiByb3dzLm92ZXJ3cml0ZSwgdXBkYXRlczogcm93cy51cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZTogcm93cy50cmFjZSB9O1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLmhlbGRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuICAgIHRoaXMub3duZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMub3duZWQuYWRkKHRoaXMud29ya2luZ0NvcHkpO1xuICAgIHRoaXMuc3RhZ2VkID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5zdGFnZWRNZXJnZXMgPSAwO1xuICAgIHRoaXMubmVzdGVkT3BzID0gMDtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAsXG4gICAqIGtlZXBpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIOKAlCBhbmQgdGhlIHJlc3VsdCBpcyBBRE1JVFRFRCAoe0BsaW5rIGFkbWl0fSk6XG4gICAqIGEgZmFtaWx5IG9mIHJvd3Mgd2hvc2UgcmVwbGF5IGRvZXMgbm90IGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGlzXG4gICAqIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHJlYWQtYmFjayBpbnN0ZWFkICg5LjMwLjApLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBERUZBVUxUIChgY29tbWl0VmFsdWVzOiAnZnVsbCdgKSBwYXlsb2FkLCBpbmNsdWRpbmcgdGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZyBvZiBzdGFnZWQgYGRlbGV0ZWAgb3BzIGludG8gYHNldGAtb2YtYHVuZGVmaW5lZGBcbiAgICogdHJhY2UgZW50cmllcy4gVGhlIGRlbHRhIGVuY29kaW5nIGxpdmVzIGluIHtAbGluayB0b0RlbHRhUGF5bG9hZH0uXG4gICAqXG4gICAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogdGhlIG5ldC1jaGFuZ2UgdmVyZGljdCBpcyBwYWlkIG9uY2UgcGVyIFBBVEhcbiAgICogYW5kIHRoZSBjbG9uZSBvbmNlIHBlciBDT05TRUNVVElWRSBydW4gb2Ygb3BzIG9uIGEgcGF0aCwgbm90IG9uY2UgcGVyIG9wXG4gICAqIOKAlCBzZWUgdGhlIHR3byBtZW1vcyBpbnNpZGUuIFBpbm5lZCBieVxuICAgKiB0ZXN0L2xpYi9tZW1vcnkvc2NlbmFyaW8vcmVwZWF0ZWQtcGF0aC1ieXRlLWlkZW50aXR5LnRlc3QudHMgYWdhaW5zdCB0aGVcbiAgICogOS4yMi4wIGJ5dGVzLiBTaW5jZSA5LjIzLjAgdGhhdCBjbG9uZSBpcyBUSEUgY2xvbmU6IHRoZSBwYXRjaCB0cmVlcyBob2xkXG4gICAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2VzIChzZWUgdGhlIGNsYXNzIGhlYWRlciksIHNvIHRoaXMgbG9vcCBpcyB0aGUgb25lXG4gICAqIHBsYWNlIHRoZSByZWNvcmQgaXMgZGV0YWNoZWQgZnJvbSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IFJvd3Mge1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5jaGFuZ2VPbmx5Um93cyhsb3NzeSkpO1xuICB9XG5cbiAgLyoqIFRoZSAnZnVsbCcgcm93czsgYSBmYW1pbHkgaW4gYGxvc3N5YCBpcyB3cml0dGVuIGFzIGl0cyByZWFkLWJhY2ssIGF0IGl0cyBsYXN0IHRvdWNoICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkuICovXG4gIHByaXZhdGUgY2hhbmdlT25seVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICAvLyBQZXIgUEFUSCwgZGVjaWRlZCBvbmNlICg5LjIyLjEpOiBiYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmUgZml4ZWQgYXRcbiAgICAvLyBjb21taXQsIHNvIGV2ZXJ5IGxhdGVyIG9wIG9uIGEgcGF0aCBnZXRzIHRoZSB2ZXJkaWN0IGl0cyBmaXJzdCBvcCBnb3QuXG4gICAgLy8gYHVuZGVmaW5lZGAgPSBub3QgeWV0IGRlY2lkZWQ7IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYXJlIHRoZSBgdHJ1ZWAga2V5cy5cbiAgICBjb25zdCBzdXJ2aXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIC8vIFRoZSBwYXRoIHRoZSBMQVNUIHN1cnZpdmluZyBvcCBjb3BpZWQgaW50byBlYWNoIHBhdGNoIHRyZWUgKDkuMjIuMSkuXG4gICAgLy8gVGhlIHZhbHVlIGF0IGEgcGF0aCBpcyBmaXhlZCBhdCBjb21taXQsIHNvIGFuIG9wIHdob3NlIHByZWRlY2Vzc29yIG9uXG4gICAgLy8gdGhlIFNBTUUgdHJlZSBhbHJlYWR5IGNvcGllZCB0aGF0IHBhdGggd291bGQgd3JpdGUgdGhlIHNhbWUgYnl0ZXMgb3ZlclxuICAgIC8vIHRoZSBzYW1lIGtleSDigJQgaXQga2VlcHMgaXRzIHRyYWNlIHJvdyAodGhlIGxvZyBpcyBieXRlLWlkZW50aWNhbCkgYW5kXG4gICAgLy8gcGF5cyBubyBzZWNvbmQgY2xvbmUuIFRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgc3RhZ2VzIE5cbiAgICAvLyB3aG9sZS1hcnJheSBzZXRzIG9uIE9ORSBwYXRoOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhhdCBjb21taXQgTyhOKVxuICAgIC8vIGluc3RlYWQgb2YgTyhOIMOXIG9wcykuIENPTlNFQ1VUSVZFIG9ubHkg4oCUIGFuIG9wIG9uIGFub3RoZXIgcGF0aCBpblxuICAgIC8vIGJldHdlZW4gbWF5IGhhdmUgY29lcmNlZCBvciBncm93biB0aGlzIG9uZSdzIGNvbnRhaW5lciAoYSBkZXNjZW5kYW50XG4gICAgLy8gYG5hdGl2ZVNldGAgdGhyb3VnaCBhIHByaW1pdGl2ZSwgYSBga2V5OiB1bmRlZmluZWRgIHNoZWxsKSBhbmQgdGhlXG4gICAgLy8gcmUtY29weSBpcyB3aGF0IHJlcGFpcnMgaXQ7IGEgYG1lcmdlYCBiZXR3ZWVuIHR3byBzZXRzIHRvdWNoZXMgdGhlXG4gICAgLy8gb3RoZXIgdHJlZSBhbmQgZG9lcyBub3QgY291bnQuIFNhbWUgbGF3IGFzIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAgICBsZXQgbGFzdFNldFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdE1lcmdlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgZmFtaWx5ID0gbG9zc3k/LmZhbWlsaWVzLmdldChsb3NzeS5yb290T2YuZ2V0KG9wLnBhdGgpIGFzIHN0cmluZyk7XG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGkgPT09IGZhbWlseS5zbG90KSB7XG4gICAgICAgICAgdGhpcy5lbWl0UmVhZEJhY2soZmFtaWx5LCByb3dzLCAnZnVsbCcpO1xuICAgICAgICAgIGxhc3RTZXRQYXRoID0gbGFzdE1lcmdlUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBrZWVwID0gc3Vydml2ZXMuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGtlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZWVwID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKTtcbiAgICAgICAgc3Vydml2ZXMuc2V0KG9wLnBhdGgsIGtlZXApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZWVwKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcblxuICAgICAgdHJhY2UucHVzaChmbGF0dGVuZWRUcmFjZVJvdyhvcCkpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgaWYgKGxhc3RNZXJnZVBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0TWVyZ2VQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFNldFBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0U2V0UGF0aCA9IG9wLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0aHJlZSBlbmNvZGluZyBkaWZmZXJlbmNlczpcbiAgICpcbiAgICogMS4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKHRoZSDCpzIuNSBkZWR1cCBydWxlIOKAlCBgYXBwZW5kYFxuICAgKiAgICBpcyBOT1QgaWRlbXBvdGVudCBvbiByZXBsYXksIHNvIGR1cGxpY2F0ZSBlbnRyaWVzIHdvdWxkIG11bHRpcGx5XG4gICAqICAgIHRhaWxzKS4gVGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIG9wIG1peCArIGJhc2XihpJmaW5hbFxuICAgKiAgICByZWxhdGlvbnNoaXA7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaCxcbiAgICogICAgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMuXG4gICAqIDIuICoqVmVyYiByZXNvbHV0aW9uIHBlciBwYXRoKiog4oCUIGZvciBhIHBhdGggd2l0aCBOTyBzdXJ2aXZpbmcgcmVsYXRpdmVcbiAgICogICAgKHNlZSAzKTpcbiAgICogICAgLSBsYXN0IG9wIGAnZGVsZXRlJ2AgQU5EIGZpbmFsIHZhbHVlIGdvbmUg4oaSIGBkZWxldGVgICh0aGUgcGF0aCBzdGF5c1xuICAgKiAgICAgIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWAgd2l0aCBgdW5kZWZpbmVkYCBmb3Iga2V5LXNldCBjb25zdW1lcnMpLlxuICAgKiAgICAgIFJlcXVpcmVzIHRoZSBwYXJlbnQgdG8gYmUgYSByZWFsIGNvbnRhaW5lciBpbiB0aGUgYmFzZSDigJQgcmVwbGF5IHVzZXNcbiAgICogICAgICBgbmF0aXZlRGVsZXRlYCwgd2hpY2ggaXMgaW5lcnQgb24gYSBwcmltaXRpdmUvYWJzZW50IHBhcmVudCwgd2hlcmVhc1xuICAgKiAgICAgIHRoZSBgJ2Z1bGwnYCBmbGF0dGVuaW5nIChgX3NldGAgb2YgYHVuZGVmaW5lZGApIENPRVJDRVMgdGhhdCBwYXJlbnRcbiAgICogICAgICBpbnRvIGFuIG9iamVjdDsgd2hlbiB0aGV5IHdvdWxkIGRpc2FncmVlIHdlIGtlZXAgdGhlIGZsYXR0ZW5pbmc7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YTtcbiAgICogICAgLSBvdGhlcndpc2UgKGBzZXRgL21peGVkKTogdGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgdGhlXG4gICAqICAgICAgcGF0aCAoe0BsaW5rIGZ1bGxSb3dzVmFsdWV9KS4gSWYgYmFzZSBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZFxuICAgKiAgICAgIGJhc2UgaXMgYSBTVFJJQ1QgUFJFRklYIOKGkiBgYXBwZW5kYCBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGBcbiAgICogICAgICBzdG9yaW5nIHRoZSBmdWxsIHZhbHVlLlxuICAgKiAzLiAqKk9WRVJMQVAgRkFNSUxJRVMgdGFrZSB0aGUgZnVsbC12YWx1ZSBmYWxsYmFjay4qKiBgb3ZlcndyaXRlYCAvXG4gICAqICAgIGB1cGRhdGVzYCBhcmUgbmVzdGVkIHBhdGggVFJFRVMsIHNvIHR3byBzdXJ2aXZpbmcgcGF0aHMgd2hlcmUgb25lIGlzXG4gICAqICAgIGFuIGFuY2VzdG9yIG9mIHRoZSBvdGhlciAoYGFgIGFuZCBgYS5wYCkgc2hhcmUgc3RvcmFnZS4gRGVsdGEnc1xuICAgKiAgICBwZXItcGF0aCBlbmNvZGluZ3Mgd291bGQgY2xvYmJlciBlYWNoIG90aGVyIHRoZXJlIChhbiBgYXBwZW5kYFxuICAgKiAgICBhbmNlc3RvciBzdG9yZXMgb25seSBhIFRBSUwsIGEgYGRlbGV0ZWAgYW5jZXN0b3IgYHVuZGVmaW5lZGApLCBzbyBldmVyeVxuICAgKiAgICBwYXRoIHRoYXQgaGFzIGEgc3Vydml2aW5nIGFuY2VzdG9yL2Rlc2NlbmRhbnQgaXMgY29tbWl0dGVkIGFzIGEgcGxhaW5cbiAgICogICAgYHNldGAgb2YgdGhlIHZhbHVlIHRoZSAnZnVsbCcgcm93cyBnaXZlIGl0LCBhbmQgdGhlIGZhbWlseSdzXG4gICAqICAgIHNoYWxsb3dlc3QgcGF0aCAod2hvc2Ugc2V0IGNvdmVycyB0aGUgd2hvbGUgc3VidHJlZSkgaXMgZW1pdHRlZCBMQVNULlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KSBsaWtlIHRoZSAnZnVsbCcgcGF5bG9hZDogYSBjb21wYWN0XG4gICAqIHJvdyBpcyBrZXB0IG9ubHkgd2hlcmUgdGhlIGJ1bmRsZSBwcm92YWJseSBmb2xkcyBiYWNrLCBhbmQgYSBmYW1pbHkgdGhhdFxuICAgKiBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBTbyBib3RoIGVuY29kaW5ncyBjb21taXQgdGhlXG4gICAqIHZhbHVlIHRoZSBzdGFnZSByZWFkOyBiZWZvcmUgOS4zMC4wIHRoZXkgc2hhcmVkIGEgcmVwbGF5IHRoYXQgZGlkIG5vdFxuICAgKiAoYHJlcGxheVBhdGhWZXJic2AgLyBgcmVwbGF5RmFtaWx5VmVyYnNgLCBkZWxldGVkKS5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKTogUm93cyB7XG4gICAgY29uc3QgZnVsbFZhbHVlQXQgPSB0aGlzLmZ1bGxSb3dzVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5hZG1pdCgobG9zc3kpID0+IHRoaXMuZGVsdGFSb3dzKGxvc3N5LCBmdWxsVmFsdWVBdCkpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWx0YSByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBkZWx0YVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkLCBmdWxsVmFsdWVBdDogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93bik6IFJvd3Mge1xuICAgIGNvbnN0IHJvd3M6IFJvd3MgPSB7IG92ZXJ3cml0ZToge30sIHVwZGF0ZXM6IHt9LCB0cmFjZTogW10gfTtcbiAgICBjb25zdCB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UgfSA9IHJvd3M7XG4gICAgY29uc3QgaW5Mb3NzeSA9IChwYXRoOiBzdHJpbmcpID0+IGxvc3N5Py5mYW1pbGllcy5oYXMobG9zc3kucm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpID09PSB0cnVlO1xuICAgIGNvbnN0IHN1cnZpdm9ycyA9IHRoaXMubmV0Q2hhbmdlU3Vydml2b3JzKHRoaXMub3BzQnlQYXRoKCkpLmZpbHRlcigocykgPT4gIWluTG9zc3kocy5wYXRoKSk7XG4gICAgY29uc3QgeyByb290T2YsIGJ5Um9vdCB9ID0gZ3JvdXBJbnRvRmFtaWxpZXMoc3Vydml2b3JzLCBuZXcgU2V0KHN1cnZpdm9ycy5tYXAoKHMpID0+IHMucGF0aCkpKTtcblxuICAgIC8vIFRIRSBWRVJCIENIT0lDRSDigJQgdGhlIGRlbHRhIGVuY29kZXIgcGlja3MgYSB2ZXJiIHBlciBwYXRoOyB0aGUgVkFMVUVTXG4gICAgLy8gaXQgZW5jb2RlcyBjb21lIGZyb20gdGhlIG9uZSByZXBsYXkgKGBmdWxsVmFsdWVBdGApLCBuZXZlciBhIHJlcGxpY2Egb2ZcbiAgICAvLyB0aGUgdmVyYiBsYXcgKDkuMzAuMDogQ0xBVURFLm1kJ3MgdmVyYi1zd2l0Y2ggcmVwbGljYXMgbG9zdCB0d28gaGVyZSkuXG4gICAgY29uc3QgZW1pdCA9IChzOiBTdXJ2aXZvcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBzZWdtZW50cywgdmVyYnMsIGJlZm9yZSB9ID0gcztcbiAgICAgIGNvbnN0IHByb3YgPSBwcm92ZW5hbmNlKHMucmVhZEtleXMpO1xuICAgICAgaWYgKChieVJvb3QuZ2V0KHJvb3RPZi5nZXQocGF0aCkgYXMgc3RyaW5nKSBhcyBTdXJ2aXZvcltdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJ1bGUgMyDigJQgb25lIGNvaGVyZW50IHRyZWU6IGV2ZXJ5IG1lbWJlciBhIHNldCBvZiBpdHMgdmFsdWUuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoZnVsbFZhbHVlQXQoc2VnbWVudHMpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RWZXJiID0gdmVyYnNbdmVyYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdFZlcmIgPT09ICdkZWxldGUnICYmIHMuYWZ0ZXIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlbGV0ZVJlcGxheXNBc0ZsYXR0ZW5pbmcoc2VnbWVudHMpKSB7XG4gICAgICAgIC8vIFJlYWwgZGVsZXRpb24g4oCUIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuIEtlZXAgdGhlIHBhdGggZW51bWVyYXRlZFxuICAgICAgICAvLyBpbiBgb3ZlcndyaXRlYCAodW5kZWZpbmVkKSBzbyBPYmplY3Qua2V5cyBjb25zdW1lcnMgc2VlIGl0LlxuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ2RlbGV0ZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAodmVyYnMuZXZlcnkoKHYpID0+IHYgPT09ICdtZXJnZScpKSB7XG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnbWVyZ2UnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hWYWx1ZVJvdyhyb3dzLCBwYXRoLCBzZWdtZW50cywgYmVmb3JlLCBmdWxsVmFsdWVBdChzZWdtZW50cyksIHByb3YsIHRoaXMubWFya2VkQmVsb3cocGF0aCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGZhbWlseSB0aGF0IGRpZCBub3QgZm9sZCBiYWNrIHRha2VzIGl0cyBwbGFjZSBieSBpdHMgbGFzdCB0b3VjaC5cbiAgICBjb25zdCBwZW5kaW5nID0gbG9zc3kgPT09IHVuZGVmaW5lZCA/IFtdIDogWy4uLmxvc3N5LmZhbWlsaWVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBhLnNsb3QgLSBiLnNsb3QpO1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBjb25zdCBmbHVzaEJlZm9yZSA9ICh0b3VjaDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB3aGlsZSAobmV4dCA8IHBlbmRpbmcubGVuZ3RoICYmIHBlbmRpbmdbbmV4dF0uc2xvdCA8IHRvdWNoKSB0aGlzLmVtaXRSZWFkQmFjayhwZW5kaW5nW25leHQrK10sIHJvd3MsICdkZWx0YScpO1xuICAgIH07XG4gICAgZW1pdEluRmFtaWx5T3JkZXIoc3Vydml2b3JzLCByb290T2YsIGJ5Um9vdCwgZW1pdCwgZmx1c2hCZWZvcmUpO1xuICAgIGZsdXNoQmVmb3JlKEluZmluaXR5KTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgYWRtaXR0ZWQgcmVjb3JkICg5LjMwLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUSEUgQURNSVNTSU9OIOKAlCBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGVcbiAgICogc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZC4gYGJ1aWxkYFxuICAgKiBsYXlzIHRoZSByb3dzIG91dCAob25lIGVuY29kZXI6IGAnZnVsbCdgIG9yIGAnZGVsdGEnYCk7IHRoZSBjYW5kaWRhdGUgaXNcbiAgICogY2hlY2tlZCAoe0BsaW5rIGxvc3N5RmFtaWxpZXN9KSwgYW5kIHdoZW4gc29tZSBmYW1pbHkncyByb3dzIGRvIG5vdCBmb2xkXG4gICAqIGJhY2sgdGhlIHJvd3MgYXJlIGxhaWQgb3V0IGFnYWluIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZVxuICAgKiBzdGFnZSByZWFkICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkg4oCUIGV2ZXJ5IG90aGVyIGZhbWlseSdzIGJ5dGVzIGV4YWN0bHkgYXNcbiAgICogdGhlIGZpcnN0IGxheW91dCBtYWRlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KGJ1aWxkOiAobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKSA9PiBSb3dzKTogUm93cyB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYnVpbGQodW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb3NzeSA9IHRoaXMubG9zc3lGYW1pbGllcyhjYW5kaWRhdGUpO1xuICAgIHJldHVybiBsb3NzeSA9PT0gdW5kZWZpbmVkID8gY2FuZGlkYXRlIDogYnVpbGQobG9zc3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYW1pbGllcyB3aG9zZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGUgc3RhZ2UgcmVhZCDigJRcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAoYGFkbWlzc2lvbi50cyDCtyBsb3NzeUZhbWlsaWVzYDogdGhlXG4gICAqIGNhbmRpZGF0ZSByZXBsYXllZCBvbnRvIHRoZSBkaWZmIGJhc2UgYnkgYGRyeUZvbGRgLCBldmVyeSBmYW1pbHkgb2ZcbiAgICogdG91Y2hlZCBwYXRocyBjb21wYXJlZCB3aXRoIHRoZSB3b3JraW5nIGNvcHkgYXQgaXRzIHJvb3QgYW5kIG9uIHRoZSB3YXlcbiAgICogZG93biB0byBpdCkuXG4gICAqXG4gICAqIFdpdGhvdXQgYSBmb2xkLCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wOiBpdHNcbiAgICogcm93cyBhcmUgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyIGl0cyBhZGRyZXNzLCBlYWNoXG4gICAqIHdyaXRpbmcgdGhlIFNBTUUgdmFsdWUgaW50byBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIOKAlCB0aGVcbiAgICogcmVjb3JkIGlzIHRoZSByZWFkLWJhY2sgYnkgY29uc3RydWN0aW9uICh0aGUgcHJvcGVydHkncyBST09ULU9OTFkgYXJtXG4gICAqIHBpbnMgdGhpcykuIFRoYXQga2VlcHMgdGhlIGNvbW1pdCBvZiB0aGUgdHlwZWQgc2NvcGUncyByb290LWtleSB3cml0ZXNcbiAgICogZXhhY3RseSBhcyBjaGVhcCBhcyBpdCB3YXMuXG4gICAqL1xuICBwcml2YXRlIGxvc3N5RmFtaWxpZXMoY2FuZGlkYXRlOiBSb3dzKTogTG9zc3kgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN0YWdlZE1lcmdlcyA9PT0gMCAmJiB0aGlzLm5lc3RlZE9wcyA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbG9zc3lGYW1pbGllcyhjYW5kaWRhdGUsIHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLndvcmtpbmdDb3B5LCB0aGlzLm9wVHJhY2UsIHRoaXMuYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYW1pbHkgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkOlxuICAgKiBvbmUgYHNldGAgcm93IHBlciBtZW1iZXIgdGhhdCBjaGFuZ2VkIChkZXNjZW5kYW50cyBieSBsYXN0IHRvdWNoLCBlYWNoXG4gICAqIHdpdGggaXRzIG93biByZWFkIHByZWZpeCksIHRoZSBST09UIGxhc3QsIGFuZCB0aGUgcm9vdCdzIHJlYWQtYmFjayB2YWx1ZVxuICAgKiBpbiBgb3ZlcndyaXRlYCDigJQgb25lIGNvaGVyZW50IHRyZWUsIHNvIG5vIHJvdyBjYW4gY2xvYmJlciBhbm90aGVyLiBUaGVcbiAgICogcm9vdCdzIHJvdyBpcyB3cml0dGVuIGV2ZW4gd2hlbiB0aGUgcm9vdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2U6IGl0IGlzIHRoZVxuICAgKiByb3cgdGhhdCBjYXJyaWVzIHRoZSBmYW1pbHkncyByZWFkLWJhY2sgKGFuZCB0aGUgY29udGFpbmVycyBMLTEncyBkcm9wcGVkXG4gICAqIG9wIGxlZnQpLiBBIGxvbmUgcm9vdCB1bmRlciBgJ2RlbHRhJ2Aga2VlcHMgdGhlIGNvbXBhY3QgYGFwcGVuZGAgd2hlbiB0aGVcbiAgICogdmFsdWUgaXQgcmVhZCBpcyBpdHMgYmFzZSBwbHVzIGEgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgZW1pdFJlYWRCYWNrKGZhbWlseTogRmFtaWx5LCByb3dzOiBSb3dzLCBlbmNvZGluZzogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIGxldCByb290OiBNZW1iZXIgPSBmYW1pbHkubWVtYmVyc1swXTtcbiAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGZhbWlseS5tZW1iZXJzKSB7XG4gICAgICBpZiAobS5wYXRoID09PSBmYW1pbHkucm9vdCkge1xuICAgICAgICByb290ID0gbTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShtLnBhdGguc3BsaXQoREVMSU0pKSkgY29udGludWU7XG4gICAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoOiBtLnBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKG0ucmVhZEtleXMpIH0pO1xuICAgICAgY2hhbmdlZCsrO1xuICAgIH1cbiAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgaWYgKGVuY29kaW5nID09PSAnZGVsdGEnICYmIGNoYW5nZWQgPT09IDAgJiYgYWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgICBwdXNoVmFsdWVSb3coXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGZhbWlseS5yb290LFxuICAgICAgICBmYW1pbHkucm9vdFNlZ21lbnRzLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyLFxuICAgICAgICBwcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpLFxuICAgICAgICB0aGlzLm1hcmtlZEJlbG93KGZhbWlseS5yb290KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IGZhbWlseS5yb290LCB2ZXJiOiAnc2V0JywgLi4ucHJvdmVuYW5jZShyb290LnJlYWRLZXlzKSB9KTtcbiAgICAvLyBUaGUgY2xvbmUgdGhlIGNoZWNrIHRvb2sgKGBhZG1pc3Npb24udHMgwrcgZm9sZHNCYWNrYCksIHdoZW4gaXQgdG9vayBvbmUuXG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgZmFtaWx5LnJvb3RTZWdtZW50cywgZmFtaWx5LmhlbGQgIT09IHVuZGVmaW5lZCA/IGZhbWlseS5oZWxkLnZhbHVlIDogc3RydWN0dXJlZENsb25lKGFmdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgYSBwYXRoIOKAlCB3aGF0IHRoZSBkZWx0YSBlbmNvZGVyXG4gICAqIGNvbW1pdHMgZm9yIGEgZmFtaWx5IG1lbWJlciBvciBhIHBhdGggd2l0aCBhIGBzZXRgIOKAlCByZWFkIGZyb20gT05FXG4gICAqIHtAbGluayBkcnlGb2xkfSBvZiB0aG9zZSByb3dzIG92ZXIgdGhlIHBhdGNoIHRyZWVzIHRoZW1zZWx2ZXMsIHRha2VuIHRoZVxuICAgKiBmaXJzdCB0aW1lIGl0IGlzIGFza2VkLiBCeSByZWZlcmVuY2UsIGFzIHRoZSBzdGFnZSBoZWxkIHRoZW06IGFuIGVsZW1lbnRcbiAgICogYSBgc2V0YCBhbmQgYSBgbWVyZ2VgIG9mIG9uZSBwYXRoIHNoYXJlIHN0YXlzIG9uZSBlbGVtZW50LiBBIHN0YWdlIHRoYXRcbiAgICogc3RhZ2VkIG5vIGBtZXJnZWAgYW5kIG5vIG5lc3RlZCBvcCBuZWVkcyBubyBmb2xkIOKAlCBhIHBhdGgncyB2YWx1ZSBpcyBpdHNcbiAgICogbGFzdCBzdGFnZWQgdmFsdWUuIChCZWZvcmUgOS4zMC4wOiB0d28gcmVwbGljYXMgb2YgdGhlIHZlcmIgbGF3LFxuICAgKiBgcmVwbGF5UGF0aFZlcmJzYCBhbmQgYHJlcGxheUZhbWlseVZlcmJzYC4pXG4gICAqL1xuICBwcml2YXRlIGZ1bGxSb3dzVmFsdWUoKTogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93biB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gKHNlZ21lbnRzKSA9PiBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBsZXQgZm9sZDogdW5rbm93bjtcbiAgICByZXR1cm4gKHNlZ21lbnRzKSA9PiB7XG4gICAgICBmb2xkID8/PSBkcnlGb2xkKHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLnVwZGF0ZVBhdGNoLCB0aGlzLm92ZXJ3cml0ZVBhdGNoLCB0aGlzLmZ1bGxSb3dzKCkpO1xuICAgICAgcmV0dXJuIF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3M6IGV2ZXJ5IG9wIG9uIGEgcGF0aCB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIga2VlcHMsIGEgYGRlbGV0ZWAgc3BlbGxlZCBgc2V0YC4gKi9cbiAgcHJpdmF0ZSBmdWxsUm93cygpOiBUcmFjZUVudHJ5W10ge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCByb3dzOiBUcmFjZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgbGV0IGsgPSBrZWVwLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIGtlZXAuc2V0KG9wLnBhdGgsIChrID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKSkpO1xuICAgICAgaWYgKGspIHJvd3MucHVzaCh7IHBhdGg6IG9wLnBhdGgsIHZlcmI6IG9wLnZlcmIgPT09ICdtZXJnZScgPyAnbWVyZ2UnIDogJ3NldCcgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgc3RhZ2UgY2hhbmdlIHRoZSB2YWx1ZSBhdCBgc2VnbWVudHNgPyBCYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmVcbiAgICogZml4ZWQgYXQgY29tbWl0LCBzbyB0aGlzIGlzIHRoZSBPTkUgbmV0LWNoYW5nZSB2ZXJkaWN0IGJvdGggcGF5bG9hZFxuICAgKiBlbmNvZGluZ3MgYXBwbHkgKGEgbm8tb3Agd3JpdGUgYW5kIGEgd3JpdGUtdGhlbi1yZXZlcnQgYm90aCBmYWlsIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbChfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyksIF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgKyByZS1pbnNlcnRcbiAgICogbW92ZXMgYSByZS10b3VjaGVkIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgTWFwJ3MgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICAgKiBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocykuIFBlci13cml0ZVxuICAgKiBwcm92ZW5hbmNlICgjUDEpOiB0aGUgTEFTVCBvcCdzIHJlYWRLZXlzIGlzIGtlcHQg4oCUIHJlYWQgcHJlZml4ZXMgb25seSBncm93XG4gICAqIHdpdGhpbiBhIHN0YWdlLCBzbyBsYXN0ID09IHVuaW9uIGFjcm9zcyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgb3BzQnlQYXRoKCk6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnZlcmJzLnB1c2gob3AudmVyYik7XG4gICAgICAgIHByZXYubGFzdCA9IGk7XG4gICAgICAgIGlmIChvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkKSBwcmV2LnJlYWRLZXlzID0gb3AucmVhZEtleXM7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIHtcbiAgICAgICAgICB2ZXJiczogW29wLnZlcmJdLFxuICAgICAgICAgIGxhc3Q6IGksXG4gICAgICAgICAgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciDigJQgaWRlbnRpY2FsIHRvICdmdWxsJyAoe0BsaW5rIGNoYW5nZWRTaW5jZUJhc2V9KS4gU3Vydml2b3JzIGtlZXAgbGFzdC10b3VjaCBvcmRlci4gKi9cbiAgcHJpdmF0ZSBuZXRDaGFuZ2VTdXJ2aXZvcnMoYnlQYXRoOiBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KTogU3Vydml2b3JbXSB7XG4gICAgY29uc3Qgc3Vydml2b3JzOiBTdXJ2aXZvcltdID0gW107XG4gICAgZm9yIChjb25zdCBbcGF0aCwgeyB2ZXJicywgcmVhZEtleXMsIGxhc3QgfV0gb2YgYnlQYXRoKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgaWYgKCF0aGlzLmNoYW5nZWRTaW5jZUJhc2Uoc2VnbWVudHMpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBzdXJ2aXZvcnMucHVzaCh7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgcmVhZEtleXMsIGxhc3QsIGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdXJ2aXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGEgc3RhZ2VkIGBkZWxldGVgIGF0IHRoaXMgcGF0aCBjb21taXQgYXMgdGhlIGAnZGVsZXRlJ2AgdmVyYj9cbiAgICpcbiAgICogT25seSB3aGVuIHJlbW92aW5nIHRoZSBrZXkgYW5kIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgZmxhdHRlbmluZyAoYF9zZXRgIG9mXG4gICAqIGB1bmRlZmluZWRgKSBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLiBUaGV5IGRpdmVyZ2Ugd2hlbiB0aGUgcGFyZW50IGlzIG5vdFxuICAgKiBhIGNvbnRhaW5lcjogYG5hdGl2ZURlbGV0ZWAgd2Fsa3MgYXdheSB1bnRvdWNoZWQsIHdoaWxlIGBuYXRpdmVTZXRgXG4gICAqIENPRVJDRVMgdGhlIHByaW1pdGl2ZSBwYXJlbnQgaW50byBhbiBvYmplY3QgdG8gaG9sZCB0aGUga2V5LiBDb21taXR0aW5nXG4gICAqIGBkZWxldGVgIHRoZXJlIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBzdGF0ZSBjaGFuZ2UgdGhlIHN0YWdlIHJlYWxseSBtYWRlLFxuICAgKiBzbyB0aG9zZSAocGF0aG9sb2dpY2FsKSBkZWxldGVzIGtlZXAgdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgLy8gcGFyZW50IGlzIHRoZSBzdGF0ZSByb290IOKAlCBhbHdheXMgYSBjb250YWluZXJcbiAgICBjb25zdCBwYXJlbnQgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cy5zbGljZSgwLCAtMSkpO1xuICAgIHJldHVybiBwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCc7XG4gIH1cbn1cblxuLyoqXG4gKiBIaXN0b3JpY2FsIGZsYXR0ZW5pbmcgZm9yIHRoZSBgJ2Z1bGwnYCBwYXlsb2FkOiBhbiBleHBsaWNpdCBkZWxldGUgY29tbWl0c1xuICogYXMgc2V0LW9mLXVuZGVmaW5lZC4gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSkgcmlkZXMgZWFjaCBzdXJ2aXZpbmcgZW50cnlcbiAqIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbmVkVHJhY2VSb3cob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IFRyYWNlRW50cnkge1xuICByZXR1cm4gb3AudmVyYiA9PT0gJ2RlbGV0ZSdcbiAgICA/IHsgcGF0aDogb3AucGF0aCwgdmVyYjogJ3NldCcgYXMgY29uc3QsIC4uLihvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZEtleXM6IG9wLnJlYWRLZXlzIH0pIH1cbiAgICA6IG9wO1xufVxuXG4vKiogQSByb3cncyBgcmVhZEtleXNgIGZyYWdtZW50IOKAlCBhYnNlbnQgdW5sZXNzIHRoZSBwcm92ZW5hbmNlIGRpYWwgcmVjb3JkZWQgb25lICgjUDEpLiAqL1xuZnVuY3Rpb24gcHJvdmVuYW5jZShyZWFkS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IHJlYWRLZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlYWRLZXlzICE9PSB1bmRlZmluZWQgPyB7IHJlYWRLZXlzIH0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
950
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStERzs7O0FBRUgsaURBQWdIO0FBQ2hILHlEQUFvSDtBQUNwSCwrQ0FBeUM7QUFDekMsNkNBVXNCO0FBRXRCLHlDQUFzRjtBQUV0RixNQUFhLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixDQUFrQjtJQUVuRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdEM7Ozs7OztPQU1HO0lBQ0ssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdkM7Ozs7O09BS0c7SUFDSyxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0ssU0FBUyxDQUFtQjtJQUVwQzs7O09BR0c7SUFDSyxZQUFZLENBQW1CO0lBRXZDOzs7Ozs7T0FNRztJQUNjLE9BQU8sQ0FBb0I7SUFFNUMsb0VBQW9FO0lBQzVELFlBQVksR0FBRyxDQUFDLENBQUM7SUFDekIsb0ZBQW9GO0lBQzVFLFNBQVMsR0FBRyxDQUFDLENBQUM7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O0lBQ2hGLE9BQU8sRUFBRSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQ3pCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ3RHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLFNBQVMsVUFBVSxDQUFDLFFBQThCO0lBQ2hELE9BQU8sUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zYWN0aW9uQnVmZmVyIOKAlCBQZXItc3RhZ2UgU1RBR0lORyBidWZmZXIgZm9yIHN0YXRlIG11dGF0aW9uc1xuICpcbiAqIFdoYXQgaXQgSVM6IGEgc3RhZ2luZyBidWZmZXIgd2l0aCByZWFkLXlvdXItd3JpdGVzIGFuZCBuZXQtY2hhbmdlIGNvbW1pdHMuXG4gKiAtIENoYW5nZXMgYXJlIHN0YWdlZCBoZXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24gYW5kIGZsdXNoZWQgdG9cbiAqICAgU2hhcmVkTWVtb3J5IGluIE9ORSBiYXRjaCBwZXIgc3RhZ2UgKGBjb21taXQoKWApIOKAlCBvdGhlciBzdGFnZXMgYW5kXG4gKiAgIHBhcmFsbGVsIHNpYmxpbmdzIG5ldmVyIG9ic2VydmUgYSBzdGFnZSdzIGhhbGYtZmluaXNoZWQgd3JpdGVzLlxuICogLSBSZWFkLWFmdGVyLXdyaXRlIGNvbnNpc3RlbmN5IHdpdGhpbiBhIHN0YWdlIOKAlCBhIHN0YWdlIHNlZXMgaXRzIG93blxuICogICBzdGFnZWQgd3JpdGVzIGltbWVkaWF0ZWx5LlxuICogLSBgY29tbWl0KClgIHJlY29yZHMgdGhlIHN0YWdlJ3MgTkVUIGNoYW5nZSAoc2VlIHtAbGluayBjb21taXR9KSwgcGx1cyBhblxuICogICBvcGVyYXRpb24gdHJhY2UgZm9yIGRldGVybWluaXN0aWMgcmVwbGF5LlxuICpcbiAqIFdoYXQgaXQgaXMgTk9UOiBhIHJvbGxiYWNrIG1lY2hhbmlzbS4gRGVzcGl0ZSB0aGUgbmFtZSwgdGhlcmUgaXMgbm9cbiAqIGFib3J0L3JvbGxiYWNrIHBhdGgg4oCUIHdoZW4gYSBzdGFnZSBUSFJPV1MsIHRoZSBlbmdpbmUgc3RpbGwgY29tbWl0c1xuICogZXZlcnl0aGluZyBzdGFnZWQgc28gZmFyIGJlZm9yZSByZS10aHJvd2luZyAoY29tbWl0LW9uLWVycm9yIGluXG4gKiBgRmxvd2NoYXJ0VHJhdmVyc2VyYCkuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIGF1ZGl0IHRyYWlsIG11c3QgcmVjb3JkXG4gKiB3aGF0IHRoZSBmYWlsaW5nIHN0YWdlIGNoYW5nZWQuIERvIG5vdCByZWx5IG9uIFwic3RhZ2UgZmFpbGVkIOKGkiBpdHNcbiAqIHdyaXRlcyB2YW5pc2hlZFwiLlxuICpcbiAqIFRoZSBwYXRjaCB0cmVlcyBob2xkIFJFRkVSRU5DRVMgdW50aWwgY29tbWl0ICg5LjIzLjApLiBBIGBzZXRgIHN0b3JlcyB0aGVcbiAqIGNhbGxlcidzIG93biB2YWx1ZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGRpZCBpblxuICogYHdvcmtpbmdDb3B5YDsgdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyB0YWtlbiBPTkNFIHBlciBzdXJ2aXZpbmcgcGF0aFxuICogd2hlbiB0aGUgcGF5bG9hZCBsZWF2ZXMgdGhlIGJ1ZmZlciAoYHRvQ2hhbmdlT25seVBheWxvYWRgIC9cbiAqIGB0b0RlbHRhUGF5bG9hZGAg4oCUIGV2ZXJ5IHZhbHVlIHRoZXkgZW1pdCBwYXNzZXMgdGhyb3VnaCBgc3RydWN0dXJlZENsb25lYFxuICogdGhlcmUpLiBUaGUgbGF3IFwidGhlIHJlY29yZCBuZXZlciBhbGlhc2VzIGEgY2FsbGVyJ3Mgb2JqZWN0XCIgaXMga2VwdCBhdFxuICogdGhlIGNvbW1pdCBib3VuZGFyeSBpbnN0ZWFkIG9mIGF0IGV2ZXJ5IHdyaXRlLCB3aGljaCBpcyB3aGF0IG1ha2VzIE5cbiAqIHdyaXRlcyB0byBvbmUgcGF0aCBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHNpemUpLiBDb25zZXF1ZW5jZSwgYnkgZGVzaWduOiBhXG4gKiBjYWxsZXIgd2hvIG11dGF0ZXMgaXRzIG93biBvYmplY3QgQUZURVIgdGhlIHdyaXRlIGFuZCBCRUZPUkUgdGhlIHN0YWdlXG4gKiBlbmRzIGNvbW1pdHMgdGhlIHZhbHVlIGFzIHRoZSBzdGFnZSByZWFkIGl0IGJhY2sg4oCUIHRoZSByZWNvcmQgYWdyZWVzIHdpdGhcbiAqIHRoZSBzdGFnZSAoQ0xBVURFLm1kIGxhbmRtaW5lIDMncyBmaXJzdCBiaXRlLCBjbG9zZWQpLiBUaGUgb25lIHBsYWNlIHRoZVxuICogZW5naW5lIGl0c2VsZiBlZGl0cyBUSFJPVUdIIGEgc3RhZ2VkIHZhbHVlIOKAlCBhIGxhdGVyIG5lc3RlZCBvcCB1bmRlciBhXG4gKiBgc2V0YCBwYXRoIOKAlCBkZXRhY2hlcyB0aGF0IHZhbHVlIGZpcnN0ICh7QGxpbmsgZGV0YWNoSGVsZEFuY2VzdG9yc30pLCBzb1xuICogYHdvcmtpbmdDb3B5YCBhbmQgYG92ZXJ3cml0ZVBhdGNoYCBuZXZlciBzaGFyZSBhIGNvbnRhaW5lciB0aGUgZW5naW5lXG4gKiBtdXRhdGVzIG9uIG9uZSBzaWRlIG9ubHkuXG4gKlxuICogQ09QWS1PTi1XUklURSAoOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS4gVGhlXG4gKiBidWZmZXIgbm8gbG9uZ2VyIGNsb25lcyB0aGUgY29tbWl0dGVkIHN0YXRlIGl0IHN0YXJ0cyBmcm9tLiBgYmFzZVNuYXBzaG90YFxuICogSVMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIChoZWxkIGJ5IHJlZmVyZW5jZSDigJRcbiAqIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcCksIGFuZCBgd29ya2luZ0NvcHlgIHN0YXJ0cyBhcyBhXG4gKiBjb3B5IG9mIGl0cyBST09UIG9ubHk6IGVhY2ggd3JpdGUgY29waWVzIHRoZSBjb250YWluZXJzIG9uIGl0cyBvd24gcGF0aFxuICogKHtAbGluayBvd25TcGluZX0pLCBhbmQgdGhlIGZpcnN0IFJFQUQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgb2YgYVxuICogY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSB0YWtlcyBhIHByaXZhdGUgZGVlcCBjb3B5IG9mXG4gKiBpdCAoe0BsaW5rIHByaXZhdGlzZX0pIOKAlCB3aGF0IHRoZSB3aG9sZS1zdGF0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgZXZlcnlcbiAqIHJlYWQsIHNvIGFuIGluLXBsYWNlIGVkaXQgb2YgYSByZWFkIHZhbHVlIHN0YXlzIHByaXZhdGUgZXhhY3RseSBhcyBpdCBkaWQuXG4gKiBBIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyIGlzIHNlcnZlZCBmcm9tIGxpdmUgc3RhdGUgYnkgdGhlXG4gKiBjYWxsZXIsIGFzIGJlZm9yZTsgdGhlIGJ1ZmZlciB0aGVuIHJlcGxhY2VzIHRoYXQgcGF0aCBvZiBpdHMgZGlmZiBiYXNlXG4gKiB3aXRoIGEgcHJpdmF0ZSBjb3B5ICh7QGxpbmsgZGV0YWNoQmFzZX0pLCBhcyB0aGUgY2xvbmUgaGFkIGl0LlxuICpcbiAqIFRIRSBBRE1JVFRFRCBSRUNPUkQgKDkuMzAuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1hZG1pdHRlZC1yZWNvcmQubWQpLiBBXG4gKiBjb21taXQgaXMgYWRtaXR0ZWQgb25seSBpZiBpdHMgYnVuZGxlIGZvbGRzIGJhY2sgdG8gdGhlIHN0YWdlJ3NcbiAqIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkIChhbmQgYXQgZXZlcnlcbiAqIGNvbnRhaW5lciBpdHMgd3JpdGVzIGNyZWF0ZWQgb24gdGhlIHdheSB0aGVyZSwgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcykuXG4gKiBCb3RoIGVuY29kZXJzIGNvbW1pdCB0aGUgdmFsdWUgdGhlIHN0YWdlIHJlYWQ6IGEgY29tcGFjdCByb3cg4oCUIGEgYG1lcmdlYFxuICogZGVsdGEsIGFuIGBhcHBlbmRgIHRhaWwg4oCUIGlzIGtlcHQgd2hlcmUgaXQgcHJvdmFibHkgZm9sZHMgYmFjazsgYSBmYW1pbHkgb2ZcbiAqIHJvd3MgdGhhdCBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyBgc2V0YCByb3dzIG9mIHRoZSB2YWx1ZXMgdGhlIHN0YWdlIHJlYWRcbiAqICh7QGxpbmsgYWRtaXR9KS4gQmVmb3JlIDkuMzAuMCB0aGUgb25lIGFjY3VtdWxhdGVkIG1lcmdlIGRlbHRhIHBlciBwYXRoIHdhc1xuICogcmVwbGF5ZWQgYXQgZXZlcnkgYG1lcmdlYCByb3cgb2YgdGhhdCBwYXRoLCB3aGljaCBsaWVkIGFjcm9zcyBhIGhhcmQgd3JpdGVcbiAqIChgJHVwZGF0ZShrLHt4fSk7IGsgPSB7eX07ICR1cGRhdGUoayx7en0pYCBjb21taXR0ZWQgYHt5LCB4LCB6fWAgZm9yIGFcbiAqIHJlYWQtYmFjayBvZiBge3ksIHp9YCksIGFuIGBbXWAgY2xlYXIsIGEga2luZCBjaGFuZ2Ugb3IgYW4gYXJyYXkgdW5pb25cbiAqIGRlZHVwbGljYXRlZCBieSByZWZlcmVuY2UuIFZlcmlmaWVkIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBhIGBtZXJnZWAgb3IgYVxuICogbmVzdGVkIG9wOyBhIHN0YWdlIHRoYXQgc3RhZ2VkIG9ubHkgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyXG4gKiBpdHMgYWRkcmVzcyBpcyBjb2hlcmVudCBieSBjb25zdHJ1Y3Rpb24g4oCUIGJvdGggdHJlZXMgcmVjZWl2ZSB0aGUgc2FtZVxuICogd3JpdGUg4oCUIGFuZCBpcyBhZG1pdHRlZCB3aXRob3V0IHRoZSBmb2xkLlxuICovXG5cbmltcG9ydCB7IHR5cGUgRmFtaWx5LCB0eXBlIExvc3N5LCB0eXBlIE1lbWJlciwgdHlwZSBSb3dzLCBhZGRyZXNzRGVwdGhPZiwgbG9zc3lGYW1pbGllcyB9IGZyb20gJy4vYWRtaXNzaW9uLmpzJztcbmltcG9ydCB7IHR5cGUgT3BWZXJiLCB0eXBlIFN1cnZpdm9yLCBlbWl0SW5GYW1pbHlPcmRlciwgZ3JvdXBJbnRvRmFtaWxpZXMsIHB1c2hWYWx1ZVJvdyB9IGZyb20gJy4vZGVsdGFFbmNvZGluZy5qcyc7XG5pbXBvcnQgeyByZWxhdGlvbiB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHtcbiAgYWRvcHQsXG4gIGlzQ29udGFpbmVyLFxuICBuYXRpdmVHZXQgYXMgX2dldCxcbiAgbmF0aXZlU2V0IGFzIF9zZXQsXG4gIG93bixcbiAgb3duQ2hpbGQsXG4gIG93bmVkUm9vdE9mLFxuICBvd25TcGluZSxcbiAgc2hhbGxvd0NvcHksXG59IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdFZhbHVlc01vZGUsIE1lbW9yeVBhdGNoLCBUcmFjZUVudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRlZXBTbWFydE1lcmdlLCBERUxJTSwgZHJ5Rm9sZCwgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWZmZXIge1xuICAvKipcbiAgICogVGhlIG5ldC1jaGFuZ2UgZGlmZiBiYXNlOiB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0XG4gICAqIHRvdWNoZWQsIGJ5IHJlZmVyZW5jZSDigJQgZXhjZXB0IHdoZXJlIHtAbGluayBkZXRhY2hCYXNlfSByZXBsYWNlZCBhIHBhdGhcbiAgICogb2YgaXQgd2l0aCBhIHByaXZhdGUgY29weSAoaXRzIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgYXJlXG4gICAqIHRoZW4gY29waWVzIHRvbywgb3duZWQgYnkge0BsaW5rIGJhc2VPd25lZH0pLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBQYXRocyB3aG9zZSBgb3ZlcndyaXRlUGF0Y2hgIHZhbHVlIGlzIHRoZSBjYWxsZXIncyBvd24gb2JqZWN0ICg5LjIzLjApOlxuICAgKiBhIGBzZXRgIG9mIGEgY29udGFpbmVyIHN0b3JlcyB0aGUgcmVmZXJlbmNlLCBhbmQgdGhpcyBpcyB0aGUgbGVkZ2VyIG9mXG4gICAqIHdoaWNoIG9uZXMgYXJlIHN0aWxsIHNoYXJlZCB3aXRoIHRoZSBjYWxsZXIgKGFuZCB3aXRoIGB3b3JraW5nQ29weWApLlxuICAgKiBDb25zdWx0ZWQgb25seSBieSB0aGUgZW5naW5lJ3MgbmVzdGVkIG9wcyDigJQgc2VlXG4gICAqIHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfTsgdGhlIGNvbW1pdCBwYXlsb2FkIGNsb25lcyBldmVyeSBzdXJ2aXZpbmdcbiAgICogdmFsdWUgYW55d2F5IGFuZCBuZXZlciBhc2tzLiBDbGVhcmVkIHdpdGggdGhlIHJlc3QgYXQgYGNvbW1pdCgpYC5cbiAgICovXG4gIHByaXZhdGUgaGVsZFJlZnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqIENvbW1pdC12YWx1ZSBlbmNvZGluZyBwb2xpY3kgKCMxM2MtQikuIGAnZnVsbCdgID0gaGlzdG9yaWNhbCBieXRlcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG5cbiAgLyoqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2Ugc291cmNlICgjUDEpLiBXaGVuIHNldCAodGhlXG4gICAqICBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZGlhbCksIGV2ZXJ5IHN0YWdlZCBvcCBzbmFwc2hvdHMgdGhlXG4gICAqICBrZXlzIHRyYWNrZWQtcmVhZCBzbyBmYXIg4oCUIHRoZSB0ZW1wb3JhbC1wcmVmaXggYXR0cmlidXRpb24gY29uc3VtZWQgYnlcbiAgICogIGNhdXNhbCBzbGljaW5nLiBVbmRlZmluZWQgKGRlZmF1bHQpID0gemVybyBjb3N0LCBieXRlLWlkZW50aWNhbCBvcHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZEtleXNQcm92aWRlcj86ICgpID0+IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBpbiBgd29ya2luZ0NvcHlgIHRoaXMgYnVmZmVyIENSRUFURUQ6IGl0cyByb290IGNvcHksIHRoZVxuICAgKiBwYXRoIGNvcGllcyBpdHMgd3JpdGVzIG1hZGUsIHRoZSBtZXJnZSByZXN1bHRzIGl0IGJ1aWx0LCBhbmQgZXZlcnlcbiAgICogY29udGFpbmVyIG9mIHRoZSBwcml2YXRlIGNvcGllcyBpdHMgcmVhZHMgdG9vay4gQSB3cml0ZSBlZGl0cyB0aGVzZSBpblxuICAgKiBwbGFjZS4gRXZlcnl0aGluZyBlbHNlIGluIGB3b3JraW5nQ29weWAgaXMgU0hBUkVEIOKAlCB3aXRoIHRoZSBjb21taXR0ZWRcbiAgICogZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCwgb3Igd2l0aCBhIHZhbHVlIHRoZSBzdGFnZSBzdGFnZWQg4oCUXG4gICAqIGFuZCBpcyBjb3BpZWQgYmVmb3JlIGEgd3JpdGUgcGFzc2VzIHRocm91Z2ggaXQgKHtAbGluayBvd25TcGluZX0pLlxuICAgKi9cbiAgcHJpdmF0ZSBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogQ29udGFpbmVyIHZhbHVlcyB0aGUgc3RhZ2Ugc3RhZ2VkIHdpdGgge0BsaW5rIHNldH0g4oCUIGl0cyBvd24gb2JqZWN0cyxcbiAgICogaGVsZCBieSByZWZlcmVuY2UgKDkuMjMuMCkuIEEgcmVhZCBoYW5kcyB0aGVtIGJhY2sgYXMgdGhleSBhcmUsIGV4YWN0bHlcbiAgICogYXMgdGhlIHByaXZhdGUgd29ya2luZyBjb3B5IGFsd2F5cyBkaWQsIGFuZCBuZXZlciBwcml2YXRpc2VzIHRoZW06IGFcbiAgICogcHJpdmF0ZSBjb3B5IG9mIGEgc3RhZ2VkIHZhbHVlIHdvdWxkIGxlYXZlIGB3b3JraW5nQ29weWAgYW5kXG4gICAqIGBvdmVyd3JpdGVQYXRjaGAgZGlzYWdyZWVpbmcgYWJvdXQgYSB2YWx1ZSB0aGUgc3RhZ2Ugd3JvdGUuXG4gICAqL1xuICBwcml2YXRlIHN0YWdlZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogT3duZWQgY29udGFpbmVycyB3aXRoIG5vIGNvbnRhaW5lciBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGVcbiAgICogYW55d2hlcmUgYmVsb3cgdGhlbSAoYSBwcml2YXRlIGRlZXAgY29weSwgYSBtZXJnZSByZXN1bHQgYnVpbHQgb24gYVxuICAgKiBwcml2YXRlIGJhc2UsIGEgcGF0aCBjb3B5IHdob3NlIHNoYXJlZCBjaGlsZHJlbiB3ZXJlIHByaXZhdGlzZWQpLiBBIHJlYWRcbiAgICogdGhhdCBsYW5kcyBvbiBvbmUgbmVlZHMgbm8gd2FsayDigJQgc2VlIHtAbGluayBwcml2YXRpc2VCZWxvd30uXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lcnMgb2Yge0BsaW5rIGJhc2VTbmFwc2hvdH0gdGhhdCB7QGxpbmsgZGV0YWNoQmFzZX0gY3JlYXRlZDpcbiAgICogaXRzIHJvb3QgY29weSBhbmQgdGhlIGNvcGllcyBvbiB0aGUgd2F5IHRvIGEgZGV0YWNoZWQgcGF0aC4gQWxsb2NhdGVkXG4gICAqIG9ubHkgYnkgdGhlIGZpcnN0IGRldGFjaCDigJQgdGhlIGluLWNvbnRyYWN0IHN0YWdlIG5ldmVyIHBheXMgZm9yIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlT3duZWQ/OiBXZWFrU2V0PG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFRoZSBwcml2YXRlIGRlZXAgY29waWVzIHtAbGluayBkZXRhY2hCYXNlfSBwdXQgaW50byB0aGUgZGlmZiBiYXNlOiBub3RoaW5nXG4gICAqIGF0IG9yIGJlbG93IG9uZSBpcyBjb21taXR0ZWQgc3RhdGUsIHNvIGEgbGF0ZXIgZGV0YWNoIGluc2lkZSBpdCBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRhY2hlZEJhc2U/OiBXZWFrU2V0PG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBzdGFnZSB3cml0ZXMgKDkuMzAuMCk6IGEgcGF0aCBwcmVmaXggaXRzIGZyYW1lIGNvbXB1dGVkIGFuZFxuICAgKiBoYW5kcyBvdmVyIGFzIGRhdGEgKEMyIOKAlCBmb3IgdGhlIGVuZ2luZSwgdGhlIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZSwgb3JcbiAgICogYFtdYCBmb3IgdGhlIHJvb3QpLiBJdHMgY29udGFpbmVycyBhcmUgdGhlIHN0YWdlJ3MgQUREUkVTUywgbm90IGEgdmFsdWVcbiAgICogdGhlIHN0YWdlIHJlYWRzIChldmVyeSByZWFkIGl0IG1ha2VzIGlzIGEga2V5IGJlbG93IGl0KSwgc28gYSBzaGVsbCBhXG4gICAqIHdyaXRlIGxlYXZlcyB0aGVyZSBpcyBubyBwYXJ0IG9mIHRoZSByZWFkLWJhY2sgdGhlIHJlY29yZCBtdXN0IGhvbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBgbWVyZ2VgIG9wcyBzdGFnZWQgc2luY2UgdGhlIGxhc3QgY29tbWl0IOKAlCBzZWUge0BsaW5rIGFkbWl0fS4gKi9cbiAgcHJpdmF0ZSBzdGFnZWRNZXJnZXMgPSAwO1xuICAvKiogT3BzIHN0YWdlZCBkZWVwZXIgdGhhbiBvbmUga2V5IGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3Mg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIG5lc3RlZE9wcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZTogYW55LFxuICAgIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZSA9ICdmdWxsJyxcbiAgICByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW10sXG4gICAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKSB7XG4gICAgLy8gYGJhc2VgIGlzIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCDigJRcbiAgICAvLyBpbW11dGFibGUtYWZ0ZXItc3dhcCwgdGhlIGludmFyaWFudCB0aGUgZmlyc3QtdG91Y2ggdmlldyBhbHJlYWR5IHJlc3RzXG4gICAgLy8gb24g4oCUIHNvIHRoZSBkaWZmIGJhc2UgaXMgaGVsZCBieSBSRUZFUkVOQ0UsIGFuZCB0aGUgd29ya2luZyBjb3B5IHN0YXJ0c1xuICAgIC8vIGFzIGEgY29weSBvZiBpdHMgUk9PVCBvbmx5LiBCZWZvcmUgOS4yOS4wIHRoZXNlIHR3byBsaW5lcyB3ZXJlIHR3b1xuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgd2hvbGUgc3RhdGUsIHBhaWQgYnkgZXZlcnkgc3RhZ2UgdGhhdCB3cm90ZS5cbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IGJhc2U7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IG93bmVkUm9vdE9mKGJhc2UsIHRoaXMub3duZWQpO1xuICAgIHRoaXMuY29tbWl0VmFsdWVzID0gY29tbWl0VmFsdWVzO1xuICAgIHRoaXMucmVhZEtleXNQcm92aWRlciA9IHJlYWRLZXlzUHJvdmlkZXI7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgY3VycmVudCByZWFkIHByZWZpeCBvbnRvIGEgc3RhZ2VkIG9wIOKAlCBvbmx5IHdoZW4gdGhlXG4gICAqICBwcm92ZW5hbmNlIGRpYWwgaXMgb24gKHByb3ZpZGVyIHByZXNlbnQpLCBzbyB0aGUgZGVmYXVsdCBwYXRoIGFsbG9jYXRlc1xuICAgKiAgbm90aGluZyBhbmQgY29tbWl0IGJ1bmRsZXMgc3RheSBieXRlLWlkZW50aWNhbC4gKi9cbiAgcHJpdmF0ZSBzdGFtcFJlYWRLZXlzKG9wOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH0pOiB0eXBlb2Ygb3Age1xuICAgIGlmICh0aGlzLnJlYWRLZXlzUHJvdmlkZXIpIG9wLnJlYWRLZXlzID0gdGhpcy5yZWFkS2V5c1Byb3ZpZGVyKCk7XG4gICAgcmV0dXJuIG9wO1xuICB9XG5cbiAgLyoqIFN0YWdlIGFuIG9wIGludG8gYG9wVHJhY2VgLCBjb3VudGluZyB3aGF0IGRlY2lkZXMgd2hldGhlciB7QGxpbmsgYWRtaXR9IG11c3QgZm9sZC4gKi9cbiAgcHJpdmF0ZSBzdGFnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBrZXk6IHN0cmluZywgdmVyYjogT3BWZXJiKTogdm9pZCB7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHRoaXMuc3RhZ2VkTWVyZ2VzKys7XG4gICAgaWYgKHBhdGgubGVuZ3RoIC0gYWRkcmVzc0RlcHRoT2YocGF0aCwgdGhpcy5hZGRyZXNzKSA+IDEpIHRoaXMubmVzdGVkT3BzKys7XG4gICAgdGhpcy5vcFRyYWNlLnB1c2godGhpcy5zdGFtcFJlYWRLZXlzKHsgcGF0aDoga2V5LCB2ZXJiIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIFN0b3JlcyB0aGUgUkVGRVJFTkNFIGluIGJvdGggdHJlZXNcbiAgICogKDkuMjMuMCkg4oCUIHRoZSByZWNvcmQncyBjb3B5IGlzIHRha2VuIG9uY2UsIGF0IGNvbW1pdDsgc2VlIHRoZSBoZWFkZXIuXG4gICAqL1xuICBzZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoaXNDb250YWluZXIodmFsdWUpKSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmFkZChrZXkpO1xuICAgICAgdGhpcy5zdGFnZWQuYWRkKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ3NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbmVzdGVkIG9wIGlzIGFib3V0IHRvIHdyaXRlIFRIUk9VR0ggYSBwYXRoIHdob3NlIGBvdmVyd3JpdGVQYXRjaGBcbiAgICogdmFsdWUgaXMgYSBoZWxkIHJlZmVyZW5jZSAoOS4yMy4wKS4gVG9kYXkncyBsYXcgaXMgdGhhdCB0aGUgdHdvIHRyZWVzXG4gICAqIHJlY2VpdmUgdGhlIHNhbWUgbmVzdGVkIGBzZXRgL2BkZWxldGVgIG11dGF0aW9ucyBidXQgT05MWSBgd29ya2luZ0NvcHlgXG4gICAqIHJlY2VpdmVzIGEgbmVzdGVkIGBtZXJnZWAncyByZXN1bHQgKGB1cGRhdGVQYXRjaGAgZ2V0cyB0aGUgZGVsdGEpIOKAlCBzbyBhXG4gICAqIGNvbnRhaW5lciBzaGFyZWQgYmV0d2VlbiB0aGUgdHJlZXMgd291bGQgbGVhayB0aGUgbWVyZ2VkIHZhbHVlIGludG8gdGhlXG4gICAqIG92ZXJ3cml0ZSBwYXlsb2FkLCBhbmQgYSBzaGFyZWQgY29udGFpbmVyIGlzIGFsc28gdGhlIGNhbGxlcidzIG93blxuICAgKiBvYmplY3QsIHdoaWNoIHRoZSBlbmdpbmUgbXVzdCBub3QgZWRpdCBvbiB0aGUgcmVjb3JkJ3MgYmVoYWxmLiBSZXBsYWNpbmdcbiAgICogdGhlIGhlbGQgYW5jZXN0b3Igd2l0aCBpdHMgY2xvbmUgaW4gYG92ZXJ3cml0ZVBhdGNoYCByZXN0b3JlcyBleGFjdGx5XG4gICAqIHRoZSBwcml2YXRlIHRyZWUgdGhlIHBlci13cml0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgaXQsIHBhaWQgb25jZSBwZXJcbiAgICogYW5jZXN0b3IgYW5kIG9ubHkgb24gdGhlIG5lc3RlZC1vcCBwYXRoIHRoZSBwdWJsaWMgc3VyZmFjZSBuZXZlciB0YWtlc1xuICAgKiAodGhlIHNjb3BlIHByb3h5IHdyaXRlcyBST09UIGtleXMpLiBgd29ya2luZ0NvcHlgIGtlZXBzIHRoZSByZWZlcmVuY2UsXG4gICAqIGFzIGl0IGFsd2F5cyBkaWQuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaEhlbGRBbmNlc3RvcnMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlbGRSZWZzLnNpemUgPT09IDApIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGF0aC5zbGljZSgwLCBpKTtcbiAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgoYW5jZXN0b3IpO1xuICAgICAgaWYgKCF0aGlzLmhlbGRSZWZzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGhlbGQgPSBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yKTtcbiAgICAgIGlmIChoZWxkICE9PSBudWxsICYmIHR5cGVvZiBoZWxkID09PSAnb2JqZWN0JykgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBhbmNlc3Rvciwgc3RydWN0dXJlZENsb25lKGhlbGQpKTtcbiAgICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGtleSBkZWxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKCMxM2MtQjsgYWJzb3JicyBiYWNrbG9nIEI4KS5cbiAgICpcbiAgICogU3RhZ2VzIEVYQUNUTFkgdGhlIHNhbWUgYnVmZmVyIG11dGF0aW9ucyBhcyBgc2V0KHBhdGgsIHVuZGVmaW5lZClgIOKAlFxuICAgKiBgd29ya2luZ0NvcHlgL2BvdmVyd3JpdGVQYXRjaGAgZ2V0IGFuIG93biBgdW5kZWZpbmVkYCBhdCB0aGUgcGF0aCAodGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZywgcHJlc2VydmluZyByZWFkIGJlaGF2aW9yIGFuZCB0aGUgZGVkdXAgZGlmZiBiYXNlXG4gICAqIGFjcm9zcyBtb2Rlcykg4oCUIGJ1dCByZWNvcmRzIHRoZSBvcCB2ZXJiIGFzIGAnZGVsZXRlJ2AuIEF0IGNvbW1pdDpcbiAgICogYCdmdWxsJ2AgbW9kZSBtYXBzIGl0IGJhY2sgdG8gYSBgJ3NldCdgIHRyYWNlIGVudHJ5IChieXRlLWlkZW50aWNhbCB0b1xuICAgKiB0b2RheSk7IGAnZGVsdGEnYCBtb2RlIGVtaXRzIGEgcmVhbCBgJ2RlbGV0ZSdgIGVudHJ5IHdob3NlIHJlcGxheVxuICAgKiBSRU1PVkVTIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGBrZXk6IHVuZGVmaW5lZGAgYmVoaW5kLlxuICAgKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBmaWx0ZXIgcmVhZHMgdGhhdCBzdGFnZWQgb3duIGB1bmRlZmluZWRgIGFzIEFCU0VOVFxuICAgKiAoYGRlZXBFcXVhbGAsIDkuMTkuMSkg4oCUIHNvIHVuZGVyIGAnZGVsdGEnYCwgd2hvc2UgY29tbWl0dGVkIHN0YXRlIHJlYWxseVxuICAgKiBsYWNrcyB0aGUga2V5LCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGluc2lkZSBhIGNvbnRhaW5lciB0aGUgc3RhZ2UgYWxzb1xuICAgKiByZS13cm90ZSBpcyB0aGUgbm8tb3AgaXQgaXMsIG5vdCBhIGBzZXRgIG9mIHRoZSB3aG9sZSBjb250YWluZXIuXG4gICAqL1xuICBkZWxldGUocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBgZGVlcFNtYXJ0TWVyZ2VgIGJ1aWxkcyBmcmVzaFxuICAgKiAgY29udGFpbmVycywgc28gbmVpdGhlciB0cmVlIGV2ZXIgaG9sZHMgdGhlIG1lcmdlIElOUFVUIGJ5IHJlZmVyZW5jZTtcbiAgICogIHRoZSBuZXN0ZWQtb3AgZGV0YWNoIGd1YXJkcyB0aGUgYW5jZXN0b3IgaXQgd3JpdGVzIElOVE8uXG4gICAqXG4gICAqICBUaGUgdmFsdWUgbWVyZ2VkIElOVE8gaXMgbWFkZSBwcml2YXRlIGZpcnN0IChgcHJpdmF0aXNlYCksIGFzIHRoZVxuICAgKiAgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBpdCBiZWZvcmUgOS4yOS4wLiBOb3Qgb25seSBmb3IgdGhlIHJlYWRzIHRoYXRcbiAgICogIGZvbGxvdzogYGRlZXBTbWFydE1lcmdlYCB1bmlvbnMgYXJyYXlzIEJZIFJFRkVSRU5DRSwgc28gd2hldGhlciBhblxuICAgKiAgZWxlbWVudCB0aGUgc3RhZ2UgcGFzc2VzIGluIGlzIFwiYWxyZWFkeSB0aGVyZVwiIGRlcGVuZHMgb24gd2hpY2ggb2JqZWN0c1xuICAgKiAgdGhlIGJhc2UgaG9sZHMg4oCUIGEgY29tbWl0dGVkIGFycmF5IHdvdWxkIGRlZHVwIGFuIGVsZW1lbnQgdGhlIHN0YWdlXG4gICAqICByZWFkIGZyb20gaXQgYmVmb3JlIGl0cyBmaXJzdCB3cml0ZSwgd2hlcmUgdGhlIHByaXZhdGUgY29weSAoYW5kXG4gICAqICA5LjI4LjApIGFwcGVuZHMgaXQuICovXG4gIG1lcmdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpID8/IHt9O1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBTbWFydE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgb3duKG1lcmdlZCwgdGhpcy5vd25lZCk7XG4gICAgaWYgKGlzQ29udGFpbmVyKG1lcmdlZCkpIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChtZXJnZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ21lcmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmllbGQtbGV2ZWwgcmVkYWN0aW9uICg5LjE5LjApOiBtYXJrIGRvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlIHN0YWdlZCBhdFxuICAgKiBgcGF0aGAgYXMgc2VjcmV0LCBzbyBgc2NydWJQYXRjaGAgc2NydWJzIHRoZW0gaW4gdGhlIGNvbW1pdCBsb2cgYW5kIHRoZVxuICAgKiBtaXJyb3IgdGhlIHNhbWUgd2F5IGEgd2hvbGUta2V5IHJlZGFjdGlvbiBpcyBzY3J1YmJlZC4gQSBmaWVsZCBpc1xuICAgKiByZWdpc3RlcmVkIGFzIGEgbGl0ZXJhbCBrZXkgQU5ELCB3aGVuIGRvdHRlZCwgYXMgdGhlIG5lc3RlZCBwYXRoIGl0XG4gICAqIG5hbWVzIOKAlCB3aGljaGV2ZXIgZXhpc3RzIGluIHRoZSBwYXRjaCBpcyB0aGUgb25lIGBzY3J1YlBhdGNoYCBmaW5kcy5cbiAgICogTWFya2VkIHBhdGhzIHN1cnZpdmUgY29tbWl0IG9ubHkgd2hpbGUgdGhlIG9wIHBhdGggdGhleSBzaXQgdW5kZXIgZG9lc1xuICAgKiAoc2VlIHtAbGluayBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzfSkuXG4gICAqL1xuICBtYXJrUmVkYWN0ZWRGaWVsZHMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgoWy4uLnBhdGgsIGZpZWxkXSkpO1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKCcuJykpIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgLi4uZmllbGQuc3BsaXQoJy4nKV0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHJlZGFjdGlvbiBtYXJrIGFkZHJlc3MgYW4gYXJyYXkgRUxFTUVOVCByaWdodCBiZWxvdyBgcGF0aGBcbiAgICogKGBsaXN0LjEudG9rZW5gKT8gQW4gYGFwcGVuZGAgcm93IHJlLWJhc2VzIHRoZSBpbmRpY2VzIG9udG8gdGhlIHRhaWwsIHNvXG4gICAqIHN1Y2ggYSBwYXRoIHRha2VzIHRoZSB3aG9sZS12YWx1ZSBgc2V0YCAoYGRlbHRhRW5jb2RpbmcgwrcgcHVzaFZhbHVlUm93YCkuXG4gICAqIEEgbWFyayBieSBOQU1FIGJlbG93IGFuIGFycmF5IChgb2JqLnlgKSBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiB0aGUgdGFpbFxuICAgKiBhcyBvbiB0aGUgd2hvbGUgdmFsdWUsIHNvIHRoZSBjb21wYWN0IHJvdyBzdGF5cyAoYnl0ZS1pZGVudGljYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWRCZWxvdyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXggPSBwYXRoICsgREVMSU07XG4gICAgZm9yIChjb25zdCBtYXJrZWQgb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoIW1hcmtlZC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmV4dCA9IG1hcmtlZC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdChERUxJTSlbMF07XG4gICAgICBpZiAoL14oMHxbMS05XVxcZCopJC8udGVzdChuZXh0KSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0ZWQgcGF0aHMgdGhhdCBzdXJ2aXZlIHRoZSBuZXQtY2hhbmdlIGZpbHRlcjogYSBwYXRoIHN1cnZpdmVzXG4gICAqIHdoZW4gaXQgSVMgYSBzdXJ2aXZpbmcgb3AgcGF0aCAoYSB3aG9sZS1rZXkgcmVkYWN0aW9uKSBvciBzaXRzIFVOREVSIG9uZVxuICAgKiAoYSBmaWVsZCBpbnNpZGUgYSBzdXJ2aXZpbmcgd3JpdGUpLiBBIGRyb3BwZWQgb3AgdGFrZXMgaXRzIGZpZWxkcyB3aXRoIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKHN1cnZpdmluZ1BhdGhzOiBTZXQ8c3RyaW5nPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgIG91dC5hZGQocGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcCBvZiBzdXJ2aXZpbmdQYXRocykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKG9wICsgREVMSU0pKSB7XG4gICAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gVGhlIHZhbHVlIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biDigJQgcHJpdmF0ZSB0byBpdCwgYXMgdGhlIHdob2xlLXN0YXRlIGNsb25lIG1hZGUgZXZlcnkgcmVhZFxuICAgKiBhZnRlciB0aGUgZmlyc3Qgd3JpdGUgYmVmb3JlIDkuMjkuMCAoYHByaXZhdGlzZWApLlxuICAgKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHRoaXMucHJpdmF0aXNlKHBhdGgpO1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgd29ya2luZyBjb3B5IGF0IGBwYXRoYCBXSVRIT1VUIHRha2luZyBhIHByaXZhdGUgY29weSDigJQgZm9yIGFcbiAgICogcmVhZGVyIHRoYXQgb25seSBjb21wYXJlcyAodGhlIGRldi1tb2RlIGJvcnJvd2VkLW11dGF0aW9uIHJlcG9ydCBpblxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdGApLCBuZXZlciBmb3IgYSB2YWx1ZSBoYW5kZWQgdG8gYSBzdGFnZS5cbiAgICovXG4gIHBlZWsocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCB1bmRlciBhIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyLlxuICAgKlxuICAgKiBXaGVuIGB3b3JraW5nQ29weWAgaG9sZHMgbm90aGluZyBhdCBgcGF0aGAg4oCUIHRoZSBzdGFnZSBkZWxldGVkIG9yIHVuc2V0XG4gICAqIGl0LCBvciBhIHdyaXRlIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0IOKAlCBgUmVjb3JkRnJhbWUgwrcgcmVhZGBcbiAgICogc2VydmVzIHRoZSByZWFkIGZyb20gTElWRSBjb21taXR0ZWQgc3RhdGUsIGV4YWN0bHkgYXMgOS4yOC4wXG4gICAqIGRpZCwgc28gdGhlIHZhbHVlIGl0IGhhbmRzIG91dCBpcyBjb21taXR0ZWQgc3RhdGUgaXRzZWxmLiBPbiA5LjI4LjAgdGhlXG4gICAqIGRpZmYgYmFzZSB3YXMgYSB3aG9sZS1zdGF0ZSBjbG9uZSB0YWtlbiBhdCB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSwgYW5kXG4gICAqIGFuIGluLXBsYWNlIGVkaXQgb2YgdGhhdCB2YWx1ZSAob3V0IG9mIGNvbnRyYWN0IOKAlCByZWFkcyBhcmUgYm9ycm93ZWQpXG4gICAqIGNvdWxkIG5vdCBtb3ZlIGl0OiB3cml0dGVuIGJhY2ssIHRoZSBlZGl0IHdhcyByZWNvcmRlZC4gSGVyZSB0aGUgZGlmZlxuICAgKiBiYXNlIElTIGEgY29tbWl0dGVkIGdlbmVyYXRpb24sIGFuZCBpdCB2ZXJ5IG9mdGVuIGhvbGRzIHRoYXQgc2FtZVxuICAgKiBjb250YWluZXIgYXQgYHBhdGhgIOKAlCB0aGUgZWRpdCB3b3VsZCBtb3ZlIHRoZSBiYXNlIHdpdGggaXQsIGFuZCB0aGVcbiAgICogd3JpdGUtYmFjayB3b3VsZCBjb21taXQgbm8gY2hhbmdlLiBTbyBiZWZvcmUgdGhlIHZhbHVlIGdvZXMgb3V0LCB0aGVcbiAgICogYmFzZSdzIHZhbHVlIGF0IGBwYXRoYCBpcyByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5ICh0aGUgYmFzZSdzXG4gICAqIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgY29waWVkIHNoYWxsb3dseSkg4oCUIHdoYXQgOS4yOC4wJ3NcbiAgICogYmFzZSBoZWxkIHRoZXJlLiBUaGUgY29tbWl0J3MgbmV0LWNoYW5nZSB0ZXN0IGNvbXBhcmVzIGFnYWluc3QgaXQgYW5kXG4gICAqIHRoZSBkZWx0YSBlbmNvZGVyIHJlcGxheXMgZnJvbSBpdDsgdGhlIHZhbHVlIGhhbmRlZCBvdXQgc3RheXMgdGhlIGxpdmVcbiAgICogb25lLCBzbyB3aGF0ZXZlciBlbHNlIGFuIGVkaXQgb2YgaXQgcmVhY2hlcyAobGl2ZSBzdGF0ZSwgdGhlIG5leHRcbiAgICogZ2VuZXJhdGlvbikgYmVoYXZlcyBhcyBvbiA5LjI4LjAgdG9vLlxuICAgKlxuICAgKiBOb3QgYHByaXZhdGlzZWA6IGEgcHJpdmF0ZSBjb3B5IGhhbmRlZCB0byB0aGUgc3RhZ2Ugd291bGQgYWxzbyBrZWVwIHRoZVxuICAgKiBlZGl0IG91dCBvZiBsaXZlIHN0YXRlLCB3aGVyZSA5LjI4LjAgbGV0IGl0IGluIOKAlCBhIHJ1bi1uYW1lc3BhY2VkIHJlYWRcbiAgICogdGhhdCBmYWxscyBiYWNrIHRvIGEgZ2xvYmFsIGtleSB3b3VsZCB0aGVuIGVuZCBkaWZmZXJlbnRseSAodGhlXG4gICAqIGRpZmZlcmVudGlhbCdzIE5FU1RFRCBmYW1pbHkgZmFpbHMgd2l0aGluIDEwMCBwcm9ncmFtcyB0aGF0IHdheSkuXG4gICAqXG4gICAqIENvcGllcyBub3RoaW5nIHdoZW4gdGhlIGJhc2UgaG9sZHMgbm8gY29udGFpbmVyIGF0IGBwYXRoYCwgYW5kIG5vdGhpbmdcbiAgICogdHdpY2U6IGEgcGF0aCBhdCBvciBiZWxvdyBhbiBlYXJsaWVyIGRldGFjaCBpcyBhbHJlYWR5IHByaXZhdGUuIE8ocGF0aClcbiAgICogb3RoZXJ3aXNlLCBwbHVzIE8odmFsdWUpIG9uY2UgcGVyIGRldGFjaGVkIHBhdGguXG4gICAqL1xuICBkZXRhY2hCYXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgfHwgIWlzQ29udGFpbmVyKHRoaXMuYmFzZVNuYXBzaG90KSkgcmV0dXJuO1xuICAgIGxldCBhdDogb2JqZWN0ID0gdGhpcy5iYXNlU25hcHNob3Q7XG4gICAgZm9yIChjb25zdCBrIG9mIHBhdGgpIHtcbiAgICAgIGlmICh0aGlzLmRldGFjaGVkQmFzZT8uaGFzKGF0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGNoaWxkKSkgcmV0dXJuO1xuICAgICAgYXQgPSBjaGlsZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgY29uc3Qgb3duZWQgPSAodGhpcy5iYXNlT3duZWQgPz89IG5ldyBXZWFrU2V0PG9iamVjdD4oKSk7XG4gICAgaWYgKCFvd25lZC5oYXModGhpcy5iYXNlU25hcHNob3QpKSB0aGlzLmJhc2VTbmFwc2hvdCA9IG93bmVkUm9vdE9mKHRoaXMuYmFzZVNuYXBzaG90LCBvd25lZCk7XG4gICAgb3duU3BpbmUodGhpcy5iYXNlU25hcHNob3QsIHBhdGgsIG93bmVkKTtcbiAgICBjb25zdCBjb3B5OiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYXQpO1xuICAgICh0aGlzLmRldGFjaGVkQmFzZSA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKS5hZGQoY29weSk7XG4gICAgX3NldCh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgY29weSk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSByZWFkcyAoOS4yOS4wKTogbWFrZSB0aGUgdmFsdWUgYXQgYHBhdGhgIHRoZSBzdGFnZSdzIG93biBiZWZvcmVcbiAgICogYSByZWFkIGhhbmRzIGl0IG91dCDigJQgc28gYSByZWFkIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIGJlaGF2ZXNcbiAgICogZXhhY3RseSBhcyBpdCBkaWQgd2hlbiB0aGUgYnVmZmVyIGJlZ2FuIHdpdGggYSBkZWVwIGNsb25lIG9mIHRoZSB3aG9sZVxuICAgKiBzdGF0ZS4gQW4gaW4tcGxhY2UgZWRpdCBvZiB3aGF0IHRoZSByZWFkIHJldHVybmVkIChvdXQgb2YgY29udHJhY3Qg4oCUXG4gICAqIHJlYWRzIGFyZSBib3Jyb3dlZCkgc3RheXMgaW5zaWRlIHRoZSBidWZmZXIsIGFuZCBjb21taXR0ZWQgc3RhdGUgaXMgbmV2ZXJcbiAgICogdG91Y2hlZC4gV2hldGhlciB0aGUgUkVDT1JEIGtlZXBzIGl0IGlzIHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXdcbiAgICogKDkuMzAuMCwgb3duZXIgcnVsaW5nIFIxIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHdoYXQgdGhlIHN0YWdlIHJlYWQgYmFjayk6IGl0XG4gICAqIGlzIGtlcHQgd2hlbiB0aGUgZWRpdGVkIHZhbHVlIGxpZXMgYXQgb3IgYmVsb3cgYSBwYXRoIHRoZSBzdGFnZSB3cm90ZSBpblxuICAgKiB0aGlzIHN0YWdlIOKAlCBzZXQsIG1lcmdlZCBvciB3cml0dGVuIGJhY2sgYWxpa2Ug4oCUIGFuZCBsb3N0IG90aGVyd2lzZS5cbiAgICpcbiAgICogV2Fsa2luZyB0aGUgcGF0aCBmcm9tIHRoZSAob3duZWQpIHJvb3Q6XG4gICAqICAtIGEgY29udGFpbmVyIHN0aWxsIFNIQVJFRCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpc1xuICAgKiAgICByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5IHdoZW4gaXQgaXMgdGhlIHZhbHVlIHJlYWQsIG9yIGJ5IGFcbiAgICogICAgc2hhbGxvdyBjb3B5IHdoZW4gaXQgaXMgYSBjb250YWluZXIgb24gdGhlIHdheSB0byBpdCAoc28gYSByZWFkIG9mXG4gICAqICAgIGBrYCB1bmRlciBhIGZvcmsgY2hpbGQncyBhZGRyZXNzIGNvcGllcyBga2AsIG5vdCBldmVyeSBjaGlsZCdzIG5hbWVzcGFjZSk7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBzdGFnZSBTVEFHRUQgKG9yIGFueXRoaW5nIGVsc2UgdGhlIGJ1ZmZlciBkaWQgbm90XG4gICAqICAgIHRha2UgZnJvbSBjb21taXR0ZWQgc3RhdGUpIGlzIGhhbmRlZCBiYWNrIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlO1xuICAgKiAgLSBhIGNvbnRhaW5lciB0aGUgYnVmZmVyIG93bnMgaXMgd2Fsa2VkIG9uIOKAlCBhbmQgd2hlbiBpdCBpcyB0aGUgdmFsdWVcbiAgICogICAgcmVhZCwgaXRzIHN0aWxsLXNoYXJlZCBkZXNjZW5kYW50cyBhcmUgcHJpdmF0aXNlZFxuICAgKiAgICAoe0BsaW5rIHByaXZhdGlzZUJlbG93fSkuXG4gICAqXG4gICAqIENvc3Q6IE8ocGF0aCkgcGVyIHJlYWQsIHBsdXMgTyh2YWx1ZSkgT05DRSBwZXIgc2hhcmVkIGNvbnRhaW5lciBhIHN0YWdlXG4gICAqIHJlYWRzIGFmdGVyIGl0cyBmaXJzdCB3cml0ZS4gQSBzdGFnZSB0aGF0IG5ldmVyIHJlYWRzIGFmdGVyIHdyaXRpbmcgcGF5c1xuICAgKiBub3RoaW5nOyBhIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBuZXZlciByZWFjaGVzIHRoZSBidWZmZXIuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgLy8gUmVzb2x2ZSBmaXJzdDogYSByZWFkIHRoYXQgbGFuZHMgb24gbm90aGluZyAoYSBtaXNzaW5nIGtleSwgYSByZWZ1c2VkXG4gICAgLy8gc2VnbWVudCwgYSBwcmltaXRpdmUpIHJldHVybnMgbm90aGluZyBhbmQgbXVzdCBjb3B5IG5vdGhpbmcuXG4gICAgY29uc3QgY2hhaW46IG9iamVjdFtdID0gW107XG4gICAgbGV0IGF0OiB1bmtub3duID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgYXQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGF0KSkgcmV0dXJuO1xuICAgICAgY2hhaW4ucHVzaChhdCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMud29ya2luZ0NvcHk7XG4gICAgbGV0IGJhc2U6IHVua25vd24gPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQoYmFzZSwgayk7XG4gICAgICBsZXQgdmFsdWUgPSBjaGFpbltpXTtcbiAgICAgIGlmICghdGhpcy5vd25lZC5oYXModmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gYXRCYXNlIHx8IHRoaXMuc3RhZ2VkLmhhcyh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKGkgPT09IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBhcmVudFtrXSA9IHRoaXMucHJpdmF0ZUNvcHlPZih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm93bmVkLmFkZCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudFtrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gdmFsdWU7XG4gICAgICBiYXNlID0gYXRCYXNlO1xuICAgIH1cbiAgICB0aGlzLnByaXZhdGlzZUJlbG93KHBhcmVudCwgYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gT1dORUQgY29udGFpbmVyIGlzIGFib3V0IHRvIGJlIHJlYWQgd2hvbGUgKGEgcGF0aCBjb3B5IGEgbmVzdGVkIHdyaXRlXG4gICAqIG1hZGUsIHNheSk6IGl0cyBkZXNjZW5kYW50cyBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXJlXG4gICAqIHJlcGxhY2VkIGJ5IHByaXZhdGUgZGVlcCBjb3BpZXMsIHNvIG5vdGhpbmcgdGhlIHJlYWQgaGFuZHMgb3V0IGlzXG4gICAqIGNvbW1pdHRlZCBzdGF0ZS4gV2Fsa3Mgb3duZWQgY29udGFpbmVycyBvbmx5OyBtYXJrcyBlYWNoIG9uZSBmaW5pc2hlZFxuICAgKiAoe0BsaW5rIHByaXZhdGVUcmVlc30pLCBzbyBhIGNvbnRhaW5lciBpcyBzY2FubmVkIG9uY2UgcGVyIHN0YWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2VCZWxvdyhjb250YWluZXI6IG9iamVjdCwgYmFzZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHdvcms6IEFycmF5PFtvYmplY3QsIHVua25vd25dPiA9IFtbY29udGFpbmVyLCBiYXNlXV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW25vZGUsIG5vZGVCYXNlXSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKHRoaXMucHJpdmF0ZVRyZWVzLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKG5vZGUsIGtleSk7XG4gICAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQobm9kZUJhc2UsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLm93bmVkLmhhcyhjaGlsZCkpIHdvcmsucHVzaChbY2hpbGQsIGF0QmFzZV0pO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCA9PT0gYXRCYXNlICYmICF0aGlzLnN0YWdlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB0aGlzLnByaXZhdGVDb3B5T2YoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgcHJpdmF0ZSBkZWVwIGNvcHkgb2YgYSBjb21taXR0ZWQgY29udGFpbmVyIOKAlCBvd25lZCB0aHJvdWdoIGFuZCB0aHJvdWdoLiAqL1xuICBwcml2YXRlIHByaXZhdGVDb3B5T2YodmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgYWRvcHQoY29weSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5wcml2YXRlVHJlZXMuYWRkKGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCBhbnkgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCwgb3IgYSBwYXRoIGFib3ZlIG9yIGJlbG93IGl0P1xuICAgKlxuICAgKiBUaGUgZGV2LW1vZGUgYm9ycm93ZWQtcmVhZCBjaGVjayAoYFN0YWdlQ29udGV4dC5jb21taXRgKSBhc2tzIHRoaXMgYmVmb3JlXG4gICAqIGFjY3VzaW5nIGEgc3RhZ2Ugb2YgbXV0YXRpbmcgYSB2YWx1ZSBpbiBwbGFjZTogYSBrZXkgdGhlIHN0YWdlIGxlZ2l0aW1hdGVseVxuICAgKiBXUk9URSBpcyBleHBlY3RlZCB0byBkaWZmZXIgZnJvbSB3aGF0IGl0IHJlYWQsIGFuZCB3cml0ZXMgcmVhY2ggdGhlIGJ1ZmZlclxuICAgKiBmcm9tIHBhdGhzIHRoYXQgYnlwYXNzIHVzZXItbGV2ZWwgd3JpdGUgdHJhY2tpbmcgdG9vICh0aGUgc3ViZmxvdyBzZWVkLFxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCB0aGUgcmVzdW1lIHJlLXNlZWQpLiBEZXYtbW9kZSBvbmx5IOKAlCBub3RoaW5nIG9uXG4gICAqIHRoZSBob3QgcGF0aCBjYWxscyBpdC5cbiAgICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgLy8gT24gdGhlIHBhdGgsIGJlbG93IGl0IG9yIGFib3ZlIGl0IOKAlCB0aGUgb25lIHBhdGggcmVsYXRpb24gZXZlcnkga2V5IHF1ZXJ5IGFza3MuXG4gICAgICBpZiAocmVsYXRpb24ob3AucGF0aCwgdGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gdGhpcy5zdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKG5ldyBTZXQocm93cy50cmFjZS5tYXAoKHQpID0+IHQucGF0aCkpKTtcbiAgICAvLyBUaGUgYnVuZGxlJ3Mga2V5IG9yZGVyIGlzIGByZWNvcmRDb21taXRgJ3M7IGEgZGlyZWN0IGNhbGxlciBrZWVwcyB0aGlzIHNhbWUgb3JkZXIuXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgb3ZlcndyaXRlOiByb3dzLm92ZXJ3cml0ZSwgdXBkYXRlczogcm93cy51cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZTogcm93cy50cmFjZSB9O1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLmhlbGRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuICAgIHRoaXMub3duZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMub3duZWQuYWRkKHRoaXMud29ya2luZ0NvcHkpO1xuICAgIHRoaXMuc3RhZ2VkID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5zdGFnZWRNZXJnZXMgPSAwO1xuICAgIHRoaXMubmVzdGVkT3BzID0gMDtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAsXG4gICAqIGtlZXBpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIOKAlCBhbmQgdGhlIHJlc3VsdCBpcyBBRE1JVFRFRCAoe0BsaW5rIGFkbWl0fSk6XG4gICAqIGEgZmFtaWx5IG9mIHJvd3Mgd2hvc2UgcmVwbGF5IGRvZXMgbm90IGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGlzXG4gICAqIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHJlYWQtYmFjayBpbnN0ZWFkICg5LjMwLjApLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBERUZBVUxUIChgY29tbWl0VmFsdWVzOiAnZnVsbCdgKSBwYXlsb2FkLCBpbmNsdWRpbmcgdGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZyBvZiBzdGFnZWQgYGRlbGV0ZWAgb3BzIGludG8gYHNldGAtb2YtYHVuZGVmaW5lZGBcbiAgICogdHJhY2UgZW50cmllcy4gVGhlIGRlbHRhIGVuY29kaW5nIGxpdmVzIGluIHtAbGluayB0b0RlbHRhUGF5bG9hZH0uXG4gICAqXG4gICAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogdGhlIG5ldC1jaGFuZ2UgdmVyZGljdCBpcyBwYWlkIG9uY2UgcGVyIFBBVEhcbiAgICogYW5kIHRoZSBjbG9uZSBvbmNlIHBlciBDT05TRUNVVElWRSBydW4gb2Ygb3BzIG9uIGEgcGF0aCwgbm90IG9uY2UgcGVyIG9wXG4gICAqIOKAlCBzZWUgdGhlIHR3byBtZW1vcyBpbnNpZGUuIFBpbm5lZCBieVxuICAgKiB0ZXN0L2xpYi9tZW1vcnkvc2NlbmFyaW8vcmVwZWF0ZWQtcGF0aC1ieXRlLWlkZW50aXR5LnRlc3QudHMgYWdhaW5zdCB0aGVcbiAgICogOS4yMi4wIGJ5dGVzLiBTaW5jZSA5LjIzLjAgdGhhdCBjbG9uZSBpcyBUSEUgY2xvbmU6IHRoZSBwYXRjaCB0cmVlcyBob2xkXG4gICAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2VzIChzZWUgdGhlIGNsYXNzIGhlYWRlciksIHNvIHRoaXMgbG9vcCBpcyB0aGUgb25lXG4gICAqIHBsYWNlIHRoZSByZWNvcmQgaXMgZGV0YWNoZWQgZnJvbSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IFJvd3Mge1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5jaGFuZ2VPbmx5Um93cyhsb3NzeSkpO1xuICB9XG5cbiAgLyoqIFRoZSAnZnVsbCcgcm93czsgYSBmYW1pbHkgaW4gYGxvc3N5YCBpcyB3cml0dGVuIGFzIGl0cyByZWFkLWJhY2ssIGF0IGl0cyBsYXN0IHRvdWNoICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkuICovXG4gIHByaXZhdGUgY2hhbmdlT25seVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICAvLyBQZXIgUEFUSCwgZGVjaWRlZCBvbmNlICg5LjIyLjEpOiBiYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmUgZml4ZWQgYXRcbiAgICAvLyBjb21taXQsIHNvIGV2ZXJ5IGxhdGVyIG9wIG9uIGEgcGF0aCBnZXRzIHRoZSB2ZXJkaWN0IGl0cyBmaXJzdCBvcCBnb3QuXG4gICAgLy8gYHVuZGVmaW5lZGAgPSBub3QgeWV0IGRlY2lkZWQ7IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYXJlIHRoZSBgdHJ1ZWAga2V5cy5cbiAgICBjb25zdCBzdXJ2aXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIC8vIFRoZSBwYXRoIHRoZSBMQVNUIHN1cnZpdmluZyBvcCBjb3BpZWQgaW50byBlYWNoIHBhdGNoIHRyZWUgKDkuMjIuMSkuXG4gICAgLy8gVGhlIHZhbHVlIGF0IGEgcGF0aCBpcyBmaXhlZCBhdCBjb21taXQsIHNvIGFuIG9wIHdob3NlIHByZWRlY2Vzc29yIG9uXG4gICAgLy8gdGhlIFNBTUUgdHJlZSBhbHJlYWR5IGNvcGllZCB0aGF0IHBhdGggd291bGQgd3JpdGUgdGhlIHNhbWUgYnl0ZXMgb3ZlclxuICAgIC8vIHRoZSBzYW1lIGtleSDigJQgaXQga2VlcHMgaXRzIHRyYWNlIHJvdyAodGhlIGxvZyBpcyBieXRlLWlkZW50aWNhbCkgYW5kXG4gICAgLy8gcGF5cyBubyBzZWNvbmQgY2xvbmUuIFRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgc3RhZ2VzIE5cbiAgICAvLyB3aG9sZS1hcnJheSBzZXRzIG9uIE9ORSBwYXRoOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhhdCBjb21taXQgTyhOKVxuICAgIC8vIGluc3RlYWQgb2YgTyhOIMOXIG9wcykuIENPTlNFQ1VUSVZFIG9ubHkg4oCUIGFuIG9wIG9uIGFub3RoZXIgcGF0aCBpblxuICAgIC8vIGJldHdlZW4gbWF5IGhhdmUgY29lcmNlZCBvciBncm93biB0aGlzIG9uZSdzIGNvbnRhaW5lciAoYSBkZXNjZW5kYW50XG4gICAgLy8gYG5hdGl2ZVNldGAgdGhyb3VnaCBhIHByaW1pdGl2ZSwgYSBga2V5OiB1bmRlZmluZWRgIHNoZWxsKSBhbmQgdGhlXG4gICAgLy8gcmUtY29weSBpcyB3aGF0IHJlcGFpcnMgaXQ7IGEgYG1lcmdlYCBiZXR3ZWVuIHR3byBzZXRzIHRvdWNoZXMgdGhlXG4gICAgLy8gb3RoZXIgdHJlZSBhbmQgZG9lcyBub3QgY291bnQuIFNhbWUgbGF3IGFzIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAgICBsZXQgbGFzdFNldFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdE1lcmdlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgZmFtaWx5ID0gbG9zc3k/LmZhbWlsaWVzLmdldChsb3NzeS5yb290T2YuZ2V0KG9wLnBhdGgpIGFzIHN0cmluZyk7XG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGkgPT09IGZhbWlseS5zbG90KSB7XG4gICAgICAgICAgdGhpcy5lbWl0UmVhZEJhY2soZmFtaWx5LCByb3dzLCAnZnVsbCcpO1xuICAgICAgICAgIGxhc3RTZXRQYXRoID0gbGFzdE1lcmdlUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBrZWVwID0gc3Vydml2ZXMuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGtlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZWVwID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKTtcbiAgICAgICAgc3Vydml2ZXMuc2V0KG9wLnBhdGgsIGtlZXApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZWVwKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcblxuICAgICAgdHJhY2UucHVzaChmbGF0dGVuZWRUcmFjZVJvdyhvcCkpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgaWYgKGxhc3RNZXJnZVBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0TWVyZ2VQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFNldFBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0U2V0UGF0aCA9IG9wLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0aHJlZSBlbmNvZGluZyBkaWZmZXJlbmNlczpcbiAgICpcbiAgICogMS4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKHRoZSDCpzIuNSBkZWR1cCBydWxlIOKAlCBgYXBwZW5kYFxuICAgKiAgICBpcyBOT1QgaWRlbXBvdGVudCBvbiByZXBsYXksIHNvIGR1cGxpY2F0ZSBlbnRyaWVzIHdvdWxkIG11bHRpcGx5XG4gICAqICAgIHRhaWxzKS4gVGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIG9wIG1peCArIGJhc2XihpJmaW5hbFxuICAgKiAgICByZWxhdGlvbnNoaXA7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaCxcbiAgICogICAgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMuXG4gICAqIDIuICoqVmVyYiByZXNvbHV0aW9uIHBlciBwYXRoKiog4oCUIGZvciBhIHBhdGggd2l0aCBOTyBzdXJ2aXZpbmcgcmVsYXRpdmVcbiAgICogICAgKHNlZSAzKTpcbiAgICogICAgLSBsYXN0IG9wIGAnZGVsZXRlJ2AgQU5EIGZpbmFsIHZhbHVlIGdvbmUg4oaSIGBkZWxldGVgICh0aGUgcGF0aCBzdGF5c1xuICAgKiAgICAgIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWAgd2l0aCBgdW5kZWZpbmVkYCBmb3Iga2V5LXNldCBjb25zdW1lcnMpLlxuICAgKiAgICAgIFJlcXVpcmVzIHRoZSBwYXJlbnQgdG8gYmUgYSByZWFsIGNvbnRhaW5lciBpbiB0aGUgYmFzZSDigJQgcmVwbGF5IHVzZXNcbiAgICogICAgICBgbmF0aXZlRGVsZXRlYCwgd2hpY2ggaXMgaW5lcnQgb24gYSBwcmltaXRpdmUvYWJzZW50IHBhcmVudCwgd2hlcmVhc1xuICAgKiAgICAgIHRoZSBgJ2Z1bGwnYCBmbGF0dGVuaW5nIChgX3NldGAgb2YgYHVuZGVmaW5lZGApIENPRVJDRVMgdGhhdCBwYXJlbnRcbiAgICogICAgICBpbnRvIGFuIG9iamVjdDsgd2hlbiB0aGV5IHdvdWxkIGRpc2FncmVlIHdlIGtlZXAgdGhlIGZsYXR0ZW5pbmc7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YTtcbiAgICogICAgLSBvdGhlcndpc2UgKGBzZXRgL21peGVkKTogdGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgdGhlXG4gICAqICAgICAgcGF0aCAoe0BsaW5rIGZ1bGxSb3dzVmFsdWV9KS4gSWYgYmFzZSBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZFxuICAgKiAgICAgIGJhc2UgaXMgYSBTVFJJQ1QgUFJFRklYIOKGkiBgYXBwZW5kYCBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGBcbiAgICogICAgICBzdG9yaW5nIHRoZSBmdWxsIHZhbHVlLlxuICAgKiAzLiAqKk9WRVJMQVAgRkFNSUxJRVMgdGFrZSB0aGUgZnVsbC12YWx1ZSBmYWxsYmFjay4qKiBgb3ZlcndyaXRlYCAvXG4gICAqICAgIGB1cGRhdGVzYCBhcmUgbmVzdGVkIHBhdGggVFJFRVMsIHNvIHR3byBzdXJ2aXZpbmcgcGF0aHMgd2hlcmUgb25lIGlzXG4gICAqICAgIGFuIGFuY2VzdG9yIG9mIHRoZSBvdGhlciAoYGFgIGFuZCBgYS5wYCkgc2hhcmUgc3RvcmFnZS4gRGVsdGEnc1xuICAgKiAgICBwZXItcGF0aCBlbmNvZGluZ3Mgd291bGQgY2xvYmJlciBlYWNoIG90aGVyIHRoZXJlIChhbiBgYXBwZW5kYFxuICAgKiAgICBhbmNlc3RvciBzdG9yZXMgb25seSBhIFRBSUwsIGEgYGRlbGV0ZWAgYW5jZXN0b3IgYHVuZGVmaW5lZGApLCBzbyBldmVyeVxuICAgKiAgICBwYXRoIHRoYXQgaGFzIGEgc3Vydml2aW5nIGFuY2VzdG9yL2Rlc2NlbmRhbnQgaXMgY29tbWl0dGVkIGFzIGEgcGxhaW5cbiAgICogICAgYHNldGAgb2YgdGhlIHZhbHVlIHRoZSAnZnVsbCcgcm93cyBnaXZlIGl0LCBhbmQgdGhlIGZhbWlseSdzXG4gICAqICAgIHNoYWxsb3dlc3QgcGF0aCAod2hvc2Ugc2V0IGNvdmVycyB0aGUgd2hvbGUgc3VidHJlZSkgaXMgZW1pdHRlZCBMQVNULlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KSBsaWtlIHRoZSAnZnVsbCcgcGF5bG9hZDogYSBjb21wYWN0XG4gICAqIHJvdyBpcyBrZXB0IG9ubHkgd2hlcmUgdGhlIGJ1bmRsZSBwcm92YWJseSBmb2xkcyBiYWNrLCBhbmQgYSBmYW1pbHkgdGhhdFxuICAgKiBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBTbyBib3RoIGVuY29kaW5ncyBjb21taXQgdGhlXG4gICAqIHZhbHVlIHRoZSBzdGFnZSByZWFkOyBiZWZvcmUgOS4zMC4wIHRoZXkgc2hhcmVkIGEgcmVwbGF5IHRoYXQgZGlkIG5vdFxuICAgKiAoYHJlcGxheVBhdGhWZXJic2AgLyBgcmVwbGF5RmFtaWx5VmVyYnNgLCBkZWxldGVkKS5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKTogUm93cyB7XG4gICAgY29uc3QgZnVsbFZhbHVlQXQgPSB0aGlzLmZ1bGxSb3dzVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5hZG1pdCgobG9zc3kpID0+IHRoaXMuZGVsdGFSb3dzKGxvc3N5LCBmdWxsVmFsdWVBdCkpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWx0YSByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBkZWx0YVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkLCBmdWxsVmFsdWVBdDogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93bik6IFJvd3Mge1xuICAgIGNvbnN0IHJvd3M6IFJvd3MgPSB7IG92ZXJ3cml0ZToge30sIHVwZGF0ZXM6IHt9LCB0cmFjZTogW10gfTtcbiAgICBjb25zdCB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UgfSA9IHJvd3M7XG4gICAgY29uc3QgaW5Mb3NzeSA9IChwYXRoOiBzdHJpbmcpID0+IGxvc3N5Py5mYW1pbGllcy5oYXMobG9zc3kucm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpID09PSB0cnVlO1xuICAgIGNvbnN0IHN1cnZpdm9ycyA9IHRoaXMubmV0Q2hhbmdlU3Vydml2b3JzKHRoaXMub3BzQnlQYXRoKCkpLmZpbHRlcigocykgPT4gIWluTG9zc3kocy5wYXRoKSk7XG4gICAgY29uc3QgeyByb290T2YsIGJ5Um9vdCB9ID0gZ3JvdXBJbnRvRmFtaWxpZXMoc3Vydml2b3JzLCBuZXcgU2V0KHN1cnZpdm9ycy5tYXAoKHMpID0+IHMucGF0aCkpKTtcblxuICAgIC8vIFRIRSBWRVJCIENIT0lDRSDigJQgdGhlIGRlbHRhIGVuY29kZXIgcGlja3MgYSB2ZXJiIHBlciBwYXRoOyB0aGUgVkFMVUVTXG4gICAgLy8gaXQgZW5jb2RlcyBjb21lIGZyb20gdGhlIG9uZSByZXBsYXkgKGBmdWxsVmFsdWVBdGApLCBuZXZlciBhIHJlcGxpY2Egb2ZcbiAgICAvLyB0aGUgdmVyYiBsYXcgKDkuMzAuMDogQ0xBVURFLm1kJ3MgdmVyYi1zd2l0Y2ggcmVwbGljYXMgbG9zdCB0d28gaGVyZSkuXG4gICAgY29uc3QgZW1pdCA9IChzOiBTdXJ2aXZvcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBzZWdtZW50cywgdmVyYnMsIGJlZm9yZSB9ID0gcztcbiAgICAgIGNvbnN0IHByb3YgPSBwcm92ZW5hbmNlKHMucmVhZEtleXMpO1xuICAgICAgaWYgKChieVJvb3QuZ2V0KHJvb3RPZi5nZXQocGF0aCkgYXMgc3RyaW5nKSBhcyBTdXJ2aXZvcltdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJ1bGUgMyDigJQgb25lIGNvaGVyZW50IHRyZWU6IGV2ZXJ5IG1lbWJlciBhIHNldCBvZiBpdHMgdmFsdWUuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoZnVsbFZhbHVlQXQoc2VnbWVudHMpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RWZXJiID0gdmVyYnNbdmVyYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdFZlcmIgPT09ICdkZWxldGUnICYmIHMuYWZ0ZXIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlbGV0ZVJlcGxheXNBc0ZsYXR0ZW5pbmcoc2VnbWVudHMpKSB7XG4gICAgICAgIC8vIFJlYWwgZGVsZXRpb24g4oCUIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuIEtlZXAgdGhlIHBhdGggZW51bWVyYXRlZFxuICAgICAgICAvLyBpbiBgb3ZlcndyaXRlYCAodW5kZWZpbmVkKSBzbyBPYmplY3Qua2V5cyBjb25zdW1lcnMgc2VlIGl0LlxuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ2RlbGV0ZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAodmVyYnMuZXZlcnkoKHYpID0+IHYgPT09ICdtZXJnZScpKSB7XG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnbWVyZ2UnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hWYWx1ZVJvdyhyb3dzLCBwYXRoLCBzZWdtZW50cywgYmVmb3JlLCBmdWxsVmFsdWVBdChzZWdtZW50cyksIHByb3YsIHRoaXMubWFya2VkQmVsb3cocGF0aCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGZhbWlseSB0aGF0IGRpZCBub3QgZm9sZCBiYWNrIHRha2VzIGl0cyBwbGFjZSBieSBpdHMgbGFzdCB0b3VjaC5cbiAgICBjb25zdCBwZW5kaW5nID0gbG9zc3kgPT09IHVuZGVmaW5lZCA/IFtdIDogWy4uLmxvc3N5LmZhbWlsaWVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBhLnNsb3QgLSBiLnNsb3QpO1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBjb25zdCBmbHVzaEJlZm9yZSA9ICh0b3VjaDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB3aGlsZSAobmV4dCA8IHBlbmRpbmcubGVuZ3RoICYmIHBlbmRpbmdbbmV4dF0uc2xvdCA8IHRvdWNoKSB0aGlzLmVtaXRSZWFkQmFjayhwZW5kaW5nW25leHQrK10sIHJvd3MsICdkZWx0YScpO1xuICAgIH07XG4gICAgZW1pdEluRmFtaWx5T3JkZXIoc3Vydml2b3JzLCByb290T2YsIGJ5Um9vdCwgZW1pdCwgZmx1c2hCZWZvcmUpO1xuICAgIGZsdXNoQmVmb3JlKEluZmluaXR5KTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgYWRtaXR0ZWQgcmVjb3JkICg5LjMwLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUSEUgQURNSVNTSU9OIOKAlCBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGVcbiAgICogc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZC4gYGJ1aWxkYFxuICAgKiBsYXlzIHRoZSByb3dzIG91dCAob25lIGVuY29kZXI6IGAnZnVsbCdgIG9yIGAnZGVsdGEnYCk7IHRoZSBjYW5kaWRhdGUgaXNcbiAgICogY2hlY2tlZCAoe0BsaW5rIGxvc3N5RmFtaWxpZXN9KSwgYW5kIHdoZW4gc29tZSBmYW1pbHkncyByb3dzIGRvIG5vdCBmb2xkXG4gICAqIGJhY2sgdGhlIHJvd3MgYXJlIGxhaWQgb3V0IGFnYWluIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZVxuICAgKiBzdGFnZSByZWFkICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkg4oCUIGV2ZXJ5IG90aGVyIGZhbWlseSdzIGJ5dGVzIGV4YWN0bHkgYXNcbiAgICogdGhlIGZpcnN0IGxheW91dCBtYWRlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KGJ1aWxkOiAobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKSA9PiBSb3dzKTogUm93cyB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYnVpbGQodW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb3NzeSA9IHRoaXMubG9zc3lGYW1pbGllcyhjYW5kaWRhdGUpO1xuICAgIHJldHVybiBsb3NzeSA9PT0gdW5kZWZpbmVkID8gY2FuZGlkYXRlIDogYnVpbGQobG9zc3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYW1pbGllcyB3aG9zZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGUgc3RhZ2UgcmVhZCDigJRcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAoYGFkbWlzc2lvbi50cyDCtyBsb3NzeUZhbWlsaWVzYDogdGhlXG4gICAqIGNhbmRpZGF0ZSByZXBsYXllZCBvbnRvIHRoZSBkaWZmIGJhc2UgYnkgYGRyeUZvbGRgLCBldmVyeSBmYW1pbHkgb2ZcbiAgICogdG91Y2hlZCBwYXRocyBjb21wYXJlZCB3aXRoIHRoZSB3b3JraW5nIGNvcHkgYXQgaXRzIHJvb3QgYW5kIG9uIHRoZSB3YXlcbiAgICogZG93biB0byBpdCkuXG4gICAqXG4gICAqIFdpdGhvdXQgYSBmb2xkLCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wOiBpdHNcbiAgICogcm93cyBhcmUgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyIGl0cyBhZGRyZXNzLCBlYWNoXG4gICAqIHdyaXRpbmcgdGhlIFNBTUUgdmFsdWUgaW50byBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIOKAlCB0aGVcbiAgICogcmVjb3JkIGlzIHRoZSByZWFkLWJhY2sgYnkgY29uc3RydWN0aW9uICh0aGUgcHJvcGVydHkncyBST09ULU9OTFkgYXJtXG4gICAqIHBpbnMgdGhpcykuIFRoYXQga2VlcHMgdGhlIGNvbW1pdCBvZiB0aGUgdHlwZWQgc2NvcGUncyByb290LWtleSB3cml0ZXNcbiAgICogZXhhY3RseSBhcyBjaGVhcCBhcyBpdCB3YXMuXG4gICAqL1xuICBwcml2YXRlIGxvc3N5RmFtaWxpZXMoY2FuZGlkYXRlOiBSb3dzKTogTG9zc3kgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN0YWdlZE1lcmdlcyA9PT0gMCAmJiB0aGlzLm5lc3RlZE9wcyA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbG9zc3lGYW1pbGllcyhjYW5kaWRhdGUsIHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLndvcmtpbmdDb3B5LCB0aGlzLm9wVHJhY2UsIHRoaXMuYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYW1pbHkgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkOlxuICAgKiBvbmUgYHNldGAgcm93IHBlciBtZW1iZXIgdGhhdCBjaGFuZ2VkIChkZXNjZW5kYW50cyBieSBsYXN0IHRvdWNoLCBlYWNoXG4gICAqIHdpdGggaXRzIG93biByZWFkIHByZWZpeCksIHRoZSBST09UIGxhc3QsIGFuZCB0aGUgcm9vdCdzIHJlYWQtYmFjayB2YWx1ZVxuICAgKiBpbiBgb3ZlcndyaXRlYCDigJQgb25lIGNvaGVyZW50IHRyZWUsIHNvIG5vIHJvdyBjYW4gY2xvYmJlciBhbm90aGVyLiBUaGVcbiAgICogcm9vdCdzIHJvdyBpcyB3cml0dGVuIGV2ZW4gd2hlbiB0aGUgcm9vdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2U6IGl0IGlzIHRoZVxuICAgKiByb3cgdGhhdCBjYXJyaWVzIHRoZSBmYW1pbHkncyByZWFkLWJhY2sgKGFuZCB0aGUgY29udGFpbmVycyBMLTEncyBkcm9wcGVkXG4gICAqIG9wIGxlZnQpLiBBIGxvbmUgcm9vdCB1bmRlciBgJ2RlbHRhJ2Aga2VlcHMgdGhlIGNvbXBhY3QgYGFwcGVuZGAgd2hlbiB0aGVcbiAgICogdmFsdWUgaXQgcmVhZCBpcyBpdHMgYmFzZSBwbHVzIGEgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgZW1pdFJlYWRCYWNrKGZhbWlseTogRmFtaWx5LCByb3dzOiBSb3dzLCBlbmNvZGluZzogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIGxldCByb290OiBNZW1iZXIgPSBmYW1pbHkubWVtYmVyc1swXTtcbiAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGZhbWlseS5tZW1iZXJzKSB7XG4gICAgICBpZiAobS5wYXRoID09PSBmYW1pbHkucm9vdCkge1xuICAgICAgICByb290ID0gbTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShtLnBhdGguc3BsaXQoREVMSU0pKSkgY29udGludWU7XG4gICAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoOiBtLnBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKG0ucmVhZEtleXMpIH0pO1xuICAgICAgY2hhbmdlZCsrO1xuICAgIH1cbiAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgaWYgKGVuY29kaW5nID09PSAnZGVsdGEnICYmIGNoYW5nZWQgPT09IDAgJiYgYWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgICBwdXNoVmFsdWVSb3coXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGZhbWlseS5yb290LFxuICAgICAgICBmYW1pbHkucm9vdFNlZ21lbnRzLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyLFxuICAgICAgICBwcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpLFxuICAgICAgICB0aGlzLm1hcmtlZEJlbG93KGZhbWlseS5yb290KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IGZhbWlseS5yb290LCB2ZXJiOiAnc2V0JywgLi4ucHJvdmVuYW5jZShyb290LnJlYWRLZXlzKSB9KTtcbiAgICAvLyBUaGUgY2xvbmUgdGhlIGNoZWNrIHRvb2sgKGBhZG1pc3Npb24udHMgwrcgZm9sZHNCYWNrYCksIHdoZW4gaXQgdG9vayBvbmUuXG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgZmFtaWx5LnJvb3RTZWdtZW50cywgZmFtaWx5LmhlbGQgIT09IHVuZGVmaW5lZCA/IGZhbWlseS5oZWxkLnZhbHVlIDogc3RydWN0dXJlZENsb25lKGFmdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgYSBwYXRoIOKAlCB3aGF0IHRoZSBkZWx0YSBlbmNvZGVyXG4gICAqIGNvbW1pdHMgZm9yIGEgZmFtaWx5IG1lbWJlciBvciBhIHBhdGggd2l0aCBhIGBzZXRgIOKAlCByZWFkIGZyb20gT05FXG4gICAqIHtAbGluayBkcnlGb2xkfSBvZiB0aG9zZSByb3dzIG92ZXIgdGhlIHBhdGNoIHRyZWVzIHRoZW1zZWx2ZXMsIHRha2VuIHRoZVxuICAgKiBmaXJzdCB0aW1lIGl0IGlzIGFza2VkLiBCeSByZWZlcmVuY2UsIGFzIHRoZSBzdGFnZSBoZWxkIHRoZW06IGFuIGVsZW1lbnRcbiAgICogYSBgc2V0YCBhbmQgYSBgbWVyZ2VgIG9mIG9uZSBwYXRoIHNoYXJlIHN0YXlzIG9uZSBlbGVtZW50LiBBIHN0YWdlIHRoYXRcbiAgICogc3RhZ2VkIG5vIGBtZXJnZWAgYW5kIG5vIG5lc3RlZCBvcCBuZWVkcyBubyBmb2xkIOKAlCBhIHBhdGgncyB2YWx1ZSBpcyBpdHNcbiAgICogbGFzdCBzdGFnZWQgdmFsdWUuIChCZWZvcmUgOS4zMC4wOiB0d28gcmVwbGljYXMgb2YgdGhlIHZlcmIgbGF3LFxuICAgKiBgcmVwbGF5UGF0aFZlcmJzYCBhbmQgYHJlcGxheUZhbWlseVZlcmJzYC4pXG4gICAqL1xuICBwcml2YXRlIGZ1bGxSb3dzVmFsdWUoKTogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93biB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gKHNlZ21lbnRzKSA9PiBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBsZXQgZm9sZDogdW5rbm93bjtcbiAgICByZXR1cm4gKHNlZ21lbnRzKSA9PiB7XG4gICAgICBmb2xkID8/PSBkcnlGb2xkKHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLnVwZGF0ZVBhdGNoLCB0aGlzLm92ZXJ3cml0ZVBhdGNoLCB0aGlzLmZ1bGxSb3dzKCkpO1xuICAgICAgcmV0dXJuIF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3M6IGV2ZXJ5IG9wIG9uIGEgcGF0aCB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIga2VlcHMsIGEgYGRlbGV0ZWAgc3BlbGxlZCBgc2V0YC4gKi9cbiAgcHJpdmF0ZSBmdWxsUm93cygpOiBUcmFjZUVudHJ5W10ge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCByb3dzOiBUcmFjZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgbGV0IGsgPSBrZWVwLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIGtlZXAuc2V0KG9wLnBhdGgsIChrID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKSkpO1xuICAgICAgaWYgKGspIHJvd3MucHVzaCh7IHBhdGg6IG9wLnBhdGgsIHZlcmI6IG9wLnZlcmIgPT09ICdtZXJnZScgPyAnbWVyZ2UnIDogJ3NldCcgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgc3RhZ2UgY2hhbmdlIHRoZSB2YWx1ZSBhdCBgc2VnbWVudHNgPyBCYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmVcbiAgICogZml4ZWQgYXQgY29tbWl0LCBzbyB0aGlzIGlzIHRoZSBPTkUgbmV0LWNoYW5nZSB2ZXJkaWN0IGJvdGggcGF5bG9hZFxuICAgKiBlbmNvZGluZ3MgYXBwbHkgKGEgbm8tb3Agd3JpdGUgYW5kIGEgd3JpdGUtdGhlbi1yZXZlcnQgYm90aCBmYWlsIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbChfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyksIF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgKyByZS1pbnNlcnRcbiAgICogbW92ZXMgYSByZS10b3VjaGVkIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgTWFwJ3MgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICAgKiBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocykuIFBlci13cml0ZVxuICAgKiBwcm92ZW5hbmNlICgjUDEpOiB0aGUgTEFTVCBvcCdzIHJlYWRLZXlzIGlzIGtlcHQg4oCUIHJlYWQgcHJlZml4ZXMgb25seSBncm93XG4gICAqIHdpdGhpbiBhIHN0YWdlLCBzbyBsYXN0ID09IHVuaW9uIGFjcm9zcyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgb3BzQnlQYXRoKCk6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnZlcmJzLnB1c2gob3AudmVyYik7XG4gICAgICAgIHByZXYubGFzdCA9IGk7XG4gICAgICAgIGlmIChvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkKSBwcmV2LnJlYWRLZXlzID0gb3AucmVhZEtleXM7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIHtcbiAgICAgICAgICB2ZXJiczogW29wLnZlcmJdLFxuICAgICAgICAgIGxhc3Q6IGksXG4gICAgICAgICAgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciDigJQgaWRlbnRpY2FsIHRvICdmdWxsJyAoe0BsaW5rIGNoYW5nZWRTaW5jZUJhc2V9KS4gU3Vydml2b3JzIGtlZXAgbGFzdC10b3VjaCBvcmRlci4gKi9cbiAgcHJpdmF0ZSBuZXRDaGFuZ2VTdXJ2aXZvcnMoYnlQYXRoOiBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KTogU3Vydml2b3JbXSB7XG4gICAgY29uc3Qgc3Vydml2b3JzOiBTdXJ2aXZvcltdID0gW107XG4gICAgZm9yIChjb25zdCBbcGF0aCwgeyB2ZXJicywgcmVhZEtleXMsIGxhc3QgfV0gb2YgYnlQYXRoKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgaWYgKCF0aGlzLmNoYW5nZWRTaW5jZUJhc2Uoc2VnbWVudHMpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBzdXJ2aXZvcnMucHVzaCh7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgcmVhZEtleXMsIGxhc3QsIGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdXJ2aXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGEgc3RhZ2VkIGBkZWxldGVgIGF0IHRoaXMgcGF0aCBjb21taXQgYXMgdGhlIGAnZGVsZXRlJ2AgdmVyYj9cbiAgICpcbiAgICogT25seSB3aGVuIHJlbW92aW5nIHRoZSBrZXkgYW5kIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgZmxhdHRlbmluZyAoYF9zZXRgIG9mXG4gICAqIGB1bmRlZmluZWRgKSBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLiBUaGV5IGRpdmVyZ2Ugd2hlbiB0aGUgcGFyZW50IGlzIG5vdFxuICAgKiBhIGNvbnRhaW5lcjogYG5hdGl2ZURlbGV0ZWAgd2Fsa3MgYXdheSB1bnRvdWNoZWQsIHdoaWxlIGBuYXRpdmVTZXRgXG4gICAqIENPRVJDRVMgdGhlIHByaW1pdGl2ZSBwYXJlbnQgaW50byBhbiBvYmplY3QgdG8gaG9sZCB0aGUga2V5LiBDb21taXR0aW5nXG4gICAqIGBkZWxldGVgIHRoZXJlIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBzdGF0ZSBjaGFuZ2UgdGhlIHN0YWdlIHJlYWxseSBtYWRlLFxuICAgKiBzbyB0aG9zZSAocGF0aG9sb2dpY2FsKSBkZWxldGVzIGtlZXAgdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgLy8gcGFyZW50IGlzIHRoZSBzdGF0ZSByb290IOKAlCBhbHdheXMgYSBjb250YWluZXJcbiAgICBjb25zdCBwYXJlbnQgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cy5zbGljZSgwLCAtMSkpO1xuICAgIHJldHVybiBwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCc7XG4gIH1cbn1cblxuLyoqXG4gKiBIaXN0b3JpY2FsIGZsYXR0ZW5pbmcgZm9yIHRoZSBgJ2Z1bGwnYCBwYXlsb2FkOiBhbiBleHBsaWNpdCBkZWxldGUgY29tbWl0c1xuICogYXMgc2V0LW9mLXVuZGVmaW5lZC4gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSkgcmlkZXMgZWFjaCBzdXJ2aXZpbmcgZW50cnlcbiAqIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbmVkVHJhY2VSb3cob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IFRyYWNlRW50cnkge1xuICByZXR1cm4gb3AudmVyYiA9PT0gJ2RlbGV0ZSdcbiAgICA/IHsgcGF0aDogb3AucGF0aCwgdmVyYjogJ3NldCcgYXMgY29uc3QsIC4uLihvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZEtleXM6IG9wLnJlYWRLZXlzIH0pIH1cbiAgICA6IG9wO1xufVxuXG4vKiogQSByb3cncyBgcmVhZEtleXNgIGZyYWdtZW50IOKAlCBhYnNlbnQgdW5sZXNzIHRoZSBwcm92ZW5hbmNlIGRpYWwgcmVjb3JkZWQgb25lICgjUDEpLiAqL1xuZnVuY3Rpb24gcHJvdmVuYW5jZShyZWFkS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IHJlYWRLZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlYWRLZXlzICE9PSB1bmRlZmluZWQgPyB7IHJlYWRLZXlzIH0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
package/dist/lib/memory/utils.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
|
|
13
13
|
* The log's scrub, `redactPatch`, moved to its owner `redaction.ts` in 9.33.0.
|
|
14
14
|
* The writers take an ADDRESS, a path prefix their caller computed, and never
|
|
15
|
-
* name one (C2: the engine decides where a stage writes, `StageContext ·
|
|
15
|
+
* name one (C2: the engine decides where a stage writes, `StageContext.ts · runAddress`).
|
|
16
16
|
* Zero external dependencies.
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -36,7 +36,7 @@ Object.defineProperty(exports, "supersededByNextSet", { enumerable: true, get: f
|
|
|
36
36
|
* The two places a value at `path` can sit: under `address` (`runPath`, absent
|
|
37
37
|
* for the root address `[]`) and at the root (`globalPath`). `address` is a
|
|
38
38
|
* path prefix the caller computed — for the engine, a frame's run namespace
|
|
39
|
-
* (`StageContext ·
|
|
39
|
+
* (`StageContext.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
|
|
40
40
|
*/
|
|
41
41
|
function getRunAndGlobalPaths(address = [], path = []) {
|
|
42
42
|
return {
|
|
@@ -147,4 +147,4 @@ function getNestedValue(root, path, field) {
|
|
|
147
147
|
return undefined;
|
|
148
148
|
}
|
|
149
149
|
exports.getNestedValue = getNestedValue;
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBdUY7QUFJdkYsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7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UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIHRvIGl0cyBvd25lciBgcmVkYWN0aW9uLnRzYCBpbiA5LjMzLjAuXG4gKiBUaGUgd3JpdGVycyB0YWtlIGFuIEFERFJFU1MsIGEgcGF0aCBwcmVmaXggdGhlaXIgY2FsbGVyIGNvbXB1dGVkLCBhbmQgbmV2ZXJcbiAqIG5hbWUgb25lIChDMjogdGhlIGVuZ2luZSBkZWNpZGVzIHdoZXJlIGEgc3RhZ2Ugd3JpdGVzLCBgU3RhZ2VDb250ZXh0IMK3IGFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVIYXMgYXMgX2hhcywgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYFN0YWdlQ29udGV4dCDCtyBhZGRyZXNzYCwgQzIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdKSB7XG4gIHJldHVybiB7XG4gICAgcnVuUGF0aDogYWRkcmVzc09mKGFkZHJlc3MpLmxlbmd0aCA+IDAgPyBwYXRoVW5kZXIoYWRkcmVzcywgcGF0aCkgOiB1bmRlZmluZWQsXG4gICAgZ2xvYmFsUGF0aDogWy4uLnBhdGhdLFxuICB9O1xufVxuXG4vKiogQW4gYWRkcmVzcyBpcyBhbiBhcnJheS4gQSBydW4gaWQgc3RpbGwgcGFzc2VkIGluIGl0cyBwbGFjZSAoQzIpIGlzIHJlZnVzZWQsIG5ldmVyIHNwcmVhZCBpbnRvIGl0cyBjaGFyYWN0ZXJzLiAqL1xuZnVuY3Rpb24gYWRkcmVzc09mKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShhZGRyZXNzKSkgcmV0dXJuIGFkZHJlc3M7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgYGZvb3RwcmludGpzOiBhbiBhZGRyZXNzIGlzIGFuIGFycmF5IHBhdGggcHJlZml4LCBnb3QgJHthZGRyZXNzID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGFkZHJlc3N9YCxcbiAgKTtcbn1cblxuLyoqXG4gKiBgYWRkcmVzc2AgdGhlbiBgcGF0aGAsIGFzIG9uZSBuZXcgYXJyYXkuIEFuIGluZGV4IGxvb3AsIGJlY2F1c2UgdGhlIGRvdWJsZVxuICogc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aF1gIGNvc3RzIHR3aWNlIGFzIG11Y2ggYW5kIGEgZnJhbWUgYnVpbGRzIG9uZSBvblxuICogZXZlcnkgcmVhZCBpdCBzZXJ2ZXMgZnJvbSBsaXZlIHN0YXRlIChhIGZvcmsgY2hpbGQgcmVhZGluZyBhIHJvb3Qga2V5KS5cbiAqL1xuZnVuY3Rpb24gcGF0aFVuZGVyKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmcgfCBudW1iZXI+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgb3V0W2FkZHJlc3MubGVuZ3RoICsgaV0gPSBwYXRoW2ldO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRoZSBjb250YWluZXIgYXQgYGFkZHJlc3NgICsgYHBhdGhgIGluc2lkZSBgb2JqYCwgZWFjaCBtaXNzaW5nIG9uZSBjcmVhdGVkXG4gKiBvbiB0aGUgd2F5OiB0aGUgb25lIEFUIHRoZSBhZGRyZXNzIGZyb20gYGRlZmF1bHRWYWx1ZXNgIHdoZW4gZ2l2ZW4sIGV2ZXJ5XG4gKiBvdGhlciBvbmUgZW1wdHkuIFRoZSBvbmUgd2FsayBib3RoIG5lc3RlZCB3cml0ZXJzIHNoYXJlLlxuICovXG5mdW5jdGlvbiBjb250YWluZXJBdChcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGhVbmRlcihhZGRyZXNzT2YoYWRkcmVzcyksIHBhdGgpO1xuICBsZXQgY3VycmVudCA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHNlZ21lbnRzW2ldO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IGkgPT09IGFkZHJlc3MubGVuZ3RoIC0gMSAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vKipcbiAqIFNldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHVuZGVyIGBhZGRyZXNzYCwgY3JlYXRpbmcgaW50ZXJtZWRpYXRlIG9iamVjdHMgYXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkVmFsdWU8VD4oXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcGF0aDogc3RyaW5nW10sXG4gIGZpZWxkOiBzdHJpbmcsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnRhaW5lckF0KG9iaiwgYWRkcmVzcywgcGF0aCwgZGVmYXVsdFZhbHVlcylbZmllbGRdID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRGVlcC1tZXJnZXMgYSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AuXG4gKiAtIEFycmF5czogY29uY2F0ZW5hdGVcbiAqIC0gT2JqZWN0czogc2hhbGxvdyBtZXJnZSBhdCBlYWNoIGxldmVsXG4gKiAtIFByaW1pdGl2ZXM6IHJlcGxhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IGFueSxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIGZpZWxkOiBzdHJpbmcgfCBudW1iZXIsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IGFueSB7XG4gIHVwZGF0ZVZhbHVlKGNvbnRhaW5lckF0KG9iaiwgYWRkcmVzcywgcGF0aCwgZGVmYXVsdFZhbHVlcyksIGZpZWxkLCB2YWx1ZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSW4tcGxhY2UgdmFsdWUgdXBkYXRlIHdpdGggbWVyZ2Ugc2VtYW50aWNzLlxuICogLSBBcnJheXMgKG5vbi1lbXB0eSk6IGNvbmNhdGVuYXRlIG9udG8gZXhpc3RpbmdcbiAqIC0gQXJyYXlzIChlbXB0eSk6ICAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBgW11gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gT2JqZWN0cyAobm9uLWVtcHR5KTogc2hhbGxvdyBtZXJnZSAoc3ByZWFkKVxuICogLSBPYmplY3RzIChlbXB0eSk6ICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGB7fWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBQcmltaXRpdmVzOiBkaXJlY3QgYXNzaWdubWVudFxuICpcbiAqIE5vdGUgb24gZW1wdHkgYXJyYXlzOiBib3RoIGB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKWAgYW5kXG4gKiBgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGV2YWx1YXRlIHRoZSBzYW1lIGZvciBhcnJheXMg4oCUIGBbXWAgaXMgdHJ1dGh5IGluXG4gKiBKYXZhU2NyaXB0LCBzbyB0aGUgYCYmYCBndWFyZCB3YXMgbmV2ZXIgdGhlIGlzc3VlLiBUaGUgYWN0dWFsIGJ1ZyB3YXMgdGhlXG4gKiBjb25jYXQgcGF0aDogYFsuLi5jdXIsIC4uLltdXWAgc2lsZW50bHkgcmV0dXJuZWQgYGN1cmAgdW5jaGFuZ2VkIHdoZW4gYHZhbHVlYFxuICogd2FzIGBbXWAsIG1ha2luZyBgdXBkYXRlVmFsdWUob2JqLCAndGFncycsIFtdKWAgYSBuby1vcCBpbnN0ZWFkIG9mIGEgY2xlYXIuXG4gKiBUaGUgZml4IGlzIHRoZSBleHBsaWNpdCBgdmFsdWUubGVuZ3RoID09PSAwYCBlYXJseS1yZXR1cm4gYnJhbmNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmFsdWUob2JqZWN0OiBhbnksIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7IC8vIGNsZWFyOiBbXSByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogWy4uLmN1ciwgLi4udmFsdWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogeyAuLi5jdXIsIC4uLnZhbHVlIH07XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHdpdGggcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUocm9vdDogYW55LCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZD86IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoICYmIHBhdGgubGVuZ3RoID4gMCA/IF9nZXQocm9vdCwgcGF0aCkgOiByb290O1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSB1bmRlZmluZWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGZpZWxkKSkge1xuICAgIHJldHVybiBub2RlW2ZpZWxkXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBdUY7QUFJdkYsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsU0FBUyxDQUFDLE9BQTBCLEVBQUUsSUFBa0M7SUFDL0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQWtCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFdBQVcsQ0FDbEIsR0FBaUIsRUFDakIsVUFBNkIsRUFBRSxFQUMvQixPQUFxQyxFQUFFLEVBQ3ZDLGFBQXVCO0lBRXZCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckQsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hGLENBQUM7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlCLEVBQ2pCLE9BQTBCLEVBQzFCLElBQWMsRUFDZCxLQUFhLEVBQ2IsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBVkQsd0NBVUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixHQUFRLEVBQ1IsT0FBMEIsRUFDMUIsSUFBeUIsRUFDekIsS0FBc0IsRUFDdEIsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQVZELDhDQVVDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFnQixXQUFXLENBQUMsTUFBVyxFQUFFLEdBQW9CLEVBQUUsS0FBVTtJQUN2RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLHdDQUF3QztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQVEsQ0FBQztZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ2pFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0FBQ0gsQ0FBQztBQWRELGtDQWNDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQUMsSUFBUyxFQUFFLElBQXlCLEVBQUUsS0FBdUI7SUFDMUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIHRvIGl0cyBvd25lciBgcmVkYWN0aW9uLnRzYCBpbiA5LjMzLjAuXG4gKiBUaGUgd3JpdGVycyB0YWtlIGFuIEFERFJFU1MsIGEgcGF0aCBwcmVmaXggdGhlaXIgY2FsbGVyIGNvbXB1dGVkLCBhbmQgbmV2ZXJcbiAqIG5hbWUgb25lIChDMjogdGhlIGVuZ2luZSBkZWNpZGVzIHdoZXJlIGEgc3RhZ2Ugd3JpdGVzLCBgU3RhZ2VDb250ZXh0LnRzIMK3IHJ1bkFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVIYXMgYXMgX2hhcywgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYFN0YWdlQ29udGV4dC50cyDCtyBydW5BZGRyZXNzYCwgQzIpLCBoZWxkIGJ5IGl0cyByZWNvcmQgZnJhbWUgKGBSZWNvcmRGcmFtZSDCtyBhZGRyZXNzYCwgQzMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdKSB7XG4gIHJldHVybiB7XG4gICAgcnVuUGF0aDogYWRkcmVzc09mKGFkZHJlc3MpLmxlbmd0aCA+IDAgPyBwYXRoVW5kZXIoYWRkcmVzcywgcGF0aCkgOiB1bmRlZmluZWQsXG4gICAgZ2xvYmFsUGF0aDogWy4uLnBhdGhdLFxuICB9O1xufVxuXG4vKiogQW4gYWRkcmVzcyBpcyBhbiBhcnJheS4gQSBydW4gaWQgc3RpbGwgcGFzc2VkIGluIGl0cyBwbGFjZSAoQzIpIGlzIHJlZnVzZWQsIG5ldmVyIHNwcmVhZCBpbnRvIGl0cyBjaGFyYWN0ZXJzLiAqL1xuZnVuY3Rpb24gYWRkcmVzc09mKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShhZGRyZXNzKSkgcmV0dXJuIGFkZHJlc3M7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgYGZvb3RwcmludGpzOiBhbiBhZGRyZXNzIGlzIGFuIGFycmF5IHBhdGggcHJlZml4LCBnb3QgJHthZGRyZXNzID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGFkZHJlc3N9YCxcbiAgKTtcbn1cblxuLyoqXG4gKiBgYWRkcmVzc2AgdGhlbiBgcGF0aGAsIGFzIG9uZSBuZXcgYXJyYXkuIEFuIGluZGV4IGxvb3AsIGJlY2F1c2UgdGhlIGRvdWJsZVxuICogc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aF1gIGNvc3RzIHR3aWNlIGFzIG11Y2ggYW5kIGEgZnJhbWUgYnVpbGRzIG9uZSBvblxuICogZXZlcnkgcmVhZCBpdCBzZXJ2ZXMgZnJvbSBsaXZlIHN0YXRlIChhIGZvcmsgY2hpbGQgcmVhZGluZyBhIHJvb3Qga2V5KS5cbiAqL1xuZnVuY3Rpb24gcGF0aFVuZGVyKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmcgfCBudW1iZXI+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgb3V0W2FkZHJlc3MubGVuZ3RoICsgaV0gPSBwYXRoW2ldO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRoZSBjb250YWluZXIgYXQgYGFkZHJlc3NgICsgYHBhdGhgIGluc2lkZSBgb2JqYCwgZWFjaCBtaXNzaW5nIG9uZSBjcmVhdGVkXG4gKiBvbiB0aGUgd2F5OiB0aGUgb25lIEFUIHRoZSBhZGRyZXNzIGZyb20gYGRlZmF1bHRWYWx1ZXNgIHdoZW4gZ2l2ZW4sIGV2ZXJ5XG4gKiBvdGhlciBvbmUgZW1wdHkuIFRoZSBvbmUgd2FsayBib3RoIG5lc3RlZCB3cml0ZXJzIHNoYXJlLlxuICovXG5mdW5jdGlvbiBjb250YWluZXJBdChcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGhVbmRlcihhZGRyZXNzT2YoYWRkcmVzcyksIHBhdGgpO1xuICBsZXQgY3VycmVudCA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHNlZ21lbnRzW2ldO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IGkgPT09IGFkZHJlc3MubGVuZ3RoIC0gMSAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vKipcbiAqIFNldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHVuZGVyIGBhZGRyZXNzYCwgY3JlYXRpbmcgaW50ZXJtZWRpYXRlIG9iamVjdHMgYXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkVmFsdWU8VD4oXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcGF0aDogc3RyaW5nW10sXG4gIGZpZWxkOiBzdHJpbmcsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnRhaW5lckF0KG9iaiwgYWRkcmVzcywgcGF0aCwgZGVmYXVsdFZhbHVlcylbZmllbGRdID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRGVlcC1tZXJnZXMgYSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AuXG4gKiAtIEFycmF5czogY29uY2F0ZW5hdGVcbiAqIC0gT2JqZWN0czogc2hhbGxvdyBtZXJnZSBhdCBlYWNoIGxldmVsXG4gKiAtIFByaW1pdGl2ZXM6IHJlcGxhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IGFueSxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIGZpZWxkOiBzdHJpbmcgfCBudW1iZXIsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IGFueSB7XG4gIHVwZGF0ZVZhbHVlKGNvbnRhaW5lckF0KG9iaiwgYWRkcmVzcywgcGF0aCwgZGVmYXVsdFZhbHVlcyksIGZpZWxkLCB2YWx1ZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSW4tcGxhY2UgdmFsdWUgdXBkYXRlIHdpdGggbWVyZ2Ugc2VtYW50aWNzLlxuICogLSBBcnJheXMgKG5vbi1lbXB0eSk6IGNvbmNhdGVuYXRlIG9udG8gZXhpc3RpbmdcbiAqIC0gQXJyYXlzIChlbXB0eSk6ICAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBgW11gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gT2JqZWN0cyAobm9uLWVtcHR5KTogc2hhbGxvdyBtZXJnZSAoc3ByZWFkKVxuICogLSBPYmplY3RzIChlbXB0eSk6ICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGB7fWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBQcmltaXRpdmVzOiBkaXJlY3QgYXNzaWdubWVudFxuICpcbiAqIE5vdGUgb24gZW1wdHkgYXJyYXlzOiBib3RoIGB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKWAgYW5kXG4gKiBgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGV2YWx1YXRlIHRoZSBzYW1lIGZvciBhcnJheXMg4oCUIGBbXWAgaXMgdHJ1dGh5IGluXG4gKiBKYXZhU2NyaXB0LCBzbyB0aGUgYCYmYCBndWFyZCB3YXMgbmV2ZXIgdGhlIGlzc3VlLiBUaGUgYWN0dWFsIGJ1ZyB3YXMgdGhlXG4gKiBjb25jYXQgcGF0aDogYFsuLi5jdXIsIC4uLltdXWAgc2lsZW50bHkgcmV0dXJuZWQgYGN1cmAgdW5jaGFuZ2VkIHdoZW4gYHZhbHVlYFxuICogd2FzIGBbXWAsIG1ha2luZyBgdXBkYXRlVmFsdWUob2JqLCAndGFncycsIFtdKWAgYSBuby1vcCBpbnN0ZWFkIG9mIGEgY2xlYXIuXG4gKiBUaGUgZml4IGlzIHRoZSBleHBsaWNpdCBgdmFsdWUubGVuZ3RoID09PSAwYCBlYXJseS1yZXR1cm4gYnJhbmNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmFsdWUob2JqZWN0OiBhbnksIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7IC8vIGNsZWFyOiBbXSByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogWy4uLmN1ciwgLi4udmFsdWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogeyAuLi5jdXIsIC4uLnZhbHVlIH07XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHdpdGggcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUocm9vdDogYW55LCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZD86IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoICYmIHBhdGgubGVuZ3RoID4gMCA/IF9nZXQocm9vdCwgcGF0aCkgOiByb290O1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSB1bmRlZmluZWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGZpZWxkKSkge1xuICAgIHJldHVybiBub2RlW2ZpZWxkXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* path inside the value I read, put this". The value it read is BORROWED —
|
|
7
7
|
* before a stage's first staged write it is a bare reference into committed
|
|
8
8
|
* shared memory, and committed state is immutable-after-swap (see
|
|
9
|
-
* `
|
|
9
|
+
* `RecordFrame · firstTouch`). Editing it in place would corrupt every
|
|
10
10
|
* in-flight stage AND leave the commit log with nothing to record.
|
|
11
11
|
*
|
|
12
12
|
* So the write path never mutates. It COPIES the containers along the path
|
|
@@ -106,4 +106,4 @@ function deleteInPath(root, segments) {
|
|
|
106
106
|
return copy;
|
|
107
107
|
}
|
|
108
108
|
exports.deleteInPath = deleteInPath;
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJhbFdyaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWFjdGl2ZS9zdHJ1Y3R1cmFsV3JpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7O0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUgseUZBQXlGO0FBQ3pGLFNBQVMsYUFBYSxDQUFDLElBQWE7SUFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLEdBQUksSUFBZ0MsRUFBRSxDQUFDO0lBQy9GLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFNBQVMsT0FBTyxDQUFDLElBQWEsRUFBRSxPQUFlO0lBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLElBQWEsRUFBRSxRQUEyQixFQUFFLEtBQWM7SUFDbEYsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN4QyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBRSxJQUFnQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdGLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RCxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQzs7UUFDMUMsSUFBZ0MsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDM0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBVkQsOEJBVUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLElBQWEsRUFBRSxRQUEyQjtJQUNyRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksS0FBSyxJQUFLLElBQWtCLENBQUMsTUFBTTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNyRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUksSUFBa0IsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBSSxJQUFnQyxFQUFFLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUUsSUFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsSUFBZ0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1RyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLFFBQVEsS0FBSyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDOztRQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzlCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQXhCRCxvQ0F3QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL3N0cnVjdHVyYWxXcml0ZSAtLSBCdWlsZCB0aGUgTkVYVCB2YWx1ZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBsYXN0IG9uZS5cbiAqXG4gKiBFdmVyeSBkZWVwIHdyaXRlIHRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGhhcyB0aGUgc2FtZSBzaGFwZTogXCJhdCB0aGlzXG4gKiBwYXRoIGluc2lkZSB0aGUgdmFsdWUgSSByZWFkLCBwdXQgdGhpc1wiLiBUaGUgdmFsdWUgaXQgcmVhZCBpcyBCT1JST1dFRCDigJRcbiAqIGJlZm9yZSBhIHN0YWdlJ3MgZmlyc3Qgc3RhZ2VkIHdyaXRlIGl0IGlzIGEgYmFyZSByZWZlcmVuY2UgaW50byBjb21taXR0ZWRcbiAqIHNoYXJlZCBtZW1vcnksIGFuZCBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXAgKHNlZVxuICogYFJlY29yZEZyYW1lIMK3IGZpcnN0VG91Y2hgKS4gRWRpdGluZyBpdCBpbiBwbGFjZSB3b3VsZCBjb3JydXB0IGV2ZXJ5XG4gKiBpbi1mbGlnaHQgc3RhZ2UgQU5EIGxlYXZlIHRoZSBjb21taXQgbG9nIHdpdGggbm90aGluZyB0byByZWNvcmQuXG4gKlxuICogU28gdGhlIHdyaXRlIHBhdGggbmV2ZXIgbXV0YXRlcy4gSXQgQ09QSUVTIHRoZSBjb250YWluZXJzIGFsb25nIHRoZSBwYXRoXG4gKiAoYW5kIG9ubHkgdGhvc2UpIGFuZCByZXR1cm5zIGEgbmV3IHJvb3QsIGxlYXZpbmcgZXZlcnkgdW50b3VjaGVkIHNpYmxpbmdcbiAqIHNoYXJlZCBieSByZWZlcmVuY2Ug4oCUIHRoZSBzYW1lIHplcm8tY2xvbmUgYmFyZ2FpbiB0aGUgZmlyc3QtdG91Y2ggdmlld1xuICogYWxyZWFkeSBtYWtlcy4gVGhlIGJ1ZmZlciBgc3RydWN0dXJlZENsb25lYHMgd2hhdCBpdCBzdGFnZXMsIHNvIHRoZVxuICogZGV0YWNoaW5nIGhhcHBlbnMgb25jZSwgYXQgdGhlIGJvdW5kYXJ5IHRoYXQgbmVlZHMgaXQuXG4gKi9cblxuLypcbiAqIFVudGlsIDkuMjQuMCB0aGlzIG1vZHVsZSBhbHNvIG93bmVkIGB1bndyYXBQcm94eWAsIGEgSlNPTiByb3VuZC10cmlwIG9mXG4gKiBldmVyeSBBU1NJR05FRCB2YWx1ZSDigJQgdGhlIG9ubHkgd2F5IHRoZW4gdG8ga2VlcCB0aGUgc2NvcGUncyBvd24gUHJveGllc1xuICogb3V0IG9mIHRoZSBidWZmZXIuIEl0IGNvc3QgYSBgRGF0ZWAgaXRzIHR5cGUgYW5kIGEgYE1hcGAgaXRzIG1lbWJlcnMsIGFuZFxuICogaXQgbWFkZSB0aGUgdHJhcCBhbmQgYCRzZXRWYWx1ZWAgc3RvcmUgZGlmZmVyZW50IGJ5dGVzIGZvciB0aGUgc2FtZSB2YWx1ZVxuICogKHRoZSBvbGQgbGFuZG1pbmUgMSkuIFRoZSBzY29wZSdzIGhhbmRsZXMgYXJlIHJlY29nbmlzZWQgbm93XG4gKiAoYGhhbmRsZXMudHMgwrcgdW53cmFwSGFuZGxlc2AsIE8oMSkgZWFjaCksIHNvIHRoZSBhc3NpZ25lZCB2YWx1ZSBnb2VzIHRvXG4gKiB0aGUgc2luayBBUyBBU1NJR05FRCBhbmQgdGhlIGJ1ZmZlcidzIGBzdHJ1Y3R1cmVkQ2xvbmVgIGF0IGNvbW1pdCBpcyB0aGVcbiAqIG9uZSBkZXRhY2hpbmcgc3RlcCDigJQgdGhlIHNhbWUgbGF3IGAkc2V0VmFsdWVgIGhhcyBhbHdheXMgaGFkLlxuICovXG5cbi8qKiBTaGFsbG93IGNvcHkgdGhhdCBwcmVzZXJ2ZXMgYXJyYXktbmVzcyDigJQgdGhlIG9uZSBjb250YWluZXIgY29weSB0aGlzIG1vZHVsZSBtYWtlcy4gKi9cbmZ1bmN0aW9uIGNvcHlDb250YWluZXIobm9kZTogdW5rbm93bik6IGFueSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSByZXR1cm4gWy4uLm5vZGVdO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpIHJldHVybiB7IC4uLihub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAvLyBOb3QgYSBjb250YWluZXIgKHByaW1pdGl2ZSwgbnVsbCwgdW5kZWZpbmVkKTogdGhlIHBhdGggY29udGludWVzIElOVE8gaXQsXG4gIC8vIHNvIGl0IGJlY29tZXMgYSBmcmVzaCBvYmplY3Qg4oCUIHRoZSBzYW1lIGNvZXJjaW9uIGBuYXRpdmVTZXRgIHBlcmZvcm1zLlxuICByZXR1cm4ge307XG59XG5cbi8qKiBBbiBhcnJheSBpbmRleCBzZWdtZW50LCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzZWdtZW50IG5hbWVzIGEgcHJvcGVydHkuICovXG5mdW5jdGlvbiBpbmRleE9mKG5vZGU6IHVua25vd24sIHNlZ21lbnQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShub2RlKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaSA9IE51bWJlcihzZWdtZW50KTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoaSkgJiYgaSA+PSAwID8gaSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBjb3B5IG9mIGByb290YCB3aXRoIGB2YWx1ZWAgYXQgYHNlZ21lbnRzYCwgbXV0YXRpbmcgbm90aGluZy5cbiAqXG4gKiBDb250YWluZXJzIG9uIHRoZSBwYXRoIGFyZSBzaGFsbG93LWNvcGllZCAoYXJyYXlzIHN0YXkgYXJyYXlzKTsgZXZlcnl0aGluZ1xuICogb2ZmIHRoZSBwYXRoIGlzIHNoYXJlZCBieSByZWZlcmVuY2UuIEFuIGVtcHR5IHBhdGggcmV0dXJucyBgdmFsdWVgIGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEluUGF0aChyb290OiB1bmtub3duLCBzZWdtZW50czogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgbmV4dCA9IGNvcHlDb250YWluZXIocm9vdCk7XG4gIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1swXTtcbiAgY29uc3QgaW5kZXggPSBpbmRleE9mKG5leHQsIHNlZ21lbnQpO1xuICBjb25zdCBjaGlsZCA9IGluZGV4ICE9PSB1bmRlZmluZWQgPyBuZXh0W2luZGV4XSA6IChuZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtzZWdtZW50XTtcbiAgY29uc3QgcmVwbGFjZWQgPSBzZXRJblBhdGgoY2hpbGQsIHNlZ21lbnRzLnNsaWNlKDEpLCB2YWx1ZSk7XG4gIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSBuZXh0W2luZGV4XSA9IHJlcGxhY2VkO1xuICBlbHNlIChuZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtzZWdtZW50XSA9IHJlcGxhY2VkO1xuICByZXR1cm4gbmV4dDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBjb3B5IG9mIGByb290YCB3aXRoIHRoZSBrZXkgYXQgYHNlZ21lbnRzYCBSRU1PVkVELCBtdXRhdGluZyBub3RoaW5nLlxuICpcbiAqIE9uIGFuIGFycmF5IHRoZSBzbG90IGlzIHJlbW92ZWQgd2l0aCBgc3BsaWNlYCAodGhlIGFycmF5IHNocmlua3Mg4oCUIGBkZWxldGVgXG4gKiBvbiBhbiBhcnJheSBpbmRleCB3b3VsZCBsZWF2ZSBhIGhvbGUsIHdoaWNoIGNhbm5vdCBzdXJ2aXZlXG4gKiBgc3RydWN0dXJlZENsb25lYCByb3VuZC10cmlwcyBhcyB0aGUgc2FtZSB2YWx1ZSkuIEEgcGF0aCB0aGF0IGRvZXMgbm90XG4gKiBleGlzdCByZXR1cm5zIHRoZSByb290IHVuY2hhbmdlZCwgYnkgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlSW5QYXRoKHJvb3Q6IHVua25vd24sIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSk6IHVua25vd24ge1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAocm9vdCA9PT0gbnVsbCB8fCB0eXBlb2Ygcm9vdCAhPT0gJ29iamVjdCcpIHJldHVybiByb290O1xuICBjb25zdCBzZWdtZW50ID0gc2VnbWVudHNbMF07XG4gIGNvbnN0IGluZGV4ID0gaW5kZXhPZihyb290LCBzZWdtZW50KTtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaW5kZXggPj0gKHJvb3QgYXMgdW5rbm93bltdKS5sZW5ndGgpIHJldHVybiByb290O1xuICAgICAgY29uc3QgY29weSA9IFsuLi4ocm9vdCBhcyB1bmtub3duW10pXTtcbiAgICAgIGNvcHkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyb290LCBzZWdtZW50KSkgcmV0dXJuIHJvb3Q7XG4gICAgY29uc3QgY29weSA9IHsgLi4uKHJvb3QgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgZGVsZXRlIGNvcHlbc2VnbWVudF07XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cbiAgY29uc3QgY2hpbGQgPSBpbmRleCAhPT0gdW5kZWZpbmVkID8gKHJvb3QgYXMgdW5rbm93bltdKVtpbmRleF0gOiAocm9vdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbc2VnbWVudF07XG4gIGNvbnN0IHJlcGxhY2VkID0gZGVsZXRlSW5QYXRoKGNoaWxkLCBzZWdtZW50cy5zbGljZSgxKSk7XG4gIGlmIChyZXBsYWNlZCA9PT0gY2hpbGQpIHJldHVybiByb290O1xuICBjb25zdCBjb3B5ID0gY29weUNvbnRhaW5lcihyb290KTtcbiAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIGNvcHlbaW5kZXhdID0gcmVwbGFjZWQ7XG4gIGVsc2UgY29weVtzZWdtZW50XSA9IHJlcGxhY2VkO1xuICByZXR1cm4gY29weTtcbn1cbiJdfQ==
|