@mnaoumov/obsidian-lib 3.4.0 → 4.1.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/dist/lib/cjs/components/monkey-around-component.cjs +3 -6
- package/dist/lib/cjs/components/monkey-around-component.d.cts +6 -7
- package/dist/lib/cjs/components/plugin-gate-component.cjs +51 -12
- package/dist/lib/cjs/components/plugin-gate-component.d.cts +22 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/esm/components/monkey-around-component.d.mts +6 -7
- package/dist/lib/esm/components/monkey-around-component.mjs +3 -6
- package/dist/lib/esm/components/plugin-gate-component.d.mts +22 -0
- package/dist/lib/esm/components/plugin-gate-component.mjs +55 -13
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/package.json +3 -3
|
@@ -166,11 +166,8 @@ class MonkeyAroundComponent extends import_component_ex.ComponentEx {
|
|
|
166
166
|
once: params.once ?? false,
|
|
167
167
|
patchHandler: (originalMethodRaw) => {
|
|
168
168
|
const originalMethod = originalMethodRaw;
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
patchedMethod: patchedMethod2
|
|
172
|
-
}) ?? patchedMethod2;
|
|
173
|
-
return finalPatchedMethod;
|
|
169
|
+
params.postPatchHandler?.({ originalMethod });
|
|
170
|
+
return patchedMethod2;
|
|
174
171
|
function patchedMethod2(...originalArguments) {
|
|
175
172
|
const originalThis = this;
|
|
176
173
|
return params.patchHandler({
|
|
@@ -223,4 +220,4 @@ function getMonkeyAroundPatches() {
|
|
|
223
220
|
around,
|
|
224
221
|
hasPatchToken
|
|
225
222
|
});
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBJbXByb3ZlZCB0eXBlLXNhZmUgd3JhcHBlciBvZiB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbW9ua2V5LWFyb3VuZH0gbGlicmFyeS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNGdW5jdGlvbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uYWxLZXlzIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgYXJvdW5kIGFzIG9yaWdpbmFsQXJvdW5kIH0gZnJvbSAnbW9ua2V5LWFyb3VuZCc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuLyoqXG4gKiBBIHR5cGUgb2YgdGhlIGZhY3RvcmllcyB0byBhcHBseSB0byB0aGUgb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gJE9iamVjdCAtIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gKi9cbmV4cG9ydCB0eXBlIEZhY3RvcmllczwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0PiA9IFBhcnRpYWw8RnVsbEZhY3RvcmllczwkT2JqZWN0Pj47XG5cbi8qKlxuICogS2V5cyBvZiBgT2JqYCB3aG9zZSB2YWx1ZSBpcyBjYWxsYWJsZSDigJQgYSBtZXRob2QsIG9yIGEgZnVuY3Rpb24tbGlrZSBvYmplY3Qgc3VjaCBhcyBhIGBEZWJvdW5jZXJgLiBUaGVzZSBhcmUgdGhlIG1lbWJlcnNcbiAqIGFjY2VwdGVkIGJ5IHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnQjcmVnaXN0ZXJGdW5jdGlvblBhdGNofS5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IHdob3NlIGtleXMgYXJlIGZpbHRlcmVkLlxuICovXG5leHBvcnQgdHlwZSBGdW5jdGlvbktleXM8JE9iamVjdCBleHRlbmRzIG9iamVjdD4gPSBDb25kaXRpb25hbEtleXM8JE9iamVjdCwgR2VuZXJpY0Z1bmN0aW9uIHwgdW5kZWZpbmVkPiAmIGtleW9mICRPYmplY3Q7XG5cbi8qKlxuICogS2V5cyBvZiBgT2JqYCB3aG9zZSB2YWx1ZSBpcyBhIHBsYWluIGZ1bmN0aW9uIChhIFwicmVhbCBtZXRob2RcIikuIEZ1bmN0aW9uLWxpa2Ugb2JqZWN0cyB0aGF0IGNhcnJ5IGV4dHJhIG1lbWJlcnMgYXJlXG4gKiBleGNsdWRlZCDigJQgZS5nLiBhIGBEZWJvdW5jZXJgICh3aGljaCBhZGRzIGBjYW5jZWxgL2BydW5gKSBiZWxvbmdzIHRvIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnQjcmVnaXN0ZXJGdW5jdGlvblBhdGNofSxcbiAqIG5vdCB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50I3JlZ2lzdGVyTWV0aG9kUGF0Y2h9LiBUaGUgY2hlY2sgaXMgd2hldGhlciB0aGUgbWVtYmVyIGhhcyBhbnkgb3duIGtleXMgYmV5b25kIGEgYmFyZVxuICogZnVuY3Rpb24ncyAoYEV4Y2x1ZGU8a2V5b2YgVCwga2V5b2YgR2VuZXJpY0Z1bmN0aW9uPmAgaXMgYG5ldmVyYCkuXG4gKlxuICogQHR5cGVQYXJhbSAkT2JqZWN0IC0gVGhlIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBmaWx0ZXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWV0aG9kS2V5czwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0PiA9IE1ldGhvZEtleXNNYXA8JE9iamVjdD5bRnVuY3Rpb25LZXlzPCRPYmplY3Q+XTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIHBhc3NlZCB0byB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50I3JlZ2lzdGVyRnVuY3Rpb25QYXRjaH0uXG4gKlxuICogQHR5cGVQYXJhbSAkT2JqZWN0IC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAqIEB0eXBlUGFyYW0gRnVuY3Rpb25OYW1lIC0gVGhlIGZ1bmN0aW9uIG5hbWUgdG8gcGF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9ua2V5QXJvdW5kQ29tcG9uZW50UmVnaXN0ZXJGdW5jdGlvblBhdGNoUGFyYW1zPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIEZ1bmN0aW9uTmFtZSBleHRlbmRzIEZ1bmN0aW9uS2V5czwkT2JqZWN0Pj4ge1xuICAvKipcbiAgICogVGhlIG9iamVjdCB0byBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5ICRvYmplY3Q6ICRPYmplY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiBuYW1lIHRvIHBhdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lOiBGdW5jdGlvbk5hbWU7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgcGF0Y2ggdW5pbnN0YWxscyBpdHNlbGYgdGhlIGZpcnN0IHRpbWUgdGhlIHBhdGNoZWQgZnVuY3Rpb24gaXMgaW52b2tlZCAoYnlcbiAgICogdW5sb2FkaW5nIHRoaXMgY29tcG9uZW50KSwgcmVzdG9yaW5nIHRoZSBvcmlnaW5hbCDigJQgc28gdGhlIGludGVyY2VwdGlvbiBoYXBwZW5zIGV4YWN0bHkgb25jZS5cbiAgICogSW50ZW5kZWQgZm9yIGEgY29tcG9uZW50IGRlZGljYXRlZCB0byB0aGlzIHNpbmdsZSBwYXRjaC4gRXhpc3RpbmcgY2FsbGVycyB0aGF0IG9taXQgaXQgYXJlXG4gICAqIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IG9uY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXRjaCBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIG9yaWdpbmFsIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBwYXRjaGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gb3JpZ2luYWxWYWx1ZSAtIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoZSBwYXRjaGVkIHZhbHVlIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoSGFuZGxlcjogKG9yaWdpbmFsVmFsdWU6ICRPYmplY3RbRnVuY3Rpb25OYW1lXSkgPT4gJE9iamVjdFtGdW5jdGlvbk5hbWVdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgcGFzc2VkIHRvIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnQjcmVnaXN0ZXJNZXRob2RQYXRjaH0uXG4gKlxuICogQHR5cGVQYXJhbSAkT2JqZWN0IC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSB0byBwYXRjaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25rZXlBcm91bmRDb21wb25lbnRSZWdpc3Rlck1ldGhvZFBhdGNoUGFyYW1zPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPCRPYmplY3Q+PiB7XG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgJG9iamVjdDogJE9iamVjdDtcblxuICAvKipcbiAgICogVGhlIG1ldGhvZCBuYW1lIHRvIHBhdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kTmFtZTogTWV0aG9kTmFtZTtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBwYXRjaCB1bmluc3RhbGxzIGl0c2VsZiB0aGUgZmlyc3QgdGltZSB0aGUgcGF0Y2hlZCBtZXRob2QgaXMgaW52b2tlZCwgcmVzdG9yaW5nXG4gICAqIHRoZSBvcmlnaW5hbCDigJQgc28gdGhlIGludGVyY2VwdGlvbiBoYXBwZW5zIGV4YWN0bHkgb25jZS4gRXhpc3RpbmcgY2FsbGVycyB0aGF0IG9taXQgaXQgYXJlXG4gICAqIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IG9uY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0Y2ggaGFuZGxlciBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoSGFuZGxlcjogUGF0Y2hIYW5kbGVyRnVuY3Rpb248JE9iamVjdCwgTWV0aG9kTmFtZT47XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHRva2VuIHRvIGlkZW50aWZ5IHRoZSBwYXRjaC5cbiAgICpcbiAgICogVGhlIHRva2VuIGlzIHJlY29yZGVkIGFnYWluc3QgdGhlIG1ldGhvZCB0aGlzIHBhdGNoIElOU1RBTExTLCBzbyB0aGUgbmV4dCBwYXRjaCBvZiB0aGUgc2FtZSBtZXRob2RcbiAgICogZGV0ZWN0cyBpdCB2aWEge0BsaW5rIGhhc1BhdGNoVG9rZW59IG9uIGl0cyBvd24gYG9yaWdpbmFsTWV0aG9kYCBhbmQgY2FuIGRlZmVyIHRvIHRoaXMgb25lLiBUaGVcbiAgICogcGF0Y2ggdGhhdCBpbnN0YWxscyBhIHRva2VuIHRoZXJlZm9yZSBuZXZlciBzZWVzIGl0cyBvd24gdG9rZW4g4oCUIG9ubHkgdGhlIHBhdGNoZXMgc3RhY2tlZCBvbiB0b3Agb2ZcbiAgICogaXQgZG8uIFVzZSBhIGBTeW1ib2wuZm9yYCB0b2tlbiB0byBtYWtlIHRoZSBkZXRlY3Rpb24gd29yayBhY3Jvc3MgaW5kZXBlbmRlbnRseSBidW5kbGVkIGNvcGllcyBvZlxuICAgKiB0aGlzIGxpYnJhcnkuXG4gICAqXG4gICAqIFRoZSB0b2tlbiBpcyBkcm9wcGVkIHdoZW4gdGhpcyBjb21wb25lbnQgdW5sb2Fkcywgc28gYSBsYXRlciBwYXRjaCB0aGF0IGhhZCBkZWZlcnJlZCB0YWtlcyBvdmVyIG9uXG4gICAqIGl0cyBuZXh0IGNhbGwuXG4gICAqL1xuICByZWFkb25seSBwYXRjaFRva2VuPzogc3ltYm9sO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBwb3N0LXBhdGNoIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBydW5zIGFmdGVyIHRoZSBwYXRjaCBpcyBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdFBhdGNoSGFuZGxlcj86IFBvc3RQYXRjaEhhbmRsZXJGdW5jdGlvbjwkT2JqZWN0LCBNZXRob2ROYW1lPjtcbn1cblxuLyoqXG4gKiBBIHBhdGNoIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBpbnRlcmNlcHRzIGNhbGxzIHRvIGEgbWV0aG9kIG9uIGFuIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IGJlaW5nIHBhdGNoZWQuXG4gKiBAdHlwZVBhcmFtIE1ldGhvZE5hbWUgLSBUaGUgbWV0aG9kIG5hbWUgYmVpbmcgcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGF0Y2hIYW5kbGVyRnVuY3Rpb248JE9iamVjdCBleHRlbmRzIG9iamVjdCwgTWV0aG9kTmFtZSBleHRlbmRzIE1ldGhvZEtleXM8JE9iamVjdD4+ID0gKFxuICBwYXJhbXM6IFBhdGNoSGFuZGxlclBhcmFtczwkT2JqZWN0LCBNZXRob2ROYW1lPlxuKSA9PiBSZXR1cm5UeXBlPEV4dHJhY3RGdW5jdGlvbjwkT2JqZWN0LCBNZXRob2ROYW1lPj47XG5cbi8qKlxuICogUGFyYW1ldGVycyBwYXNzZWQgdG8gYSB7QGxpbmsgUGF0Y2hIYW5kbGVyRnVuY3Rpb259IGNhbGxiYWNrLlxuICpcbiAqIEB0eXBlUGFyYW0gJE9iamVjdCAtIFRoZSBvYmplY3QgYmVpbmcgcGF0Y2hlZC5cbiAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSBiZWluZyBwYXRjaGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoSGFuZGxlclBhcmFtczwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0LCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czwkT2JqZWN0Pj4ge1xuICAvKipcbiAgICogSW52b2tlcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggdGhlIG9yaWdpbmFsIGB0aGlzYCBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGF0ZXZlciB0aGUgb3JpZ2luYWwgbWV0aG9kIHJldHVybnMuXG4gICAqL1xuICByZWFkb25seSBmYWxsYmFjazogKCkgPT4gUmV0dXJuVHlwZTxFeHRyYWN0RnVuY3Rpb248JE9iamVjdCwgTWV0aG9kTmFtZT4+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnRzIG9mIHRoZSBpbnRlcmNlcHRlZCBjYWxsLCBhcyBhIHR1cGxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxBcmd1bWVudHM6IFBhcmFtZXRlcnM8RXh0cmFjdEZ1bmN0aW9uPCRPYmplY3QsIE1ldGhvZE5hbWU+PjtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsICh1bnBhdGNoZWQpIG1ldGhvZC4gQ2FsbCB2aWEgYG9yaWdpbmFsRm4uY2FsbChvcmlnaW5hbFRoaXMsIC4uLm9yaWdpbmFsQXJncylgLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxNZXRob2Q6IEV4dHJhY3RGdW5jdGlvbjwkT2JqZWN0LCBNZXRob2ROYW1lPjtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIG1ldGhvZCwgYnV0IHdpdGggdGhlIGB0aGlzYCBjb250ZXh0IGFscmVhZHkgYm91bmQgdG8gdGhlIG9yaWdpbmFsIG9iamVjdC4gQ2FsbCB2aWEgYG9yaWdpbmFsTWV0aG9kQm91bmQoLi4ub3JpZ2luYWxBcmdzKWAuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbE1ldGhvZEJvdW5kOiBPbWl0VGhpc1BhcmFtZXRlcjxFeHRyYWN0RnVuY3Rpb248JE9iamVjdCwgTWV0aG9kTmFtZT4+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYHRoaXNgIGNvbnRleHQgb2YgdGhlIGludGVyY2VwdGVkIGNhbGwuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbFRoaXM6ICRPYmplY3Q7XG59XG5cbi8qKlxuICogQSBwb3N0LXBhdGNoIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBydW5zIGFmdGVyIGEgcGF0Y2ggaXMgYXBwbGllZC5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IGJlaW5nIHBhdGNoZWQuXG4gKiBAdHlwZVBhcmFtIE1ldGhvZE5hbWUgLSBUaGUgbWV0aG9kIG5hbWUgYmVpbmcgcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUG9zdFBhdGNoSGFuZGxlckZ1bmN0aW9uPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPCRPYmplY3Q+PiA9IChcbiAgcGFyYW1zOiBQb3N0UGF0Y2hIYW5kbGVyUGFyYW1zPCRPYmplY3QsIE1ldGhvZE5hbWU+XG4pID0+IE1heWJlUmV0dXJuPEV4dHJhY3RGdW5jdGlvbjwkT2JqZWN0LCBNZXRob2ROYW1lPj47XG5cbi8qKlxuICogUGFyYW1ldGVycyBwYXNzZWQgdG8gYSB7QGxpbmsgUG9zdFBhdGNoSGFuZGxlckZ1bmN0aW9ufSBjYWxsYmFjay5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IGJlaW5nIHBhdGNoZWQuXG4gKiBAdHlwZVBhcmFtIE1ldGhvZE5hbWUgLSBUaGUgbWV0aG9kIG5hbWUgYmVpbmcgcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3N0UGF0Y2hIYW5kbGVyUGFyYW1zPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPCRPYmplY3Q+PiB7XG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgKHVucGF0Y2hlZCkgbWV0aG9kLiBDYWxsIHZpYSBgb3JpZ2luYWxGbi5jYWxsKG9yaWdpbmFsVGhpcywgLi4ub3JpZ2luYWxBcmdzKWAuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbE1ldGhvZDogRXh0cmFjdEZ1bmN0aW9uPCRPYmplY3QsIE1ldGhvZE5hbWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0Y2hlZCBtZXRob2QuXG4gICAqL1xuICByZWFkb25seSBwYXRjaGVkTWV0aG9kOiBFeHRyYWN0RnVuY3Rpb248JE9iamVjdCwgTWV0aG9kTmFtZT47XG59XG5cbnR5cGUgRXh0cmFjdEZ1bmN0aW9uPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPCRPYmplY3Q+PiA9IEdlbmVyaWNGdW5jdGlvbjxQYXJhbWV0ZXJzPEV4dHJhY3Q8JE9iamVjdFtNZXRob2ROYW1lXSwgR2VuZXJpY0Z1bmN0aW9uPj4sIFJldHVyblR5cGU8RXh0cmFjdDwkT2JqZWN0W01ldGhvZE5hbWVdLCBHZW5lcmljRnVuY3Rpb24+Pj47XG5cbnR5cGUgRnVsbEZhY3RvcmllczwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0tleSBpbiBrZXlvZiAkT2JqZWN0XTogKG9yaWdpbmFsVmFsdWU6ICRPYmplY3RbS2V5XSkgPT4gJE9iamVjdFtLZXldO1xufTtcblxudHlwZSBNZXRob2RLZXlzTWFwPCRPYmplY3QgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICBbS2V5IGluIEZ1bmN0aW9uS2V5czwkT2JqZWN0Pl06IFtFeGNsdWRlPGtleW9mIE5vbk51bGxhYmxlPCRPYmplY3RbS2V5XT4sIGtleW9mIEdlbmVyaWNGdW5jdGlvbj5dIGV4dGVuZHMgW25ldmVyXSA/IEtleSA6IG5ldmVyO1xufTtcblxudHlwZSBPcmlnaW5hbEZhY3RvcmllczwkT2JqZWN0IGV4dGVuZHMgR2VuZXJpY09iamVjdD4gPSBQYXJhbWV0ZXJzPHR5cGVvZiBvcmlnaW5hbEFyb3VuZDwkT2JqZWN0Pj5bMV07XG5cbnR5cGUgVW5pbnN0YWxsZXIgPSAoKSA9PiB2b2lkO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgbWFuYWdlcyBtb25rZXktcGF0Y2hlcyB3aXRoIGxpZmVjeWNsZS1ib3VuZCBjbGVhbnVwLlxuICogQWxsIHBhdGNoZXMgcmVnaXN0ZXJlZCB2aWEgdGhpcyBjb21wb25lbnQgYXJlIGF1dG9tYXRpY2FsbHkgdW5pbnN0YWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IHVubG9hZHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25rZXlBcm91bmRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBwYXRjaCBmb3IgYSBzaW5nbGUgZnVuY3Rpb24tbGlrZSBtZW1iZXIgKGEgbWV0aG9kLCBvciBhIGNhbGxhYmxlIHN1Y2ggYXMgYSBgRGVib3VuY2VyYCkgdXNpbmcgYSBzaW1wbGlmaWVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gJE9iamVjdCAtIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gICAqIEB0eXBlUGFyYW0gRnVuY3Rpb25OYW1lIC0gVGhlIGZ1bmN0aW9uIG5hbWUgdG8gcGF0Y2guXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBvZiB0aGUgcGF0Y2guXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJGdW5jdGlvblBhdGNoPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIGNvbnN0IEZ1bmN0aW9uTmFtZSBleHRlbmRzIEZ1bmN0aW9uS2V5czwkT2JqZWN0Pj4oXG4gICAgcGFyYW1zOiBNb25rZXlBcm91bmRDb21wb25lbnRSZWdpc3RlckZ1bmN0aW9uUGF0Y2hQYXJhbXM8JE9iamVjdCwgRnVuY3Rpb25OYW1lPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuXG4gICAgY29uc3QgZmFjdG9yaWVzOiBGYWN0b3JpZXM8JE9iamVjdD4gPSB7fTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1pbW1lZGlhdGUtbXV0YXRpb24gLS0gQSBjb21wdXRlZCBrZXkgaW4gYW4gb2JqZWN0IGxpdGVyYWwgZG9lcyBub3QgbWF0Y2ggYFBhcnRpYWw8RnVsbEZhY3RvcmllczwkT2JqZWN0Pj5gIHdoZW4gdGhlIGtleSB0eXBlIGlzIGdlbmVyaWM7IGFzc2lnbmluZyBhZnRlciBkZWNsYXJhdGlvbiBrZWVwcyB0aGUgdGFyZ2V0IHR5cGUga25vd24uXG4gICAgZmFjdG9yaWVzW3BhcmFtcy5mdW5jdGlvbk5hbWVdID0gKG9yaWdpbmFsVmFsdWU6ICRPYmplY3RbRnVuY3Rpb25OYW1lXSk6ICRPYmplY3RbRnVuY3Rpb25OYW1lXSA9PiB7XG4gICAgICBjb25zdCBwYXRjaGVkVmFsdWUgPSBwYXJhbXMucGF0Y2hIYW5kbGVyKG9yaWdpbmFsVmFsdWUpO1xuICAgICAgaWYgKCFwYXJhbXMub25jZSkge1xuICAgICAgICByZXR1cm4gcGF0Y2hlZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBIGBvbmNlYCBwYXRjaCB1bmxvYWRzIHRoaXMgY29tcG9uZW50IGFmdGVyIHRoZSBmaXJzdCBpbnZvY2F0aW9uIOKAlCBydW5uaW5nIHRoZSByZWdpc3RlcmVkXG4gICAgICAvLyB1bmluc3RhbGxlciBhbmQgcmVzdG9yaW5nIHRoZSBvcmlnaW5hbC4gYHVubG9hZENvbXBvbmVudGAgaXMgYW4gYXJyb3cgc28gaXQgY2FwdHVyZXMgdGhlXG4gICAgICAvLyBjb21wb25lbnQgYHRoaXNgOyB0aGUgbmVzdGVkIGBvbmNlUGF0Y2hlZFZhbHVlYCBtdXN0IGJlIGEgZnVuY3Rpb24gdG8gcmVjZWl2ZSB0aGUgY2FsbC10aW1lXG4gICAgICAvLyBgdGhpc2AuIE93biBtZW1iZXJzIChlLmcuIGEgYERlYm91bmNlcmAncyBgY2FuY2VsYC9gcnVuYCkgYXJlIGNvcGllZCBvbnRvIGl0IHNvIGZ1bmN0aW9uLWxpa2VcbiAgICAgIC8vIHZhbHVlcyBrZWVwIHdvcmtpbmcuXG4gICAgICBjb25zdCB1bmxvYWRDb21wb25lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gb25jZVBhdGNoZWRWYWx1ZSh0aGlzOiB1bmtub3duLCAuLi4kYXJndW1lbnRzOiB1bmtub3duW10pOiB1bmtub3duIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShwYXRjaGVkVmFsdWUsIHRoaXMsICRhcmd1bWVudHMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHVubG9hZENvbXBvbmVudCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvbmNlUGF0Y2hlZFZhbHVlLCBwYXRjaGVkVmFsdWUpIGFzICRPYmplY3RbRnVuY3Rpb25OYW1lXTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZWdpc3RlclBhdGNoKHBhcmFtcy4kb2JqZWN0LCBmYWN0b3JpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHNpbmdsZS1tZXRob2QgcGF0Y2ggdXNpbmcgYSBzaW1wbGlmaWVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gJE9iamVjdCAtIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gICAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSB0byBwYXRjaC5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBwYXRjaC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck1ldGhvZFBhdGNoPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIGNvbnN0IE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPCRPYmplY3Q+PihcbiAgICBwYXJhbXM6IE1vbmtleUFyb3VuZENvbXBvbmVudFJlZ2lzdGVyTWV0aG9kUGF0Y2hQYXJhbXM8JE9iamVjdCwgTWV0aG9kTmFtZT5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcblxuICAgIHR5cGUgJEZ1bmN0aW9uID0gRXh0cmFjdEZ1bmN0aW9uPCRPYmplY3QsIE1ldGhvZE5hbWU+O1xuXG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uUGF0Y2goe1xuICAgICAgJG9iamVjdDogcGFyYW1zLiRvYmplY3QsXG4gICAgICBmdW5jdGlvbk5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgb25jZTogcGFyYW1zLm9uY2UgPz8gZmFsc2UsXG4gICAgICBwYXRjaEhhbmRsZXI6IChvcmlnaW5hbE1ldGhvZFJhdykgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsTWV0aG9kUmF3IGFzICRGdW5jdGlvbjtcbiAgICAgICAgY29uc3QgZmluYWxQYXRjaGVkTWV0aG9kID0gcGFyYW1zLnBvc3RQYXRjaEhhbmRsZXI/Lih7XG4gICAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgICAgcGF0Y2hlZE1ldGhvZFxuICAgICAgICB9KSA/PyBwYXRjaGVkTWV0aG9kO1xuICAgICAgICByZXR1cm4gZmluYWxQYXRjaGVkTWV0aG9kIGFzICRPYmplY3RbTWV0aG9kTmFtZV07XG5cbiAgICAgICAgZnVuY3Rpb24gcGF0Y2hlZE1ldGhvZCh0aGlzOiAkT2JqZWN0LCAuLi5vcmlnaW5hbEFyZ3VtZW50czogUGFyYW1ldGVyczwkRnVuY3Rpb24+KTogUmV0dXJuVHlwZTwkRnVuY3Rpb24+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC10aGlzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcywgdW5pY29ybi9uby10aGlzLWFzc2lnbm1lbnQgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGB0aGlzYCBjb250ZXh0LlxuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVGhpcyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIHBhcmFtcy5wYXRjaEhhbmRsZXIoe1xuICAgICAgICAgICAgZmFsbGJhY2soKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5jYWxsKG9yaWdpbmFsVGhpcywgLi4ub3JpZ2luYWxBcmd1bWVudHMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9yaWdpbmFsQXJndW1lbnRzLFxuICAgICAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgICAgICBvcmlnaW5hbE1ldGhvZEJvdW5kOiBvcmlnaW5hbE1ldGhvZC5iaW5kKG9yaWdpbmFsVGhpcyksXG4gICAgICAgICAgICBvcmlnaW5hbFRoaXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFwYXJhbXMucGF0Y2hUb2tlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSB0b2tlbiBtYXJrcyB0aGUgSU5TVEFMTEVEIG1ldGhvZCwgcmVhZCBiYWNrIG9uY2UgdGhlIHBhdGNoIGlzIGluIHBsYWNlLlxuICAgIC8vIFRoYXQgaXMgdGhlIGlkZW50aXR5IHRoZSBuZXh0IHBhdGNoIG9mIHRoZSBzYW1lIG1ldGhvZCByZWNlaXZlcyBhcyBpdHMgYG9yaWdpbmFsTWV0aG9kYC5cbiAgICAvLyBgbW9ua2V5LWFyb3VuZGAgaW5zdGFsbHMgYSB3cmFwcGVyIG9mIGl0cyBvd24gYW5kIGV4cG9zZXMgdGhlIHZhbHVlIGJ1aWx0IGFib3ZlIG9ubHkgdmlhIGl0cyBwcm90b3R5cGUuXG4gICAgLy8gTWFya2luZyB0aGF0IHZhbHVlLCBvciB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgYXMgdGhpcyBvbmNlIGRpZCwgbWF0Y2hlcyBub3RoaW5nIHRoZSBuZXh0IHBhdGNoIHNlZXMuXG4gICAgLy8gRHJvcHBpbmcgdGhlIHRva2VuIG9uIHVubG9hZCBsZXRzIGEgZGVmZXJyaW5nIGxhdGVyIHBhdGNoIHRha2Ugb3Zlciwgc2luY2UgdGhlIGd1YXJkIGlzIHJlYWQgcGVyIGNhbGwuXG4gICAgY29uc3QgcGF0Y2hlZE1ldGhvZCA9IHBhcmFtcy4kb2JqZWN0W3BhcmFtcy5tZXRob2ROYW1lXSBhcyBHZW5lcmljRnVuY3Rpb247XG4gICAgY29uc3QgbW9ua2V5QXJvdW5kUGF0Y2hlcyA9IGdldE1vbmtleUFyb3VuZFBhdGNoZXMoKTtcbiAgICBtb25rZXlBcm91bmRQYXRjaGVzLnNldChwYXRjaGVkTWV0aG9kLCBwYXJhbXMucGF0Y2hUb2tlbik7XG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICBtb25rZXlBcm91bmRQYXRjaGVzLmRlbGV0ZShwYXRjaGVkTWV0aG9kKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBwYXRjaCB1c2luZyByYXcgZmFjdG9yaWVzIChhZHZhbmNlZCBBUEkpLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICAgKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gICAqIEBwYXJhbSBmYWN0b3JpZXMgLSBUaGUgZmFjdG9yaWVzIHRvIGFwcGx5IHRvIHRoZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJQYXRjaDwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiAkT2JqZWN0LCBmYWN0b3JpZXM6IEZhY3RvcmllczwkT2JqZWN0Pik6IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG5cbiAgICBjb25zdCB1bmluc3RhbGxlciA9IGFyb3VuZCgkb2JqZWN0LCBmYWN0b3JpZXMpO1xuICAgIHRoaXMucmVnaXN0ZXIodW5pbnN0YWxsZXIpO1xuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHBhdGNoIHRvIHRoZSBvYmplY3QuXG4gKiBCZXR0ZXIgc3Ryb25nbHktdHlwZWQgdmVyc2lvbiBvZiBgbW9ua2V5LWFyb3VuZGAuXG4gKlxuICogQHR5cGVQYXJhbSAkT2JqZWN0IC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAqIEBwYXJhbSBmYWN0b3JpZXMgLSBUaGUgZmFjdG9yaWVzIHRvIGFwcGx5IHRvIHRoZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgdW5pbnN0YWxsZXIgdGhhdCByZW1vdmVzIHRoZSBwYXRjaCB3aGVuIGNhbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyb3VuZDwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiAkT2JqZWN0LCBmYWN0b3JpZXM6IEZhY3RvcmllczwkT2JqZWN0Pik6IFVuaW5zdGFsbGVyIHtcbiAgcmV0dXJuIG9yaWdpbmFsQXJvdW5kKCRvYmplY3QgYXMgR2VuZXJpY09iamVjdCwgZmFjdG9yaWVzIGFzIE9yaWdpbmFsRmFjdG9yaWVzPEdlbmVyaWNPYmplY3Q+KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBmdW5jdGlvbiBoYXMgYSBzcGVjaWZpYyBwYXRjaCB0b2tlbi5cbiAqXG4gKiBBIHRva2VuIGlzIGNhcnJpZWQgYnkgdGhlIG1ldGhvZCBhIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnQjcmVnaXN0ZXJNZXRob2RQYXRjaH0gY2FsbCBJTlNUQUxMRUQsIHNvXG4gKiB0aGUgaW50ZW5kZWQgY2FsbGVyIGlzIGEgbGF0ZXIgcGF0Y2ggb2YgdGhlIHNhbWUgbWV0aG9kLCBjaGVja2luZyB0aGUgYG9yaWdpbmFsTWV0aG9kYCBpdCB3cmFwcGVkIGluXG4gKiBvcmRlciB0byBkZWZlciB0byB0aGUgcGF0Y2ggYWxyZWFkeSBpbiBwbGFjZTpcbiAqXG4gKiBgYGB0c1xuICogcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxNZXRob2QgfSkgPT4ge1xuICogICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gKiAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gKiAgIH1cbiAqICAgLi4uXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgY2hlY2sgaXMgbWFkZSBwZXIgY2FsbCwgc28gaXQgc3RvcHMgcmVwb3J0aW5nIHRoZSBlYXJsaWVyIHBhdGNoIG9uY2UgdGhhdCBwYXRjaCdzIGNvbXBvbmVudCB1bmxvYWRzLlxuICpcbiAqIEBwYXJhbSAkZnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcGFyYW0gcGF0Y2hUb2tlbiAtIFRoZSBwYXRjaCB0b2tlbiB0byBjaGVjayBmb3IuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmdW5jdGlvbiBoYXMgdGhlIHBhdGNoIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGF0Y2hUb2tlbigkZnVuY3Rpb246IEdlbmVyaWNGdW5jdGlvbiwgcGF0Y2hUb2tlbjogc3ltYm9sKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNb25rZXlBcm91bmRQYXRjaGVzKCkuZ2V0KCRmdW5jdGlvbikgPT09IHBhdGNoVG9rZW47XG59XG5cbmZ1bmN0aW9uIGdldE1vbmtleUFyb3VuZFBhdGNoZXMoKTogV2Vha01hcDxHZW5lcmljRnVuY3Rpb24sIHN5bWJvbD4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdtb25rZXlBcm91bmRQYXRjaGVzJywgbmV3IFdlYWtNYXA8R2VuZXJpY0Z1bmN0aW9uLCBzeW1ib2w+KCkpLnZhbHVlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0EsMkJBQXlDO0FBRXpDLHNDQUF5QztBQUN6QywwQkFBNEI7QUE2TXJCLE1BQU0sOEJBQThCLGdDQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVE5Qyxz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
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBJbXByb3ZlZCB0eXBlLXNhZmUgd3JhcHBlciBvZiB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbW9ua2V5LWFyb3VuZH0gbGlicmFyeS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNGdW5jdGlvbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25hbEtleXMgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBhcm91bmQgYXMgb3JpZ2luYWxBcm91bmQgfSBmcm9tICdtb25rZXktYXJvdW5kJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuXG4vKipcbiAqIEEgdHlwZSBvZiB0aGUgZmFjdG9yaWVzIHRvIGFwcGx5IHRvIHRoZSBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSAkT2JqZWN0IC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAqL1xuZXhwb3J0IHR5cGUgRmFjdG9yaWVzPCRPYmplY3QgZXh0ZW5kcyBvYmplY3Q+ID0gUGFydGlhbDxGdWxsRmFjdG9yaWVzPCRPYmplY3Q+PjtcblxuLyoqXG4gKiBLZXlzIG9mIGBPYmpgIHdob3NlIHZhbHVlIGlzIGNhbGxhYmxlIOKAlCBhIG1ldGhvZCwgb3IgYSBmdW5jdGlvbi1saWtlIG9iamVjdCBzdWNoIGFzIGEgYERlYm91bmNlcmAuIFRoZXNlIGFyZSB0aGUgbWVtYmVyc1xuICogYWNjZXB0ZWQgYnkge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudCNyZWdpc3RlckZ1bmN0aW9uUGF0Y2h9LlxuICpcbiAqIEB0eXBlUGFyYW0gJE9iamVjdCAtIFRoZSBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgZmlsdGVyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uS2V5czwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0PiA9IENvbmRpdGlvbmFsS2V5czwkT2JqZWN0LCBHZW5lcmljRnVuY3Rpb24gfCB1bmRlZmluZWQ+ICYga2V5b2YgJE9iamVjdDtcblxuLyoqXG4gKiBLZXlzIG9mIGBPYmpgIHdob3NlIHZhbHVlIGlzIGEgcGxhaW4gZnVuY3Rpb24gKGEgXCJyZWFsIG1ldGhvZFwiKS4gRnVuY3Rpb24tbGlrZSBvYmplY3RzIHRoYXQgY2FycnkgZXh0cmEgbWVtYmVycyBhcmVcbiAqIGV4Y2x1ZGVkIOKAlCBlLmcuIGEgYERlYm91bmNlcmAgKHdoaWNoIGFkZHMgYGNhbmNlbGAvYHJ1bmApIGJlbG9uZ3MgdG8ge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudCNyZWdpc3RlckZ1bmN0aW9uUGF0Y2h9LFxuICogbm90IHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnQjcmVnaXN0ZXJNZXRob2RQYXRjaH0uIFRoZSBjaGVjayBpcyB3aGV0aGVyIHRoZSBtZW1iZXIgaGFzIGFueSBvd24ga2V5cyBiZXlvbmQgYSBiYXJlXG4gKiBmdW5jdGlvbidzIChgRXhjbHVkZTxrZXlvZiBULCBrZXlvZiBHZW5lcmljRnVuY3Rpb24+YCBpcyBgbmV2ZXJgKS5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IHdob3NlIGtleXMgYXJlIGZpbHRlcmVkLlxuICovXG5leHBvcnQgdHlwZSBNZXRob2RLZXlzPCRPYmplY3QgZXh0ZW5kcyBvYmplY3Q+ID0gTWV0aG9kS2V5c01hcDwkT2JqZWN0PltGdW5jdGlvbktleXM8JE9iamVjdD5dO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgcGFzc2VkIHRvIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnQjcmVnaXN0ZXJGdW5jdGlvblBhdGNofS5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICogQHR5cGVQYXJhbSBGdW5jdGlvbk5hbWUgLSBUaGUgZnVuY3Rpb24gbmFtZSB0byBwYXRjaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25rZXlBcm91bmRDb21wb25lbnRSZWdpc3RlckZ1bmN0aW9uUGF0Y2hQYXJhbXM8JE9iamVjdCBleHRlbmRzIG9iamVjdCwgRnVuY3Rpb25OYW1lIGV4dGVuZHMgRnVuY3Rpb25LZXlzPCRPYmplY3Q+PiB7XG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgJG9iamVjdDogJE9iamVjdDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIG5hbWUgdG8gcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5hbWU6IEZ1bmN0aW9uTmFtZTtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBwYXRjaCB1bmluc3RhbGxzIGl0c2VsZiB0aGUgZmlyc3QgdGltZSB0aGUgcGF0Y2hlZCBmdW5jdGlvbiBpcyBpbnZva2VkIChieVxuICAgKiB1bmxvYWRpbmcgdGhpcyBjb21wb25lbnQpLCByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIOKAlCBzbyB0aGUgaW50ZXJjZXB0aW9uIGhhcHBlbnMgZXhhY3RseSBvbmNlLlxuICAgKiBJbnRlbmRlZCBmb3IgYSBjb21wb25lbnQgZGVkaWNhdGVkIHRvIHRoaXMgc2luZ2xlIHBhdGNoLiBFeGlzdGluZyBjYWxsZXJzIHRoYXQgb21pdCBpdCBhcmVcbiAgICogdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgb25jZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhdGNoIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgb3JpZ2luYWwgdmFsdWUgYW5kIHJldHVybnMgdGhlIHBhdGNoZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBvcmlnaW5hbFZhbHVlIC0gVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgVGhlIHBhdGNoZWQgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0Y2hIYW5kbGVyOiAob3JpZ2luYWxWYWx1ZTogJE9iamVjdFtGdW5jdGlvbk5hbWVdKSA9PiAkT2JqZWN0W0Z1bmN0aW9uTmFtZV07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBwYXNzZWQgdG8ge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudCNyZWdpc3Rlck1ldGhvZFBhdGNofS5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICogQHR5cGVQYXJhbSBNZXRob2ROYW1lIC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbmtleUFyb3VuZENvbXBvbmVudFJlZ2lzdGVyTWV0aG9kUGF0Y2hQYXJhbXM8JE9iamVjdCBleHRlbmRzIG9iamVjdCwgTWV0aG9kTmFtZSBleHRlbmRzIE1ldGhvZEtleXM8JE9iamVjdD4+IHtcbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gICAqL1xuICByZWFkb25seSAkb2JqZWN0OiAkT2JqZWN0O1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIG5hbWUgdG8gcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBNZXRob2ROYW1lO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIHBhdGNoIHVuaW5zdGFsbHMgaXRzZWxmIHRoZSBmaXJzdCB0aW1lIHRoZSBwYXRjaGVkIG1ldGhvZCBpcyBpbnZva2VkLCByZXN0b3JpbmdcbiAgICogdGhlIG9yaWdpbmFsIOKAlCBzbyB0aGUgaW50ZXJjZXB0aW9uIGhhcHBlbnMgZXhhY3RseSBvbmNlLiBFeGlzdGluZyBjYWxsZXJzIHRoYXQgb21pdCBpdCBhcmVcbiAgICogdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgb25jZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRjaCBoYW5kbGVyIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0Y2hIYW5kbGVyOiBQYXRjaEhhbmRsZXJGdW5jdGlvbjwkT2JqZWN0LCBNZXRob2ROYW1lPjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgdG9rZW4gdG8gaWRlbnRpZnkgdGhlIHBhdGNoLlxuICAgKlxuICAgKiBUaGUgdG9rZW4gaXMgcmVjb3JkZWQgYWdhaW5zdCB0aGUgbWV0aG9kIHRoaXMgcGF0Y2ggSU5TVEFMTFMsIHNvIHRoZSBuZXh0IHBhdGNoIG9mIHRoZSBzYW1lIG1ldGhvZFxuICAgKiBkZXRlY3RzIGl0IHZpYSB7QGxpbmsgaGFzUGF0Y2hUb2tlbn0gb24gaXRzIG93biBgb3JpZ2luYWxNZXRob2RgIGFuZCBjYW4gZGVmZXIgdG8gdGhpcyBvbmUuIFRoZVxuICAgKiBwYXRjaCB0aGF0IGluc3RhbGxzIGEgdG9rZW4gdGhlcmVmb3JlIG5ldmVyIHNlZXMgaXRzIG93biB0b2tlbiDigJQgb25seSB0aGUgcGF0Y2hlcyBzdGFja2VkIG9uIHRvcCBvZlxuICAgKiBpdCBkby4gVXNlIGEgYFN5bWJvbC5mb3JgIHRva2VuIHRvIG1ha2UgdGhlIGRldGVjdGlvbiB3b3JrIGFjcm9zcyBpbmRlcGVuZGVudGx5IGJ1bmRsZWQgY29waWVzIG9mXG4gICAqIHRoaXMgbGlicmFyeS5cbiAgICpcbiAgICogVGhlIHRva2VuIGlzIGRyb3BwZWQgd2hlbiB0aGlzIGNvbXBvbmVudCB1bmxvYWRzLCBzbyBhIGxhdGVyIHBhdGNoIHRoYXQgaGFkIGRlZmVycmVkIHRha2VzIG92ZXIgb25cbiAgICogaXRzIG5leHQgY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoVG9rZW4/OiBzeW1ib2w7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHBvc3QtcGF0Y2ggaGFuZGxlciBmdW5jdGlvbiB0aGF0IHJ1bnMgYWZ0ZXIgdGhlIHBhdGNoIGlzIGFwcGxpZWQsIHR5cGljYWxseSB0byBrZWVwIHRoZSBvcmlnaW5hbCBtZXRob2QuXG4gICAqL1xuICByZWFkb25seSBwb3N0UGF0Y2hIYW5kbGVyPzogUG9zdFBhdGNoSGFuZGxlckZ1bmN0aW9uPCRPYmplY3QsIE1ldGhvZE5hbWU+O1xufVxuXG4vKipcbiAqIEEgcGF0Y2ggaGFuZGxlciBmdW5jdGlvbiB0aGF0IGludGVyY2VwdHMgY2FsbHMgdG8gYSBtZXRob2Qgb24gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gJE9iamVjdCAtIFRoZSBvYmplY3QgYmVpbmcgcGF0Y2hlZC5cbiAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSBiZWluZyBwYXRjaGVkLlxuICovXG5leHBvcnQgdHlwZSBQYXRjaEhhbmRsZXJGdW5jdGlvbjwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0LCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czwkT2JqZWN0Pj4gPSAoXG4gIHBhcmFtczogUGF0Y2hIYW5kbGVyUGFyYW1zPCRPYmplY3QsIE1ldGhvZE5hbWU+XG4pID0+IFJldHVyblR5cGU8RXh0cmFjdEZ1bmN0aW9uPCRPYmplY3QsIE1ldGhvZE5hbWU+PjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIHBhc3NlZCB0byBhIHtAbGluayBQYXRjaEhhbmRsZXJGdW5jdGlvbn0gY2FsbGJhY2suXG4gKlxuICogQHR5cGVQYXJhbSAkT2JqZWN0IC0gVGhlIG9iamVjdCBiZWluZyBwYXRjaGVkLlxuICogQHR5cGVQYXJhbSBNZXRob2ROYW1lIC0gVGhlIG1ldGhvZCBuYW1lIGJlaW5nIHBhdGNoZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hIYW5kbGVyUGFyYW1zPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPCRPYmplY3Q+PiB7XG4gIC8qKlxuICAgKiBJbnZva2VzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCB0aGUgb3JpZ2luYWwgYHRoaXNgIGFuZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoYXRldmVyIHRoZSBvcmlnaW5hbCBtZXRob2QgcmV0dXJucy5cbiAgICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrOiAoKSA9PiBSZXR1cm5UeXBlPEV4dHJhY3RGdW5jdGlvbjwkT2JqZWN0LCBNZXRob2ROYW1lPj47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBhcmd1bWVudHMgb2YgdGhlIGludGVyY2VwdGVkIGNhbGwsIGFzIGEgdHVwbGUuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbEFyZ3VtZW50czogUGFyYW1ldGVyczxFeHRyYWN0RnVuY3Rpb248JE9iamVjdCwgTWV0aG9kTmFtZT4+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgKHVucGF0Y2hlZCkgbWV0aG9kLiBDYWxsIHZpYSBgb3JpZ2luYWxGbi5jYWxsKG9yaWdpbmFsVGhpcywgLi4ub3JpZ2luYWxBcmdzKWAuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbE1ldGhvZDogRXh0cmFjdEZ1bmN0aW9uPCRPYmplY3QsIE1ldGhvZE5hbWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgbWV0aG9kLCBidXQgd2l0aCB0aGUgYHRoaXNgIGNvbnRleHQgYWxyZWFkeSBib3VuZCB0byB0aGUgb3JpZ2luYWwgb2JqZWN0LiBDYWxsIHZpYSBgb3JpZ2luYWxNZXRob2RCb3VuZCguLi5vcmlnaW5hbEFyZ3MpYC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTWV0aG9kQm91bmQ6IE9taXRUaGlzUGFyYW1ldGVyPEV4dHJhY3RGdW5jdGlvbjwkT2JqZWN0LCBNZXRob2ROYW1lPj47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBgdGhpc2AgY29udGV4dCBvZiB0aGUgaW50ZXJjZXB0ZWQgY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsVGhpczogJE9iamVjdDtcbn1cblxuLyoqXG4gKiBBIHBvc3QtcGF0Y2ggaGFuZGxlciBmdW5jdGlvbiB0aGF0IHJ1bnMgYWZ0ZXIgYSBwYXRjaCBpcyBhcHBsaWVkLlxuICpcbiAqIEl0IHJldHVybnMgbm90aGluZyBhbmQgaXMgbm90IGhhbmRlZCB0aGUgcGF0Y2hlZCBtZXRob2Q6IHRoZSBtZXRob2QgaW5zdGFsbGVkIGlzIGFsd2F5cyB0aGUgb25lIHRoZSBwYXRjaCBidWlsZHMsIHNvXG4gKiBhIHBvc3QtcGF0Y2ggaGFuZGxlciBjYW5ub3QgZ3JhZnQgbWVtYmVycyBvbnRvIGl0LiBBIGNhcGFiaWxpdHkgYmV5b25kIHRoZSBwYXRjaGVkIG1ldGhvZCdzIG93biBzaWduYXR1cmUgYmVsb25nc1xuICogb24gdGhlIHBsdWdpbidzIHB1Ymxpc2hlZCBBUEkgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IGJlaW5nIHBhdGNoZWQuXG4gKiBAdHlwZVBhcmFtIE1ldGhvZE5hbWUgLSBUaGUgbWV0aG9kIG5hbWUgYmVpbmcgcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUG9zdFBhdGNoSGFuZGxlckZ1bmN0aW9uPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPCRPYmplY3Q+PiA9IChcbiAgcGFyYW1zOiBQb3N0UGF0Y2hIYW5kbGVyUGFyYW1zPCRPYmplY3QsIE1ldGhvZE5hbWU+XG4pID0+IHZvaWQ7XG5cbi8qKlxuICogUGFyYW1ldGVycyBwYXNzZWQgdG8gYSB7QGxpbmsgUG9zdFBhdGNoSGFuZGxlckZ1bmN0aW9ufSBjYWxsYmFjay5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IGJlaW5nIHBhdGNoZWQuXG4gKiBAdHlwZVBhcmFtIE1ldGhvZE5hbWUgLSBUaGUgbWV0aG9kIG5hbWUgYmVpbmcgcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3N0UGF0Y2hIYW5kbGVyUGFyYW1zPCRPYmplY3QgZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPCRPYmplY3Q+PiB7XG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgKHVucGF0Y2hlZCkgbWV0aG9kLiBDYWxsIHZpYSBgb3JpZ2luYWxGbi5jYWxsKG9yaWdpbmFsVGhpcywgLi4ub3JpZ2luYWxBcmdzKWAuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbE1ldGhvZDogRXh0cmFjdEZ1bmN0aW9uPCRPYmplY3QsIE1ldGhvZE5hbWU+O1xufVxuXG50eXBlIEV4dHJhY3RGdW5jdGlvbjwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0LCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czwkT2JqZWN0Pj4gPSBHZW5lcmljRnVuY3Rpb248UGFyYW1ldGVyczxFeHRyYWN0PCRPYmplY3RbTWV0aG9kTmFtZV0sIEdlbmVyaWNGdW5jdGlvbj4+LCBSZXR1cm5UeXBlPEV4dHJhY3Q8JE9iamVjdFtNZXRob2ROYW1lXSwgR2VuZXJpY0Z1bmN0aW9uPj4+O1xuXG50eXBlIEZ1bGxGYWN0b3JpZXM8JE9iamVjdCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgJE9iamVjdF06IChvcmlnaW5hbFZhbHVlOiAkT2JqZWN0W0tleV0pID0+ICRPYmplY3RbS2V5XTtcbn07XG5cbnR5cGUgTWV0aG9kS2V5c01hcDwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0tleSBpbiBGdW5jdGlvbktleXM8JE9iamVjdD5dOiBbRXhjbHVkZTxrZXlvZiBOb25OdWxsYWJsZTwkT2JqZWN0W0tleV0+LCBrZXlvZiBHZW5lcmljRnVuY3Rpb24+XSBleHRlbmRzIFtuZXZlcl0gPyBLZXkgOiBuZXZlcjtcbn07XG5cbnR5cGUgT3JpZ2luYWxGYWN0b3JpZXM8JE9iamVjdCBleHRlbmRzIEdlbmVyaWNPYmplY3Q+ID0gUGFyYW1ldGVyczx0eXBlb2Ygb3JpZ2luYWxBcm91bmQ8JE9iamVjdD4+WzFdO1xuXG50eXBlIFVuaW5zdGFsbGVyID0gKCkgPT4gdm9pZDtcblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0aGF0IG1hbmFnZXMgbW9ua2V5LXBhdGNoZXMgd2l0aCBsaWZlY3ljbGUtYm91bmQgY2xlYW51cC5cbiAqIEFsbCBwYXRjaGVzIHJlZ2lzdGVyZWQgdmlhIHRoaXMgY29tcG9uZW50IGFyZSBhdXRvbWF0aWNhbGx5IHVuaW5zdGFsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzLlxuICovXG5leHBvcnQgY2xhc3MgTW9ua2V5QXJvdW5kQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgcGF0Y2ggZm9yIGEgc2luZ2xlIGZ1bmN0aW9uLWxpa2UgbWVtYmVyIChhIG1ldGhvZCwgb3IgYSBjYWxsYWJsZSBzdWNoIGFzIGEgYERlYm91bmNlcmApIHVzaW5nIGEgc2ltcGxpZmllZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICAgKiBAdHlwZVBhcmFtIEZ1bmN0aW9uTmFtZSAtIFRoZSBmdW5jdGlvbiBuYW1lIHRvIHBhdGNoLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgb2YgdGhlIHBhdGNoLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRnVuY3Rpb25QYXRjaDwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0LCBjb25zdCBGdW5jdGlvbk5hbWUgZXh0ZW5kcyBGdW5jdGlvbktleXM8JE9iamVjdD4+KFxuICAgIHBhcmFtczogTW9ua2V5QXJvdW5kQ29tcG9uZW50UmVnaXN0ZXJGdW5jdGlvblBhdGNoUGFyYW1zPCRPYmplY3QsIEZ1bmN0aW9uTmFtZT5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcblxuICAgIGNvbnN0IGZhY3RvcmllczogRmFjdG9yaWVzPCRPYmplY3Q+ID0ge307XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8taW1tZWRpYXRlLW11dGF0aW9uIC0tIEEgY29tcHV0ZWQga2V5IGluIGFuIG9iamVjdCBsaXRlcmFsIGRvZXMgbm90IG1hdGNoIGBQYXJ0aWFsPEZ1bGxGYWN0b3JpZXM8JE9iamVjdD4+YCB3aGVuIHRoZSBrZXkgdHlwZSBpcyBnZW5lcmljOyBhc3NpZ25pbmcgYWZ0ZXIgZGVjbGFyYXRpb24ga2VlcHMgdGhlIHRhcmdldCB0eXBlIGtub3duLlxuICAgIGZhY3Rvcmllc1twYXJhbXMuZnVuY3Rpb25OYW1lXSA9IChvcmlnaW5hbFZhbHVlOiAkT2JqZWN0W0Z1bmN0aW9uTmFtZV0pOiAkT2JqZWN0W0Z1bmN0aW9uTmFtZV0gPT4ge1xuICAgICAgY29uc3QgcGF0Y2hlZFZhbHVlID0gcGFyYW1zLnBhdGNoSGFuZGxlcihvcmlnaW5hbFZhbHVlKTtcbiAgICAgIGlmICghcGFyYW1zLm9uY2UpIHtcbiAgICAgICAgcmV0dXJuIHBhdGNoZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQSBgb25jZWAgcGF0Y2ggdW5sb2FkcyB0aGlzIGNvbXBvbmVudCBhZnRlciB0aGUgZmlyc3QgaW52b2NhdGlvbiDigJQgcnVubmluZyB0aGUgcmVnaXN0ZXJlZFxuICAgICAgLy8gdW5pbnN0YWxsZXIgYW5kIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwuIGB1bmxvYWRDb21wb25lbnRgIGlzIGFuIGFycm93IHNvIGl0IGNhcHR1cmVzIHRoZVxuICAgICAgLy8gY29tcG9uZW50IGB0aGlzYDsgdGhlIG5lc3RlZCBgb25jZVBhdGNoZWRWYWx1ZWAgbXVzdCBiZSBhIGZ1bmN0aW9uIHRvIHJlY2VpdmUgdGhlIGNhbGwtdGltZVxuICAgICAgLy8gYHRoaXNgLiBPd24gbWVtYmVycyAoZS5nLiBhIGBEZWJvdW5jZXJgJ3MgYGNhbmNlbGAvYHJ1bmApIGFyZSBjb3BpZWQgb250byBpdCBzbyBmdW5jdGlvbi1saWtlXG4gICAgICAvLyB2YWx1ZXMga2VlcCB3b3JraW5nLlxuICAgICAgY29uc3QgdW5sb2FkQ29tcG9uZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIG9uY2VQYXRjaGVkVmFsdWUodGhpczogdW5rbm93biwgLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocGF0Y2hlZFZhbHVlLCB0aGlzLCAkYXJndW1lbnRzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB1bmxvYWRDb21wb25lbnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob25jZVBhdGNoZWRWYWx1ZSwgcGF0Y2hlZFZhbHVlKSBhcyAkT2JqZWN0W0Z1bmN0aW9uTmFtZV07XG4gICAgfTtcblxuICAgIHRoaXMucmVnaXN0ZXJQYXRjaChwYXJhbXMuJG9iamVjdCwgZmFjdG9yaWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzaW5nbGUtbWV0aG9kIHBhdGNoIHVzaW5nIGEgc2ltcGxpZmllZCBoYW5kbGVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICAgKiBAdHlwZVBhcmFtIE1ldGhvZE5hbWUgLSBUaGUgbWV0aG9kIG5hbWUgdG8gcGF0Y2guXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBvZiB0aGUgcGF0Y2guXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJNZXRob2RQYXRjaDwkT2JqZWN0IGV4dGVuZHMgb2JqZWN0LCBjb25zdCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czwkT2JqZWN0Pj4oXG4gICAgcGFyYW1zOiBNb25rZXlBcm91bmRDb21wb25lbnRSZWdpc3Rlck1ldGhvZFBhdGNoUGFyYW1zPCRPYmplY3QsIE1ldGhvZE5hbWU+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG5cbiAgICB0eXBlICRGdW5jdGlvbiA9IEV4dHJhY3RGdW5jdGlvbjwkT2JqZWN0LCBNZXRob2ROYW1lPjtcblxuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvblBhdGNoKHtcbiAgICAgICRvYmplY3Q6IHBhcmFtcy4kb2JqZWN0LFxuICAgICAgZnVuY3Rpb25OYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgIG9uY2U6IHBhcmFtcy5vbmNlID8/IGZhbHNlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAob3JpZ2luYWxNZXRob2RSYXcpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbE1ldGhvZFJhdyBhcyAkRnVuY3Rpb247XG4gICAgICAgIHBhcmFtcy5wb3N0UGF0Y2hIYW5kbGVyPy4oeyBvcmlnaW5hbE1ldGhvZCB9KTtcbiAgICAgICAgcmV0dXJuIHBhdGNoZWRNZXRob2QgYXMgJE9iamVjdFtNZXRob2ROYW1lXTtcblxuICAgICAgICBmdW5jdGlvbiBwYXRjaGVkTWV0aG9kKHRoaXM6ICRPYmplY3QsIC4uLm9yaWdpbmFsQXJndW1lbnRzOiBQYXJhbWV0ZXJzPCRGdW5jdGlvbj4pOiBSZXR1cm5UeXBlPCRGdW5jdGlvbj4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXRoaXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzLCB1bmljb3JuL25vLXRoaXMtYXNzaWdubWVudCAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgYHRoaXNgIGNvbnRleHQuXG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxUaGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gcGFyYW1zLnBhdGNoSGFuZGxlcih7XG4gICAgICAgICAgICBmYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmNhbGwob3JpZ2luYWxUaGlzLCAuLi5vcmlnaW5hbEFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3JpZ2luYWxBcmd1bWVudHMsXG4gICAgICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmQ6IG9yaWdpbmFsTWV0aG9kLmJpbmQob3JpZ2luYWxUaGlzKSxcbiAgICAgICAgICAgIG9yaWdpbmFsVGhpc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXBhcmFtcy5wYXRjaFRva2VuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHRva2VuIG1hcmtzIHRoZSBJTlNUQUxMRUQgbWV0aG9kLCByZWFkIGJhY2sgb25jZSB0aGUgcGF0Y2ggaXMgaW4gcGxhY2UuXG4gICAgLy8gVGhhdCBpcyB0aGUgaWRlbnRpdHkgdGhlIG5leHQgcGF0Y2ggb2YgdGhlIHNhbWUgbWV0aG9kIHJlY2VpdmVzIGFzIGl0cyBgb3JpZ2luYWxNZXRob2RgLlxuICAgIC8vIGBtb25rZXktYXJvdW5kYCBpbnN0YWxscyBhIHdyYXBwZXIgb2YgaXRzIG93biBhbmQgZXhwb3NlcyB0aGUgdmFsdWUgYnVpbHQgYWJvdmUgb25seSB2aWEgaXRzIHByb3RvdHlwZS5cbiAgICAvLyBNYXJraW5nIHRoYXQgdmFsdWUsIG9yIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCBhcyB0aGlzIG9uY2UgZGlkLCBtYXRjaGVzIG5vdGhpbmcgdGhlIG5leHQgcGF0Y2ggc2Vlcy5cbiAgICAvLyBEcm9wcGluZyB0aGUgdG9rZW4gb24gdW5sb2FkIGxldHMgYSBkZWZlcnJpbmcgbGF0ZXIgcGF0Y2ggdGFrZSBvdmVyLCBzaW5jZSB0aGUgZ3VhcmQgaXMgcmVhZCBwZXIgY2FsbC5cbiAgICBjb25zdCBwYXRjaGVkTWV0aG9kID0gcGFyYW1zLiRvYmplY3RbcGFyYW1zLm1ldGhvZE5hbWVdIGFzIEdlbmVyaWNGdW5jdGlvbjtcbiAgICBjb25zdCBtb25rZXlBcm91bmRQYXRjaGVzID0gZ2V0TW9ua2V5QXJvdW5kUGF0Y2hlcygpO1xuICAgIG1vbmtleUFyb3VuZFBhdGNoZXMuc2V0KHBhdGNoZWRNZXRob2QsIHBhcmFtcy5wYXRjaFRva2VuKTtcbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIG1vbmtleUFyb3VuZFBhdGNoZXMuZGVsZXRlKHBhdGNoZWRNZXRob2QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHBhdGNoIHVzaW5nIHJhdyBmYWN0b3JpZXMgKGFkdmFuY2VkIEFQSSkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gJE9iamVjdCAtIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gICAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAgICogQHBhcmFtIGZhY3RvcmllcyAtIFRoZSBmYWN0b3JpZXMgdG8gYXBwbHkgdG8gdGhlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclBhdGNoPCRPYmplY3QgZXh0ZW5kcyBvYmplY3Q+KCRvYmplY3Q6ICRPYmplY3QsIGZhY3RvcmllczogRmFjdG9yaWVzPCRPYmplY3Q+KTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcblxuICAgIGNvbnN0IHVuaW5zdGFsbGVyID0gYXJvdW5kKCRvYmplY3QsIGZhY3Rvcmllcyk7XG4gICAgdGhpcy5yZWdpc3Rlcih1bmluc3RhbGxlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgcGF0Y2ggdG8gdGhlIG9iamVjdC5cbiAqIEJldHRlciBzdHJvbmdseS10eXBlZCB2ZXJzaW9uIG9mIGBtb25rZXktYXJvdW5kYC5cbiAqXG4gKiBAdHlwZVBhcmFtICRPYmplY3QgLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICogQHBhcmFtICRvYmplY3QgLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICogQHBhcmFtIGZhY3RvcmllcyAtIFRoZSBmYWN0b3JpZXMgdG8gYXBwbHkgdG8gdGhlIG9iamVjdC5cbiAqIEByZXR1cm5zIFRoZSB1bmluc3RhbGxlciB0aGF0IHJlbW92ZXMgdGhlIHBhdGNoIHdoZW4gY2FsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJvdW5kPCRPYmplY3QgZXh0ZW5kcyBvYmplY3Q+KCRvYmplY3Q6ICRPYmplY3QsIGZhY3RvcmllczogRmFjdG9yaWVzPCRPYmplY3Q+KTogVW5pbnN0YWxsZXIge1xuICByZXR1cm4gb3JpZ2luYWxBcm91bmQoJG9iamVjdCBhcyBHZW5lcmljT2JqZWN0LCBmYWN0b3JpZXMgYXMgT3JpZ2luYWxGYWN0b3JpZXM8R2VuZXJpY09iamVjdD4pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZ1bmN0aW9uIGhhcyBhIHNwZWNpZmljIHBhdGNoIHRva2VuLlxuICpcbiAqIEEgdG9rZW4gaXMgY2FycmllZCBieSB0aGUgbWV0aG9kIGEge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudCNyZWdpc3Rlck1ldGhvZFBhdGNofSBjYWxsIElOU1RBTExFRCwgc29cbiAqIHRoZSBpbnRlbmRlZCBjYWxsZXIgaXMgYSBsYXRlciBwYXRjaCBvZiB0aGUgc2FtZSBtZXRob2QsIGNoZWNraW5nIHRoZSBgb3JpZ2luYWxNZXRob2RgIGl0IHdyYXBwZWQgaW5cbiAqIG9yZGVyIHRvIGRlZmVyIHRvIHRoZSBwYXRjaCBhbHJlYWR5IGluIHBsYWNlOlxuICpcbiAqIGBgYHRzXG4gKiBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbE1ldGhvZCB9KSA9PiB7XG4gKiAgIGlmIChoYXNQYXRjaFRva2VuKG9yaWdpbmFsTWV0aG9kLCBQQVRDSF9UT0tFTikpIHtcbiAqICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAqICAgfVxuICogICAuLi5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoZSBjaGVjayBpcyBtYWRlIHBlciBjYWxsLCBzbyBpdCBzdG9wcyByZXBvcnRpbmcgdGhlIGVhcmxpZXIgcGF0Y2ggb25jZSB0aGF0IHBhdGNoJ3MgY29tcG9uZW50IHVubG9hZHMuXG4gKlxuICogQHBhcmFtICRmdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEBwYXJhbSBwYXRjaFRva2VuIC0gVGhlIHBhdGNoIHRva2VuIHRvIGNoZWNrIGZvci5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhcyB0aGUgcGF0Y2ggdG9rZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQYXRjaFRva2VuKCRmdW5jdGlvbjogR2VuZXJpY0Z1bmN0aW9uLCBwYXRjaFRva2VuOiBzeW1ib2wpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1vbmtleUFyb3VuZFBhdGNoZXMoKS5nZXQoJGZ1bmN0aW9uKSA9PT0gcGF0Y2hUb2tlbjtcbn1cblxuZnVuY3Rpb24gZ2V0TW9ua2V5QXJvdW5kUGF0Y2hlcygpOiBXZWFrTWFwPEdlbmVyaWNGdW5jdGlvbiwgc3ltYm9sPiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ21vbmtleUFyb3VuZFBhdGNoZXMnLCBuZXcgV2Vha01hcDxHZW5lcmljRnVuY3Rpb24sIHN5bWJvbD4oKSkudmFsdWU7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQSwyQkFBeUM7QUFFekMsc0NBQXlDO0FBQ3pDLDBCQUE0QjtBQTRNckIsTUFBTSw4QkFBOEIsZ0NBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* Improved type-safe wrapper of {@link https://www.npmjs.com/package/monkey-around} library.
|
|
6
6
|
*/
|
|
7
7
|
import type { GenericFunction } from '@mnaoumov/typescript-lib/function' with { 'resolution-mode': 'import' };
|
|
8
|
-
import type { MaybeReturn } from '@mnaoumov/typescript-lib/type' with { 'resolution-mode': 'import' };
|
|
9
8
|
import type { ConditionalKeys } from 'type-fest' with { 'resolution-mode': 'import' };
|
|
10
9
|
import { ComponentEx } from './component-ex.cjs';
|
|
11
10
|
/**
|
|
@@ -103,7 +102,7 @@ export interface MonkeyAroundComponentRegisterMethodPatchParams<$Object extends
|
|
|
103
102
|
*/
|
|
104
103
|
readonly patchToken?: symbol;
|
|
105
104
|
/**
|
|
106
|
-
* An optional post-patch handler function that runs after the patch is applied.
|
|
105
|
+
* An optional post-patch handler function that runs after the patch is applied, typically to keep the original method.
|
|
107
106
|
*/
|
|
108
107
|
readonly postPatchHandler?: PostPatchHandlerFunction<$Object, MethodName>;
|
|
109
108
|
}
|
|
@@ -147,10 +146,14 @@ export interface PatchHandlerParams<$Object extends object, MethodName extends M
|
|
|
147
146
|
/**
|
|
148
147
|
* A post-patch handler function that runs after a patch is applied.
|
|
149
148
|
*
|
|
149
|
+
* It returns nothing and is not handed the patched method: the method installed is always the one the patch builds, so
|
|
150
|
+
* a post-patch handler cannot graft members onto it. A capability beyond the patched method's own signature belongs
|
|
151
|
+
* on the plugin's published API instead.
|
|
152
|
+
*
|
|
150
153
|
* @typeParam $Object - The object being patched.
|
|
151
154
|
* @typeParam MethodName - The method name being patched.
|
|
152
155
|
*/
|
|
153
|
-
export type PostPatchHandlerFunction<$Object extends object, MethodName extends MethodKeys<$Object>> = (params: PostPatchHandlerParams<$Object, MethodName>) =>
|
|
156
|
+
export type PostPatchHandlerFunction<$Object extends object, MethodName extends MethodKeys<$Object>> = (params: PostPatchHandlerParams<$Object, MethodName>) => void;
|
|
154
157
|
/**
|
|
155
158
|
* Parameters passed to a {@link PostPatchHandlerFunction} callback.
|
|
156
159
|
*
|
|
@@ -162,10 +165,6 @@ export interface PostPatchHandlerParams<$Object extends object, MethodName exten
|
|
|
162
165
|
* The original (unpatched) method. Call via `originalFn.call(originalThis, ...originalArgs)`.
|
|
163
166
|
*/
|
|
164
167
|
readonly originalMethod: ExtractFunction<$Object, MethodName>;
|
|
165
|
-
/**
|
|
166
|
-
* The patched method.
|
|
167
|
-
*/
|
|
168
|
-
readonly patchedMethod: ExtractFunction<$Object, MethodName>;
|
|
169
168
|
}
|
|
170
169
|
type ExtractFunction<$Object extends object, MethodName extends MethodKeys<$Object>> = GenericFunction<Parameters<Extract<$Object[MethodName], GenericFunction>>, ReturnType<Extract<$Object[MethodName], GenericFunction>>>;
|
|
171
170
|
type FullFactories<$Object extends object> = {
|
|
@@ -302,6 +302,9 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
302
302
|
this.lossAnnouncementTimerId = null;
|
|
303
303
|
}
|
|
304
304
|
createBlockedMessage(dependency) {
|
|
305
|
+
if (this.isBelowMinPluginVersion(dependency)) {
|
|
306
|
+
return this.createVersionMismatchMessage(dependency);
|
|
307
|
+
}
|
|
305
308
|
return (0, import_html_element.createFragmentWithCodeBlocks)((0, import_i18n.t)(($) => $.obsidianDevUtils.pluginDependency.blockedNotice, {
|
|
306
309
|
dependencyPluginName: (0, import_html_element.asCodeBlock)(dependency.pluginName),
|
|
307
310
|
pluginName: (0, import_html_element.asCodeBlock)(this.plugin.manifest.name)
|
|
@@ -326,11 +329,20 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
326
329
|
}));
|
|
327
330
|
}
|
|
328
331
|
createDependencyLostMessage(dependency) {
|
|
332
|
+
if (this.isBelowMinPluginVersion(dependency)) {
|
|
333
|
+
return this.createVersionMismatchMessage(dependency);
|
|
334
|
+
}
|
|
329
335
|
return (0, import_html_element.createFragmentWithCodeBlocks)((0, import_i18n.t)(($) => $.obsidianDevUtils.pluginDependency.dependencyLostNotice, {
|
|
330
336
|
dependencyPluginName: (0, import_html_element.asCodeBlock)(dependency.pluginName),
|
|
331
337
|
pluginName: (0, import_html_element.asCodeBlock)(this.plugin.manifest.name)
|
|
332
338
|
}));
|
|
333
339
|
}
|
|
340
|
+
createVersionMismatchMessage(dependency) {
|
|
341
|
+
return (0, import_html_element.createFragmentWithCodeBlocks)((0, import_i18n.t)(($) => $.obsidianDevUtils.pluginDependency.versionMismatchNotice, {
|
|
342
|
+
dependencyPluginName: (0, import_html_element.asCodeBlock)(dependency.pluginName),
|
|
343
|
+
pluginName: (0, import_html_element.asCodeBlock)(this.plugin.manifest.name)
|
|
344
|
+
}));
|
|
345
|
+
}
|
|
334
346
|
/**
|
|
335
347
|
* Finds the declared conflicts of one severity that are currently in force.
|
|
336
348
|
*
|
|
@@ -341,7 +353,7 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
341
353
|
return this.conflicts.filter((conflict) => conflict.severity === severity && this.isConflictActive(conflict));
|
|
342
354
|
}
|
|
343
355
|
getUnsatisfiedDependencies() {
|
|
344
|
-
return this.dependencies.filter((dependency) => !this.apiRefs.get(dependency.pluginId)?.value);
|
|
356
|
+
return this.dependencies.filter((dependency) => !this.apiRefs.get(dependency.pluginId)?.value || this.isBelowMinPluginVersion(dependency));
|
|
345
357
|
}
|
|
346
358
|
hideBlockedSettingTab() {
|
|
347
359
|
if (!this.blockedSettingTab) {
|
|
@@ -350,6 +362,33 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
350
362
|
this.app.setting.removeSettingTab(this.blockedSettingTab);
|
|
351
363
|
this.blockedSettingTab = null;
|
|
352
364
|
}
|
|
365
|
+
/**
|
|
366
|
+
* Decides whether a dependency is running at a release older than it declared it needs.
|
|
367
|
+
*
|
|
368
|
+
* Read from the manifest, like a conflict, and re-read on every evaluation: Obsidian applies an update by
|
|
369
|
+
* reloading the provider, which fires the API watch's `change`, so the gate opens without a restart.
|
|
370
|
+
*
|
|
371
|
+
* @param dependency - The declared dependency.
|
|
372
|
+
* @returns Whether the dependency is enabled below its {@link PluginDependency.minPluginVersion}; `false`
|
|
373
|
+
* when it declares none or is not enabled, since its API is then absent anyway.
|
|
374
|
+
*/
|
|
375
|
+
isBelowMinPluginVersion(dependency) {
|
|
376
|
+
if (dependency.minPluginVersion === void 0) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
const installedVersion = (0, import_plugin_install_state.getInstalledPluginVersion)({
|
|
380
|
+
app: this.app,
|
|
381
|
+
pluginId: dependency.pluginId
|
|
382
|
+
});
|
|
383
|
+
if (installedVersion === null) {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
try {
|
|
387
|
+
return !(0, import_compare_versions.compare)(installedVersion, dependency.minPluginVersion, ">=");
|
|
388
|
+
} catch {
|
|
389
|
+
return true;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
353
392
|
/**
|
|
354
393
|
* Decides whether one declared conflict is in force right now.
|
|
355
394
|
*
|
|
@@ -450,17 +489,17 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
450
489
|
app: this.app,
|
|
451
490
|
pluginId: dependency.pluginId
|
|
452
491
|
});
|
|
453
|
-
new import_obsidian.ButtonComponent(bannerEl).setButtonText((0, import_i18n.t)(
|
|
454
|
-
($) => state === import_plugin_install_state.InstalledPluginState.InstalledButDisabled ? $.obsidianDevUtils.pluginSuggestion.enable : $.obsidianDevUtils.pluginSuggestion.install
|
|
455
|
-
)).setCta().onClick((0, import_async.convertAsyncToSync)(async () => {
|
|
456
|
-
await (0, import_plugin_install_state.installAndEnablePlugin)({
|
|
457
|
-
app: this.app,
|
|
458
|
-
pluginId: dependency.pluginId,
|
|
459
|
-
pluginName: dependency.pluginName,
|
|
460
|
-
pluginNoticeComponent: this.pluginNoticeComponent
|
|
461
|
-
});
|
|
462
|
-
}));
|
|
463
492
|
if (state !== import_plugin_install_state.InstalledPluginState.Enabled) {
|
|
493
|
+
new import_obsidian.ButtonComponent(bannerEl).setButtonText((0, import_i18n.t)(
|
|
494
|
+
($) => state === import_plugin_install_state.InstalledPluginState.InstalledButDisabled ? $.obsidianDevUtils.pluginSuggestion.enable : $.obsidianDevUtils.pluginSuggestion.install
|
|
495
|
+
)).setCta().onClick((0, import_async.convertAsyncToSync)(async () => {
|
|
496
|
+
await (0, import_plugin_install_state.installAndEnablePlugin)({
|
|
497
|
+
app: this.app,
|
|
498
|
+
pluginId: dependency.pluginId,
|
|
499
|
+
pluginName: dependency.pluginName,
|
|
500
|
+
pluginNoticeComponent: this.pluginNoticeComponent
|
|
501
|
+
});
|
|
502
|
+
}));
|
|
464
503
|
continue;
|
|
465
504
|
}
|
|
466
505
|
this.renderOpenSettingsButton(bannerEl, dependency.pluginId, dependency.pluginName);
|
|
@@ -526,4 +565,4 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
526
565
|
PluginConflictSeverity,
|
|
527
566
|
PluginGateComponent
|
|
528
567
|
});
|
|
529
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uIH0gZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIFBsdWdpblNldHRpbmdUYWJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbkFwaVJlZiB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tYXBpLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luTGlmZWN5Y2xlRXZlbnROYW1lLFxuICBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWRcbn0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1saWZlY3ljbGUtZXZlbnRzLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGRpc2FibGVDb21tdW5pdHlQbHVnaW4gfSBmcm9tICcuLi9jb21tdW5pdHktcGx1Z2lucy50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQge1xuICBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lLFxuICBhc0NvZGVCbG9jayxcbiAgY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrc1xufSBmcm9tICcuLi9odG1sLWVsZW1lbnQudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4uL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyB3YXRjaFBsdWdpbkFwaSB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tYXBpLnRzJztcbmltcG9ydCB7XG4gIGdldEluc3RhbGxlZFBsdWdpblN0YXRlLFxuICBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uLFxuICBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luLFxuICBJbnN0YWxsZWRQbHVnaW5TdGF0ZVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCB0aGUgZGVwZW5kZW50IGRvZXMgd2l0aCB0aGlzIHBsdWdpbiwgc2hvd24gaW4gdGhlIHNldHRpbmdzIGJhbm5lci5cbiAgICpcbiAgICogVGhlIGRlcGVuZGVudCBvd25zIHRoaXMgc3RyaW5nIGJlY2F1c2Ugb25seSBpdCBrbm93cyB3aGF0IGl0IHVzZXMgdGhlIG90aGVyIHBsdWdpbiBmb3IsIGFuZCBhIHVzZXJcbiAgICogYmVpbmcgYXNrZWQgdG8gaW5zdGFsbCBzb21ldGhpbmcgZGVzZXJ2ZXMgdG8gYmUgdG9sZCB3aHkuXG4gICAqXG4gICAqIFBhc3MgYSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gdG8gbWFyayB1cCBwYXJ0IG9mIHRoZSBzZW50ZW5jZSwgc3VjaCBhcyBhIHBsdWdpbiBuYW1lIHJlbmRlcmVkIGFzXG4gICAqIGNvZGUuIEVhY2ggcmVuZGVyIGFwcGVuZHMgYSBmcmVzaCBjbG9uZSBvZiBpdCwgc2luY2UgdGhlIGJhbm5lciBpcyByZW5kZXJlZCBhZ2FpbiBvbiBldmVyeSByZWZyZXNoLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb25mbGljdHMgdG8gZW5mb3JjZS4gQW4gZW1wdHkgbGlzdCBtZWFucyB0aGUgcGx1Z2luIHJlZnVzZXMgdG8gcnVuIGJlc2lkZSBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwZW5kZW5jaWVzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiBkZXBlbmRzIG9uIG5vdGhpbmcsIGFuZCBpdHMgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGxvYWRzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W107XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBob3N0IHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZS4gQ2FsbGVkIG9uY2UgZXZlcnkgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgYW5kIG5vIGJsb2NraW5nXG4gICAqIGNvbmZsaWN0IGhvbGRzLCBhbmQgYWdhaW4gYWZ0ZXIgYSBnYXRlIHRoYXQgaGFkIGNsb3NlZCBvcGVucyBiYWNrIHVwLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgaXMgbG9hZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwbHVnaW4g4oCUIHRoZSBvbmUgZGVjbGFyaW5nIHRoZSBkZXBlbmRlbmNpZXMgYW5kIGNvbmZsaWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwbHVnaW4ncyBub3RpY2UgY29tcG9uZW50LCB1c2VkIHRvIHNheSB3aGF0IGlzIG1pc3NpbmcsIHdoYXQgaXMgaW4gdGhlIHdheSwgYW5kIHdoYXQgY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBVbmxvYWRzIHRoZSBob3N0IHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZS4gQ2FsbGVkIHdoZW4gYSBnYXRlIHRoYXQgaGFkIGJlZW4gb3BlbiBjbG9zZXMuXG4gICAqL1xuICByZWFkb25seSB1bmxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifSBjb25zdHJ1Y3Rvci5cbiAqL1xuaW50ZXJmYWNlIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJsb2NrZWQgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byB0aGUgdGFiJ3MgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgdGFiJ3MgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqL1xuICByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRhYiBhIGJsb2NrZWQgcGx1Z2luIHNob3dzIGluIHBsYWNlIG9mIHRoZSBvbmUgaXQgbmV2ZXIgZ290IHRvIHJlZ2lzdGVyLlxuICpcbiAqIEEgYmxvY2tlZCBwbHVnaW4ncyBgb25sb2FkSW1wbGAgbmV2ZXIgcmFuLCBzbyBpdHMgcmVhbCBzZXR0aW5ncyB0YWIgZG9lcyBub3QgZXhpc3Qg4oCUIGFuZCBhIHVzZXIgd2hvIGdvZXNcbiAqIGxvb2tpbmcgZm9yIHRoZSBwbHVnaW4ncyBzZXR0aW5ncyBpcyBwcmVjaXNlbHkgdGhlIHVzZXIgYXNraW5nIFwid2h5IGlzbid0IHRoaXMgZG9pbmcgYW55dGhpbmc/XCIuIEFuXG4gKiBlbXB0eSBzcGFjZSBpcyB0aGUgd29yc3QgcG9zc2libGUgYW5zd2VyIHRvIHRoYXQgcXVlc3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3NldHRpbmdzLXRhYi9wcmVmZXItc2V0dGluZy1kZWZpbml0aW9ucyAtLSBUaGlzIHRhYiBoYXMgbm8gc2V0dGluZ3MgdG8gZGVjbGFyZS4gSXQgc3RhbmRzIGluIGZvciBhIHNldHRpbmdzIHRhYiB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCwgY2FycnlpbmcgYW4gZXhwbGFuYXRpb24gYW5kIGEgcmVwYWlyIGJ1dHRvbiwgYW5kIHRoZSBwbHVnaW4ncyByZWFsIHNldHRpbmdzIGFwcGVhciB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zLlxuY2xhc3MgQmxvY2tlZFBsdWdpblNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQmxvY2tlZFBsdWdpblNldHRpbmdUYWJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5wbHVnaW4uYXBwLCBwYXJhbXMucGx1Z2luKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lciA9IHBhcmFtcy5yZW5kZXJCYW5uZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgdGFiLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuICAgIHRoaXMucmVuZGVyQmFubmVyKHRoaXMuY29udGFpbmVyRWwpO1xuICB9XG59XG5cbi8qKlxuICogRW5mb3JjZXMgYSBwbHVnaW4ncyBtYW5kYXRvcnkgZGVwZW5kZW5jaWVzIGFuZCBkZWNsYXJlZCBjb25mbGljdHMsIGdhdGluZyBpdHMgZmVhdHVyZSBzdXJmYWNlIG9uIGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5HYXRlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlSZWZzID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbkFwaVJlZjxvYmplY3Q+PigpO1xuICBwcml2YXRlIGJsb2NrZWRTZXR0aW5nVGFiOiBudWxsIHwgUGx1Z2luU2V0dGluZ1RhYiA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuICBwcml2YXRlIGhhc0Fubm91bmNlZEJsb2NrZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0ZlYXR1cmVTdXJmYWNlTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNMYXlvdXRSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBsb3NzQW5ub3VuY2VtZW50VGltZXJJZDogbnVsbCB8IG51bWJlciA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBnZXQgYXBwKCk6IEFwcCB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLmFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5HYXRlQ29tcG9uZW50fS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZsaWN0cyA9IHBhcmFtcy5jb25mbGljdHM7XG4gICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBwYXJhbXMuZGVwZW5kZW5jaWVzO1xuICAgIHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLmxvYWRGZWF0dXJlU3VyZmFjZTtcbiAgICB0aGlzLnBsdWdpbiA9IHBhcmFtcy5wbHVnaW47XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UgPSBwYXJhbXMudW5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGV0aGVyIGFueSB3YXJuaW5nIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogVGhlIHByZWRpY2F0ZSBhIGRlY2xhcmF0aXZlIHNldHRpbmdzIHRhYiBuZWVkcywgYW5kIHRoZSBjb3VudGVycGFydCB0b1xuICAgKiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5nZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZWAuIFN1Y2ggYSB0YWIgZGVjaWRlcyB3aGV0aGVyIGEgcm93IGV4aXN0c1xuICAgKiBCRUZPUkUgaXQgcmVuZGVycyBhbnl0aGluZyBpbnRvIGl0LCBzbyB7QGxpbmsgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyfSB3cml0aW5nIG5vdGhpbmcgY2Fubm90XG4gICAqIGFuc3dlciB0aGUgcXVlc3Rpb24gZm9yIGl0IOKAlCBhIHJvdyB0aGF0IHJlbmRlcnMgZW1wdHkgaXMgc3RpbGwgYSByb3csIHdpdGggdGhlIGRpdmlkZXIgYW5kIHBhZGRpbmdcbiAgICogZXZlcnkgb3RoZXIgc2V0dGluZyBoYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYXQgbGVhc3Qgb25lIGRlY2xhcmVkIHdhcm5pbmcgY29uZmxpY3QgaG9sZHMuXG4gICAqL1xuICBwdWJsaWMgaGFzQWN0aXZlV2FybmluZ0NvbmZsaWN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB3YXRjaGluZyBldmVyeSBkZWNsYXJlZCBkZXBlbmRlbmN5IGFuZCBjb25mbGljdC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBhcGlSZWYgPSB3YXRjaFBsdWdpbkFwaTxvYmplY3Q+KHtcbiAgICAgICAgYXBpVmVyc2lvblJhbmdlOiBkZXBlbmRlbmN5LmFwaVZlcnNpb25SYW5nZSxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgICAgfSk7XG4gICAgICByZWdpc3RlckFzeW5jRXZlbnQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGFwaVJlZi5vbignY2hhbmdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuYXBpUmVmcy5zZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCwgYXBpUmVmKTtcbiAgICB9XG5cbiAgICAvLyBBIGNvbmZsaWN0IGhhcyBubyBBUEkgdG8gd2F0Y2gg4oCUIGl0IGlzIHJlYWQgb3V0IG9mIHRoZSBtYW5pZmVzdHMg4oCUIHNvIHRoZSB0cmlnZ2VyIHRvIHJlLXJlYWQgaXMgdGhlXG4gICAgLy8gbGlicmFyeSdzIG93biBsaWZlY3ljbGUgYnJvYWRjYXN0LiBJdCBjb3ZlcnMgZXZlcnkgY29uZmxpY3RpbmcgcGx1Z2luIGJ1aWx0IG9uIHRoaXMgbGlicmFyeTsgb25lXG4gICAgLy8gdGhhdCBpcyBub3QgaXMgY2F1Z2h0IGF0IHRoZSBuZXh0IGxvYWQsIGFzIHRoZSBmaWxlIGhlYWRlciBzYXlzLlxuICAgIGNvbnN0IGxpZmVjeWNsZUV2ZW50TmFtZXM6IFBsdWdpbkxpZmVjeWNsZUV2ZW50TmFtZVtdID0gW1BMVUdJTl9MT0FERURfRVZFTlRfTkFNRSwgUExVR0lOX1VOTE9BREVEX0VWRU5UX05BTUVdO1xuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIGxpZmVjeWNsZUV2ZW50TmFtZXMpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oXG4gICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgY29udmVydEFzeW5jVG9TeW5jKGFzeW5jIChwYXlsb2FkOiBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQpID0+IHtcbiAgICAgICAgICBpZiAocGF5bG9hZC5wbHVnaW5JZCA9PT0gdGhpcy5wbHVnaW4ubWFuaWZlc3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgIH1cblxuICAgIC8vIE5vdGhpbmcgaXMgU0FJRCBhYm91dCBhIG1pc3NpbmcgZGVwZW5kZW5jeSB1bnRpbCB0aGUgbGF5b3V0IGlzIHJlYWR5LiBQbHVnaW5zIGxvYWQgaW4gYW4gdW5zcGVjaWZpZWRcbiAgICAvLyBvcmRlciwgc28gYSBkZXBlbmRlbmN5IHRoYXQgc2ltcGx5IGhhcyBub3QgbG9hZGVkIHlldCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBhdCB0aGlzIHBvaW50IGZyb20gb25lXG4gICAgLy8gdGhhdCBpcyBub3QgaW5zdGFsbGVkIOKAlCBhbm5vdW5jaW5nIGhlcmUgd291bGQgcHV0IGEgXCJtaXNzaW5nIHBsdWdpblwiIG5vdGljZSBvbiBzY3JlZW4gYXQgZXZlcnlcbiAgICAvLyBzdGFydHVwIGFuZCB0YWtlIGl0IGF3YXkgYSBtb21lbnQgbGF0ZXIuIFRoZSBnYXRlIGl0c2VsZiBkb2VzIG5vdCB3YWl0OiB0aGUgc3VyZmFjZSBsb2FkcyB0aGVcbiAgICAvLyBpbnN0YW50IHRoZSBkZXBlbmRlbmN5IGlzIHRoZXJlLCB3aGVuZXZlciB0aGF0IGlzLlxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCh0aGlzLmFwcCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTGF5b3V0UmVhZHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh0aGlzLmdldFVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzKCksIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZVdhcm5pbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgdGhlIGdhdGUgb25jZSB0aGUgd2F0Y2hlcyBhcmUgaW4gcGxhY2UsIGxvYWRpbmcgdGhlIGZlYXR1cmUgc3VyZmFjZSBpZiBpdCBpcyBhbHJlYWR5IG9wZW4uXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZmlyc3QgZXZhbHVhdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgYmFubmVyIGZvciBldmVyeSBjb25mbGljdCB0aGUgaG9zdCBpcyBydW5uaW5nIGFsb25nc2lkZSwgc28gYSBwbHVnaW4gY2FuIHB1dCB0aGUgb3ZlcmxhcCBpblxuICAgKiBpdHMgb3duIHNldHRpbmdzIHRhYi5cbiAgICpcbiAgICogQ29uc3VtZXItaW52b2tlZCwgZXhhY3RseSBsaWtlIGBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50LnJlbmRlckJhbm5lcmA6IHRoZSBsaWJyYXJ5IHJlZ2lzdGVycyB0aGVcbiAgICogc2V0dGluZ3MgdGFiIGEgQkxPQ0tFRCBwbHVnaW4gbmVlZHMsIGJlY2F1c2UgdGhhdCBwbHVnaW4gbmV2ZXIgZ290IHRvIHJlZ2lzdGVyIG9uZSBvZiBpdHMgb3duLCBidXQgaXRcbiAgICogaGFzIG5vIGhvb2sgaW50byB0aGUgdGFiIGEgcnVubmluZyBwbHVnaW4gYnVpbGRzLiBSZW5kZXJzIG5vdGhpbmcgd2hlbiBubyB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJDb25mbGljdFdhcm5pbmdCYW5uZXIoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm4pKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0V2FybmluZ01lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IHdlbnQgYXdheSB3aGlsZSB0aGUgcGx1Z2luIHdhcyBydW5uaW5nLCBub3cgdGhhdCB0aGUgZ3JhY2UgcGVyaW9kIGlzIG92ZXIuXG4gICAqXG4gICAqIFJlLXJlYWRzIHRoZSBnYXRlIHJhdGhlciB0aGFuIHRydXN0aW5nIHdoYXQgY2xvc2VkIGl0LCBzbyBhIGRlcGVuZGVuY3kgdGhhdCB3ZW50IGF3YXkgZHVyaW5nIHRoZVxuICAgKiB3aW5kb3cgaXMgYW5ub3VuY2VkIHdpdGggdGhlIHJlc3QuIE9uZSB0aGF0IGNhbWUgYmFjayBpbiB0aW1lIG5ldmVyIGdldHMgaGVyZTogdGhlIGdhdGUgcmVvcGVuaW5nXG4gICAqIGNhbmNlbHMgdGhlIHRpbWVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhbm5vdW5jZUxvc3MoKTogdm9pZCB7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlRGVwZW5kZW5jeUxvc3RNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RBcHBlYXJlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFubm91bmNlV2FybmluZ3MoKTogdm9pZCB7XG4gICAgLy8gQSB3YXJuaW5nIGRlc2NyaWJlcyB0d28gcGx1Z2lucyB0aGF0IGFyZSBib3RoIFJVTk5JTkcsIHNvIGl0IGlzIHBvaW50bGVzcyB3aGlsZSB0aGlzIG9uZSBpcyBibG9ja2VkXG4gICAgLy8g4oCUIGFuZCBpdCB3YWl0cyBmb3IgbGF5b3V0LXJlYWR5IGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGJsb2NrZWQgbm90aWNlIGRvZXMuXG4gICAgaWYgKCF0aGlzLmlzTGF5b3V0UmVhZHkgfHwgIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgaWYgKHRoaXMuYW5ub3VuY2VkV2FybmluZ1BsdWdpbklkcy5oYXMoY29uZmxpY3QucGx1Z2luSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuYWRkKGNvbmZsaWN0LnBsdWdpbklkKTtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxMb3NzQW5ub3VuY2VtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkKTtcbiAgICB0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQmxvY2tlZE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5EZXBlbmRlbmN5LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5Db25mbGljdC5jb25mbGljdEFwcGVhcmVkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpbkNvbmZsaWN0LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luQ29uZmxpY3Qud2FybmluZ05vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBlbmRlbmN5TG9zdE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5EZXBlbmRlbmN5LmRlcGVuZGVuY3lMb3N0Tm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBkZWNsYXJlZCBjb25mbGljdHMgb2Ygb25lIHNldmVyaXR5IHRoYXQgYXJlIGN1cnJlbnRseSBpbiBmb3JjZS5cbiAgICpcbiAgICogQHBhcmFtIHNldmVyaXR5IC0gVGhlIHNldmVyaXR5IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZsaWN0cyBob2xkaW5nIHJpZ2h0IG5vdywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWN0aXZlQ29uZmxpY3RzKHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5KTogUGx1Z2luQ29uZmxpY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmZpbHRlcigoY29uZmxpY3QpID0+IGNvbmZsaWN0LnNldmVyaXR5ID09PSBzZXZlcml0eSAmJiB0aGlzLmlzQ29uZmxpY3RBY3RpdmUoY29uZmxpY3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWRlQmxvY2tlZFNldHRpbmdUYWIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hcHAuc2V0dGluZy5yZW1vdmVTZXR0aW5nVGFiKHRoaXMuYmxvY2tlZFNldHRpbmdUYWIpO1xuICAgIHRoaXMuYmxvY2tlZFNldHRpbmdUYWIgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgZGVjbGFyZWQgY29uZmxpY3QgaXMgaW4gZm9yY2UgcmlnaHQgbm93LlxuICAgKlxuICAgKiBPbmx5IGFuIEVOQUJMRUQgcGx1Z2luIGNvdW50cy4gT25lIHRoYXQgaXMgaW5zdGFsbGVkIGJ1dCBzd2l0Y2hlZCBvZmYgcmVnaXN0ZXJzIG5vdGhpbmcsIHNvIGl0IGNhbm5vdFxuICAgKiBjb2xsaWRlLCBhbmQgYWN0aW5nIG9uIGl0IHdvdWxkIGJlIGFuIGFsYXJtIHRoZSB1c2VyIGNhbiBvbmx5IGFuc3dlciBieSB1bmluc3RhbGxpbmcgc29tZXRoaW5nIHRoZXlcbiAgICogaGF2ZSBhbHJlYWR5IHR1cm5lZCBvZmYuXG4gICAqXG4gICAqIEBwYXJhbSBjb25mbGljdCAtIFRoZSBkZWNsYXJlZCBjb25mbGljdC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQgYXQgYSBjb25mbGljdGluZyB2ZXJzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NvbmZsaWN0QWN0aXZlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICB9KTtcblxuICAgIGlmIChpbnN0YWxsZWRWZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzYXRpc2ZpZXNWZXJzaW9uKGluc3RhbGxlZFZlcnNpb24sIGNvbmZsaWN0LmNvbmZsaWN0aW5nVmVyc2lvblJhbmdlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXlzIHdoYXQgaXMgaW4gdGhlIHdheSwgYW5kIHB1dHMgdGhlIHNhbWUgZXhwbGFuYXRpb24gd2hlcmUgdGhlIHVzZXIgd2lsbCBsb29rIGZvciB0aGUgcGx1Z2luJ3NcbiAgICogc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcHJlc2VudFVuc2F0aXNmaWVkKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W10sXG4gICAgYmxvY2tpbmdDb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W11cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGF5b3V0UmVhZHkgfHwgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcblxuICAgIGlmICh0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB1bnNhdGlzZmllZERlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1ldmFsdWF0ZXMgdGhlIGdhdGUgYW5kIG1vdmVzIHRoZSBmZWF0dXJlIHN1cmZhY2UgdG8gbWF0Y2guXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgc3VyZmFjZSBtYXRjaGVzIHRoZSBnYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzID0gdGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IGJsb2NraW5nQ29uZmxpY3RzID0gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5CbG9jayk7XG5cbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwICYmIGJsb2NraW5nQ29uZmxpY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jYW5jZWxMb3NzQW5ub3VuY2VtZW50KCk7XG4gICAgICB0aGlzLmhpZGVCbG9ja2VkU2V0dGluZ1RhYigpO1xuICAgICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG5cbiAgICAgIGlmICghdGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy51bmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuXG4gICAgICAvLyBBIGdhdGUgdGhhdCBjbG9zZXMgd2hpbGUgdGhlIHBsdWdpbiBpcyBSVU5OSU5HIGlzIHRoZSBjYXNlIHdvcnRoIGJlaW5nIGxvdWQgYWJvdXQ6IHRoZSB1c2VyIGp1c3RcbiAgICAgIC8vIGRpZCBzb21ldGhpbmcsIGFuZCB0aGUgY29uc2VxdWVuY2UgaXMgaW1tZWRpYXRlIGFuZCBpbnZpc2libGUgd2l0aG91dCB0aGlzLiBBbm5vdW5jZWQgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgbGF5b3V0IHJlYWRpbmVzcywgYmVjYXVzZSBhIHJ1bm5pbmcgcGx1Z2luIG1lYW5zIHRoZSBsYXlvdXQgaXMgbG9uZyBzaW5jZSByZWFkeSDigJQgYnV0IG9ubHlcbiAgICAgIC8vIG9uY2UgdGhlIGdyYWNlIHBlcmlvZCBoYXMgc2hvd24gdGhlIGxvc3MgaXMgbm90IGFuIHVwZGF0ZSByZWxvYWRpbmcgdGhlIHByb3ZpZGVyIChzZWUgdGhlIGZpbGVcbiAgICAgIC8vIGhlYWRlcikuXG4gICAgICB0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFubm91bmNlTG9zcygpO1xuICAgICAgfSwgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLnNob3dCbG9ja2VkU2V0dGluZ1RhYih1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VudFVuc2F0aXNmaWVkKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmxvY2tlZCBleHBsYW5hdGlvbiBpbnRvIGEgc2V0dGluZ3MtdGFiIGNvbnRhaW5lcjogd2hhdCBpcyBtaXNzaW5nIG9yIGluIHRoZSB3YXksIHdoeSBpdFxuICAgKiBtYXR0ZXJzLCBhbmQgdGhlIGJ1dHRvbiB0aGF0IGZpeGVzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzIC0gVGhlIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBub3QgY3VycmVudGx5IHNhdGlzZmllZC5cbiAgICogQHBhcmFtIGJsb2NraW5nQ29uZmxpY3RzIC0gVGhlIGNvbmZsaWN0cyBjdXJyZW50bHkgcmVmdXNpbmcgdGhlIHBsdWdpbiB0aGUgcmlnaHQgdG8gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCbG9ja2VkQmFubmVyKFxuICAgIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCxcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5EZXBlbmRlbmN5LnNldHRpbmdzSGVhZGluZykgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBiYW5uZXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7XG4gICAgICAgIGNsczogW0Nzc0NsYXNzLkxpYnJhcnlOYW1lLCBDc3NDbGFzcy5QbHVnaW5EZXBlbmRlbmN5QmFubmVyXVxuICAgICAgfSk7XG4gICAgICBiYW5uZXJFbC5hcHBlbmQodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgICBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lKGJhbm5lckVsLmNyZWF0ZURpdigpLCBkZXBlbmRlbmN5LnJlYXNvbik7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgICAgfSk7XG5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+XG4gICAgICAgICAgc3RhdGUgPT09IEluc3RhbGxlZFBsdWdpblN0YXRlLkluc3RhbGxlZEJ1dERpc2FibGVkXG4gICAgICAgICAgICA/ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmVuYWJsZVxuICAgICAgICAgICAgOiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luU3VnZ2VzdGlvbi5pbnN0YWxsXG4gICAgICAgICkpXG4gICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGluc3RhbGxBbmRFbmFibGVQbHVnaW4oe1xuICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkLFxuICAgICAgICAgICAgcGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lLFxuICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG5cbiAgICAgIC8vIFRoZSBsaW5rIE9VVCB0byB0aGUgZGVwZW5kZW5jeSdzIG93biBzZXR0aW5ncywgc2hvd24gb25seSBvbmNlIGl0IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCDigJQgdGhlXG4gICAgICAvLyBvdGhlciBoYWxmIG9mIHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgdmlzaWJsZSBmcm9tIGJvdGggZW5kcy4gSXQgaXMgd2hhdCBzdG9wcyBcImNvbmZpZ3VyZSBvbmVcbiAgICAgIC8vIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIHBsdWdpbnNcIiBmcm9tIG1lYW5pbmcgXCJnbyBhbmQgZmluZCB0aGUgb3RoZXIgcGx1Z2luIHlvdXJzZWxmXCIuXG4gICAgICBpZiAoc3RhdGUgIT09IEluc3RhbGxlZFBsdWdpblN0YXRlLkVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsLCBkZXBlbmRlbmN5LnBsdWdpbklkLCBkZXBlbmRlbmN5LnBsdWdpbk5hbWUpO1xuICAgIH1cblxuICAgIGlmIChibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5Db25mbGljdC5zZXR0aW5nc0hlYWRpbmcpIH0pO1xuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdEJsb2NrZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgb25lIGNvbmZsaWN0OiB3aGF0IGl0IGlzLCB3aHkgaXQgbWF0dGVycywgYW5kIHRoZSB0d28gd2F5cyBvdXQgb2YgaXQuXG4gICAqXG4gICAqIFRoZSByZXBhaXIgaXMgb2ZmZXJlZCBvbiB0aGUgT1RIRVIgcGx1Z2luIOKAlCBkaXNhYmxpbmcgaXQgaXMgdGhlIG9uZSB0aGluZyB0aGlzIHBsdWdpbiBjYW4gZG8gaW4gYVxuICAgKiBjbGljaywgc2luY2UgaXQgY2Fubm90IHVwZGF0ZSBzb21lb25lIGVsc2UncyBwbHVnaW4g4oCUIGFuZCBpdCBpcyB0aGUgcGVyc2lzdGVkIGBkaXNhYmxlUGx1Z2luQW5kU2F2ZWBcbiAgICogcmF0aGVyIHRoYW4gdGhlIHRyYW5zaWVudCBkaXNhYmxlLCBiZWNhdXNlIHRoZSB1c2VyIGFza2VkIGZvciBpdCBieSBjbGlja2luZy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSBjb25mbGljdCAtIFRoZSBjb25mbGljdCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSBtZXNzYWdlRnJhZ21lbnQgLSBUaGUgc2VudGVuY2UgZXhwbGFpbmluZyB0aGUgY29uZmxpY3QuXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBjb25mbGljdDogUGx1Z2luQ29uZmxpY3QsIG1lc3NhZ2VGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgIGNsczogW0Nzc0NsYXNzLkxpYnJhcnlOYW1lLCBDc3NDbGFzcy5QbHVnaW5Db25mbGljdEJhbm5lcl1cbiAgICB9KTtcbiAgICBiYW5uZXJFbC5hcHBlbmQobWVzc2FnZUZyYWdtZW50KTtcbiAgICBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lKGJhbm5lckVsLmNyZWF0ZURpdigpLCBjb25mbGljdC5yZWFzb24pO1xuXG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5Db25mbGljdC5kaXNhYmxlLCB7IGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogY29uZmxpY3QucGx1Z2luTmFtZSB9KSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5yZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWwsIGNvbmZsaWN0LnBsdWdpbklkLCBjb25mbGljdC5wbHVnaW5OYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luSWQ6IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5EZXBlbmRlbmN5Lm9wZW5EZXBlbmRlbmN5U2V0dGluZ3MsIHtcbiAgICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IHBsdWdpbk5hbWVcbiAgICAgIH0pKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcC5zZXR0aW5nLm9wZW4oKTtcbiAgICAgICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuVGFiQnlJZChwbHVnaW5JZCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W10sXG4gICAgYmxvY2tpbmdDb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W11cbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZGRlZCB0aHJvdWdoIGBhcHAuc2V0dGluZ2AgcmF0aGVyIHRoYW4gYHBsdWdpbi5hZGRTZXR0aW5nVGFiYCwgYmVjYXVzZSB0aGlzIHRhYiBoYXMgdG8gY29tZSBiYWNrXG4gICAgLy8gT0ZGIGFnYWluIHRoZSBtb21lbnQgdGhlIGdhdGUgb3BlbnMg4oCUIG90aGVyd2lzZSB0aGUgcGx1Z2luJ3Mgb3duIHNldHRpbmdzIHRhYiwgcmVnaXN0ZXJlZCBieVxuICAgIC8vIGBvbmxvYWRJbXBsYCwgd291bGQgYXBwZWFyIGJlc2lkZSBhIHN0YWxlIFwicmVxdWlyZWQgcGx1Z2luIG1pc3NpbmdcIiBvbmUuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmBcbiAgICAvLyBvbmx5IGV2ZXIgcmVtb3ZlcyBhdCBwbHVnaW4gdW5sb2FkLlxuICAgIGNvbnN0IGJsb2NrZWRTZXR0aW5nVGFiID0gbmV3IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiKHtcbiAgICAgIHBsdWdpbjogdGhpcy5wbHVnaW4sXG4gICAgICByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlckJsb2NrZWRCYW5uZXIoY29udGFpbmVyRWwsIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5hZGRTZXR0aW5nVGFiKGJsb2NrZWRTZXR0aW5nVGFiKTtcbiAgICB0aGlzLmJsb2NrZWRTZXR0aW5nVGFiID0gYmxvY2tlZFNldHRpbmdUYWI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwRkEsbUJBQW1DO0FBQ25DLDhCQUE4QztBQUM5QyxzQkFHTztBQVNQLCtCQUF1QztBQUN2Qyx1QkFBeUI7QUFDekIsMEJBSU87QUFDUCxrQkFBa0I7QUFDbEIsd0JBQStCO0FBQy9CLGtDQUtPO0FBQ1AscUNBR087QUFDUCxvQ0FBbUM7QUFDbkMsMEJBQTRCO0FBQzVCLG9DQUE2QztBQVE3QyxNQUFNLGlEQUFpRDtBQUtoRCxJQUFLLHlCQUFMLGtCQUFLQSw0QkFBTDtBQU9MLEVBQUFBLHdCQUFBLFdBQVE7QUFRUixFQUFBQSx3QkFBQSxVQUFPO0FBZkcsU0FBQUE7QUFBQSxHQUFBO0FBK0paLE1BQU0sZ0NBQWdDLGlDQUFpQjtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1YsWUFBWSxRQUFrRDtBQUNuRSxVQUFNLE9BQU8sT0FBTyxLQUFLLE9BQU8sTUFBTTtBQUN0QyxTQUFLLGVBQWUsT0FBTztBQUFBLEVBQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsVUFBZ0I7QUFDOUIsU0FBSyxZQUFZLE1BQU07QUFDdkIsU0FBSyxhQUFhLEtBQUssV0FBVztBQUFBLEVBQ3BDO0FBQ0Y7QUFLTyxNQUFNLDRCQUE0QixnQ0FBWTtBQUFBLEVBQ2xDLDRCQUE0QixvQkFBSSxJQUFZO0FBQUEsRUFDNUMsVUFBVSxvQkFBSSxJQUFrQztB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
|
|
568
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IHdhdGNoUGx1Z2luQXBpIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIGdldEluc3RhbGxlZFBsdWdpblZlcnNpb24sXG4gIGluc3RhbGxBbmRFbmFibGVQbHVnaW4sXG4gIEluc3RhbGxlZFBsdWdpblN0YXRlXG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsXG4gIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cy50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDYWxsYmFja0xheW91dFJlYWR5Q29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtcmVhZHktY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBIb3cgbG9uZyBhIGdhdGUgdGhhdCBjbG9zZWQgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZyB3YWl0cyBiZWZvcmUgc2F5aW5nIHNvLlxuICpcbiAqIExvbmcgZW5vdWdoIHRvIGNvdmVyIE9ic2lkaWFuIHJlbG9hZGluZyBhIHBsdWdpbiB0byBhcHBseSBpdHMgdXBkYXRlLCBzaG9ydCBlbm91Z2ggdGhhdCBhIHVzZXIgd2hvXG4gKiBkaXNhYmxlZCB0aGUgZGVwZW5kZW5jeSBieSBoYW5kIHN0aWxsIGNvbm5lY3RzIHRoZSBub3RpY2UgdG8gd2hhdCB0aGV5IGp1c3QgZGlkLlxuICovXG5jb25zdCBMT1NTX0FOTk9VTkNFTUVOVF9HUkFDRV9QRVJJT0RfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuLyoqXG4gKiBIb3cgYmFkbHkgdHdvIHBsdWdpbnMgcnVubmluZyBzaWRlIGJ5IHNpZGUgZ29lcyB3cm9uZywgYW5kIHRoZXJlZm9yZSB3aGF0IHRoaXMgb25lIGRvZXMgYWJvdXQgaXQuXG4gKi9cbmV4cG9ydCBlbnVtIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkge1xuICAvKipcbiAgICogVGhlIGhvc3QgcmVmdXNlcyB0byBydW4gYXQgYWxsIHdoaWxlIHRoZSBjb25mbGljdCBob2xkczogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vdGhpbmcgaXNcbiAgICogcmVnaXN0ZXJlZCwgYW5kIHRoZSBwbHVnaW4gZXhwbGFpbnMgaXRzZWxmIHRoZSB3YXkgYSBtaXNzaW5nIGRlcGVuZGVuY3kgZG9lcy5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgd2hlcmUgYm90aCBwbHVnaW5zIGFjdGluZyBvbiB0aGUgc2FtZSBvcGVyYXRpb24gZGFtYWdlcyB0aGUgdmF1bHQuXG4gICAqL1xuICBCbG9jayA9ICdibG9jaycsXG5cbiAgLyoqXG4gICAqIFRoZSBob3N0IHJ1bnMgYW55d2F5IGFuZCBzYXlzIHRoZSBvdmVybGFwIGlzIHRoZXJlLlxuICAgKlxuICAgKiBGb3IgYW4gb3ZlcmxhcCB0aGF0IGlzIGFubm95aW5nIHJhdGhlciB0aGFuIGRlc3RydWN0aXZlIOKAlCBkdXBsaWNhdGUgY29tbWFuZHMsIHdvcmsgZG9uZSB0d2ljZSDigJQgd2hlcmVcbiAgICogcmVmdXNpbmcgdG8gbG9hZCB3b3VsZCBjb3N0IHRoZSB1c2VyIG1vcmUgdGhhbiB0aGUgb3ZlcmxhcCBkb2VzLlxuICAgKi9cbiAgV2FybiA9ICd3YXJuJ1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIGFub3RoZXIgcGx1Z2luIHJlZnVzZXMgdG8gcnVuIGJlc2lkZSwgb3Igd2FybnMgYWJvdXQgcnVubmluZyBiZXNpZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQ29uZmxpY3Qge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiB0aGUgT1RIRVIgcGx1Z2luJ3MgdmVyc2lvbnMgdGhhdCBjb25mbGljdCwgZS5nLiBgJzwxMi4wLjAnYCBmb3IgXCJldmVyeSB2ZXJzaW9uXG4gICAqIGJlZm9yZSB0aGUgb25lIHRoYXQgZ2F2ZSB0aGlzIGJlaGF2aW9yIHVwXCIuXG4gICAqXG4gICAqIEEgcmFuZ2UgcmF0aGVyIHRoYW4gYSBtaW5pbXVtLCBzbyBhbiBvdmVybGFwIGNvbmZpbmVkIHRvIG9uZSBtYWpvciAoYCc+PTMgPDQnYCkgaXMgZXhwcmVzc2libGUsIGFuZCBzb1xuICAgKiBpcyBhIHBsdWdpbiB0aGF0IGNvbmZsaWN0cyBhdCBldmVyeSB2ZXJzaW9uIOKAlCBzcGVsbCB0aGF0IGAnPj0wLjAuMCdgLCBzaW5jZSBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0c1xuICAgKiBhIGJhcmUgYCpgLiBFdmFsdWF0ZWQgYWdhaW5zdCBgbWFuaWZlc3QudmVyc2lvbmA7IGEgdmVyc2lvbiB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgY291bnRzIGFzXG4gICAqIGNvbmZsaWN0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmxpY3RpbmdWZXJzaW9uUmFuZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiwgYXMgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiwgc2hvd24gdG8gdGhlIHVzZXIuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbG9jYWxpemVkIHNlbnRlbmNlIHNheWluZyB3aGF0IGdvZXMgd3Jvbmcgd2hlbiBib3RoIHJ1biwgc2hvd24gaW4gdGhlIGJhbm5lci5cbiAgICpcbiAgICogVGhlIGRlY2xhcmluZyBwbHVnaW4gb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCB0aGUgdHdvIG9mIHRoZW0gY29sbGlkZSBvdmVyLCBhbmQgYVxuICAgKiB1c2VyIGJlaW5nIGFza2VkIHRvIGRpc2FibGUgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcblxuICAvKipcbiAgICogV2hhdCB0aGlzIHBsdWdpbiBkb2VzIGFib3V0IHRoZSBjb25mbGljdC5cbiAgICovXG4gIHJlYWRvbmx5IHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5O1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIGFub3RoZXIgcGx1Z2luIGNhbm5vdCB3b3JrIHdpdGhvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGVwZW5kZW5jeSB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIEFQSSBjb250cmFjdCB2ZXJzaW9ucyB0aGUgZGVwZW5kZW50IGNvbXBpbGVkIGFnYWluc3QsIGUuZy4gYCdeMidgLlxuICAgKlxuICAgKiBBIGRlcGVuZGVuY3kgd2hvc2UgcHVibGlzaGVkIEFQSSBmYWxscyBvdXRzaWRlIHRoZSByYW5nZSBjb3VudHMgYXMgVU5TQVRJU0ZJRUQsIHdoaWNoIGlzIHdoYXQgdHVybnMgYVxuICAgKiBzaWxlbnQgYmVoYXZpb3JhbCBtaXNtYXRjaCBiZXR3ZWVuIHR3byBpbmRlcGVuZGVudGx5IHJlbGVhc2VkIHBsdWdpbnMgaW50byBhIHZpc2libGUgXCJ1cGRhdGUgdGhpc1xuICAgKiBvbmVcIiBtZXNzYWdlLiBTcGVsbCBcImFueSB2ZXJzaW9uXCIgYXMgYCc+PTAuMC4wJ2Ag4oCUIGBjb21wYXJlLXZlcnNpb25zYCByZWplY3RzIGEgYmFyZSBgKmAuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uUmFuZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZGVzdCByZWxlYXNlIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4gdGhlIGRlcGVuZGVudCB3b3JrcyB3aXRoLCBlLmcuIGAnMi4yLjAnYC5cbiAgICpcbiAgICogRm9yIGEgcHJvdmlkZXIgd2hvc2UgQkVIQVZJT1IgY2hhbmdlZCB3aGlsZSBpdHMgQVBJIGNvbnRyYWN0IHN0YXllZCB0aGUgc2FtZSwgd2hpY2hcbiAgICoge0BsaW5rIGFwaVZlcnNpb25SYW5nZX0gY2Fubm90IHNlZS4gQSBkZXBlbmRlbmN5IGVuYWJsZWQgYmVsb3cgaXQgY291bnRzIGFzIFVOU0FUSVNGSUVEIGFuZCBhc2tzIHRoZVxuICAgKiB1c2VyIHRvIHVwZGF0ZSBpdC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhcyB0b29cbiAgICogb2xkLiBBIG1pbmltdW0gcmF0aGVyIHRoYW4gYSByYW5nZSwgYmVjYXVzZSB0aGUgb25seSBhZHZpY2UgdGhlIGdhdGUgY2FuIGdpdmUgaXMgXCJ1cGRhdGUgaXRcIiwgYW5kIGFuXG4gICAqIHVwcGVyIGJvdW5kIGlzIGEgdmVyc2lvbiBubyB1cGRhdGUgcmVhY2hlcy5cbiAgICovXG4gIHJlYWRvbmx5IG1pblBsdWdpblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCB0aGUgZGVwZW5kZW50IGRvZXMgd2l0aCB0aGlzIHBsdWdpbiwgc2hvd24gaW4gdGhlIHNldHRpbmdzIGJhbm5lci5cbiAgICpcbiAgICogVGhlIGRlcGVuZGVudCBvd25zIHRoaXMgc3RyaW5nIGJlY2F1c2Ugb25seSBpdCBrbm93cyB3aGF0IGl0IHVzZXMgdGhlIG90aGVyIHBsdWdpbiBmb3IsIGFuZCBhIHVzZXJcbiAgICogYmVpbmcgYXNrZWQgdG8gaW5zdGFsbCBzb21ldGhpbmcgZGVzZXJ2ZXMgdG8gYmUgdG9sZCB3aHkuXG4gICAqXG4gICAqIFBhc3MgYSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gdG8gbWFyayB1cCBwYXJ0IG9mIHRoZSBzZW50ZW5jZSwgc3VjaCBhcyBhIHBsdWdpbiBuYW1lIHJlbmRlcmVkIGFzXG4gICAqIGNvZGUuIEVhY2ggcmVuZGVyIGFwcGVuZHMgYSBmcmVzaCBjbG9uZSBvZiBpdCwgc2luY2UgdGhlIGJhbm5lciBpcyByZW5kZXJlZCBhZ2FpbiBvbiBldmVyeSByZWZyZXNoLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb25mbGljdHMgdG8gZW5mb3JjZS4gQW4gZW1wdHkgbGlzdCBtZWFucyB0aGUgcGx1Z2luIHJlZnVzZXMgdG8gcnVuIGJlc2lkZSBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwZW5kZW5jaWVzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiBkZXBlbmRzIG9uIG5vdGhpbmcsIGFuZCBpdHMgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGxvYWRzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W107XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBob3N0IHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZS4gQ2FsbGVkIG9uY2UgZXZlcnkgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgYW5kIG5vIGJsb2NraW5nXG4gICAqIGNvbmZsaWN0IGhvbGRzLCBhbmQgYWdhaW4gYWZ0ZXIgYSBnYXRlIHRoYXQgaGFkIGNsb3NlZCBvcGVucyBiYWNrIHVwLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgaXMgbG9hZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwbHVnaW4g4oCUIHRoZSBvbmUgZGVjbGFyaW5nIHRoZSBkZXBlbmRlbmNpZXMgYW5kIGNvbmZsaWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwbHVnaW4ncyBub3RpY2UgY29tcG9uZW50LCB1c2VkIHRvIHNheSB3aGF0IGlzIG1pc3NpbmcsIHdoYXQgaXMgaW4gdGhlIHdheSwgYW5kIHdoYXQgY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBVbmxvYWRzIHRoZSBob3N0IHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZS4gQ2FsbGVkIHdoZW4gYSBnYXRlIHRoYXQgaGFkIGJlZW4gb3BlbiBjbG9zZXMuXG4gICAqL1xuICByZWFkb25seSB1bmxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifSBjb25zdHJ1Y3Rvci5cbiAqL1xuaW50ZXJmYWNlIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJsb2NrZWQgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byB0aGUgdGFiJ3MgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgdGFiJ3MgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqL1xuICByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRhYiBhIGJsb2NrZWQgcGx1Z2luIHNob3dzIGluIHBsYWNlIG9mIHRoZSBvbmUgaXQgbmV2ZXIgZ290IHRvIHJlZ2lzdGVyLlxuICpcbiAqIEEgYmxvY2tlZCBwbHVnaW4ncyBgb25sb2FkSW1wbGAgbmV2ZXIgcmFuLCBzbyBpdHMgcmVhbCBzZXR0aW5ncyB0YWIgZG9lcyBub3QgZXhpc3Qg4oCUIGFuZCBhIHVzZXIgd2hvIGdvZXNcbiAqIGxvb2tpbmcgZm9yIHRoZSBwbHVnaW4ncyBzZXR0aW5ncyBpcyBwcmVjaXNlbHkgdGhlIHVzZXIgYXNraW5nIFwid2h5IGlzbid0IHRoaXMgZG9pbmcgYW55dGhpbmc/XCIuIEFuXG4gKiBlbXB0eSBzcGFjZSBpcyB0aGUgd29yc3QgcG9zc2libGUgYW5zd2VyIHRvIHRoYXQgcXVlc3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3NldHRpbmdzLXRhYi9wcmVmZXItc2V0dGluZy1kZWZpbml0aW9ucyAtLSBUaGlzIHRhYiBoYXMgbm8gc2V0dGluZ3MgdG8gZGVjbGFyZS4gSXQgc3RhbmRzIGluIGZvciBhIHNldHRpbmdzIHRhYiB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCwgY2FycnlpbmcgYW4gZXhwbGFuYXRpb24gYW5kIGEgcmVwYWlyIGJ1dHRvbiwgYW5kIHRoZSBwbHVnaW4ncyByZWFsIHNldHRpbmdzIGFwcGVhciB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zLlxuY2xhc3MgQmxvY2tlZFBsdWdpblNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQmxvY2tlZFBsdWdpblNldHRpbmdUYWJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5wbHVnaW4uYXBwLCBwYXJhbXMucGx1Z2luKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lciA9IHBhcmFtcy5yZW5kZXJCYW5uZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgdGFiLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuICAgIHRoaXMucmVuZGVyQmFubmVyKHRoaXMuY29udGFpbmVyRWwpO1xuICB9XG59XG5cbi8qKlxuICogRW5mb3JjZXMgYSBwbHVnaW4ncyBtYW5kYXRvcnkgZGVwZW5kZW5jaWVzIGFuZCBkZWNsYXJlZCBjb25mbGljdHMsIGdhdGluZyBpdHMgZmVhdHVyZSBzdXJmYWNlIG9uIGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5HYXRlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlSZWZzID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbkFwaVJlZjxvYmplY3Q+PigpO1xuICBwcml2YXRlIGJsb2NrZWRTZXR0aW5nVGFiOiBudWxsIHwgUGx1Z2luU2V0dGluZ1RhYiA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuICBwcml2YXRlIGhhc0Fubm91bmNlZEJsb2NrZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0ZlYXR1cmVTdXJmYWNlTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNMYXlvdXRSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBsb3NzQW5ub3VuY2VtZW50VGltZXJJZDogbnVsbCB8IG51bWJlciA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBnZXQgYXBwKCk6IEFwcCB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLmFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5HYXRlQ29tcG9uZW50fS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZsaWN0cyA9IHBhcmFtcy5jb25mbGljdHM7XG4gICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBwYXJhbXMuZGVwZW5kZW5jaWVzO1xuICAgIHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLmxvYWRGZWF0dXJlU3VyZmFjZTtcbiAgICB0aGlzLnBsdWdpbiA9IHBhcmFtcy5wbHVnaW47XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UgPSBwYXJhbXMudW5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGV0aGVyIGFueSB3YXJuaW5nIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogVGhlIHByZWRpY2F0ZSBhIGRlY2xhcmF0aXZlIHNldHRpbmdzIHRhYiBuZWVkcywgYW5kIHRoZSBjb3VudGVycGFydCB0b1xuICAgKiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5nZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZWAuIFN1Y2ggYSB0YWIgZGVjaWRlcyB3aGV0aGVyIGEgcm93IGV4aXN0c1xuICAgKiBCRUZPUkUgaXQgcmVuZGVycyBhbnl0aGluZyBpbnRvIGl0LCBzbyB7QGxpbmsgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyfSB3cml0aW5nIG5vdGhpbmcgY2Fubm90XG4gICAqIGFuc3dlciB0aGUgcXVlc3Rpb24gZm9yIGl0IOKAlCBhIHJvdyB0aGF0IHJlbmRlcnMgZW1wdHkgaXMgc3RpbGwgYSByb3csIHdpdGggdGhlIGRpdmlkZXIgYW5kIHBhZGRpbmdcbiAgICogZXZlcnkgb3RoZXIgc2V0dGluZyBoYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYXQgbGVhc3Qgb25lIGRlY2xhcmVkIHdhcm5pbmcgY29uZmxpY3QgaG9sZHMuXG4gICAqL1xuICBwdWJsaWMgaGFzQWN0aXZlV2FybmluZ0NvbmZsaWN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB3YXRjaGluZyBldmVyeSBkZWNsYXJlZCBkZXBlbmRlbmN5IGFuZCBjb25mbGljdC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBhcGlSZWYgPSB3YXRjaFBsdWdpbkFwaTxvYmplY3Q+KHtcbiAgICAgICAgYXBpVmVyc2lvblJhbmdlOiBkZXBlbmRlbmN5LmFwaVZlcnNpb25SYW5nZSxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgICAgfSk7XG4gICAgICByZWdpc3RlckFzeW5jRXZlbnQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGFwaVJlZi5vbignY2hhbmdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuYXBpUmVmcy5zZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCwgYXBpUmVmKTtcbiAgICB9XG5cbiAgICAvLyBBIGNvbmZsaWN0IGhhcyBubyBBUEkgdG8gd2F0Y2gg4oCUIGl0IGlzIHJlYWQgb3V0IG9mIHRoZSBtYW5pZmVzdHMg4oCUIHNvIHRoZSB0cmlnZ2VyIHRvIHJlLXJlYWQgaXMgdGhlXG4gICAgLy8gbGlicmFyeSdzIG93biBsaWZlY3ljbGUgYnJvYWRjYXN0LiBJdCBjb3ZlcnMgZXZlcnkgY29uZmxpY3RpbmcgcGx1Z2luIGJ1aWx0IG9uIHRoaXMgbGlicmFyeTsgb25lXG4gICAgLy8gdGhhdCBpcyBub3QgaXMgY2F1Z2h0IGF0IHRoZSBuZXh0IGxvYWQsIGFzIHRoZSBmaWxlIGhlYWRlciBzYXlzLlxuICAgIGNvbnN0IGxpZmVjeWNsZUV2ZW50TmFtZXM6IFBsdWdpbkxpZmVjeWNsZUV2ZW50TmFtZVtdID0gW1BMVUdJTl9MT0FERURfRVZFTlRfTkFNRSwgUExVR0lOX1VOTE9BREVEX0VWRU5UX05BTUVdO1xuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIGxpZmVjeWNsZUV2ZW50TmFtZXMpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oXG4gICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgY29udmVydEFzeW5jVG9TeW5jKGFzeW5jIChwYXlsb2FkOiBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQpID0+IHtcbiAgICAgICAgICBpZiAocGF5bG9hZC5wbHVnaW5JZCA9PT0gdGhpcy5wbHVnaW4ubWFuaWZlc3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgIH1cblxuICAgIC8vIE5vdGhpbmcgaXMgU0FJRCBhYm91dCBhIG1pc3NpbmcgZGVwZW5kZW5jeSB1bnRpbCB0aGUgbGF5b3V0IGlzIHJlYWR5LiBQbHVnaW5zIGxvYWQgaW4gYW4gdW5zcGVjaWZpZWRcbiAgICAvLyBvcmRlciwgc28gYSBkZXBlbmRlbmN5IHRoYXQgc2ltcGx5IGhhcyBub3QgbG9hZGVkIHlldCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBhdCB0aGlzIHBvaW50IGZyb20gb25lXG4gICAgLy8gdGhhdCBpcyBub3QgaW5zdGFsbGVkIOKAlCBhbm5vdW5jaW5nIGhlcmUgd291bGQgcHV0IGEgXCJtaXNzaW5nIHBsdWdpblwiIG5vdGljZSBvbiBzY3JlZW4gYXQgZXZlcnlcbiAgICAvLyBzdGFydHVwIGFuZCB0YWtlIGl0IGF3YXkgYSBtb21lbnQgbGF0ZXIuIFRoZSBnYXRlIGl0c2VsZiBkb2VzIG5vdCB3YWl0OiB0aGUgc3VyZmFjZSBsb2FkcyB0aGVcbiAgICAvLyBpbnN0YW50IHRoZSBkZXBlbmRlbmN5IGlzIHRoZXJlLCB3aGVuZXZlciB0aGF0IGlzLlxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCh0aGlzLmFwcCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTGF5b3V0UmVhZHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh0aGlzLmdldFVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzKCksIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZVdhcm5pbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgdGhlIGdhdGUgb25jZSB0aGUgd2F0Y2hlcyBhcmUgaW4gcGxhY2UsIGxvYWRpbmcgdGhlIGZlYXR1cmUgc3VyZmFjZSBpZiBpdCBpcyBhbHJlYWR5IG9wZW4uXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZmlyc3QgZXZhbHVhdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgYmFubmVyIGZvciBldmVyeSBjb25mbGljdCB0aGUgaG9zdCBpcyBydW5uaW5nIGFsb25nc2lkZSwgc28gYSBwbHVnaW4gY2FuIHB1dCB0aGUgb3ZlcmxhcCBpblxuICAgKiBpdHMgb3duIHNldHRpbmdzIHRhYi5cbiAgICpcbiAgICogQ29uc3VtZXItaW52b2tlZCwgZXhhY3RseSBsaWtlIGBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50LnJlbmRlckJhbm5lcmA6IHRoZSBsaWJyYXJ5IHJlZ2lzdGVycyB0aGVcbiAgICogc2V0dGluZ3MgdGFiIGEgQkxPQ0tFRCBwbHVnaW4gbmVlZHMsIGJlY2F1c2UgdGhhdCBwbHVnaW4gbmV2ZXIgZ290IHRvIHJlZ2lzdGVyIG9uZSBvZiBpdHMgb3duLCBidXQgaXRcbiAgICogaGFzIG5vIGhvb2sgaW50byB0aGUgdGFiIGEgcnVubmluZyBwbHVnaW4gYnVpbGRzLiBSZW5kZXJzIG5vdGhpbmcgd2hlbiBubyB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJDb25mbGljdFdhcm5pbmdCYW5uZXIoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm4pKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0V2FybmluZ01lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IHdlbnQgYXdheSB3aGlsZSB0aGUgcGx1Z2luIHdhcyBydW5uaW5nLCBub3cgdGhhdCB0aGUgZ3JhY2UgcGVyaW9kIGlzIG92ZXIuXG4gICAqXG4gICAqIFJlLXJlYWRzIHRoZSBnYXRlIHJhdGhlciB0aGFuIHRydXN0aW5nIHdoYXQgY2xvc2VkIGl0LCBzbyBhIGRlcGVuZGVuY3kgdGhhdCB3ZW50IGF3YXkgZHVyaW5nIHRoZVxuICAgKiB3aW5kb3cgaXMgYW5ub3VuY2VkIHdpdGggdGhlIHJlc3QuIE9uZSB0aGF0IGNhbWUgYmFjayBpbiB0aW1lIG5ldmVyIGdldHMgaGVyZTogdGhlIGdhdGUgcmVvcGVuaW5nXG4gICAqIGNhbmNlbHMgdGhlIHRpbWVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhbm5vdW5jZUxvc3MoKTogdm9pZCB7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlRGVwZW5kZW5jeUxvc3RNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RBcHBlYXJlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFubm91bmNlV2FybmluZ3MoKTogdm9pZCB7XG4gICAgLy8gQSB3YXJuaW5nIGRlc2NyaWJlcyB0d28gcGx1Z2lucyB0aGF0IGFyZSBib3RoIFJVTk5JTkcsIHNvIGl0IGlzIHBvaW50bGVzcyB3aGlsZSB0aGlzIG9uZSBpcyBibG9ja2VkXG4gICAgLy8g4oCUIGFuZCBpdCB3YWl0cyBmb3IgbGF5b3V0LXJlYWR5IGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGJsb2NrZWQgbm90aWNlIGRvZXMuXG4gICAgaWYgKCF0aGlzLmlzTGF5b3V0UmVhZHkgfHwgIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgaWYgKHRoaXMuYW5ub3VuY2VkV2FybmluZ1BsdWdpbklkcy5oYXMoY29uZmxpY3QucGx1Z2luSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuYWRkKGNvbmZsaWN0LnBsdWdpbklkKTtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxMb3NzQW5ub3VuY2VtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkKTtcbiAgICB0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQmxvY2tlZE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGlmICh0aGlzLmlzQmVsb3dNaW5QbHVnaW5WZXJzaW9uKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5EZXBlbmRlbmN5LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5Db25mbGljdC5jb25mbGljdEFwcGVhcmVkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpbkNvbmZsaWN0LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luQ29uZmxpY3Qud2FybmluZ05vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBlbmRlbmN5TG9zdE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGlmICh0aGlzLmlzQmVsb3dNaW5QbHVnaW5WZXJzaW9uKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5EZXBlbmRlbmN5LmRlcGVuZGVuY3lMb3N0Tm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luRGVwZW5kZW5jeS52ZXJzaW9uTWlzbWF0Y2hOb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGRlY2xhcmVkIGNvbmZsaWN0cyBvZiBvbmUgc2V2ZXJpdHkgdGhhdCBhcmUgY3VycmVudGx5IGluIGZvcmNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V2ZXJpdHkgLSBUaGUgc2V2ZXJpdHkgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgY29uZmxpY3RzIGhvbGRpbmcgcmlnaHQgbm93LCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlY2xhcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBY3RpdmVDb25mbGljdHMoc2V2ZXJpdHk6IFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkpOiBQbHVnaW5Db25mbGljdFtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25mbGljdHMuZmlsdGVyKChjb25mbGljdCkgPT4gY29uZmxpY3Quc2V2ZXJpdHkgPT09IHNldmVyaXR5ICYmIHRoaXMuaXNDb25mbGljdEFjdGl2ZShjb25mbGljdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpOiBQbHVnaW5EZXBlbmRlbmN5W10ge1xuICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcGVuZGVuY3kpID0+ICF0aGlzLmFwaVJlZnMuZ2V0KGRlcGVuZGVuY3kucGx1Z2luSWQpPy52YWx1ZSB8fCB0aGlzLmlzQmVsb3dNaW5QbHVnaW5WZXJzaW9uKGRlcGVuZGVuY3kpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ibG9ja2VkU2V0dGluZ1RhYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYXBwLnNldHRpbmcucmVtb3ZlU2V0dGluZ1RhYih0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKTtcbiAgICB0aGlzLmJsb2NrZWRTZXR0aW5nVGFiID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYXQgYSByZWxlYXNlIG9sZGVyIHRoYW4gaXQgZGVjbGFyZWQgaXQgbmVlZHMuXG4gICAqXG4gICAqIFJlYWQgZnJvbSB0aGUgbWFuaWZlc3QsIGxpa2UgYSBjb25mbGljdCwgYW5kIHJlLXJlYWQgb24gZXZlcnkgZXZhbHVhdGlvbjogT2JzaWRpYW4gYXBwbGllcyBhbiB1cGRhdGUgYnlcbiAgICogcmVsb2FkaW5nIHRoZSBwcm92aWRlciwgd2hpY2ggZmlyZXMgdGhlIEFQSSB3YXRjaCdzIGBjaGFuZ2VgLCBzbyB0aGUgZ2F0ZSBvcGVucyB3aXRob3V0IGEgcmVzdGFydC5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZGVwZW5kZW5jeSBpcyBlbmFibGVkIGJlbG93IGl0cyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufTsgYGZhbHNlYFxuICAgKiB3aGVuIGl0IGRlY2xhcmVzIG5vbmUgb3IgaXMgbm90IGVuYWJsZWQsIHNpbmNlIGl0cyBBUEkgaXMgdGhlbiBhYnNlbnQgYW55d2F5LlxuICAgKi9cbiAgcHJpdmF0ZSBpc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgaWYgKGRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFsbGVkVmVyc2lvbiA9IGdldEluc3RhbGxlZFBsdWdpblZlcnNpb24oe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIWNvbXBhcmVWZXJzaW9ucyhpbnN0YWxsZWRWZXJzaW9uLCBkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24sICc+PScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgZGVjbGFyZWQgY29uZmxpY3QgaXMgaW4gZm9yY2UgcmlnaHQgbm93LlxuICAgKlxuICAgKiBPbmx5IGFuIEVOQUJMRUQgcGx1Z2luIGNvdW50cy4gT25lIHRoYXQgaXMgaW5zdGFsbGVkIGJ1dCBzd2l0Y2hlZCBvZmYgcmVnaXN0ZXJzIG5vdGhpbmcsIHNvIGl0IGNhbm5vdFxuICAgKiBjb2xsaWRlLCBhbmQgYWN0aW5nIG9uIGl0IHdvdWxkIGJlIGFuIGFsYXJtIHRoZSB1c2VyIGNhbiBvbmx5IGFuc3dlciBieSB1bmluc3RhbGxpbmcgc29tZXRoaW5nIHRoZXlcbiAgICogaGF2ZSBhbHJlYWR5IHR1cm5lZCBvZmYuXG4gICAqXG4gICAqIEBwYXJhbSBjb25mbGljdCAtIFRoZSBkZWNsYXJlZCBjb25mbGljdC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQgYXQgYSBjb25mbGljdGluZyB2ZXJzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NvbmZsaWN0QWN0aXZlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICB9KTtcblxuICAgIGlmIChpbnN0YWxsZWRWZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzYXRpc2ZpZXNWZXJzaW9uKGluc3RhbGxlZFZlcnNpb24sIGNvbmZsaWN0LmNvbmZsaWN0aW5nVmVyc2lvblJhbmdlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXlzIHdoYXQgaXMgaW4gdGhlIHdheSwgYW5kIHB1dHMgdGhlIHNhbWUgZXhwbGFuYXRpb24gd2hlcmUgdGhlIHVzZXIgd2lsbCBsb29rIGZvciB0aGUgcGx1Z2luJ3NcbiAgICogc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcHJlc2VudFVuc2F0aXNmaWVkKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W10sXG4gICAgYmxvY2tpbmdDb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W11cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGF5b3V0UmVhZHkgfHwgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcblxuICAgIGlmICh0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB1bnNhdGlzZmllZERlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1ldmFsdWF0ZXMgdGhlIGdhdGUgYW5kIG1vdmVzIHRoZSBmZWF0dXJlIHN1cmZhY2UgdG8gbWF0Y2guXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgc3VyZmFjZSBtYXRjaGVzIHRoZSBnYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzID0gdGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IGJsb2NraW5nQ29uZmxpY3RzID0gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5CbG9jayk7XG5cbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwICYmIGJsb2NraW5nQ29uZmxpY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jYW5jZWxMb3NzQW5ub3VuY2VtZW50KCk7XG4gICAgICB0aGlzLmhpZGVCbG9ja2VkU2V0dGluZ1RhYigpO1xuICAgICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG5cbiAgICAgIGlmICghdGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy51bmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuXG4gICAgICAvLyBBIGdhdGUgdGhhdCBjbG9zZXMgd2hpbGUgdGhlIHBsdWdpbiBpcyBSVU5OSU5HIGlzIHRoZSBjYXNlIHdvcnRoIGJlaW5nIGxvdWQgYWJvdXQ6IHRoZSB1c2VyIGp1c3RcbiAgICAgIC8vIGRpZCBzb21ldGhpbmcsIGFuZCB0aGUgY29uc2VxdWVuY2UgaXMgaW1tZWRpYXRlIGFuZCBpbnZpc2libGUgd2l0aG91dCB0aGlzLiBBbm5vdW5jZWQgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgbGF5b3V0IHJlYWRpbmVzcywgYmVjYXVzZSBhIHJ1bm5pbmcgcGx1Z2luIG1lYW5zIHRoZSBsYXlvdXQgaXMgbG9uZyBzaW5jZSByZWFkeSDigJQgYnV0IG9ubHlcbiAgICAgIC8vIG9uY2UgdGhlIGdyYWNlIHBlcmlvZCBoYXMgc2hvd24gdGhlIGxvc3MgaXMgbm90IGFuIHVwZGF0ZSByZWxvYWRpbmcgdGhlIHByb3ZpZGVyIChzZWUgdGhlIGZpbGVcbiAgICAgIC8vIGhlYWRlcikuXG4gICAgICB0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFubm91bmNlTG9zcygpO1xuICAgICAgfSwgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLnNob3dCbG9ja2VkU2V0dGluZ1RhYih1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VudFVuc2F0aXNmaWVkKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmxvY2tlZCBleHBsYW5hdGlvbiBpbnRvIGEgc2V0dGluZ3MtdGFiIGNvbnRhaW5lcjogd2hhdCBpcyBtaXNzaW5nIG9yIGluIHRoZSB3YXksIHdoeSBpdFxuICAgKiBtYXR0ZXJzLCBhbmQgdGhlIGJ1dHRvbiB0aGF0IGZpeGVzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzIC0gVGhlIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBub3QgY3VycmVudGx5IHNhdGlzZmllZC5cbiAgICogQHBhcmFtIGJsb2NraW5nQ29uZmxpY3RzIC0gVGhlIGNvbmZsaWN0cyBjdXJyZW50bHkgcmVmdXNpbmcgdGhlIHBsdWdpbiB0aGUgcmlnaHQgdG8gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCbG9ja2VkQmFubmVyKFxuICAgIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCxcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5EZXBlbmRlbmN5LnNldHRpbmdzSGVhZGluZykgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBiYW5uZXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7XG4gICAgICAgIGNsczogW0Nzc0NsYXNzLkxpYnJhcnlOYW1lLCBDc3NDbGFzcy5QbHVnaW5EZXBlbmRlbmN5QmFubmVyXVxuICAgICAgfSk7XG4gICAgICBiYW5uZXJFbC5hcHBlbmQodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgICBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lKGJhbm5lckVsLmNyZWF0ZURpdigpLCBkZXBlbmRlbmN5LnJlYXNvbik7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFuIGVuYWJsZWQgZGVwZW5kZW5jeSB0aGF0IGlzIHN0aWxsIHVuc2F0aXNmaWVkIGlzIHRvbyBvbGQsIGFuZCBpbnN0YWxsaW5nIG9yIGVuYWJsaW5nIGl0IGFnYWluIGRvZXNcbiAgICAgIC8vIG5vdGhpbmcsIHNvIGl0IGdldHMgbm8gYnV0dG9uIHRoYXQgcHJldGVuZHMgb3RoZXJ3aXNlLlxuICAgICAgaWYgKHN0YXRlICE9PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5FbmFibGVkKSB7XG4gICAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT5cbiAgICAgICAgICAgIHN0YXRlID09PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgICAgICAgICA/ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmVuYWJsZVxuICAgICAgICAgICAgICA6ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICAgICAgICApKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWQsXG4gICAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGxpbmsgT1VUIHRvIHRoZSBkZXBlbmRlbmN5J3Mgb3duIHNldHRpbmdzLCBzaG93biBvbmx5IG9uY2UgaXQgaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkIOKAlCB0aGVcbiAgICAgIC8vIG90aGVyIGhhbGYgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZWluZyB2aXNpYmxlIGZyb20gYm90aCBlbmRzLiBJdCBpcyB3aGF0IHN0b3BzIFwiY29uZmlndXJlIG9uZVxuICAgICAgLy8gb3BlcmF0aW9uIGFjcm9zcyB0d28gcGx1Z2luc1wiIGZyb20gbWVhbmluZyBcImdvIGFuZCBmaW5kIHRoZSBvdGhlciBwbHVnaW4geW91cnNlbGZcIi5cbiAgICAgIHRoaXMucmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsLCBkZXBlbmRlbmN5LnBsdWdpbklkLCBkZXBlbmRlbmN5LnBsdWdpbk5hbWUpO1xuICAgIH1cblxuICAgIGlmIChibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5Db25mbGljdC5zZXR0aW5nc0hlYWRpbmcpIH0pO1xuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdEJsb2NrZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgb25lIGNvbmZsaWN0OiB3aGF0IGl0IGlzLCB3aHkgaXQgbWF0dGVycywgYW5kIHRoZSB0d28gd2F5cyBvdXQgb2YgaXQuXG4gICAqXG4gICAqIFRoZSByZXBhaXIgaXMgb2ZmZXJlZCBvbiB0aGUgT1RIRVIgcGx1Z2luIOKAlCBkaXNhYmxpbmcgaXQgaXMgdGhlIG9uZSB0aGluZyB0aGlzIHBsdWdpbiBjYW4gZG8gaW4gYVxuICAgKiBjbGljaywgc2luY2UgaXQgY2Fubm90IHVwZGF0ZSBzb21lb25lIGVsc2UncyBwbHVnaW4g4oCUIGFuZCBpdCBpcyB0aGUgcGVyc2lzdGVkIGBkaXNhYmxlUGx1Z2luQW5kU2F2ZWBcbiAgICogcmF0aGVyIHRoYW4gdGhlIHRyYW5zaWVudCBkaXNhYmxlLCBiZWNhdXNlIHRoZSB1c2VyIGFza2VkIGZvciBpdCBieSBjbGlja2luZy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSBjb25mbGljdCAtIFRoZSBjb25mbGljdCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSBtZXNzYWdlRnJhZ21lbnQgLSBUaGUgc2VudGVuY2UgZXhwbGFpbmluZyB0aGUgY29uZmxpY3QuXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBjb25mbGljdDogUGx1Z2luQ29uZmxpY3QsIG1lc3NhZ2VGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgIGNsczogW0Nzc0NsYXNzLkxpYnJhcnlOYW1lLCBDc3NDbGFzcy5QbHVnaW5Db25mbGljdEJhbm5lcl1cbiAgICB9KTtcbiAgICBiYW5uZXJFbC5hcHBlbmQobWVzc2FnZUZyYWdtZW50KTtcbiAgICBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lKGJhbm5lckVsLmNyZWF0ZURpdigpLCBjb25mbGljdC5yZWFzb24pO1xuXG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5Db25mbGljdC5kaXNhYmxlLCB7IGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogY29uZmxpY3QucGx1Z2luTmFtZSB9KSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5yZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWwsIGNvbmZsaWN0LnBsdWdpbklkLCBjb25mbGljdC5wbHVnaW5OYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luSWQ6IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5EZXBlbmRlbmN5Lm9wZW5EZXBlbmRlbmN5U2V0dGluZ3MsIHtcbiAgICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IHBsdWdpbk5hbWVcbiAgICAgIH0pKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcC5zZXR0aW5nLm9wZW4oKTtcbiAgICAgICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuVGFiQnlJZChwbHVnaW5JZCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W10sXG4gICAgYmxvY2tpbmdDb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W11cbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZGRlZCB0aHJvdWdoIGBhcHAuc2V0dGluZ2AgcmF0aGVyIHRoYW4gYHBsdWdpbi5hZGRTZXR0aW5nVGFiYCwgYmVjYXVzZSB0aGlzIHRhYiBoYXMgdG8gY29tZSBiYWNrXG4gICAgLy8gT0ZGIGFnYWluIHRoZSBtb21lbnQgdGhlIGdhdGUgb3BlbnMg4oCUIG90aGVyd2lzZSB0aGUgcGx1Z2luJ3Mgb3duIHNldHRpbmdzIHRhYiwgcmVnaXN0ZXJlZCBieVxuICAgIC8vIGBvbmxvYWRJbXBsYCwgd291bGQgYXBwZWFyIGJlc2lkZSBhIHN0YWxlIFwicmVxdWlyZWQgcGx1Z2luIG1pc3NpbmdcIiBvbmUuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmBcbiAgICAvLyBvbmx5IGV2ZXIgcmVtb3ZlcyBhdCBwbHVnaW4gdW5sb2FkLlxuICAgIGNvbnN0IGJsb2NrZWRTZXR0aW5nVGFiID0gbmV3IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiKHtcbiAgICAgIHBsdWdpbjogdGhpcy5wbHVnaW4sXG4gICAgICByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlckJsb2NrZWRCYW5uZXIoY29udGFpbmVyRWwsIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5hZGRTZXR0aW5nVGFiKGJsb2NrZWRTZXR0aW5nVGFiKTtcbiAgICB0aGlzLmJsb2NrZWRTZXR0aW5nVGFiID0gYmxvY2tlZFNldHRpbmdUYWI7XG4g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QVMsTUFBTSxFQUFFLFVBQU0sZUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsZUFBZSxlQUFlLEVBQUUsQ0FBQztBQUVoRyxlQUFXLFlBQVksbUJBQW1CO0FBQ3hDLFdBQUssb0JBQW9CLGFBQWEsVUFBVSxLQUFLLDZCQUE2QixRQUFRLENBQUM7QUFBQSxJQUM3RjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhUSxvQkFBb0IsYUFBMEIsVUFBMEIsaUJBQXlDO0FBQ3ZILFVBQU0sV0FBVyxZQUFZLFVBQVU7QUFBQSxNQUNyQyxLQUFLLENBQUMsMEJBQVMsYUFBYSwwQkFBUyxvQkFBb0I7QUFBQSxJQUMzRCxDQUFDO0FBQ0QsYUFBUyxPQUFPLGVBQWU7QUFDL0IsdURBQTBCLFNBQVMsVUFBVSxHQUFHLFNBQVMsTUFBTTtBQUUvRCxRQUFJLGdDQUFnQixRQUFRLEVBQ3pCLGtCQUFjLGVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLGVBQWUsU0FBUyxFQUFFLHVCQUF1QixTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQ2pILE9BQU8sRUFDUCxZQUFRLGlDQUFtQixZQUFZO0FBQ3RDLGdCQUFNLGlEQUF1QjtBQUFBLFFBQzNCLEtBQUssS0FBSztBQUFBLFFBQ1YsVUFBVSxTQUFTO0FBQUEsTUFDckIsQ0FBQztBQUNELFlBQU0sS0FBSyxRQUFRO0FBQUEsSUFDckIsQ0FBQyxDQUFDO0FBRUosU0FBSyx5QkFBeUIsVUFBVSxTQUFTLFVBQVUsU0FBUyxVQUFVO0FBQUEsRUFDaEY7QUFBQSxFQUVRLHlCQUF5QixVQUF1QixVQUFrQixZQUEwQjtBQUNsRyxRQUFJLGdDQUFnQixRQUFRLEVBQ3pCLGtCQUFjLGVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLGlCQUFpQix3QkFBd0I7QUFBQSxNQUNsRixzQkFBc0I7QUFBQSxJQUN4QixDQUFDLENBQUMsRUFDRCxRQUFRLE1BQU07QUFDYixXQUFLLElBQUksUUFBUSxLQUFLO0FBQ3RCLFdBQUssSUFBSSxRQUFRLFlBQVksUUFBUTtBQUFBLElBQ3ZDLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFUSxzQkFDTix5QkFDQSxtQkFDTTtBQUNOLFFBQUksS0FBSyxtQkFBbUI7QUFDMUI7QUFBQSxJQUNGO0FBTUEsVUFBTSxvQkFBb0IsSUFBSSx3QkFBd0I7QUFBQSxNQUNwRCxRQUFRLEtBQUs7QUFBQSxNQUNiLGNBQWMsQ0FBQyxnQkFBc0I7QUFDbkMsYUFBSyxvQkFBb0IsYUFBYSx5QkFBeUIsaUJBQWlCO0FBQUEsTUFDbEY7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLElBQUksUUFBUSxjQUFjLGlCQUFpQjtBQUNoRCxTQUFLLG9CQUFvQjtBQUFBLEVBQzNCO0FBQ0Y7IiwibmFtZXMiOlsiUGx1Z2luQ29uZmxpY3RTZXZlcml0eSIsImNvbXBhcmVWZXJzaW9ucyIsInNhdGlzZmllc1ZlcnNpb24iXX0=
|
|
@@ -155,6 +155,16 @@ export interface PluginDependency {
|
|
|
155
155
|
* one" message. Spell "any version" as `'>=0.0.0'` — `compare-versions` rejects a bare `*`.
|
|
156
156
|
*/
|
|
157
157
|
readonly apiVersionRange: string;
|
|
158
|
+
/**
|
|
159
|
+
* The oldest release of the required plugin the dependent works with, e.g. `'2.2.0'`.
|
|
160
|
+
*
|
|
161
|
+
* For a provider whose BEHAVIOR changed while its API contract stayed the same, which
|
|
162
|
+
* {@link apiVersionRange} cannot see. A dependency enabled below it counts as UNSATISFIED and asks the
|
|
163
|
+
* user to update it. Evaluated against `manifest.version`; a version that cannot be parsed counts as too
|
|
164
|
+
* old. A minimum rather than a range, because the only advice the gate can give is "update it", and an
|
|
165
|
+
* upper bound is a version no update reaches.
|
|
166
|
+
*/
|
|
167
|
+
readonly minPluginVersion?: string;
|
|
158
168
|
/**
|
|
159
169
|
* The `manifest.id` of the required plugin, as listed in Obsidian's community plugin registry.
|
|
160
170
|
*/
|
|
@@ -279,6 +289,7 @@ export declare class PluginGateComponent extends ComponentEx {
|
|
|
279
289
|
private createConflictBlockedMessage;
|
|
280
290
|
private createConflictWarningMessage;
|
|
281
291
|
private createDependencyLostMessage;
|
|
292
|
+
private createVersionMismatchMessage;
|
|
282
293
|
/**
|
|
283
294
|
* Finds the declared conflicts of one severity that are currently in force.
|
|
284
295
|
*
|
|
@@ -288,6 +299,17 @@ export declare class PluginGateComponent extends ComponentEx {
|
|
|
288
299
|
private getActiveConflicts;
|
|
289
300
|
private getUnsatisfiedDependencies;
|
|
290
301
|
private hideBlockedSettingTab;
|
|
302
|
+
/**
|
|
303
|
+
* Decides whether a dependency is running at a release older than it declared it needs.
|
|
304
|
+
*
|
|
305
|
+
* Read from the manifest, like a conflict, and re-read on every evaluation: Obsidian applies an update by
|
|
306
|
+
* reloading the provider, which fires the API watch's `change`, so the gate opens without a restart.
|
|
307
|
+
*
|
|
308
|
+
* @param dependency - The declared dependency.
|
|
309
|
+
* @returns Whether the dependency is enabled below its {@link PluginDependency.minPluginVersion}; `false`
|
|
310
|
+
* when it declares none or is not enabled, since its API is then absent anyway.
|
|
311
|
+
*/
|
|
312
|
+
private isBelowMinPluginVersion;
|
|
291
313
|
/**
|
|
292
314
|
* Decides whether one declared conflict is in force right now.
|
|
293
315
|
*
|