footprintjs 9.44.1 → 9.44.2
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 +4 -3
- package/dist/esm/lib/capture/freeze.d.ts +51 -7
- package/dist/esm/lib/capture/freeze.js +289 -24
- package/dist/esm/lib/capture/valueKinds.d.ts +57 -0
- package/dist/esm/lib/capture/valueKinds.js +142 -0
- package/dist/esm/lib/memory/EventLog.d.ts +24 -6
- package/dist/esm/lib/memory/EventLog.js +30 -10
- package/dist/esm/lib/memory/admission.js +4 -3
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/equality.d.ts +55 -19
- package/dist/esm/lib/memory/equality.js +154 -51
- package/dist/esm/lib/memory/logModel.js +11 -4
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -1
- package/dist/esm/lib/runner/ExecutionRuntime.js +15 -10
- package/dist/esm/lib/runner/snapshot.js +17 -3
- package/dist/esm/lib/slice/elementProvenance.js +2 -2
- package/dist/esm/lib/time-travel/chain.js +28 -26
- package/dist/lib/capture/freeze.js +292 -25
- package/dist/lib/capture/valueKinds.js +146 -0
- package/dist/lib/memory/EventLog.js +29 -9
- package/dist/lib/memory/admission.js +4 -3
- package/dist/lib/memory/borrowedMutation.js +2 -2
- package/dist/lib/memory/equality.js +154 -51
- package/dist/lib/memory/logModel.js +11 -4
- package/dist/lib/runner/ExecutionRuntime.js +14 -9
- package/dist/lib/runner/snapshot.js +16 -2
- package/dist/lib/slice/elementProvenance.js +2 -2
- package/dist/lib/time-travel/chain.js +27 -25
- package/dist/types/lib/capture/freeze.d.ts +51 -7
- package/dist/types/lib/capture/valueKinds.d.ts +57 -0
- package/dist/types/lib/memory/EventLog.d.ts +24 -6
- package/dist/types/lib/memory/equality.d.ts +55 -19
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -1
- package/package.json +2 -1
|
@@ -57,7 +57,7 @@ function isStrictPrefix(prev, next) {
|
|
|
57
57
|
if (prev.length > next.length)
|
|
58
58
|
return false;
|
|
59
59
|
for (let i = 0; i < prev.length; i++) {
|
|
60
|
-
if (!deepEqual(prev[i], next[i]))
|
|
60
|
+
if (!deepEqual(prev[i], next[i], 'copies'))
|
|
61
61
|
return false;
|
|
62
62
|
}
|
|
63
63
|
return true;
|
|
@@ -187,4 +187,4 @@ export function elementProvenance(commitLog, key, index, options) {
|
|
|
187
187
|
const birth = prov.births[index];
|
|
188
188
|
return prov.basis === undefined ? birth : { ...birth, valueBasis: prov.basis };
|
|
189
189
|
}
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudFByb3ZlbmFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL2VsZW1lbnRQcm92ZW5hbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaURHO0FBRUgsT0FBTyxFQUFtQixzQkFBc0IsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFaEgsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR3JELG9FQUFvRTtBQUNwRSxTQUFTLGNBQWMsQ0FBQyxJQUFlLEVBQUUsSUFBZTtJQUN0RCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFhLEVBQUUsS0FBWSxFQUFFLEtBQXVCLEVBQUUsS0FBYztJQUNuRixPQUFPO1FBQ0wsS0FBSztRQUNMLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztRQUMxQixjQUFjLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxj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LENBQUMsQ0FBQztJQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNsaWNlL2VsZW1lbnRQcm92ZW5hbmNlLnRzIOKAlCBBUFBFTkQtRk9MRCBQUk9WRU5BTkNFLlxuICpcbiAqIFRIRSBQUk9CTEVNICh3aHkgdGhpcyBmaWxlIGV4aXN0cyk6IGluIGFnZW50IGNoYXJ0cywgYWxtb3N0IGFsbCBkYXRhZmxvd1xuICogZnVubmVscyB0aHJvdWdoIE9ORSBhcnJheSBrZXkgKGBoaXN0b3J5YCkuIEEga2V5LWxldmVsIHNsaWNlIG9uIGl0XG4gKiBkZWdlbmVyYXRlcyB0byBcImV2ZXJ5dGhpbmcgZGVwZW5kcyBvbiBoaXN0b3J5XCIg4oCUIHRydWUgYW5kIHVzZWxlc3MuIFRoZVxuICogcXVlc3Rpb24gdGhhdCBhY3R1YWxseSB0cmlhZ2VzIGFuIGFnZW50IHJ1biBpcyBlbGVtZW50LWxldmVsOlxuICogXCJ3aGljaCBzdGFnZSBwcm9kdWNlZCBoaXN0b3J5WzddP1wiLlxuICpcbiAqIFRIRSBJTlNJR0hUOiB0aGUgY29tbWl0IGxvZyBhbHJlYWR5IGNvbnRhaW5zIHRoZSBhbnN3ZXIuIFVuZGVyXG4gKiBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCBldmVyeSBhcnJheSBncm93dGggaXMgcmVjb3JkZWQgYXMgYW4gYGFwcGVuZGAgdmVyYlxuICogd2hvc2UgYG92ZXJ3cml0ZVtrZXldYCBob2xkcyBleGFjdGx5IHRoZSBuZXcgdGFpbCDigJQgZWFjaCBlbGVtZW50IGhhcyBhblxuICogZXhwbGljaXQgYmlydGggcmVjb3JkLiBVbmRlciBgJ2Z1bGwnYCBtb2RlLCBwdXNoLXN0eWxlIGdyb3d0aCBhcHBlYXJzIGFzXG4gKiBjb25zZWN1dGl2ZSBgc2V0YHMgd2hlcmUgdGhlIHByZXZpb3VzIGFycmF5IGlzIGEgc3RyaWN0IHByZWZpeCBvZiB0aGUgbmV4dFxuICog4oCUIHRoZSB0YWlsIGlzIGF0dHJpYnV0YWJsZSBieSBpbmZlcmVuY2UuIE5vIG5ldyBjYXB0dXJlIGlzIG5lZWRlZDsgdGhpcyBpc1xuICogYSBwdXJlIHBvc3QtaG9jIHF1ZXJ5LlxuICpcbiAqIFRIRSBBTEdPUklUSE0gKGFwcGVuZC1mb2xkKTogV0FUQ0ggdGhlIHBlci1rZXkgdmVyYiBmb2xkIOKAlCB0aGUgU0FNRSBmb2xkXG4gKiBgY29tbWl0VmFsdWVBdGAgcnVucyAoYG1lbW9yeS92ZXJicy50c2AgwrcgYGZvbGRLZXlgOiBvbmUgc3RlcCwgYGFwcGx5VmVyYmAsXG4gKiBmb3IgZXZlcnkgdmVyYjsgdGhpcyBmaWxlIGhhcyBubyB2ZXJiIHN3aXRjaCBvZiBpdHMgb3duKSDigJQgd2hpbGUgY2FycnlpbmcgYVxuICogYmlydGhzIGFycmF5IGtlcHQgaW5kZXgtYWxpZ25lZCB3aXRoIHRoZSB2YWx1ZS4gVGhlIG9ic2VydmVyIGlzIHRvbGQsIGFmdGVyXG4gKiBlYWNoIHJvdyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5LCB0aGUgdmFsdWUgYXQgdGhlIGtleSBiZWZvcmUgaXQgYW5kXG4gKiBhZnRlciBpdCwgYW5kIGtlZXBzIHRoZSBiaXJ0aHMg4oCUIGZvciB0aGUgY29tbWl0cyB0aGF0IFdST1RFIHRoZSBrZXkgdW5kZXJcbiAqIHRoZSB3cml0ZXIgcnVsZSAoYGNvbW1pdExvZ1V0aWxzIMK3IHdyaXRlcnNPZmA7IHNpbmNlIDkuMzMuMCBhIHdyaXRlIGluc2lkZVxuICogdGhlIGtleSBvciBhcm91bmQgaXQgY291bnRzLCBhcyBpdCBkb2VzIGZvciBldmVyeSBrZXkgcXVlcnkpOiBhIHJvdyB0aGF0XG4gKiByZWNvcmRzIG9ubHkgaXRzIHRhaWwgKGBhcHBlbmRgKSBlYXJucyBhbiBleGFjdCBhdHRyaWJ1dGlvbjsgZXZlcnkgb3RoZXIgcm93XG4gKiBpcyBhIHdob2xlLXZhbHVlIHRyYW5zaXRpb24gYXR0cmlidXRlZCBieSBpbmZlcmVuY2UuIE9uZSBkaWZmZXJlbmNlIGZyb21cbiAqIGBjb21taXRWYWx1ZUF0YDogdGhhdCBoZWxwZXIgQU5DSE9SUyBhdCB0aGUgbGF0ZXN0IGBzZXRgL2BkZWxldGVgIGFzIGEgc2tpcFxuICogb3B0aW1pemF0aW9uIChlYXJsaWVyIGNvbW1pdHMgY2Fubm90IGNoYW5nZSB0aGUgZmluYWwgVkFMVUUpLiBQcm92ZW5hbmNlXG4gKiBtdXN0IGZvbGQgZnJvbSB0aGUgRklSU1QgdG91Y2gsIGJlY2F1c2UgZnVsbC1tb2RlIGdyb3d0aCBpcyBhIGNoYWluIG9mXG4gKiBgc2V0YHMgYW5kIHRoZSBhbmNob3Igd291bGQgZXJhc2UgZXZlcnkgYmlydGggYnV0IHRoZSBsYXN0LiBUaGUgZmluYWwgdmFsdWVcbiAqIGlzIGlkZW50aWNhbCBlaXRoZXIgd2F5ICh0aGUgZm9sZCBpcyBkZXRlcm1pbmlzdGljIGxlZnQtdG8tcmlnaHQpIOKAlCBhXG4gKiBwcm9wZXJ0eSB0ZXN0IHBpbnMgdGhpcyBlcXVpdmFsZW5jZS5cbiAqXG4gKiBJTlZBUklBTlQgKG1haW50YWluZWQgb24gZXZlcnkgYnJhbmNoKTogd2hlbiB0aGUgZm9sZGVkIHZhbHVlIGlzIGFuIGFycmF5LFxuICogYGJpcnRocy5sZW5ndGggPT09IHZhbHVlLmxlbmd0aGAgYW5kIGBiaXJ0aHNbaV1gIGRlc2NyaWJlcyBgdmFsdWVbaV1gLlxuICpcbiAqIEhPTkVTVFk6IGV2ZXJ5IGJpcnRoIGlzIGxhYmVsZWQgd2l0aCBob3cgaXQgd2FzIGRldGVybWluZWRcbiAqICh7QGxpbmsgQXR0cmlidXRpb25CYXNpc30pIOKAlCBgJ2FwcGVuZC12ZXJiJ2AgaXMgZW5naW5lLXJlY29yZGVkIHRydXRoLFxuICogYCdwcmVmaXgtaW5mZXJlbmNlJ2AgaXMgYSBoZXVyaXN0aWMgKGEgd2hvbGVzYWxlIHJlcGxhY2VtZW50IHRoYXQgaGFwcGVuc1xuICogdG8gc2hhcmUgdGhlIG9sZCBwcmVmaXggaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBhcHBlbmQpLCBhbmRcbiAqIGAnd2hvbGUtdmFsdWUnYCBpcyBhbiBleHBsaWNpdCByZXNldC4gQWJzZW5jZSBpcyBob25lc3QgdG9vOiBhIG1pc3NpbmdcbiAqIHByb3ZlbmFuY2UgY2FycmllcyBhIHtAbGluayBNaXNzaW5nUHJvdmVuYW5jZVJlYXNvbn0sIG1pcnJvcmluZ1xuICogYFZhcmlhYmxlU2xpY2UubWlzc2luZ2Ag4oCUIG9uZSBhYnNlbmNlIHBhdHRlcm4gbW9kdWxlLXdpZGUuXG4gKlxuICogQ09NUExFWElUWTogZGVsdGEtbW9kZSBsb2dzIG5lZWQgbm8gZXF1YWxpdHkgY2hlY2tzIOKAlCBPKHRvdGFsIGVsZW1lbnRzKS5cbiAqIEZ1bGwtbW9kZSBsb2dzIHBheSBhIHN0cmljdC1wcmVmaXggY2hlY2sgKGRlZXBFcXVhbCBwZXIgZWxlbWVudCkgcGVyXG4gKiBmdWxsLXZhbHVlIHRvdWNoOiBPKHRvdWNoZXMgw5cgbGVuZ3RoKSBlbGVtZW50IGNvbXBhcmlzb25zIHdvcnN0IGNhc2UuXG4gKiBQb3N0LWhvYyBxdWVyeSwgb2ZmIHRoZSBob3QgcGF0aCDigJQgYWNjZXB0YWJsZTsgbWVhc3VyZWQgaW4gdGhlIHBlcmYgdGVzdHMuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBWYWx1ZUJhc2lzLCBjb21taXRWYWx1ZUF0V2l0aEJhc2lzLCByb3dzVW5kZXJSb290LCB3cml0ZXJzT2YgfSBmcm9tICcuLi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBERUxJTSB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyB0eXBlIFRvdWNoLCBmb2xkS2V5LCByZWNvcmRzVGFpbCB9IGZyb20gJy4uL21lbW9yeS92ZXJicy5qcyc7XG5pbXBvcnQgeyBub3JtYWxpc2VTdGF0ZUtleSB9IGZyb20gJy4vc2xpY2VGb3JLZXkuanMnO1xuaW1wb3J0IHR5cGUgeyBBcnJheVByb3ZlbmFuY2UsIEF0dHJpYnV0aW9uQmFzaXMsIEVsZW1lbnRCaXJ0aCwgU3RhdGVLZXkgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIGBwcmV2YCBpcyBhIHN0cmljdCAobGVhZGluZywgZWxlbWVudC1lcXVhbCkgcHJlZml4IG9mIGBuZXh0YC4gKi9cbmZ1bmN0aW9uIGlzU3RyaWN0UHJlZml4KHByZXY6IHVua25vd25bXSwgbmV4dDogdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIGlmIChwcmV2Lmxlbmd0aCA+IG5leHQubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5sZW5ndGg7IGkrKykge1xuICAgIGlmICghZGVlcEVxdWFsKHByZXZbaV0sIG5leHRbaV0pKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJpcnRoT2YoaW5kZXg6IG51bWJlciwgdG91Y2g6IFRvdWNoLCBiYXNpczogQXR0cmlidXRpb25CYXNpcywgdmFsdWU6IHVua25vd24pOiBFbGVtZW50QmlydGgge1xuICByZXR1cm4ge1xuICAgIGluZGV4LFxuICAgIGNvbW1pdElkeDogdG91Y2guY29tbWl0SWR4LFxuICAgIHJ1bnRpbWVTdGFnZUlkOiB0b3VjaC5idW5kbGUucnVudGltZVN0YWdlSWQsXG4gICAgc3RhZ2VJZDogdG91Y2guYnVuZGxlLnN0YWdlSWQsXG4gICAgc3RhZ2VOYW1lOiB0b3VjaC5idW5kbGUuc3RhZ2UsXG4gICAgdmVyYjogdG91Y2gudmVyYixcbiAgICBiYXNpcyxcbiAgICB2YWx1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbGVtZW50LWxldmVsIHByb3ZlbmFuY2UgZm9yIG9uZSBhcnJheS12YWx1ZWQga2V5OiBmb2xkIHRoZSBrZXkncyBjb21taXRzXG4gKiBhbmQgcmV0dXJuIGluZGV4LWFsaWduZWQgYmlydGggcmVjb3JkcyBmb3IgZXZlcnkgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ga2V5IEEge0BsaW5rIFN0YXRlS2V5fTogdGhlIHRvcC1sZXZlbCBrZXkgc3RyaW5nLCBvciBhIHBhdGggYXJyYXlcbiAqICAgZm9yIG5lc3RlZCBrZXlzIChub3JtYWxpc2VkIGludGVybmFsbHkg4oCUIG5vIGVuZ2luZSBkZWxpbWl0ZXJzIG5lZWRlZCkuXG4gKiBAcGFyYW0gb3B0aW9ucy5hdElkeCBJbmNsdXNpdmUgY29tbWl0IGFycmF5IGluZGV4IHRvIGZvbGQgdG8gKGRlZmF1bHQ6IHRoZVxuICogICB3aG9sZSBsb2cpLiBOT1QgdGhlIGV4ZWN1dGlvbkluZGV4IGZyb20gYSBydW50aW1lU3RhZ2VJZC5cbiAqIEByZXR1cm5zIEFsd2F5cyBhbiB7QGxpbmsgQXJyYXlQcm92ZW5hbmNlfTsgb24gZmFpbHVyZSBgbWlzc2luZ2Agc2F5cyB3aHlcbiAqICAgKGAnbm90LWFuLWFycmF5J2AgZm9yIHNjYWxhci9kZWxldGVkL2RlZ3JhZGVkIGtleXMg4oCUIHRob3NlIGFyZVxuICogICBgc2xpY2VGb3JLZXlgIHRlcnJpdG9yeSkuIEJsaW5kIHNwb3Qgc2hhcmVkIHdpdGggdGhlIHdob2xlIGNvbW1pdC1sb2dcbiAqICAgZmFtaWx5OiBlbGVtZW50cyBwcmVzZW50IGluIHRoZSBydW4ncyBJTklUSUFMIHN0YXRlIChzZWVkZWQsIG5ldmVyXG4gKiAgIHJlLXNldCBpbiByYW5nZSkgYXJlIGludmlzaWJsZSBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlQcm92ZW5hbmNlKFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBrZXk6IFN0YXRlS2V5LFxuICBvcHRpb25zPzogeyBhdElkeD86IG51bWJlciB9LFxuKTogQXJyYXlQcm92ZW5hbmNlIHtcbiAgY29uc3Qgbm9ybWFsaXNlZEtleSA9IG5vcm1hbGlzZVN0YXRlS2V5KGtleSk7XG4gIGlmIChjb21taXRMb2cubGVuZ3RoID09PSAwKSByZXR1cm4geyBrZXk6IG5vcm1hbGlzZWRLZXksIG1pc3Npbmc6ICdlbXB0eS1sb2cnIH07XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKG9wdGlvbnM/LmF0SWR4ID8/IGNvbW1pdExvZy5sZW5ndGggLSAxLCBjb21taXRMb2cubGVuZ3RoIC0gMSk7XG4gIGNvbnN0IHNlZ3MgPSBub3JtYWxpc2VkS2V5LnNwbGl0KERFTElNKTtcblxuICAvLyBFdmVyeSByb3cgdW5kZXIgdGhlIGtleSdzIHRvcC1sZXZlbCBrZXkgdXAgdG8gYGVuZGAsIGluIGNvbW1pdCBvcmRlciDigJQgdGhlXG4gIC8vIHJvd3MgY29tbWl0VmFsdWVBdCBmb2xkcyAocmVmdXNpbmcgYSB2ZXJiIHRoZSBsYXcgZG9lcyBub3Qga25vdyksIHdpdGggdGhlXG4gIC8vIGNvbW1pdCBwb3NpdGlvbiB0aGUgYmlydGggcmVjb3JkcyBuZWVkLlxuICBjb25zdCByb3dzID0gcm93c1VuZGVyUm9vdChjb21taXRMb2csIG5vcm1hbGlzZWRLZXksIGVuZCk7XG4gIC8vIFRoZSBjb21taXRzIHRoYXQgV1JPVEUgdGhlIGtleSDigJQgdGhlIHdyaXRlciBydWxlIGV2ZXJ5IGtleSBxdWVyeSBzaGFyZXMuXG4gIGNvbnN0IHdyaXRlcnMgPSBuZXcgU2V0KHdyaXRlcnNPZihjb21taXRMb2csIG5vcm1hbGlzZWRLZXksIHsgZW5kIH0pKTtcbiAgLy8gRjRiOiB3aGF0IHRoZSB2YWx1ZSBhdCBgZW5kYCByZXN0cyBvbiDigJQgdGhlIGJhc2lzIHR3aW4ncyBjb2RlcywgbGVzcyB3aGF0IGBtaXNzaW5nYCBhbHJlYWR5IHNheXMuXG4gIGNvbnN0IHsgYmFzaXMgfSA9IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMoY29tbWl0TG9nLCBlbmQsIG5vcm1hbGlzZWRLZXkpO1xuICBjb25zdCBzYWlkID0gKGFsc286IFZhbHVlQmFzaXNbXSkgPT4ge1xuICAgIGNvbnN0IHJlc3QgPSBiYXNpcy5maWx0ZXIoKGMpID0+ICFhbHNvLmluY2x1ZGVzKGMpKTtcbiAgICByZXR1cm4gcmVzdC5sZW5ndGggPiAwID8geyBiYXNpczogcmVzdCB9IDoge307XG4gIH07XG4gIGlmICh3cml0ZXJzLnNpemUgPT09IDApXG4gICAgcmV0dXJuIHsga2V5OiBub3JtYWxpc2VkS2V5LCBtaXNzaW5nOiAnbmV2ZXItd3JpdHRlbicsIC4uLnNhaWQoWyduZXZlci13cml0dGVuJywgJ2Zyb20taW5pdGlhbC1zdGF0ZSddKSB9O1xuXG4gIC8vIFRoZSBhcHBlbmQtZm9sZDogdGhlIGtleSdzIG9uZSBmb2xkLCB3YXRjaGVkLiBgYmlydGhzYCBpcyB0aGUgYWRkZWRcbiAgLy8gcHJvdmVuYW5jZSB0cmFjaywgaW5kZXgtYWxpZ25lZCB3aGVuZXZlciB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgKHRoZVxuICAvLyBtb2R1bGUgaW52YXJpYW50KS4gQSByb3cgb2YgYSBjb21taXQgdGhhdCBkaWQgbm90IHdyaXRlIHRoZSBrZXkgKGEgbWVyZ2VcbiAgLy8gYXJvdW5kIGl0IHRoYXQgbmV2ZXIgcmVhY2hlZCBpdCkgbW92ZXMgbm8gYmlydGguXG4gIGxldCBiaXJ0aHM6IEVsZW1lbnRCaXJ0aFtdID0gW107XG4gIGNvbnN0IHZhbHVlID0gZm9sZEtleShyb3dzLCBzZWdzLCB7XG4gICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICBpZiAod3JpdGVycy5oYXModG91Y2guY29tbWl0SWR4KSkgYmlydGhzID0gbmV4dEJpcnRocyhiaXJ0aHMsIHRvdWNoLCBiZWZvcmUsIGFmdGVyKTtcbiAgICB9LFxuICB9KTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4geyBrZXk6IG5vcm1hbGlzZWRLZXksIG1pc3Npbmc6ICdub3QtYW4tYXJyYXknLCAuLi5zYWlkKFtdKSB9O1xuICByZXR1cm4geyBrZXk6IG5vcm1hbGlzZWRLZXksIGF0SWR4OiBlbmQsIGxlbmd0aDogdmFsdWUubGVuZ3RoLCBiaXJ0aHMsIC4uLnNhaWQoW10pIH07XG59XG5cbi8qKlxuICogVGhlIGJpcnRocyBhZnRlciBvbmUgcm93IG9mIHRoZSBmb2xkLCBmcm9tIHRoZSB2YWx1ZSBiZWZvcmUgaXQgYW5kIGFmdGVyIGl0LlxuICpcbiAqIEEgcm93IHRoYXQgcmVjb3JkcyBvbmx5IGl0cyBUQUlMIChgYXBwZW5kYCkga25vd3MgZXhhY3RseSB3aGF0IGl0IGFkZGVkIOKAlFxuICogYCdhcHBlbmQtdmVyYidgLCBubyBlcXVhbGl0eSBjaGVja3MsIE8odGFpbCkuIEV2ZXJ5IG90aGVyIHJvdyDigJQgYSBgc2V0YCwgYVxuICogYG1lcmdlYCwgYSBgZGVsZXRlYCDigJQgaXMgYSB3aG9sZS12YWx1ZSB0cmFuc2l0aW9uOiBhdHRyaWJ1dGVkIGJ5IGluZmVyZW5jZVxuICogKHtAbGluayByZWJhc2VCaXJ0aHN9KSwgYW5kIGEgbm9uLWFycmF5IHJlc3VsdCAoYSBgZGVsZXRlYCBsZWF2ZXMgbm9uZSkgZW5kc1xuICogdGhlIHRyYWNrLlxuICovXG5mdW5jdGlvbiBuZXh0QmlydGhzKGJpcnRoczogRWxlbWVudEJpcnRoW10sIHRvdWNoOiBUb3VjaCwgYmVmb3JlOiB1bmtub3duLCBhZnRlcjogdW5rbm93bik6IEVsZW1lbnRCaXJ0aFtdIHtcbiAgLy8gQW4gYGFwcGVuZGAgcmVjb3JkcyB0aGUgdGFpbCBvZiBJVFMgT1dOIHBhdGguIE9uIGEgY29udGFpbmVyIGFyb3VuZCB0aGUga2V5IChvciBhIHBhdGggaW5zaWRlIGl0KSB0aGVcbiAgLy8ga2V5J3MgdmFsdWUgY2hhbmdlZCB3aG9sZXNhbGUg4oCUIGBhcHBlbmQgYWAgd2l0aCBhIG5vbi1hcnJheSB0YWlsIHJlcGxhY2VzIGBhYCwgYW5kIGBh4pCfYmAgd2l0aCBpdCDigJQgc29cbiAgLy8gb25seSBhbiBhcHBlbmQgT04gdGhlIGtleSBlYXJucyBleGFjdCB0YWlsIGF0dHJpYnV0aW9uLlxuICBpZiAoIXJlY29yZHNUYWlsKHRvdWNoLnZlcmIpIHx8IHRvdWNoLnJlbGF0aW9uICE9PSAnZXhhY3QnKSB7XG4gICAgcmV0dXJuIHJlYmFzZUJpcnRocyhiZWZvcmUsIGFmdGVyLCBiaXJ0aHMsIHRvdWNoLCAncHJlZml4LWluZmVyZW5jZScpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGJlZm9yZSkgJiYgQXJyYXkuaXNBcnJheShhZnRlcikpIHtcbiAgICAvLyBUaGUgc3RlcCBleHRlbmRlZCB0aGUgYXJyYXk6IHRoZSBlbGVtZW50cyBwYXN0IHRoZSBvbGQgbGVuZ3RoIGFyZSB0aGVcbiAgICAvLyByZWNvcmRlZCB0YWlsIOKAlCBleGFjdCBhdHRyaWJ1dGlvbi5cbiAgICBmb3IgKGxldCBqID0gYmVmb3JlLmxlbmd0aDsgaiA8IGFmdGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICBiaXJ0aHMucHVzaChiaXJ0aE9mKGosIHRvdWNoLCAnYXBwZW5kLXZlcmInLCBhZnRlcltqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gYmlydGhzO1xuICB9XG4gIC8vIERlZ2VuZXJhdGUgYXBwZW5kOiBvbnRvIGEgbm9uLWFycmF5LCBvciBhIG5vbi1hcnJheSB0YWlsIChlLmcuIGEgcmVkYWN0ZWRcbiAgLy8gdGFpbCByZXBsYWNlZCBieSB0aGUgJ1JFREFDVEVEJyBzdHJpbmcpLiBUaGUgdGFpbCBCRUNBTUUgdGhlIHZhbHVlIOKAlFxuICAvLyB0aGUgc3RlcCdzIG93biBydWxlIOKAlCBhbmQgYXR0cmlidXRpb24gc3RheXMgZXhhY3QuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFmdGVyKSA/IGFmdGVyLm1hcCgoZWwsIGopID0+IGJpcnRoT2YoaiwgdG91Y2gsICdhcHBlbmQtdmVyYicsIGVsKSkgOiBbXTtcbn1cblxuLyoqXG4gKiBSZS1kZXJpdmUgYmlydGhzIGFmdGVyIGEgZnVsbC12YWx1ZSB0cmFuc2l0aW9uIChgc2V0YC9gbWVyZ2VgKTpcbiAqIC0gbm9uLWFycmF5IHJlc3VsdCDihpIgbm8gYmlydGhzIChpbnZhcmlhbnQ6IGJpcnRocyB0cmFjayBhcnJheXMgb25seSlcbiAqIC0gcHJldmlvdXMgYXJyYXkgaXMgYSBzdHJpY3QgcHJlZml4IOKGkiBrZWVwIG9sZCBiaXJ0aHMsIGF0dHJpYnV0ZSB0aGUgdGFpbFxuICogICB0byB0aGlzIHRvdWNoIHdpdGggdGhlIGdpdmVuIChoZXVyaXN0aWMpIGJhc2lzXG4gKiAtIG90aGVyd2lzZSDihpIgd2hvbGVzYWxlIHJlcGxhY2VtZW50OiBldmVyeSBlbGVtZW50IHJlYm9ybiAnd2hvbGUtdmFsdWUnXG4gKi9cbmZ1bmN0aW9uIHJlYmFzZUJpcnRocyhcbiAgcHJldjogdW5rbm93bixcbiAgbmV4dDogdW5rbm93bixcbiAgYmlydGhzOiBFbGVtZW50QmlydGhbXSxcbiAgdG91Y2g6IFRvdWNoLFxuICB0YWlsQmFzaXM6IEF0dHJpYnV0aW9uQmFzaXMsXG4pOiBFbGVtZW50QmlydGhbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShuZXh0KSkgcmV0dXJuIFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShwcmV2KSAmJiBpc1N0cmljdFByZWZpeChwcmV2LCBuZXh0KSkge1xuICAgIGNvbnN0IGtlcHQgPSBiaXJ0aHMuc2xpY2UoMCwgcHJldi5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSBwcmV2Lmxlbmd0aDsgaSA8IG5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtlcHQucHVzaChiaXJ0aE9mKGksIHRvdWNoLCB0YWlsQmFzaXMsIG5leHRbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGtlcHQ7XG4gIH1cbiAgcmV0dXJuIG5leHQubWFwKChlbCwgaSkgPT4gYmlydGhPZihpLCB0b3VjaCwgJ3dob2xlLXZhbHVlJywgZWwpKTtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZSBvdmVyIHtAbGluayBhcnJheVByb3ZlbmFuY2V9OiB0aGUgYmlydGggb2YgT05FIGVsZW1lbnQuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGtleSBoYXMgbm8gYXJyYXkgcHJvdmVuYW5jZSAoYW55XG4gKiB7QGxpbmsgTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb259KSBvciBgaW5kZXhgIGlzIG91dCBvZiByYW5nZSBhdCBgYXRJZHhgIOKAlFxuICogTWFwLmdldC1saWtlIHNlbWFudGljczsgdXNlIHtAbGluayBhcnJheVByb3ZlbmFuY2V9IGRpcmVjdGx5IHdoZW4geW91IG5lZWRcbiAqIHRoZSBtaXNzaW5nIHJlYXNvbi5cbiAqXG4gKiBAc2VlIEVsZW1lbnRCaXJ0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudFByb3ZlbmFuY2UoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIGtleTogU3RhdGVLZXksXG4gIGluZGV4OiBudW1iZXIsXG4gIG9wdGlvbnM/OiB7IGF0SWR4PzogbnVtYmVyIH0sXG4pOiBFbGVtZW50QmlydGggfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm92ID0gYXJyYXlQcm92ZW5hbmNlKGNvbW1pdExvZywga2V5LCBvcHRpb25zKTtcbiAgaWYgKCFwcm92LmJpcnRocyB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gcHJvdi5iaXJ0aHMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBiaXJ0aCA9IHByb3YuYmlydGhzW2luZGV4XTtcbiAgcmV0dXJuIHByb3YuYmFzaXMgPT09IHVuZGVmaW5lZCA/IGJpcnRoIDogeyAuLi5iaXJ0aCwgdmFsdWVCYXNpczogcHJvdi5iYXNpcyB9O1xufVxuIl19
|
|
190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudFByb3ZlbmFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL2VsZW1lbnRQcm92ZW5hbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaURHO0FBRUgsT0FBTyxFQUFtQixzQkFBc0IsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFaEgsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR3JELG9FQUFvRTtBQUNwRSxTQUFTLGNBQWMsQ0FBQyxJQUFlLEVBQUUsSUFBZTtJQUN0RCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsS0FBYSxFQUFFLEtBQVksRUFBRSxLQUF1QixFQUFFLEtBQWM7SUFDbkYsT0FBTztRQUNMLEtBQUs7UUFDTCxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxN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LEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNqRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzbGljZS9lbGVtZW50UHJvdmVuYW5jZS50cyDigJQgQVBQRU5ELUZPTEQgUFJPVkVOQU5DRS5cbiAqXG4gKiBUSEUgUFJPQkxFTSAod2h5IHRoaXMgZmlsZSBleGlzdHMpOiBpbiBhZ2VudCBjaGFydHMsIGFsbW9zdCBhbGwgZGF0YWZsb3dcbiAqIGZ1bm5lbHMgdGhyb3VnaCBPTkUgYXJyYXkga2V5IChgaGlzdG9yeWApLiBBIGtleS1sZXZlbCBzbGljZSBvbiBpdFxuICogZGVnZW5lcmF0ZXMgdG8gXCJldmVyeXRoaW5nIGRlcGVuZHMgb24gaGlzdG9yeVwiIOKAlCB0cnVlIGFuZCB1c2VsZXNzLiBUaGVcbiAqIHF1ZXN0aW9uIHRoYXQgYWN0dWFsbHkgdHJpYWdlcyBhbiBhZ2VudCBydW4gaXMgZWxlbWVudC1sZXZlbDpcbiAqIFwid2hpY2ggc3RhZ2UgcHJvZHVjZWQgaGlzdG9yeVs3XT9cIi5cbiAqXG4gKiBUSEUgSU5TSUdIVDogdGhlIGNvbW1pdCBsb2cgYWxyZWFkeSBjb250YWlucyB0aGUgYW5zd2VyLiBVbmRlclxuICogYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AgZXZlcnkgYXJyYXkgZ3Jvd3RoIGlzIHJlY29yZGVkIGFzIGFuIGBhcHBlbmRgIHZlcmJcbiAqIHdob3NlIGBvdmVyd3JpdGVba2V5XWAgaG9sZHMgZXhhY3RseSB0aGUgbmV3IHRhaWwg4oCUIGVhY2ggZWxlbWVudCBoYXMgYW5cbiAqIGV4cGxpY2l0IGJpcnRoIHJlY29yZC4gVW5kZXIgYCdmdWxsJ2AgbW9kZSwgcHVzaC1zdHlsZSBncm93dGggYXBwZWFycyBhc1xuICogY29uc2VjdXRpdmUgYHNldGBzIHdoZXJlIHRoZSBwcmV2aW91cyBhcnJheSBpcyBhIHN0cmljdCBwcmVmaXggb2YgdGhlIG5leHRcbiAqIOKAlCB0aGUgdGFpbCBpcyBhdHRyaWJ1dGFibGUgYnkgaW5mZXJlbmNlLiBObyBuZXcgY2FwdHVyZSBpcyBuZWVkZWQ7IHRoaXMgaXNcbiAqIGEgcHVyZSBwb3N0LWhvYyBxdWVyeS5cbiAqXG4gKiBUSEUgQUxHT1JJVEhNIChhcHBlbmQtZm9sZCk6IFdBVENIIHRoZSBwZXIta2V5IHZlcmIgZm9sZCDigJQgdGhlIFNBTUUgZm9sZFxuICogYGNvbW1pdFZhbHVlQXRgIHJ1bnMgKGBtZW1vcnkvdmVyYnMudHNgIMK3IGBmb2xkS2V5YDogb25lIHN0ZXAsIGBhcHBseVZlcmJgLFxuICogZm9yIGV2ZXJ5IHZlcmI7IHRoaXMgZmlsZSBoYXMgbm8gdmVyYiBzd2l0Y2ggb2YgaXRzIG93bikg4oCUIHdoaWxlIGNhcnJ5aW5nIGFcbiAqIGJpcnRocyBhcnJheSBrZXB0IGluZGV4LWFsaWduZWQgd2l0aCB0aGUgdmFsdWUuIFRoZSBvYnNlcnZlciBpcyB0b2xkLCBhZnRlclxuICogZWFjaCByb3cgb24sIGluc2lkZSBvciBhcm91bmQgdGhlIGtleSwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgYmVmb3JlIGl0IGFuZFxuICogYWZ0ZXIgaXQsIGFuZCBrZWVwcyB0aGUgYmlydGhzIOKAlCBmb3IgdGhlIGNvbW1pdHMgdGhhdCBXUk9URSB0aGUga2V5IHVuZGVyXG4gKiB0aGUgd3JpdGVyIHJ1bGUgKGBjb21taXRMb2dVdGlscyDCtyB3cml0ZXJzT2ZgOyBzaW5jZSA5LjMzLjAgYSB3cml0ZSBpbnNpZGVcbiAqIHRoZSBrZXkgb3IgYXJvdW5kIGl0IGNvdW50cywgYXMgaXQgZG9lcyBmb3IgZXZlcnkga2V5IHF1ZXJ5KTogYSByb3cgdGhhdFxuICogcmVjb3JkcyBvbmx5IGl0cyB0YWlsIChgYXBwZW5kYCkgZWFybnMgYW4gZXhhY3QgYXR0cmlidXRpb247IGV2ZXJ5IG90aGVyIHJvd1xuICogaXMgYSB3aG9sZS12YWx1ZSB0cmFuc2l0aW9uIGF0dHJpYnV0ZWQgYnkgaW5mZXJlbmNlLiBPbmUgZGlmZmVyZW5jZSBmcm9tXG4gKiBgY29tbWl0VmFsdWVBdGA6IHRoYXQgaGVscGVyIEFOQ0hPUlMgYXQgdGhlIGxhdGVzdCBgc2V0YC9gZGVsZXRlYCBhcyBhIHNraXBcbiAqIG9wdGltaXphdGlvbiAoZWFybGllciBjb21taXRzIGNhbm5vdCBjaGFuZ2UgdGhlIGZpbmFsIFZBTFVFKS4gUHJvdmVuYW5jZVxuICogbXVzdCBmb2xkIGZyb20gdGhlIEZJUlNUIHRvdWNoLCBiZWNhdXNlIGZ1bGwtbW9kZSBncm93dGggaXMgYSBjaGFpbiBvZlxuICogYHNldGBzIGFuZCB0aGUgYW5jaG9yIHdvdWxkIGVyYXNlIGV2ZXJ5IGJpcnRoIGJ1dCB0aGUgbGFzdC4gVGhlIGZpbmFsIHZhbHVlXG4gKiBpcyBpZGVudGljYWwgZWl0aGVyIHdheSAodGhlIGZvbGQgaXMgZGV0ZXJtaW5pc3RpYyBsZWZ0LXRvLXJpZ2h0KSDigJQgYVxuICogcHJvcGVydHkgdGVzdCBwaW5zIHRoaXMgZXF1aXZhbGVuY2UuXG4gKlxuICogSU5WQVJJQU5UIChtYWludGFpbmVkIG9uIGV2ZXJ5IGJyYW5jaCk6IHdoZW4gdGhlIGZvbGRlZCB2YWx1ZSBpcyBhbiBhcnJheSxcbiAqIGBiaXJ0aHMubGVuZ3RoID09PSB2YWx1ZS5sZW5ndGhgIGFuZCBgYmlydGhzW2ldYCBkZXNjcmliZXMgYHZhbHVlW2ldYC5cbiAqXG4gKiBIT05FU1RZOiBldmVyeSBiaXJ0aCBpcyBsYWJlbGVkIHdpdGggaG93IGl0IHdhcyBkZXRlcm1pbmVkXG4gKiAoe0BsaW5rIEF0dHJpYnV0aW9uQmFzaXN9KSDigJQgYCdhcHBlbmQtdmVyYidgIGlzIGVuZ2luZS1yZWNvcmRlZCB0cnV0aCxcbiAqIGAncHJlZml4LWluZmVyZW5jZSdgIGlzIGEgaGV1cmlzdGljIChhIHdob2xlc2FsZSByZXBsYWNlbWVudCB0aGF0IGhhcHBlbnNcbiAqIHRvIHNoYXJlIHRoZSBvbGQgcHJlZml4IGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gYXBwZW5kKSwgYW5kXG4gKiBgJ3dob2xlLXZhbHVlJ2AgaXMgYW4gZXhwbGljaXQgcmVzZXQuIEFic2VuY2UgaXMgaG9uZXN0IHRvbzogYSBtaXNzaW5nXG4gKiBwcm92ZW5hbmNlIGNhcnJpZXMgYSB7QGxpbmsgTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb259LCBtaXJyb3JpbmdcbiAqIGBWYXJpYWJsZVNsaWNlLm1pc3NpbmdgIOKAlCBvbmUgYWJzZW5jZSBwYXR0ZXJuIG1vZHVsZS13aWRlLlxuICpcbiAqIENPTVBMRVhJVFk6IGRlbHRhLW1vZGUgbG9ncyBuZWVkIG5vIGVxdWFsaXR5IGNoZWNrcyDigJQgTyh0b3RhbCBlbGVtZW50cykuXG4gKiBGdWxsLW1vZGUgbG9ncyBwYXkgYSBzdHJpY3QtcHJlZml4IGNoZWNrIChkZWVwRXF1YWwgcGVyIGVsZW1lbnQpIHBlclxuICogZnVsbC12YWx1ZSB0b3VjaDogTyh0b3VjaGVzIMOXIGxlbmd0aCkgZWxlbWVudCBjb21wYXJpc29ucyB3b3JzdCBjYXNlLlxuICogUG9zdC1ob2MgcXVlcnksIG9mZiB0aGUgaG90IHBhdGgg4oCUIGFjY2VwdGFibGU7IG1lYXN1cmVkIGluIHRoZSBwZXJmIHRlc3RzLlxuICovXG5cbmltcG9ydCB7IHR5cGUgVmFsdWVCYXNpcywgY29tbWl0VmFsdWVBdFdpdGhCYXNpcywgcm93c1VuZGVyUm9vdCwgd3JpdGVyc09mIH0gZnJvbSAnLi4vbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgREVMSU0gfSBmcm9tICcuLi9tZW1vcnkvdXRpbHMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgcmVjb3Jkc1RhaWwgfSBmcm9tICcuLi9tZW1vcnkvdmVyYnMuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXNlU3RhdGVLZXkgfSBmcm9tICcuL3NsaWNlRm9yS2V5LmpzJztcbmltcG9ydCB0eXBlIHsgQXJyYXlQcm92ZW5hbmNlLCBBdHRyaWJ1dGlvbkJhc2lzLCBFbGVtZW50QmlydGgsIFN0YXRlS2V5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBgcHJldmAgaXMgYSBzdHJpY3QgKGxlYWRpbmcsIGVsZW1lbnQtZXF1YWwpIHByZWZpeCBvZiBgbmV4dGAuICovXG5mdW5jdGlvbiBpc1N0cmljdFByZWZpeChwcmV2OiB1bmtub3duW10sIG5leHQ6IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICBpZiAocHJldi5sZW5ndGggPiBuZXh0Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWRlZXBFcXVhbChwcmV2W2ldLCBuZXh0W2ldLCAnY29waWVzJykpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYmlydGhPZihpbmRleDogbnVtYmVyLCB0b3VjaDogVG91Y2gsIGJhc2lzOiBBdHRyaWJ1dGlvbkJhc2lzLCB2YWx1ZTogdW5rbm93bik6IEVsZW1lbnRCaXJ0aCB7XG4gIHJldHVybiB7XG4gICAgaW5kZXgsXG4gICAgY29tbWl0SWR4OiB0b3VjaC5jb21taXRJZHgsXG4gICAgcnVudGltZVN0YWdlSWQ6IHRvdWNoLmJ1bmRsZS5ydW50aW1lU3RhZ2VJZCxcbiAgICBzdGFnZUlkOiB0b3VjaC5idW5kbGUuc3RhZ2VJZCxcbiAgICBzdGFnZU5hbWU6IHRvdWNoLmJ1bmRsZS5zdGFnZSxcbiAgICB2ZXJiOiB0b3VjaC52ZXJiLFxuICAgIGJhc2lzLFxuICAgIHZhbHVlLFxuICB9O1xufVxuXG4vKipcbiAqIEVsZW1lbnQtbGV2ZWwgcHJvdmVuYW5jZSBmb3Igb25lIGFycmF5LXZhbHVlZCBrZXk6IGZvbGQgdGhlIGtleSdzIGNvbW1pdHNcbiAqIGFuZCByZXR1cm4gaW5kZXgtYWxpZ25lZCBiaXJ0aCByZWNvcmRzIGZvciBldmVyeSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBrZXkgQSB7QGxpbmsgU3RhdGVLZXl9OiB0aGUgdG9wLWxldmVsIGtleSBzdHJpbmcsIG9yIGEgcGF0aCBhcnJheVxuICogICBmb3IgbmVzdGVkIGtleXMgKG5vcm1hbGlzZWQgaW50ZXJuYWxseSDigJQgbm8gZW5naW5lIGRlbGltaXRlcnMgbmVlZGVkKS5cbiAqIEBwYXJhbSBvcHRpb25zLmF0SWR4IEluY2x1c2l2ZSBjb21taXQgYXJyYXkgaW5kZXggdG8gZm9sZCB0byAoZGVmYXVsdDogdGhlXG4gKiAgIHdob2xlIGxvZykuIE5PVCB0aGUgZXhlY3V0aW9uSW5kZXggZnJvbSBhIHJ1bnRpbWVTdGFnZUlkLlxuICogQHJldHVybnMgQWx3YXlzIGFuIHtAbGluayBBcnJheVByb3ZlbmFuY2V9OyBvbiBmYWlsdXJlIGBtaXNzaW5nYCBzYXlzIHdoeVxuICogICAoYCdub3QtYW4tYXJyYXknYCBmb3Igc2NhbGFyL2RlbGV0ZWQvZGVncmFkZWQga2V5cyDigJQgdGhvc2UgYXJlXG4gKiAgIGBzbGljZUZvcktleWAgdGVycml0b3J5KS4gQmxpbmQgc3BvdCBzaGFyZWQgd2l0aCB0aGUgd2hvbGUgY29tbWl0LWxvZ1xuICogICBmYW1pbHk6IGVsZW1lbnRzIHByZXNlbnQgaW4gdGhlIHJ1bidzIElOSVRJQUwgc3RhdGUgKHNlZWRlZCwgbmV2ZXJcbiAqICAgcmUtc2V0IGluIHJhbmdlKSBhcmUgaW52aXNpYmxlIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVByb3ZlbmFuY2UoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIGtleTogU3RhdGVLZXksXG4gIG9wdGlvbnM/OiB7IGF0SWR4PzogbnVtYmVyIH0sXG4pOiBBcnJheVByb3ZlbmFuY2Uge1xuICBjb25zdCBub3JtYWxpc2VkS2V5ID0gbm9ybWFsaXNlU3RhdGVLZXkoa2V5KTtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPT09IDApIHJldHVybiB7IGtleTogbm9ybWFsaXNlZEtleSwgbWlzc2luZzogJ2VtcHR5LWxvZycgfTtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4ob3B0aW9ucz8uYXRJZHggPz8gY29tbWl0TG9nLmxlbmd0aCAtIDEsIGNvbW1pdExvZy5sZW5ndGggLSAxKTtcbiAgY29uc3Qgc2VncyA9IG5vcm1hbGlzZWRLZXkuc3BsaXQoREVMSU0pO1xuXG4gIC8vIEV2ZXJ5IHJvdyB1bmRlciB0aGUga2V5J3MgdG9wLWxldmVsIGtleSB1cCB0byBgZW5kYCwgaW4gY29tbWl0IG9yZGVyIOKAlCB0aGVcbiAgLy8gcm93cyBjb21taXRWYWx1ZUF0IGZvbGRzIChyZWZ1c2luZyBhIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93KSwgd2l0aCB0aGVcbiAgLy8gY29tbWl0IHBvc2l0aW9uIHRoZSBiaXJ0aCByZWNvcmRzIG5lZWQuXG4gIGNvbnN0IHJvd3MgPSByb3dzVW5kZXJSb290KGNvbW1pdExvZywgbm9ybWFsaXNlZEtleSwgZW5kKTtcbiAgLy8gVGhlIGNvbW1pdHMgdGhhdCBXUk9URSB0aGUga2V5IOKAlCB0aGUgd3JpdGVyIHJ1bGUgZXZlcnkga2V5IHF1ZXJ5IHNoYXJlcy5cbiAgY29uc3Qgd3JpdGVycyA9IG5ldyBTZXQod3JpdGVyc09mKGNvbW1pdExvZywgbm9ybWFsaXNlZEtleSwgeyBlbmQgfSkpO1xuICAvLyBGNGI6IHdoYXQgdGhlIHZhbHVlIGF0IGBlbmRgIHJlc3RzIG9uIOKAlCB0aGUgYmFzaXMgdHdpbidzIGNvZGVzLCBsZXNzIHdoYXQgYG1pc3NpbmdgIGFscmVhZHkgc2F5cy5cbiAgY29uc3QgeyBiYXNpcyB9ID0gY29tbWl0VmFsdWVBdFdpdGhCYXNpcyhjb21taXRMb2csIGVuZCwgbm9ybWFsaXNlZEtleSk7XG4gIGNvbnN0IHNhaWQgPSAoYWxzbzogVmFsdWVCYXNpc1tdKSA9PiB7XG4gICAgY29uc3QgcmVzdCA9IGJhc2lzLmZpbHRlcigoYykgPT4gIWFsc28uaW5jbHVkZXMoYykpO1xuICAgIHJldHVybiByZXN0Lmxlbmd0aCA+IDAgPyB7IGJhc2lzOiByZXN0IH0gOiB7fTtcbiAgfTtcbiAgaWYgKHdyaXRlcnMuc2l6ZSA9PT0gMClcbiAgICByZXR1cm4geyBrZXk6IG5vcm1hbGlzZWRLZXksIG1pc3Npbmc6ICduZXZlci13cml0dGVuJywgLi4uc2FpZChbJ25ldmVyLXdyaXR0ZW4nLCAnZnJvbS1pbml0aWFsLXN0YXRlJ10pIH07XG5cbiAgLy8gVGhlIGFwcGVuZC1mb2xkOiB0aGUga2V5J3Mgb25lIGZvbGQsIHdhdGNoZWQuIGBiaXJ0aHNgIGlzIHRoZSBhZGRlZFxuICAvLyBwcm92ZW5hbmNlIHRyYWNrLCBpbmRleC1hbGlnbmVkIHdoZW5ldmVyIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSAodGhlXG4gIC8vIG1vZHVsZSBpbnZhcmlhbnQpLiBBIHJvdyBvZiBhIGNvbW1pdCB0aGF0IGRpZCBub3Qgd3JpdGUgdGhlIGtleSAoYSBtZXJnZVxuICAvLyBhcm91bmQgaXQgdGhhdCBuZXZlciByZWFjaGVkIGl0KSBtb3ZlcyBubyBiaXJ0aC5cbiAgbGV0IGJpcnRoczogRWxlbWVudEJpcnRoW10gPSBbXTtcbiAgY29uc3QgdmFsdWUgPSBmb2xkS2V5KHJvd3MsIHNlZ3MsIHtcbiAgICBvYnNlcnZlOiAodG91Y2gsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgIGlmICh3cml0ZXJzLmhhcyh0b3VjaC5jb21taXRJZHgpKSBiaXJ0aHMgPSBuZXh0QmlydGhzKGJpcnRocywgdG91Y2gsIGJlZm9yZSwgYWZ0ZXIpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7IGtleTogbm9ybWFsaXNlZEtleSwgbWlzc2luZzogJ25vdC1hbi1hcnJheScsIC4uLnNhaWQoW10pIH07XG4gIHJldHVybiB7IGtleTogbm9ybWFsaXNlZEtleSwgYXRJZHg6IGVuZCwgbGVuZ3RoOiB2YWx1ZS5sZW5ndGgsIGJpcnRocywgLi4uc2FpZChbXSkgfTtcbn1cblxuLyoqXG4gKiBUaGUgYmlydGhzIGFmdGVyIG9uZSByb3cgb2YgdGhlIGZvbGQsIGZyb20gdGhlIHZhbHVlIGJlZm9yZSBpdCBhbmQgYWZ0ZXIgaXQuXG4gKlxuICogQSByb3cgdGhhdCByZWNvcmRzIG9ubHkgaXRzIFRBSUwgKGBhcHBlbmRgKSBrbm93cyBleGFjdGx5IHdoYXQgaXQgYWRkZWQg4oCUXG4gKiBgJ2FwcGVuZC12ZXJiJ2AsIG5vIGVxdWFsaXR5IGNoZWNrcywgTyh0YWlsKS4gRXZlcnkgb3RoZXIgcm93IOKAlCBhIGBzZXRgLCBhXG4gKiBgbWVyZ2VgLCBhIGBkZWxldGVgIOKAlCBpcyBhIHdob2xlLXZhbHVlIHRyYW5zaXRpb246IGF0dHJpYnV0ZWQgYnkgaW5mZXJlbmNlXG4gKiAoe0BsaW5rIHJlYmFzZUJpcnRoc30pLCBhbmQgYSBub24tYXJyYXkgcmVzdWx0IChhIGBkZWxldGVgIGxlYXZlcyBub25lKSBlbmRzXG4gKiB0aGUgdHJhY2suXG4gKi9cbmZ1bmN0aW9uIG5leHRCaXJ0aHMoYmlydGhzOiBFbGVtZW50QmlydGhbXSwgdG91Y2g6IFRvdWNoLCBiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duKTogRWxlbWVudEJpcnRoW10ge1xuICAvLyBBbiBgYXBwZW5kYCByZWNvcmRzIHRoZSB0YWlsIG9mIElUUyBPV04gcGF0aC4gT24gYSBjb250YWluZXIgYXJvdW5kIHRoZSBrZXkgKG9yIGEgcGF0aCBpbnNpZGUgaXQpIHRoZVxuICAvLyBrZXkncyB2YWx1ZSBjaGFuZ2VkIHdob2xlc2FsZSDigJQgYGFwcGVuZCBhYCB3aXRoIGEgbm9uLWFycmF5IHRhaWwgcmVwbGFjZXMgYGFgLCBhbmQgYGHikJ9iYCB3aXRoIGl0IOKAlCBzb1xuICAvLyBvbmx5IGFuIGFwcGVuZCBPTiB0aGUga2V5IGVhcm5zIGV4YWN0IHRhaWwgYXR0cmlidXRpb24uXG4gIGlmICghcmVjb3Jkc1RhaWwodG91Y2gudmVyYikgfHwgdG91Y2gucmVsYXRpb24gIT09ICdleGFjdCcpIHtcbiAgICByZXR1cm4gcmViYXNlQmlydGhzKGJlZm9yZSwgYWZ0ZXIsIGJpcnRocywgdG91Y2gsICdwcmVmaXgtaW5mZXJlbmNlJyk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYmVmb3JlKSAmJiBBcnJheS5pc0FycmF5KGFmdGVyKSkge1xuICAgIC8vIFRoZSBzdGVwIGV4dGVuZGVkIHRoZSBhcnJheTogdGhlIGVsZW1lbnRzIHBhc3QgdGhlIG9sZCBsZW5ndGggYXJlIHRoZVxuICAgIC8vIHJlY29yZGVkIHRhaWwg4oCUIGV4YWN0IGF0dHJpYnV0aW9uLlxuICAgIGZvciAobGV0IGogPSBiZWZvcmUubGVuZ3RoOyBqIDwgYWZ0ZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgIGJpcnRocy5wdXNoKGJpcnRoT2YoaiwgdG91Y2gsICdhcHBlbmQtdmVyYicsIGFmdGVyW2pdKSk7XG4gICAgfVxuICAgIHJldHVybiBiaXJ0aHM7XG4gIH1cbiAgLy8gRGVnZW5lcmF0ZSBhcHBlbmQ6IG9udG8gYSBub24tYXJyYXksIG9yIGEgbm9uLWFycmF5IHRhaWwgKGUuZy4gYSByZWRhY3RlZFxuICAvLyB0YWlsIHJlcGxhY2VkIGJ5IHRoZSAnUkVEQUNURUQnIHN0cmluZykuIFRoZSB0YWlsIEJFQ0FNRSB0aGUgdmFsdWUg4oCUXG4gIC8vIHRoZSBzdGVwJ3Mgb3duIHJ1bGUg4oCUIGFuZCBhdHRyaWJ1dGlvbiBzdGF5cyBleGFjdC5cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYWZ0ZXIpID8gYWZ0ZXIubWFwKChlbCwgaikgPT4gYmlydGhPZihqLCB0b3VjaCwgJ2FwcGVuZC12ZXJiJywgZWwpKSA6IFtdO1xufVxuXG4vKipcbiAqIFJlLWRlcml2ZSBiaXJ0aHMgYWZ0ZXIgYSBmdWxsLXZhbHVlIHRyYW5zaXRpb24gKGBzZXRgL2BtZXJnZWApOlxuICogLSBub24tYXJyYXkgcmVzdWx0IOKGkiBubyBiaXJ0aHMgKGludmFyaWFudDogYmlydGhzIHRyYWNrIGFycmF5cyBvbmx5KVxuICogLSBwcmV2aW91cyBhcnJheSBpcyBhIHN0cmljdCBwcmVmaXgg4oaSIGtlZXAgb2xkIGJpcnRocywgYXR0cmlidXRlIHRoZSB0YWlsXG4gKiAgIHRvIHRoaXMgdG91Y2ggd2l0aCB0aGUgZ2l2ZW4gKGhldXJpc3RpYykgYmFzaXNcbiAqIC0gb3RoZXJ3aXNlIOKGkiB3aG9sZXNhbGUgcmVwbGFjZW1lbnQ6IGV2ZXJ5IGVsZW1lbnQgcmVib3JuICd3aG9sZS12YWx1ZSdcbiAqL1xuZnVuY3Rpb24gcmViYXNlQmlydGhzKFxuICBwcmV2OiB1bmtub3duLFxuICBuZXh0OiB1bmtub3duLFxuICBiaXJ0aHM6IEVsZW1lbnRCaXJ0aFtdLFxuICB0b3VjaDogVG91Y2gsXG4gIHRhaWxCYXNpczogQXR0cmlidXRpb25CYXNpcyxcbik6IEVsZW1lbnRCaXJ0aFtdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG5leHQpKSByZXR1cm4gW107XG4gIGlmIChBcnJheS5pc0FycmF5KHByZXYpICYmIGlzU3RyaWN0UHJlZml4KHByZXYsIG5leHQpKSB7XG4gICAgY29uc3Qga2VwdCA9IGJpcnRocy5zbGljZSgwLCBwcmV2Lmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IHByZXYubGVuZ3RoOyBpIDwgbmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAga2VwdC5wdXNoKGJpcnRoT2YoaSwgdG91Y2gsIHRhaWxCYXNpcywgbmV4dFtpXSkpO1xuICAgIH1cbiAgICByZXR1cm4ga2VwdDtcbiAgfVxuICByZXR1cm4gbmV4dC5tYXAoKGVsLCBpKSA9PiBiaXJ0aE9mKGksIHRvdWNoLCAnd2hvbGUtdmFsdWUnLCBlbCkpO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIG92ZXIge0BsaW5rIGFycmF5UHJvdmVuYW5jZX06IHRoZSBiaXJ0aCBvZiBPTkUgZWxlbWVudC5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUga2V5IGhhcyBubyBhcnJheSBwcm92ZW5hbmNlIChhbnlcbiAqIHtAbGluayBNaXNzaW5nUHJvdmVuYW5jZVJlYXNvbn0pIG9yIGBpbmRleGAgaXMgb3V0IG9mIHJhbmdlIGF0IGBhdElkeGAg4oCUXG4gKiBNYXAuZ2V0LWxpa2Ugc2VtYW50aWNzOyB1c2Uge0BsaW5rIGFycmF5UHJvdmVuYW5jZX0gZGlyZWN0bHkgd2hlbiB5b3UgbmVlZFxuICogdGhlIG1pc3NpbmcgcmVhc29uLlxuICpcbiAqIEBzZWUgRWxlbWVudEJpcnRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50UHJvdmVuYW5jZShcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAga2V5OiBTdGF0ZUtleSxcbiAgaW5kZXg6IG51bWJlcixcbiAgb3B0aW9ucz86IHsgYXRJZHg/OiBudW1iZXIgfSxcbik6IEVsZW1lbnRCaXJ0aCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb3YgPSBhcnJheVByb3ZlbmFuY2UoY29tbWl0TG9nLCBrZXksIG9wdGlvbnMpO1xuICBpZiAoIXByb3YuYmlydGhzIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBwcm92LmJpcnRocy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJpcnRoID0gcHJvdi5iaXJ0aHNbaW5kZXhdO1xuICByZXR1cm4gcHJvdi5iYXNpcyA9PT0gdW5kZWZpbmVkID8gYmlydGggOiB7IC4uLmJpcnRoLCB2YWx1ZUJhc2lzOiBwcm92LmJhc2lzIH07XG59XG4iXX0=
|
|
@@ -41,8 +41,9 @@
|
|
|
41
41
|
* on. That degradation is documented on `refuseChain`, on `timeTravel`'s
|
|
42
42
|
* `@throws`, and in the README.
|
|
43
43
|
*/
|
|
44
|
+
import { kindOf } from '../capture/valueKinds.js';
|
|
44
45
|
import { parseRuntimeStageId } from '../ids/runtimeStageId.js';
|
|
45
|
-
import { DELIM } from '../memory/utils.js';
|
|
46
|
+
import { deepEqual, DELIM } from '../memory/utils.js';
|
|
46
47
|
import { foldLegs } from './stateAt.js';
|
|
47
48
|
/** The execution-index span of one leg, read off its `runtimeStageId`s. */
|
|
48
49
|
export function spanOf(log) {
|
|
@@ -70,44 +71,45 @@ export function spanOf(log) {
|
|
|
70
71
|
*
|
|
71
72
|
* The fold reproduces `'REDACTED'` wherever the engine scrubbed a write, while
|
|
72
73
|
* the checkpoint that seeded the resumed leg holds the real value — so those
|
|
73
|
-
* paths CANNOT agree, and are not asked to. Everything else
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
74
|
+
* paths CANNOT agree, and are not asked to. Everything else is decided by the
|
|
75
|
+
* ONE equality law (`memory/equality.ts · deepEqual`, every value kind compared
|
|
76
|
+
* as the record holds it; 9.44.2 — this walk had a law of its own, which held
|
|
77
|
+
* any two RegExps, Errors or buffers equal). Both sides are copies of one
|
|
78
|
+
* record, so an opaque value compares as `'copies'`. Only the containers above
|
|
79
|
+
* a redacted path are walked here.
|
|
78
80
|
*/
|
|
79
81
|
function sameState(a, b, redacted, path) {
|
|
80
|
-
if (
|
|
81
|
-
return
|
|
82
|
-
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null)
|
|
83
|
-
return false;
|
|
84
|
-
if (a instanceof Date || b instanceof Date) {
|
|
85
|
-
return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();
|
|
86
|
-
}
|
|
87
|
-
if (a instanceof Map || b instanceof Map || a instanceof Set || b instanceof Set) {
|
|
88
|
-
if (!(a instanceof Map && b instanceof Map) && !(a instanceof Set && b instanceof Set))
|
|
89
|
-
return false;
|
|
90
|
-
return sameState([...a.entries()], [...b.entries()], redacted, path);
|
|
91
|
-
}
|
|
92
|
-
if (Array.isArray(a) !== Array.isArray(b))
|
|
93
|
-
return false;
|
|
82
|
+
if (!redactedBelow(path, redacted))
|
|
83
|
+
return deepEqual(a, b, 'copies');
|
|
94
84
|
if (Array.isArray(a) && Array.isArray(b)) {
|
|
95
85
|
if (a.length !== b.length)
|
|
96
86
|
return false;
|
|
97
87
|
return a.every((item, i) => sameState(item, b[i], redacted, path === '' ? String(i) : `${path}${DELIM}${i}`));
|
|
98
88
|
}
|
|
99
|
-
const
|
|
100
|
-
|
|
89
|
+
const plain = (v) => v !== null && typeof v === 'object' && !Array.isArray(v) && kindOf(v) === 'plain';
|
|
90
|
+
if (!plain(a) || !plain(b))
|
|
91
|
+
return deepEqual(a, b, 'copies');
|
|
101
92
|
const present = (o) => Object.keys(o).filter((k) => o[k] !== undefined);
|
|
102
|
-
const leftKeys = present(
|
|
103
|
-
const rightKeys = new Set(present(
|
|
93
|
+
const leftKeys = present(a);
|
|
94
|
+
const rightKeys = new Set(present(b));
|
|
104
95
|
if (leftKeys.length !== rightKeys.size || !leftKeys.every((k) => rightKeys.has(k)))
|
|
105
96
|
return false;
|
|
106
97
|
return leftKeys.every((k) => {
|
|
107
98
|
const childPath = path === '' ? k : `${path}${DELIM}${k}`;
|
|
108
|
-
return redacted.has(childPath) || sameState(
|
|
99
|
+
return redacted.has(childPath) || sameState(a[k], b[k], redacted, childPath);
|
|
109
100
|
});
|
|
110
101
|
}
|
|
102
|
+
/** Is `path`, or a path below it, one the log was redacted at? */
|
|
103
|
+
function redactedBelow(path, redacted) {
|
|
104
|
+
if (redacted.size === 0)
|
|
105
|
+
return false;
|
|
106
|
+
if (path === '')
|
|
107
|
+
return true;
|
|
108
|
+
for (const r of redacted)
|
|
109
|
+
if (r === path || r.startsWith(`${path}${DELIM}`))
|
|
110
|
+
return true;
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
111
113
|
/**
|
|
112
114
|
* Check that `legs` really are one run read in order, and say why not.
|
|
113
115
|
*
|
|
@@ -183,4 +185,4 @@ export function refuseChain(legs) {
|
|
|
183
185
|
}
|
|
184
186
|
return undefined;
|
|
185
187
|
}
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFtQixRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFhekQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxNQUFNLENBQUMsR0FBNEI7SUFLakQsSUFBSSxLQUF5QixDQUFDO0lBQzlCLElBQUksSUFBd0IsQ0FBQztJQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzlCLEtBQUssTUFBTSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUNqQyxJQUFJLENBQUMsRUFBRTtZQUFFLFNBQVM7UUFDbEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNaLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQUUsU0FBUztRQUMzQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksY0FBYyxHQUFHLEtBQUs7WUFBRSxLQUFLLEdBQUcsY0FBYyxDQUFDO1FBQzFFLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxjQUFjLEdBQUcsSUFBSTtZQUFFLElBQUksR0FBRyxjQUFjLENBQUM7SUFDekUsQ0FBQztJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFD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QUFLLGFBQWEsSUFBSSxNQUFNLENBQUMsT0FBTztZQUFFLFNBQVMsQ0FBQyx5Q0FBeUM7UUFDekcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0RSxPQUFPLENBQ0wsc0JBQXNCLENBQUMsMkNBQTJDLENBQUMsR0FBRyxDQUFDLHlCQUF5QjtnQkFDaEcsZ0dBQWdHO2dCQUNoRyxpR0FBaUc7Z0JBQ2pHLDhCQUE4QixDQUMvQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjaGFpbi50cyDigJQgcmVhZGluZyBhIHBhdXNlL3Jlc3VtZSBhcyBPTkUgYXhpcy5cbiAqXG4gKiBXSFkgVEhJUyBGSUxFIEVYSVNUUy4gQSBwYXVzZSBhbmQgaXRzIHJlc3VtZSBwcm9kdWNlIFRXTyBzbmFwc2hvdHMuIE9uIGFcbiAqIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSAodGhlIGNoZWNrcG9pbnQgd2FzIHBlcnNpc3RlZCBhbmQgYSBmcmVzaCBleGVjdXRvclxuICogcGlja2VkIGl0IHVwKSB0aGUgc2Vjb25kIHJ1biBnZXRzIGEgZnJlc2ggcnVudGltZTogaXRzIGBjb21taXRMb2dgIHN0YXJ0cyBhdFxuICogaW5kZXggMCBhbmQgaG9sZHMgb25seSB0aGUgcG9zdC1yZXN1bWUgY29tbWl0cywgYW5kIGl0cyBgaW5pdGlhbFN0YXRlYCBpc1xuICogdGhlIHN0YXRlIGF0IHRoZSBwYXVzZS4gVHdvIGxvZ3MsIHR3byBkaXNqb2ludCBheGVzIOKAlCBzbyBhIHJlYWRlciBzY3J1YmJpbmdcbiAqIGEgcmVzdW1lZCBydW4gc2F3IG9ubHkgdGhlIHNlY29uZCBoYWxmIHVubGVzcyB0aGUgYXBwbGljYXRpb24gaGFkIGtlcHQgdGhlXG4gKiBwYXVzZWQgc25hcHNob3QgYW5kIHN0aXRjaGVkIHRoZSBoYWx2ZXMgaXRzZWxmLiBFdmVyeSBhcHBsaWNhdGlvbiB0aGF0XG4gKiBwYXVzZXMgd291bGQgd3JpdGUgdGhhdCBzdGl0Y2hpbmcsIGFuZCBub25lIG9mIHRoZW0gb3duIHRoZSBhcml0aG1ldGljLlxuICpcbiAqIFRIRSBIT05FU1QgQklULCB1cCBmcm9udDogQ09NTUlUIElORElDRVMgQVJFIFJVTi1MT0NBTC4gVGhlcmUgaXMgbm8gZ2xvYmFsXG4gKiBpbmRleCBhY3Jvc3MgYSBjaGFpbiBhbmQgdGhpcyBmaWxlIGRvZXMgbm90IGludmVudCBvbmUg4oCUIGBjb21taXRJZHhgIGFuZFxuICogYGxhc3RDb21taXRJZHhgIGtlZXAgaW5kZXhpbmcgdGhlaXIgb3duIHNvdXJjZSwgYW5kIGV2ZXJ5IHN0b3AgY2FycmllcyB0aGVcbiAqIHtAbGluayBTdG9wLnNvdXJjZUlkeH0gdGhleSBiZWxvbmcgdG8uIFRoZSBjdXJzb3IncyBTVEVQUyBhcmUgd2hhdCBydW5cbiAqIGFjcm9zcyB0aGUgd2hvbGUgY2hhaW4uXG4gKlxuICogQU5EIFRIRSBSRUZVU0FMOiBhIGNoYWluIHRoYXQgaXMgbm90IG9yZGVyZWQsIG9yIHdob3NlIGxlZ3MgYXJlIG5vdCBmcm9tIG9uZVxuICogbGluZWFnZSwgaXMgUkVGVVNFRCByYXRoZXIgdGhhbiBndWVzc2VkIGF0LiBUaGUgcmVjb3JkIGNhcnJpZXMgVFdPIHNpZ25hbHNcbiAqIGFuZCB0aGlzIGZpbGUgcmVhZHMgYm90aDpcbiAqXG4gKiAtIFRoZSBleGVjdXRpb24gaW5kZXggdGhlIGVuZ2luZSBzdGFtcHMgaW50byBldmVyeSBgcnVudGltZVN0YWdlSWRgIOKAlFxuICogICBnbG9iYWxseSBtb25vdG9uaWMgcGVyIHJ1biBhbmQsIGRlbGliZXJhdGVseSwgTk9UIHJlc2V0IG9uIHJlc3VtZS4gU28gYVxuICogICBsYXRlciBsZWcncyBmaXJzdCBleGVjdXRpb24gaW5kZXggbXVzdCBiZSBwYXN0IHRoZSBlYXJsaWVyIGxlZydzIGxhc3QsIGFuZFxuICogICBubyBzdGFnZSBtYXkgYXBwZWFyIGluIHR3byBsZWdzLiBUaGlzIGNhdGNoZXMgYSBiYWNrd2FyZHMgY2hhaW4sIGEgZnJlc2hcbiAqICAgcnVuICh3aGljaCByZXN0YXJ0cyBhdCAwKSBhbmQgYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSAod2hvc2Ugb25lIHNuYXBzaG90XG4gKiAgIGFscmVhZHkgaG9sZHMgYm90aCBoYWx2ZXMpLlxuICogLSBUaGUgbGF0ZXIgbGVnJ3MgYGluaXRpYWxTdGF0ZWAuIE9uIGEgcmVzdW1lIHRoZSBmcmVzaCBydW50aW1lIGlzIHNlZWRlZFxuICogICBmcm9tIHRoZSBjaGVja3BvaW50LCBzbyB0aGF0IGJhc2UgSVMgdGhlIHN0YXRlIGF0IHRoZSBwYXVzZSDigJQgYW5kIHRoZVxuICogICBzdGF0ZSB0aGUgZWFybGllciBsZWdzIEZPTEQgVE8gbXVzdCBkZWVwLWVxdWFsIGl0LiBUaGlzIGlzIHdoYXQgY2F0Y2hlcyBhXG4gKiAgIGxlZyBmcm9tIHNvbWUgT1RIRVIgbGluZWFnZSB3aG9zZSBpbmRpY2VzIG1lcmVseSBoYXBwZW4gdG8gYmUgaGlnaGVyOiB0aGVcbiAqICAgY291bnRlcnMgbGluZSB1cCBieSBhY2NpZGVudCwgdGhlIHN0YXRlIG5ldmVyIGRvZXMuXG4gKlxuICogQSBjaGFydCBpZGVudGl0eSBvciBhIGxpbmVhZ2UgaWQgaXMgTk9UIG9uIHRoZSByZWNvcmQsIHNvIG5vdGhpbmcgaGVyZVxuICogcHJldGVuZHMgdG8gY2hlY2sgb25lLiBBbmQgd2hlcmUgdGhlIHN0YXRlIHNpZ25hbCBpcyBub3Qgb24gdGhlIHJlY29yZFxuICogZWl0aGVyIOKAlCBhIGxlZyByZWNvcmRlZCBiZWZvcmUgOS4xNyBjYXJyaWVzIG5vIGBpbml0aWFsU3RhdGVgOyBhbiBlYXJsaWVyXG4gKiBsZWcgd2l0aCBubyBiYXNlIGZvbGRzIGAnbG9nLW9ubHknYDsgYSBsZWcgd2l0aCB1bnJlYWRhYmxlIHJvd3MgZm9sZHMgYW5cbiAqIGluY29tcGxldGUgc3RhdGUg4oCUIHRoYXQgY2hlY2sgaXMgU0tJUFBFRCwgbm90IGZha2VkOiB0aGUgY2hhaW4gdGhlbiByZXN0cyBvblxuICogdGhlIGluZGV4IGNoZWNrcyBhbG9uZSwgYW5kIGV2ZXJ5IGZvbGQncyBgYmFzaXNgIHN0aWxsIHNheXMgd2hhdCBpdCBzdG9vZFxuICogb24uIFRoYXQgZGVncmFkYXRpb24gaXMgZG9jdW1lbnRlZCBvbiBgcmVmdXNlQ2hhaW5gLCBvbiBgdGltZVRyYXZlbGAnc1xuICogYEB0aHJvd3NgLCBhbmQgaW4gdGhlIFJFQURNRS5cbiAqL1xuXG5pbXBvcnQgeyBwYXJzZVJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi4vbWVtb3J5L3V0aWxzLmpzJztcbmltcG9ydCB7IHR5cGUgUmVhZFNvdXJjZSwgZm9sZExlZ3MgfSBmcm9tICcuL3N0YXRlQXQuanMnO1xuaW1wb3J0IHR5cGUgeyBUaW1lVHJhdmVsU291cmNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBPbmUgbGVnIG9mIGEgY2hhaW46IGEgc291cmNlLCBpdHMgcmVhZCBsb2csIGFuZCB3aGVyZSBpdCBzaXRzIGluIHRoZSBydW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENoYWluTGVnIHtcbiAgcmVhZG9ubHkgc291cmNlOiBUaW1lVHJhdmVsU291cmNlO1xuICByZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdO1xuICAvKiogTG93ZXN0IGV4ZWN1dGlvbiBpbmRleCBzdGFtcGVkIGluIHRoaXMgbGVnOyBgdW5kZWZpbmVkYCBmb3IgYW4gaWQtbGVzcyBsb2cuICovXG4gIHJlYWRvbmx5IGZpcnN0RXhlY3V0aW9uSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqIEhpZ2hlc3QgZXhlY3V0aW9uIGluZGV4IHN0YW1wZWQgaW4gdGhpcyBsZWcuICovXG4gIHJlYWRvbmx5IGxhc3RFeGVjdXRpb25JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIGV4ZWN1dGlvbi1pbmRleCBzcGFuIG9mIG9uZSBsZWcsIHJlYWQgb2ZmIGl0cyBgcnVudGltZVN0YWdlSWRgcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFuT2YobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IHtcbiAgZmlyc3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGFzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZHM6IFNldDxzdHJpbmc+O1xufSB7XG4gIGxldCBmaXJzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgbGFzdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBidW5kbGUgb2YgbG9nKSB7XG4gICAgY29uc3QgaWQgPSBidW5kbGUucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKCFpZCkgY29udGludWU7XG4gICAgaWRzLmFkZChpZCk7XG4gICAgY29uc3QgeyBleGVjdXRpb25JbmRleCB9ID0gcGFyc2VSdW50aW1lU3RhZ2VJZChpZCk7XG4gICAgaWYgKE51bWJlci5pc05hTihleGVjdXRpb25JbmRleCkpIGNvbnRpbnVlO1xuICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGV4ZWN1dGlvbkluZGV4IDwgZmlyc3QpIGZpcnN0ID0gZXhlY3V0aW9uSW5kZXg7XG4gICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCB8fCBleGVjdXRpb25JbmRleCA+IGxhc3QpIGxhc3QgPSBleGVjdXRpb25JbmRleDtcbiAgfVxuICByZXR1cm4geyBmaXJzdCwgbGFzdCwgaWRzIH07XG59XG5cbi8qKlxuICogU3RydWN0dXJhbCBlcXVhbGl0eSBvZiB0d28gZm9sZGVkIHN0YXRlcywgaWdub3JpbmcgdGhlIHBhdGhzIHRoZSBsb2cgd2FzXG4gKiByZWRhY3RlZCBhdC5cbiAqXG4gKiBUaGUgZm9sZCByZXByb2R1Y2VzIGAnUkVEQUNURUQnYCB3aGVyZXZlciB0aGUgZW5naW5lIHNjcnViYmVkIGEgd3JpdGUsIHdoaWxlXG4gKiB0aGUgY2hlY2twb2ludCB0aGF0IHNlZWRlZCB0aGUgcmVzdW1lZCBsZWcgaG9sZHMgdGhlIHJlYWwgdmFsdWUg4oCUIHNvIHRob3NlXG4gKiBwYXRocyBDQU5OT1QgYWdyZWUsIGFuZCBhcmUgbm90IGFza2VkIHRvLiBFdmVyeXRoaW5nIGVsc2UgbXVzdDogc2FtZSBrZXlzXG4gKiAoYSBrZXkgaG9sZGluZyBgdW5kZWZpbmVkYCBjb3VudHMgYXMgYWJzZW50LCBhcyBpdCBkb2VzIHRocm91Z2ggSlNPTiksIHNhbWVcbiAqIGFycmF5IGxlbmd0aHMsIHNhbWUgbGVhdmVzIGJ5IGBPYmplY3QuaXNgLCBEYXRlcyBieSB0aGVpciBpbnN0YW50LiBWYWx1ZXNcbiAqIGFyZSB3aGF0ZXZlciBzdXJ2aXZlZCBgc3RydWN0dXJlZENsb25lYCwgd2hpY2ggaXMgdGhlIGxpYnJhcnkncyBvd24gbGF3IG9uXG4gKiBzdGF0ZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNhbWVTdGF0ZShhOiB1bmtub3duLCBiOiB1bmtub3duLCByZWRhY3RlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChPYmplY3QuaXMoYSwgYikpIHJldHVybiB0cnVlO1xuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9PSAnb2JqZWN0JyB8fCBhID09PSBudWxsIHx8IGIgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlIHx8IGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlICYmIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgfVxuICBpZiAoYSBpbnN0YW5jZW9mIE1hcCB8fCBiIGluc3RhbmNlb2YgTWFwIHx8IGEgaW5zdGFuY2VvZiBTZXQgfHwgYiBpbnN0YW5jZW9mIFNldCkge1xuICAgIGlmICghKGEgaW5zdGFuY2VvZiBNYXAgJiYgYiBpbnN0YW5jZW9mIE1hcCkgJiYgIShhIGluc3RhbmNlb2YgU2V0ICYmIGIgaW5zdGFuY2VvZiBTZXQpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHNhbWVTdGF0ZShbLi4uYS5lbnRyaWVzKCldLCBbLi4uYi5lbnRyaWVzKCldLCByZWRhY3RlZCwgcGF0aCk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgIT09IEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgoaXRlbSwgaSkgPT4gc2FtZVN0YXRlKGl0ZW0sIGJbaV0sIHJlZGFjdGVkLCBwYXRoID09PSAnJyA/IFN0cmluZyhpKSA6IGAke3BhdGh9JHtERUxJTX0ke2l9YCkpO1xuICB9XG4gIGNvbnN0IGxlZnQgPSBhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByaWdodCA9IGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHByZXNlbnQgPSAobzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IE9iamVjdC5rZXlzKG8pLmZpbHRlcigoaykgPT4gb1trXSAhPT0gdW5kZWZpbmVkKTtcbiAgY29uc3QgbGVmdEtleXMgPSBwcmVzZW50KGxlZnQpO1xuICBjb25zdCByaWdodEtleXMgPSBuZXcgU2V0KHByZXNlbnQocmlnaHQpKTtcbiAgaWYgKGxlZnRLZXlzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLnNpemUgfHwgIWxlZnRLZXlzLmV2ZXJ5KChrKSA9PiByaWdodEtleXMuaGFzKGspKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbGVmdEtleXMuZXZlcnkoKGspID0+IHtcbiAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID09PSAnJyA/IGsgOiBgJHtwYXRofSR7REVMSU19JHtrfWA7XG4gICAgcmV0dXJuIHJlZGFjdGVkLmhhcyhjaGlsZFBhdGgpIHx8IHNhbWVTdGF0ZShsZWZ0W2tdLCByaWdodFtrXSwgcmVkYWN0ZWQsIGNoaWxkUGF0aCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrIHRoYXQgYGxlZ3NgIHJlYWxseSBhcmUgb25lIHJ1biByZWFkIGluIG9yZGVyLCBhbmQgc2F5IHdoeSBub3QuXG4gKlxuICogUmV0dXJucyB0aGUgcmVmdXNhbCBtZXNzYWdlLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjaGFpbiBpcyBzb3VuZC4gVGhyZWVcbiAqIGRpc3RpbmN0IGZhaWx1cmVzLCBiZWNhdXNlIHRoZXkgYXJlIHRocmVlIGRpZmZlcmVudCBtaXN0YWtlcywgY2hlY2tlZCBpblxuICogdGhpcyBvcmRlcjpcbiAqXG4gKiAtIFJFUEVBVEVEIFNUQUdFIOKAlCBvbmUgYHJ1bnRpbWVTdGFnZUlkYCBhcHBlYXJzIGluIHR3byBsZWdzLiBJZHMgYXJlIHVuaXF1ZVxuICogICB3aXRoaW4gYSBydW4sIHNvIGEgcmVwZWF0IG1lYW5zIHRoZSBzYW1lIGV4ZWN1dGlvbiB3YXMgcmVjb3JkZWQgdHdpY2U6IGFcbiAqICAgc2FtZS1leGVjdXRvciByZXN1bWUsIHdob3NlIHNuYXBzaG90IEFMUkVBRFkgaG9sZHMgdGhlIHdob2xlIGxvZyBhbmQgbmVlZHNcbiAqICAgbm8gY2hhaW5pbmcsIGlzIHRoZSB1c3VhbCBjYXVzZS5cbiAqIC0gT1VUIE9GIE9SREVSIOKAlCBhIGxhdGVyIGxlZydzIGZpcnN0IGV4ZWN1dGlvbiBpbmRleCBpcyBub3QgcGFzdCB0aGUgZWFybGllclxuICogICBsZWcncyBsYXN0LiBFaXRoZXIgdGhlIHNvdXJjZXMgd2VyZSBoYW5kZWQgb3ZlciBiYWNrd2FyZHMsIG9yIHRoZSBzZWNvbmRcbiAqICAgaXMgbm90IGEgY29udGludWF0aW9uIGF0IGFsbCAoYSBmcmVzaCBydW4gcmVzdGFydHMgdGhlIGNvdW50ZXIgYXQgMCwgc28gYW5cbiAqICAgdW5yZWxhdGVkIHNuYXBzaG90IGZhaWxzIGhlcmUgcmF0aGVyIHRoYW4gc2lsZW50bHkgaW50ZXJsZWF2aW5nKS5cbiAqIC0gV1JPTkcgTElORUFHRSDigJQgbGVnIGsncyBgaW5pdGlhbFN0YXRlYCBpcyBub3QgdGhlIHN0YXRlIGxlZ3MgMC4uay0xIGZvbGRcbiAqICAgdG8uIE9uIGEgcmVzdW1lIHRoZSBsYXRlciBsZWcgaXMgc2VlZGVkIGZyb20gdGhlIGNoZWNrcG9pbnQsIHNvIGl0cyBiYXNlXG4gKiAgIElTIHRoZSBzdGF0ZSBhdCB0aGUgcGF1c2U7IGEgbGVnIHRoYXQgYmVnaW5zIGFueXdoZXJlIGVsc2UgaXMgZnJvbSBzb21lXG4gKiAgIG90aGVyIHJ1biwgaG93ZXZlciBpdHMgaW5kaWNlcyBoYXBwZW4gdG8gbGluZSB1cC5cbiAqXG4gKiBUSEUgTElORUFHRSBDSEVDSyBSVU5TIE9OTFkgV0hFUkUgVEhFIFJFQ09SRCBBTExPV1MgSVQsIGFuZCBpcyBza2lwcGVkIOKAlFxuICogbmV2ZXIgZmFrZWQg4oCUIG90aGVyd2lzZTogbGVnIGsgbXVzdCBjYXJyeSBhbiBgaW5pdGlhbFN0YXRlYCAoYSByZWNvcmRpbmdcbiAqIG1hZGUgYmVmb3JlIDkuMTcgaGFzIG5vbmUpLCBhbmQgdGhlIGZvbGQgb2YgdGhlIGxlZ3MgYmVmb3JlIGl0IG11c3Qgc3RhbmQgb25cbiAqIGEgcmVhbCBiYXNlIChgYmFzaXM6ICdpbml0aWFsK2xvZydgKSB3aXRoIG5vIHVucmVhZGFibGUgcm93cyAoYHNraXBwZWRgXG4gKiBhYnNlbnQpIOKAlCBhIGxvZy1vbmx5IG9yIGdhcHBlZCBmb2xkIGlzIG5vdCBhIHN0YXRlIGEgcmVhbCBiYXNlIG1heSBiZSBoZWxkXG4gKiBhZ2FpbnN0LiBPbiBzdWNoIGEgY2hhaW4gdGhlIHR3byBpbmRleCBjaGVja3MgYXJlIHRoZSB3aG9sZSBkZWZlbmNlLCBhbmRcbiAqIGBmb2xkTGVnc2AnIGxlZyBydWxlIHRoZW4gQ09OVElOVUVTIHRoZSBmb2xkIGFjcm9zcyB0aGUgc2VhbSwgd2hpY2ggaXMgdGhlXG4gKiByaWdodCBzdGF0ZSBmb3IgYSByZWFsIHJlc3VtZSBhbmQgaXMgd2hhdCBgYmFzaXNgIHJlcG9ydHMuIFBhdGhzIHRoZSBsb2dcbiAqIHdhcyByZWRhY3RlZCBhdCBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgY29tcGFyaXNvbjogdGhlIGZvbGQgaG9sZHNcbiAqIGAnUkVEQUNURUQnYCB0aGVyZSBhbmQgdGhlIGNoZWNrcG9pbnQgaG9sZHMgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmdXNlQ2hhaW4obGVnczogcmVhZG9ubHkgUmVhZFNvdXJjZVtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGxlZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gJ3RpbWVUcmF2ZWw6IGEgY2hhaW4gbmVlZHMgYXQgbGVhc3Qgb25lIHNvdXJjZSwgZ290IGFuIGVtcHR5IGFycmF5Lic7XG5cbiAgY29uc3Qgc3BhbnMgPSBsZWdzLm1hcCgobGVnKSA9PiBzcGFuT2YobGVnLmxvZykpO1xuICBjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaSwgc3Bhbl0gb2Ygc3BhbnMuZW50cmllcygpKSB7XG4gICAgZm9yIChjb25zdCBpZCBvZiBzcGFuLmlkcykge1xuICAgICAgY29uc3QgZWFybGllciA9IHNlZW4uZ2V0KGlkKTtcbiAgICAgIGlmIChlYXJsaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBgdGltZVRyYXZlbDogc291cmNlcyAke2VhcmxpZXJ9IGFuZCAke2l9IGJvdGggcmVjb3JkICcke2lkfScuIEEgcnVudGltZVN0YWdlSWQgaXMgdW5pcXVlIGAgK1xuICAgICAgICAgICd3aXRoaW4gYSBydW4sIHNvIHRoZXNlIGFyZSBub3QgdHdvIGxlZ3Mgb2Ygb25lIHJ1biDigJQgYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBhbHJlYWR5ICcgK1xuICAgICAgICAgICdjYXJyaWVzIHRoZSB3aG9sZSBsb2cgaW4gT05FIHNuYXBzaG90IGFuZCBtdXN0IG5vdCBiZSBjaGFpbmVkIHdpdGggdGhlIHBhdXNlZCBvbmUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc2Vlbi5zZXQoaWQsIGkpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcmV2aW91czogeyBpZHg6IG51bWJlcjsgbGFzdDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW2ksIHNwYW5dIG9mIHNwYW5zLmVudHJpZXMoKSkge1xuICAgIGlmIChzcGFuLmZpcnN0ID09PSB1bmRlZmluZWQgfHwgc3Bhbi5sYXN0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChwcmV2aW91cyAmJiBzcGFuLmZpcnN0IDw9IHByZXZpb3VzLmxhc3QpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGB0aW1lVHJhdmVsOiBzb3VyY2UgJHtpfSBzdGFydHMgYXQgZXhlY3V0aW9uIGluZGV4ICR7c3Bhbi5maXJzdH0sIHdoaWNoIGlzIG5vdCBwYXN0IGAgK1xuICAgICAgICBgc291cmNlICR7cHJldmlvdXMuaWR4fSdzIGxhc3QgKCR7cHJldmlvdXMubGFzdH0pLiBDaGFpbiB0aGUgc291cmNlcyBpbiBydW4gb3JkZXIsIGFuZCBgICtcbiAgICAgICAgJ29ubHkgc291cmNlcyBmcm9tIE9ORSBsaW5lYWdlIOKAlCB0aGUgZW5naW5lIG5ldmVyIHJlc2V0cyB0aGUgZXhlY3V0aW9uIGNvdW50ZXIgYWNyb3NzIGEgJyArXG4gICAgICAgICdyZXN1bWUsIHNvIGEgZnJlc2ggcnVuIHJlc3RhcnRpbmcgYXQgMCBpcyBhIGRpZmZlcmVudCBydW4sIG5vdCBhIGNvbnRpbnVhdGlvbi4nXG4gICAgICApO1xuICAgIH1cbiAgICBwcmV2aW91cyA9IHsgaWR4OiBpLCBsYXN0OiBzcGFuLmxhc3QgfTtcbiAgfVxuXG4gIGZvciAobGV0IGsgPSAxOyBrIDwgbGVncy5sZW5ndGg7IGsrKykge1xuICAgIGNvbnN0IGJhc2UgPSBsZWdzW2tdLmJhc2U7XG4gICAgaWYgKCFiYXNlIHx8IHR5cGVvZiBiYXNlICE9PSAnb2JqZWN0JykgY29udGludWU7IC8vIG5vIHNpZ25hbCBvbiB0aGUgcmVjb3JkIOKAlCBkb2N1bWVudGVkIGRlZ3JhZGF0aW9uXG4gICAgY29uc3QgYmVmb3JlID0gZm9sZExlZ3MobGVncywgayAtIDEsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgaWYgKGJlZm9yZS5iYXNpcyAhPT0gJ2luaXRpYWwrbG9nJyB8fCBiZWZvcmUuc2tpcHBlZCkgY29udGludWU7IC8vIG5vdCBhIHN0YXRlIGEgcmVhbCBiYXNlIGNhbiBiZSBoZWxkIHRvXG4gICAgaWYgKCFzYW1lU3RhdGUoYmVmb3JlLnN0YXRlLCBiYXNlLCBuZXcgU2V0KGJlZm9yZS5yZWRhY3RlZFBhdGhzKSwgJycpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBgdGltZVRyYXZlbDogc291cmNlICR7a30ncyBpbml0aWFsU3RhdGUgaXMgbm90IHRoZSBzdGF0ZSBzb3VyY2UgJHtrIC0gMX0gZm9sZHMgdG8uIE9uIGEgcmVzdW1lIGAgK1xuICAgICAgICBcInRoZSBsYXRlciBsZWcncyBpbml0aWFsU3RhdGUgSVMgdGhlIHN0YXRlIGF0IHRoZSBwYXVzZSwgc28gYSBsZWcgdGhhdCBiZWdpbnMgYW55d2hlcmUgZWxzZSBpcyBcIiArXG4gICAgICAgICdub3QgZnJvbSBvbmUgbGluZWFnZSDigJQgYSBkaWZmZXJlbnQgY2hhcnQsIG9yIGFub3RoZXIgcnVuIG9mIHRoaXMgb25lIOKAlCBldmVuIHdoZW4gaXRzIGV4ZWN1dGlvbiAnICtcbiAgICAgICAgJ2luZGljZXMgaGFwcGVuIHRvIGJlIGhpZ2hlci4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQW1CLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWF6RCwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLE1BQU0sQ0FBQyxHQUE0QjtJQUtqRCxJQUFJLEtBQXlCLENBQUM7SUFDOUIsSUFBSSxJQUF3QixDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDOUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN6QixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxFQUFFO1lBQUUsU0FBUztRQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ1osTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFBRSxTQUFTO1FBQzNDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxjQUFjLEdBQUcsS0FBSztZQUFFLEtBQUssR0FBRyxjQUFjLENBQUM7UUFDMUUsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLGNBQWMsR0FBRyxJQUFJO1lBQUUsSUFBSSxHQUFHLGNBQWMsQ0FBQztJQUN6RSxD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TSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxDQUNMLHNCQUFzQixDQUFDLDJDQUEyQyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUI7Z0JBQ2hHLGdHQUFnRztnQkFDaEcsaUdBQWlHO2dCQUNqRyw4QkFBOEIsQ0FDL0IsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY2hhaW4udHMg4oCUIHJlYWRpbmcgYSBwYXVzZS9yZXN1bWUgYXMgT05FIGF4aXMuXG4gKlxuICogV0hZIFRISVMgRklMRSBFWElTVFMuIEEgcGF1c2UgYW5kIGl0cyByZXN1bWUgcHJvZHVjZSBUV08gc25hcHNob3RzLiBPbiBhXG4gKiBjcm9zcy1leGVjdXRvciByZXN1bWUgKHRoZSBjaGVja3BvaW50IHdhcyBwZXJzaXN0ZWQgYW5kIGEgZnJlc2ggZXhlY3V0b3JcbiAqIHBpY2tlZCBpdCB1cCkgdGhlIHNlY29uZCBydW4gZ2V0cyBhIGZyZXNoIHJ1bnRpbWU6IGl0cyBgY29tbWl0TG9nYCBzdGFydHMgYXRcbiAqIGluZGV4IDAgYW5kIGhvbGRzIG9ubHkgdGhlIHBvc3QtcmVzdW1lIGNvbW1pdHMsIGFuZCBpdHMgYGluaXRpYWxTdGF0ZWAgaXNcbiAqIHRoZSBzdGF0ZSBhdCB0aGUgcGF1c2UuIFR3byBsb2dzLCB0d28gZGlzam9pbnQgYXhlcyDigJQgc28gYSByZWFkZXIgc2NydWJiaW5nXG4gKiBhIHJlc3VtZWQgcnVuIHNhdyBvbmx5IHRoZSBzZWNvbmQgaGFsZiB1bmxlc3MgdGhlIGFwcGxpY2F0aW9uIGhhZCBrZXB0IHRoZVxuICogcGF1c2VkIHNuYXBzaG90IGFuZCBzdGl0Y2hlZCB0aGUgaGFsdmVzIGl0c2VsZi4gRXZlcnkgYXBwbGljYXRpb24gdGhhdFxuICogcGF1c2VzIHdvdWxkIHdyaXRlIHRoYXQgc3RpdGNoaW5nLCBhbmQgbm9uZSBvZiB0aGVtIG93biB0aGUgYXJpdGhtZXRpYy5cbiAqXG4gKiBUSEUgSE9ORVNUIEJJVCwgdXAgZnJvbnQ6IENPTU1JVCBJTkRJQ0VTIEFSRSBSVU4tTE9DQUwuIFRoZXJlIGlzIG5vIGdsb2JhbFxuICogaW5kZXggYWNyb3NzIGEgY2hhaW4gYW5kIHRoaXMgZmlsZSBkb2VzIG5vdCBpbnZlbnQgb25lIOKAlCBgY29tbWl0SWR4YCBhbmRcbiAqIGBsYXN0Q29tbWl0SWR4YCBrZWVwIGluZGV4aW5nIHRoZWlyIG93biBzb3VyY2UsIGFuZCBldmVyeSBzdG9wIGNhcnJpZXMgdGhlXG4gKiB7QGxpbmsgU3RvcC5zb3VyY2VJZHh9IHRoZXkgYmVsb25nIHRvLiBUaGUgY3Vyc29yJ3MgU1RFUFMgYXJlIHdoYXQgcnVuXG4gKiBhY3Jvc3MgdGhlIHdob2xlIGNoYWluLlxuICpcbiAqIEFORCBUSEUgUkVGVVNBTDogYSBjaGFpbiB0aGF0IGlzIG5vdCBvcmRlcmVkLCBvciB3aG9zZSBsZWdzIGFyZSBub3QgZnJvbSBvbmVcbiAqIGxpbmVhZ2UsIGlzIFJFRlVTRUQgcmF0aGVyIHRoYW4gZ3Vlc3NlZCBhdC4gVGhlIHJlY29yZCBjYXJyaWVzIFRXTyBzaWduYWxzXG4gKiBhbmQgdGhpcyBmaWxlIHJlYWRzIGJvdGg6XG4gKlxuICogLSBUaGUgZXhlY3V0aW9uIGluZGV4IHRoZSBlbmdpbmUgc3RhbXBzIGludG8gZXZlcnkgYHJ1bnRpbWVTdGFnZUlkYCDigJRcbiAqICAgZ2xvYmFsbHkgbW9ub3RvbmljIHBlciBydW4gYW5kLCBkZWxpYmVyYXRlbHksIE5PVCByZXNldCBvbiByZXN1bWUuIFNvIGFcbiAqICAgbGF0ZXIgbGVnJ3MgZmlyc3QgZXhlY3V0aW9uIGluZGV4IG11c3QgYmUgcGFzdCB0aGUgZWFybGllciBsZWcncyBsYXN0LCBhbmRcbiAqICAgbm8gc3RhZ2UgbWF5IGFwcGVhciBpbiB0d28gbGVncy4gVGhpcyBjYXRjaGVzIGEgYmFja3dhcmRzIGNoYWluLCBhIGZyZXNoXG4gKiAgIHJ1biAod2hpY2ggcmVzdGFydHMgYXQgMCkgYW5kIGEgc2FtZS1leGVjdXRvciByZXN1bWUgKHdob3NlIG9uZSBzbmFwc2hvdFxuICogICBhbHJlYWR5IGhvbGRzIGJvdGggaGFsdmVzKS5cbiAqIC0gVGhlIGxhdGVyIGxlZydzIGBpbml0aWFsU3RhdGVgLiBPbiBhIHJlc3VtZSB0aGUgZnJlc2ggcnVudGltZSBpcyBzZWVkZWRcbiAqICAgZnJvbSB0aGUgY2hlY2twb2ludCwgc28gdGhhdCBiYXNlIElTIHRoZSBzdGF0ZSBhdCB0aGUgcGF1c2Ug4oCUIGFuZCB0aGVcbiAqICAgc3RhdGUgdGhlIGVhcmxpZXIgbGVncyBGT0xEIFRPIG11c3QgZGVlcC1lcXVhbCBpdC4gVGhpcyBpcyB3aGF0IGNhdGNoZXMgYVxuICogICBsZWcgZnJvbSBzb21lIE9USEVSIGxpbmVhZ2Ugd2hvc2UgaW5kaWNlcyBtZXJlbHkgaGFwcGVuIHRvIGJlIGhpZ2hlcjogdGhlXG4gKiAgIGNvdW50ZXJzIGxpbmUgdXAgYnkgYWNjaWRlbnQsIHRoZSBzdGF0ZSBuZXZlciBkb2VzLlxuICpcbiAqIEEgY2hhcnQgaWRlbnRpdHkgb3IgYSBsaW5lYWdlIGlkIGlzIE5PVCBvbiB0aGUgcmVjb3JkLCBzbyBub3RoaW5nIGhlcmVcbiAqIHByZXRlbmRzIHRvIGNoZWNrIG9uZS4gQW5kIHdoZXJlIHRoZSBzdGF0ZSBzaWduYWwgaXMgbm90IG9uIHRoZSByZWNvcmRcbiAqIGVpdGhlciDigJQgYSBsZWcgcmVjb3JkZWQgYmVmb3JlIDkuMTcgY2FycmllcyBubyBgaW5pdGlhbFN0YXRlYDsgYW4gZWFybGllclxuICogbGVnIHdpdGggbm8gYmFzZSBmb2xkcyBgJ2xvZy1vbmx5J2A7IGEgbGVnIHdpdGggdW5yZWFkYWJsZSByb3dzIGZvbGRzIGFuXG4gKiBpbmNvbXBsZXRlIHN0YXRlIOKAlCB0aGF0IGNoZWNrIGlzIFNLSVBQRUQsIG5vdCBmYWtlZDogdGhlIGNoYWluIHRoZW4gcmVzdHMgb25cbiAqIHRoZSBpbmRleCBjaGVja3MgYWxvbmUsIGFuZCBldmVyeSBmb2xkJ3MgYGJhc2lzYCBzdGlsbCBzYXlzIHdoYXQgaXQgc3Rvb2RcbiAqIG9uLiBUaGF0IGRlZ3JhZGF0aW9uIGlzIGRvY3VtZW50ZWQgb24gYHJlZnVzZUNoYWluYCwgb24gYHRpbWVUcmF2ZWxgJ3NcbiAqIGBAdGhyb3dzYCwgYW5kIGluIHRoZSBSRUFETUUuXG4gKi9cblxuaW1wb3J0IHsga2luZE9mIH0gZnJvbSAnLi4vY2FwdHVyZS92YWx1ZUtpbmRzLmpzJztcbmltcG9ydCB7IHBhcnNlUnVudGltZVN0YWdlSWQgfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBERUxJTSB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlYWRTb3VyY2UsIGZvbGRMZWdzIH0gZnJvbSAnLi9zdGF0ZUF0LmpzJztcbmltcG9ydCB0eXBlIHsgVGltZVRyYXZlbFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogT25lIGxlZyBvZiBhIGNoYWluOiBhIHNvdXJjZSwgaXRzIHJlYWQgbG9nLCBhbmQgd2hlcmUgaXQgc2l0cyBpbiB0aGUgcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFpbkxlZyB7XG4gIHJlYWRvbmx5IHNvdXJjZTogVGltZVRyYXZlbFNvdXJjZTtcbiAgcmVhZG9ubHkgbG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXTtcbiAgLyoqIExvd2VzdCBleGVjdXRpb24gaW5kZXggc3RhbXBlZCBpbiB0aGlzIGxlZzsgYHVuZGVmaW5lZGAgZm9yIGFuIGlkLWxlc3MgbG9nLiAqL1xuICByZWFkb25seSBmaXJzdEV4ZWN1dGlvbkluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBIaWdoZXN0IGV4ZWN1dGlvbiBpbmRleCBzdGFtcGVkIGluIHRoaXMgbGVnLiAqL1xuICByZWFkb25seSBsYXN0RXhlY3V0aW9uSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBleGVjdXRpb24taW5kZXggc3BhbiBvZiBvbmUgbGVnLCByZWFkIG9mZiBpdHMgYHJ1bnRpbWVTdGFnZUlkYHMuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhbk9mKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiB7XG4gIGZpcnN0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxhc3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWRzOiBTZXQ8c3RyaW5nPjtcbn0ge1xuICBsZXQgZmlyc3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3Q6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGNvbnN0IGlkID0gYnVuZGxlLnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmICghaWQpIGNvbnRpbnVlO1xuICAgIGlkcy5hZGQoaWQpO1xuICAgIGNvbnN0IHsgZXhlY3V0aW9uSW5kZXggfSA9IHBhcnNlUnVudGltZVN0YWdlSWQoaWQpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oZXhlY3V0aW9uSW5kZXgpKSBjb250aW51ZTtcbiAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBleGVjdXRpb25JbmRleCA8IGZpcnN0KSBmaXJzdCA9IGV4ZWN1dGlvbkluZGV4O1xuICAgIGlmIChsYXN0ID09PSB1bmRlZmluZWQgfHwgZXhlY3V0aW9uSW5kZXggPiBsYXN0KSBsYXN0ID0gZXhlY3V0aW9uSW5kZXg7XG4gIH1cbiAgcmV0dXJuIHsgZmlyc3QsIGxhc3QsIGlkcyB9O1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZXF1YWxpdHkgb2YgdHdvIGZvbGRlZCBzdGF0ZXMsIGlnbm9yaW5nIHRoZSBwYXRocyB0aGUgbG9nIHdhc1xuICogcmVkYWN0ZWQgYXQuXG4gKlxuICogVGhlIGZvbGQgcmVwcm9kdWNlcyBgJ1JFREFDVEVEJ2Agd2hlcmV2ZXIgdGhlIGVuZ2luZSBzY3J1YmJlZCBhIHdyaXRlLCB3aGlsZVxuICogdGhlIGNoZWNrcG9pbnQgdGhhdCBzZWVkZWQgdGhlIHJlc3VtZWQgbGVnIGhvbGRzIHRoZSByZWFsIHZhbHVlIOKAlCBzbyB0aG9zZVxuICogcGF0aHMgQ0FOTk9UIGFncmVlLCBhbmQgYXJlIG5vdCBhc2tlZCB0by4gRXZlcnl0aGluZyBlbHNlIGlzIGRlY2lkZWQgYnkgdGhlXG4gKiBPTkUgZXF1YWxpdHkgbGF3IChgbWVtb3J5L2VxdWFsaXR5LnRzIMK3IGRlZXBFcXVhbGAsIGV2ZXJ5IHZhbHVlIGtpbmQgY29tcGFyZWRcbiAqIGFzIHRoZSByZWNvcmQgaG9sZHMgaXQ7IDkuNDQuMiDigJQgdGhpcyB3YWxrIGhhZCBhIGxhdyBvZiBpdHMgb3duLCB3aGljaCBoZWxkXG4gKiBhbnkgdHdvIFJlZ0V4cHMsIEVycm9ycyBvciBidWZmZXJzIGVxdWFsKS4gQm90aCBzaWRlcyBhcmUgY29waWVzIG9mIG9uZVxuICogcmVjb3JkLCBzbyBhbiBvcGFxdWUgdmFsdWUgY29tcGFyZXMgYXMgYCdjb3BpZXMnYC4gT25seSB0aGUgY29udGFpbmVycyBhYm92ZVxuICogYSByZWRhY3RlZCBwYXRoIGFyZSB3YWxrZWQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gc2FtZVN0YXRlKGE6IHVua25vd24sIGI6IHVua25vd24sIHJlZGFjdGVkOiBSZWFkb25seVNldDxzdHJpbmc+LCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFyZWRhY3RlZEJlbG93KHBhdGgsIHJlZGFjdGVkKSkgcmV0dXJuIGRlZXBFcXVhbChhLCBiLCAnY29waWVzJyk7XG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGkpID0+IHNhbWVTdGF0ZShpdGVtLCBiW2ldLCByZWRhY3RlZCwgcGF0aCA9PT0gJycgPyBTdHJpbmcoaSkgOiBgJHtwYXRofSR7REVMSU19JHtpfWApKTtcbiAgfVxuICBjb25zdCBwbGFpbiA9ICh2OiB1bmtub3duKTogdiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHYpICYmIGtpbmRPZih2KSA9PT0gJ3BsYWluJztcbiAgaWYgKCFwbGFpbihhKSB8fCAhcGxhaW4oYikpIHJldHVybiBkZWVwRXF1YWwoYSwgYiwgJ2NvcGllcycpO1xuICBjb25zdCBwcmVzZW50ID0gKG86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBPYmplY3Qua2V5cyhvKS5maWx0ZXIoKGspID0+IG9ba10gIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGxlZnRLZXlzID0gcHJlc2VudChhKTtcbiAgY29uc3QgcmlnaHRLZXlzID0gbmV3IFNldChwcmVzZW50KGIpKTtcbiAgaWYgKGxlZnRLZXlzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLnNpemUgfHwgIWxlZnRLZXlzLmV2ZXJ5KChrKSA9PiByaWdodEtleXMuaGFzKGspKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbGVmdEtleXMuZXZlcnkoKGspID0+IHtcbiAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID09PSAnJyA/IGsgOiBgJHtwYXRofSR7REVMSU19JHtrfWA7XG4gICAgcmV0dXJuIHJlZGFjdGVkLmhhcyhjaGlsZFBhdGgpIHx8IHNhbWVTdGF0ZShhW2tdLCBiW2tdLCByZWRhY3RlZCwgY2hpbGRQYXRoKTtcbiAgfSk7XG59XG5cbi8qKiBJcyBgcGF0aGAsIG9yIGEgcGF0aCBiZWxvdyBpdCwgb25lIHRoZSBsb2cgd2FzIHJlZGFjdGVkIGF0PyAqL1xuZnVuY3Rpb24gcmVkYWN0ZWRCZWxvdyhwYXRoOiBzdHJpbmcsIHJlZGFjdGVkOiBSZWFkb25seVNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChyZWRhY3RlZC5zaXplID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXRoID09PSAnJykgcmV0dXJuIHRydWU7XG4gIGZvciAoY29uc3QgciBvZiByZWRhY3RlZCkgaWYgKHIgPT09IHBhdGggfHwgci5zdGFydHNXaXRoKGAke3BhdGh9JHtERUxJTX1gKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGF0IGBsZWdzYCByZWFsbHkgYXJlIG9uZSBydW4gcmVhZCBpbiBvcmRlciwgYW5kIHNheSB3aHkgbm90LlxuICpcbiAqIFJldHVybnMgdGhlIHJlZnVzYWwgbWVzc2FnZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2hhaW4gaXMgc291bmQuIFRocmVlXG4gKiBkaXN0aW5jdCBmYWlsdXJlcywgYmVjYXVzZSB0aGV5IGFyZSB0aHJlZSBkaWZmZXJlbnQgbWlzdGFrZXMsIGNoZWNrZWQgaW5cbiAqIHRoaXMgb3JkZXI6XG4gKlxuICogLSBSRVBFQVRFRCBTVEFHRSDigJQgb25lIGBydW50aW1lU3RhZ2VJZGAgYXBwZWFycyBpbiB0d28gbGVncy4gSWRzIGFyZSB1bmlxdWVcbiAqICAgd2l0aGluIGEgcnVuLCBzbyBhIHJlcGVhdCBtZWFucyB0aGUgc2FtZSBleGVjdXRpb24gd2FzIHJlY29yZGVkIHR3aWNlOiBhXG4gKiAgIHNhbWUtZXhlY3V0b3IgcmVzdW1lLCB3aG9zZSBzbmFwc2hvdCBBTFJFQURZIGhvbGRzIHRoZSB3aG9sZSBsb2cgYW5kIG5lZWRzXG4gKiAgIG5vIGNoYWluaW5nLCBpcyB0aGUgdXN1YWwgY2F1c2UuXG4gKiAtIE9VVCBPRiBPUkRFUiDigJQgYSBsYXRlciBsZWcncyBmaXJzdCBleGVjdXRpb24gaW5kZXggaXMgbm90IHBhc3QgdGhlIGVhcmxpZXJcbiAqICAgbGVnJ3MgbGFzdC4gRWl0aGVyIHRoZSBzb3VyY2VzIHdlcmUgaGFuZGVkIG92ZXIgYmFja3dhcmRzLCBvciB0aGUgc2Vjb25kXG4gKiAgIGlzIG5vdCBhIGNvbnRpbnVhdGlvbiBhdCBhbGwgKGEgZnJlc2ggcnVuIHJlc3RhcnRzIHRoZSBjb3VudGVyIGF0IDAsIHNvIGFuXG4gKiAgIHVucmVsYXRlZCBzbmFwc2hvdCBmYWlscyBoZXJlIHJhdGhlciB0aGFuIHNpbGVudGx5IGludGVybGVhdmluZykuXG4gKiAtIFdST05HIExJTkVBR0Ug4oCUIGxlZyBrJ3MgYGluaXRpYWxTdGF0ZWAgaXMgbm90IHRoZSBzdGF0ZSBsZWdzIDAuLmstMSBmb2xkXG4gKiAgIHRvLiBPbiBhIHJlc3VtZSB0aGUgbGF0ZXIgbGVnIGlzIHNlZWRlZCBmcm9tIHRoZSBjaGVja3BvaW50LCBzbyBpdHMgYmFzZVxuICogICBJUyB0aGUgc3RhdGUgYXQgdGhlIHBhdXNlOyBhIGxlZyB0aGF0IGJlZ2lucyBhbnl3aGVyZSBlbHNlIGlzIGZyb20gc29tZVxuICogICBvdGhlciBydW4sIGhvd2V2ZXIgaXRzIGluZGljZXMgaGFwcGVuIHRvIGxpbmUgdXAuXG4gKlxuICogVEhFIExJTkVBR0UgQ0hFQ0sgUlVOUyBPTkxZIFdIRVJFIFRIRSBSRUNPUkQgQUxMT1dTIElULCBhbmQgaXMgc2tpcHBlZCDigJRcbiAqIG5ldmVyIGZha2VkIOKAlCBvdGhlcndpc2U6IGxlZyBrIG11c3QgY2FycnkgYW4gYGluaXRpYWxTdGF0ZWAgKGEgcmVjb3JkaW5nXG4gKiBtYWRlIGJlZm9yZSA5LjE3IGhhcyBub25lKSwgYW5kIHRoZSBmb2xkIG9mIHRoZSBsZWdzIGJlZm9yZSBpdCBtdXN0IHN0YW5kIG9uXG4gKiBhIHJlYWwgYmFzZSAoYGJhc2lzOiAnaW5pdGlhbCtsb2cnYCkgd2l0aCBubyB1bnJlYWRhYmxlIHJvd3MgKGBza2lwcGVkYFxuICogYWJzZW50KSDigJQgYSBsb2ctb25seSBvciBnYXBwZWQgZm9sZCBpcyBub3QgYSBzdGF0ZSBhIHJlYWwgYmFzZSBtYXkgYmUgaGVsZFxuICogYWdhaW5zdC4gT24gc3VjaCBhIGNoYWluIHRoZSB0d28gaW5kZXggY2hlY2tzIGFyZSB0aGUgd2hvbGUgZGVmZW5jZSwgYW5kXG4gKiBgZm9sZExlZ3NgJyBsZWcgcnVsZSB0aGVuIENPTlRJTlVFUyB0aGUgZm9sZCBhY3Jvc3MgdGhlIHNlYW0sIHdoaWNoIGlzIHRoZVxuICogcmlnaHQgc3RhdGUgZm9yIGEgcmVhbCByZXN1bWUgYW5kIGlzIHdoYXQgYGJhc2lzYCByZXBvcnRzLiBQYXRocyB0aGUgbG9nXG4gKiB3YXMgcmVkYWN0ZWQgYXQgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNvbXBhcmlzb246IHRoZSBmb2xkIGhvbGRzXG4gKiBgJ1JFREFDVEVEJ2AgdGhlcmUgYW5kIHRoZSBjaGVja3BvaW50IGhvbGRzIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZnVzZUNoYWluKGxlZ3M6IHJlYWRvbmx5IFJlYWRTb3VyY2VbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChsZWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICd0aW1lVHJhdmVsOiBhIGNoYWluIG5lZWRzIGF0IGxlYXN0IG9uZSBzb3VyY2UsIGdvdCBhbiBlbXB0eSBhcnJheS4nO1xuXG4gIGNvbnN0IHNwYW5zID0gbGVncy5tYXAoKGxlZykgPT4gc3Bhbk9mKGxlZy5sb2cpKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2ksIHNwYW5dIG9mIHNwYW5zLmVudHJpZXMoKSkge1xuICAgIGZvciAoY29uc3QgaWQgb2Ygc3Bhbi5pZHMpIHtcbiAgICAgIGNvbnN0IGVhcmxpZXIgPSBzZWVuLmdldChpZCk7XG4gICAgICBpZiAoZWFybGllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgYHRpbWVUcmF2ZWw6IHNvdXJjZXMgJHtlYXJsaWVyfSBhbmQgJHtpfSBib3RoIHJlY29yZCAnJHtpZH0nLiBBIHJ1bnRpbWVTdGFnZUlkIGlzIHVuaXF1ZSBgICtcbiAgICAgICAgICAnd2l0aGluIGEgcnVuLCBzbyB0aGVzZSBhcmUgbm90IHR3byBsZWdzIG9mIG9uZSBydW4g4oCUIGEgc2FtZS1leGVjdXRvciByZXN1bWUgYWxyZWFkeSAnICtcbiAgICAgICAgICAnY2FycmllcyB0aGUgd2hvbGUgbG9nIGluIE9ORSBzbmFwc2hvdCBhbmQgbXVzdCBub3QgYmUgY2hhaW5lZCB3aXRoIHRoZSBwYXVzZWQgb25lLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW4uc2V0KGlkLCBpKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcHJldmlvdXM6IHsgaWR4OiBudW1iZXI7IGxhc3Q6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtpLCBzcGFuXSBvZiBzcGFucy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoc3Bhbi5maXJzdCA9PT0gdW5kZWZpbmVkIHx8IHNwYW4ubGFzdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAocHJldmlvdXMgJiYgc3Bhbi5maXJzdCA8PSBwcmV2aW91cy5sYXN0KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBgdGltZVRyYXZlbDogc291cmNlICR7aX0gc3RhcnRzIGF0IGV4ZWN1dGlvbiBpbmRleCAke3NwYW4uZmlyc3R9LCB3aGljaCBpcyBub3QgcGFzdCBgICtcbiAgICAgICAgYHNvdXJjZSAke3ByZXZpb3VzLmlkeH0ncyBsYXN0ICgke3ByZXZpb3VzLmxhc3R9KS4gQ2hhaW4gdGhlIHNvdXJjZXMgaW4gcnVuIG9yZGVyLCBhbmQgYCArXG4gICAgICAgICdvbmx5IHNvdXJjZXMgZnJvbSBPTkUgbGluZWFnZSDigJQgdGhlIGVuZ2luZSBuZXZlciByZXNldHMgdGhlIGV4ZWN1dGlvbiBjb3VudGVyIGFjcm9zcyBhICcgK1xuICAgICAgICAncmVzdW1lLCBzbyBhIGZyZXNoIHJ1biByZXN0YXJ0aW5nIGF0IDAgaXMgYSBkaWZmZXJlbnQgcnVuLCBub3QgYSBjb250aW51YXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcHJldmlvdXMgPSB7IGlkeDogaSwgbGFzdDogc3Bhbi5sYXN0IH07XG4gIH1cblxuICBmb3IgKGxldCBrID0gMTsgayA8IGxlZ3MubGVuZ3RoOyBrKyspIHtcbiAgICBjb25zdCBiYXNlID0gbGVnc1trXS5iYXNlO1xuICAgIGlmICghYmFzZSB8fCB0eXBlb2YgYmFzZSAhPT0gJ29iamVjdCcpIGNvbnRpbnVlOyAvLyBubyBzaWduYWwgb24gdGhlIHJlY29yZCDigJQgZG9jdW1lbnRlZCBkZWdyYWRhdGlvblxuICAgIGNvbnN0IGJlZm9yZSA9IGZvbGRMZWdzKGxlZ3MsIGsgLSAxLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgIGlmIChiZWZvcmUuYmFzaXMgIT09ICdpbml0aWFsK2xvZycgfHwgYmVmb3JlLnNraXBwZWQpIGNvbnRpbnVlOyAvLyBub3QgYSBzdGF0ZSBhIHJlYWwgYmFzZSBjYW4gYmUgaGVsZCB0b1xuICAgIGlmICghc2FtZVN0YXRlKGJlZm9yZS5zdGF0ZSwgYmFzZSwgbmV3IFNldChiZWZvcmUucmVkYWN0ZWRQYXRocyksICcnKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgYHRpbWVUcmF2ZWw6IHNvdXJjZSAke2t9J3MgaW5pdGlhbFN0YXRlIGlzIG5vdCB0aGUgc3RhdGUgc291cmNlICR7ayAtIDF9IGZvbGRzIHRvLiBPbiBhIHJlc3VtZSBgICtcbiAgICAgICAgXCJ0aGUgbGF0ZXIgbGVnJ3MgaW5pdGlhbFN0YXRlIElTIHRoZSBzdGF0ZSBhdCB0aGUgcGF1c2UsIHNvIGEgbGVnIHRoYXQgYmVnaW5zIGFueXdoZXJlIGVsc2UgaXMgXCIgK1xuICAgICAgICAnbm90IGZyb20gb25lIGxpbmVhZ2Ug4oCUIGEgZGlmZmVyZW50IGNoYXJ0LCBvciBhbm90aGVyIHJ1biBvZiB0aGlzIG9uZSDigJQgZXZlbiB3aGVuIGl0cyBleGVjdXRpb24gJyArXG4gICAgICAgICdpbmRpY2VzIGhhcHBlbiB0byBiZSBoaWdoZXIuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|