mobx-keystone-yjs 1.5.0 → 1.5.1
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/CHANGELOG.md +4 -0
- package/dist/mobx-keystone-yjs.esm.js +1 -1
- package/dist/mobx-keystone-yjs.esm.mjs +1 -1
- package/dist/mobx-keystone-yjs.umd.js +1 -1
- package/dist/types/binding/convertJsonToYjsData.d.ts +1 -1
- package/package.json +10 -10
- package/src/binding/applyMobxKeystonePatchToYjsObject.ts +1 -1
- package/src/binding/convertJsonToYjsData.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -570,4 +570,4 @@ export {
|
|
|
570
570
|
yjsBindingContext,
|
|
571
571
|
yjsTextModelId
|
|
572
572
|
};
|
|
573
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcblxuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuXG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gICAqL1xuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXG59XG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0WWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSA9PiB7XG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxuICBpZiAoIWF0b20pIHtcbiAgICBhdG9tID0gY3JlYXRlQXRvbShgeWpzQ29sbGVjdGlvbkF0b21gKVxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcbiAgfVxuICByZXR1cm4gYXRvbVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBGcm96ZW4sXG4gIE1vZGVsLFxuICBmcm96ZW4sXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBtb2RlbCxcbiAgb25TbmFwc2hvdCxcbiAgdFByb3AsXG4gIHR5cGVzLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcblxuLy8gRGVsdGFbXVtdLCBzaW5jZSBlYWNoIHNpbmdsZSBjaGFuZ2UgaXMgYSBEZWx0YVtdXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxuXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXG5cbi8qKlxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cbiAqL1xuQG1vZGVsKHlqc1RleHRNb2RlbElkKVxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXG59KSB7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cbiAgICovXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcbiAgICAgIGRlbHRhTGlzdDogW1xuICAgICAgICBmcm96ZW4oW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc2VydDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ID09IG51bGwpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIFwidGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBtdXN0IGJlIHBhcnQgb2YgYSBib3VuZCBvYmplY3QgYmVmb3JlIGl0IGNhbiBiZSBhY2Nlc3NlZFwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGN0eC5ib3VuZE9iamVjdCwgdGhpcylcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cblxuICAvKipcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCBwcmVzZW50IGF0IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlJ3MgcGF0aC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0QXRQYXRoKCk6IHVua25vd24ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykhXG5cbiAgICByZXR1cm4gcmVzb2x2ZVlqc1BhdGgoY3R4Lnlqc09iamVjdCwgcGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB5anNUZXh0KCk6IFkuVGV4dCB7XG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXG5cbiAgICBpZiAoISh5anNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB5anNPYmplY3RcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9tIHRoYXQgZ2V0cyBjaGFuZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQgWS5qcyB0ZXh0IGNoYW5nZXMuXG4gICAqL1xuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXG4gICAqIFNob3J0Y3V0IGZvciBgeWpzVGV4dC50b1N0cmluZygpYCwgYnV0IGNvbXB1dGVkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICByZXR1cm4gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkluaXQoKSB7XG4gICAgY29uc3Qgc2hvdWxkUmVwbGljYXRlVG9ZanMgPSAoY3R4OiBZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZCk6IGN0eCBpcyBZanNCaW5kaW5nQ29udGV4dCA9PiB7XG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXG4gICAgfVxuXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgIGNvbnN0IG5ld0RlbHRhczogRnJvemVuPHVua25vd25bXT5bXSA9IFtdXG5cbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXG4gICAgICAoZGVsdGFMaXN0KSA9PiB7XG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gb2JzZXJ2ZShkZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcbiAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBnb25uYSByZXBsYWNlIHRoZW0gYWxsXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzaG91bGRSZXBsaWNhdGVUb1lqcyh5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykpKSB7XG4gICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFuZ2UudHlwZSA9PT0gXCJzcGxpY2VcIiAmJlxuICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmFkZGVkQ291bnQgPiAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuaW5kZXggPT09IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBqdXN0IGFkZGluZyBuZXcgb25lcyB0byB0aGUgZW5kXG4gICAgICAgICAgICBuZXdEZWx0YXMucHVzaCguLi5jaGFuZ2UuYWRkZWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFueSBvdGhlciBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcbiAgICAgICAgICAgICAgaWYgKHlqc1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3RGVsdGFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgICAgIG5ld0RlbHRhcy5sZW5ndGggPSAwXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXG4gICAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbVxuICAgIClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSgpXG4gICAgfVxuICB9XG59XG5cbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cbi8vIGJ5IHRoZSBkZWNvcmF0b3JcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxuXG5mdW5jdGlvbiBob29rWWpzVGV4dENoYW5nZWRBdG9tKGdldFlqc1RleHQ6ICgpID0+IFkuVGV4dCwgdGV4dENoYW5nZWRBdG9tOiBJQXRvbSkge1xuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICBjb25zdCBvYnNlcnZlRm4gPSAoKSA9PiB7XG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG5cbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxuICAgICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHtcbiAgSnNvbkFycmF5V2l0aFVuZGVmaW5lZCxcbiAgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQsXG4gIEpzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkLFxuICBKc29uVmFsdWVXaXRoVW5kZWZpbmVkLFxufSBmcm9tIFwianNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzSnNvbkFycmF5V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uQXJyYXlXaXRoVW5kZWZpbmVkIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCB7XG4gIHJldHVybiAhaXNKc29uQXJyYXlXaXRoVW5kZWZpbmVkKHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqIE9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBZLk1hcHMsIGFycmF5cyB0byBZLkFycmF5cywgcHJpbWl0aXZlcyBhcmUgdW50b3VjaGVkLlxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfCB1bmRlZmluZWQpOiBZanNEYXRhIHtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheVdpdGhVbmRlZmluZWQodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyciBhcyBZanNEYXRhXG4gIH1cblxuICBpZiAoaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2KSkge1xuICAgIGlmICh2LiRmcm96ZW4gPT09IHRydWUpIHtcbiAgICAgIC8vIGZyb3plbiB2YWx1ZSwgc2F2ZSBhcyBpbW11dGFibGUgb2JqZWN0XG4gICAgICByZXR1cm4gdlxuICAgIH1cblxuICAgIGlmICh2LiRtb2RlbFR5cGUgPT09IHlqc1RleHRNb2RlbElkKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gbmV3IFkuVGV4dCgpXG4gICAgICBjb25zdCB5anNUZXh0TW9kZWwgPSB2IGFzIHVua25vd24gYXMgU25hcHNob3RPdXRPZjxZanNUZXh0TW9kZWw+XG4gICAgICB5anNUZXh0TW9kZWwuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHRleHRcbiAgICB9XG5cbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXG4gICAgcmV0dXJuIG1hcCBhcyBZanNEYXRhXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXlXaXRoVW5kZWZpbmVkKSB7XG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCkge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcbmltcG9ydCB7IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfSBmcm9tIFwianNvblR5cGVzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBjaGFuZ2VzIHRvIGRlbHRhTGlzdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFycmF5IG9ic2VydmUgaW4gdGhlIFlqc1RleHRNb2RlbCBjbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBwYXRjaC52YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIG5ld0xlbmd0aFxuICAgICAgICAgICAgICB5anMuZGVsZXRlKG5ld0xlbmd0aCwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBZanNUZXh0TW9kZWwsIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7U3RyaW5nKHBhdGNoLnBhdGhbMF0pfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25PYmplY3RXaXRoVW5kZWZpbmVkLCBKc29uVmFsdWVXaXRoVW5kZWZpbmVkIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxZanNEYXRhPiB8IFkuTWFwPFlqc0RhdGE+IHwgWS5UZXh0IHwgSnNvblZhbHVlV2l0aFVuZGVmaW5lZFxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0RhdGFUb0pzb24oeWpzRGF0YTogWWpzRGF0YSk6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogSnNvbk9iamVjdFdpdGhVbmRlZmluZWQgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZVdpdGhVbmRlZmluZWRcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQge1xuICBKc29uQXJyYXlXaXRoVW5kZWZpbmVkLFxuICBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCxcbiAgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCxcbn0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldFxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xuICAgIGxldCByZXRhaW4gPSAwXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogXCJhZGRcIixcbiAgICAgIHBhdGgsXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkIHwgSnNvbkFycmF5V2l0aFVuZGVmaW5lZFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2XG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEFueURhdGFNb2RlbCxcbiAgQW55TW9kZWwsXG4gIEFueVN0YW5kYXJkVHlwZSxcbiAgTW9kZWxDbGFzcyxcbiAgUGF0Y2gsXG4gIFNuYXBzaG90SW5PZixcbiAgVHlwZVRvRGF0YSxcbiAgYXBwbHlQYXRjaGVzLFxuICBmcm9tU25hcHNob3QsXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBvbkdsb2JhbFBhdGNoZXMsXG4gIG9uUGF0Y2hlcyxcbiAgb25TbmFwc2hvdCxcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGdldFlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IFlqc0RhdGEsIGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgYmlkaXJlY3Rpb25hbCBiaW5kaW5nIGJldHdlZW4gYSBZLmpzIGRhdGEgc3RydWN0dXJlIGFuZCBhIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICAgKi9cbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QgYXMgWWpzRGF0YSlcblxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcbiAgICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5wdXNoKHsgdGFyZ2V0LCBwYXRjaGVzIH0pXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyB1bmtub3duIGFzIFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4pLFxuICAgICAgICBiaW5kaW5nQ29udGV4dFxuICAgICAgKVxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gYWN0aW9uKChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXM6IFBhdGNoW11bXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5wdXNoKHBhdGNoZXMpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXNcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2gsIHlqc09iamVjdClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgeWpzT3JpZ2luKVxuICB9KVxuXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcblxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxuICAgICAgICB9XG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHlqc09iamVjdFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9LCB5anNPcmlnaW4pXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gICAgfSxcbiAgICB5anNPcmlnaW4sXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJZanNUZXh0TW9kZWwiLCJib3VuZE9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ3dCYSxNQUFBLG9CQUFvQixjQUE2QyxNQUFTO0FDdEN2RixNQUFNLHlDQUF5QjtBQUtsQixNQUFBLHVCQUF1QixDQUNsQyxrQkFDcUI7QUFDZCxTQUFBLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLYSxNQUFBLCtCQUErQixDQUMxQyxrQkFDUztBQUNMLE1BQUEsT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNsQix1QkFBQSxJQUFJLGVBQWUsSUFBSTtBQUFBLEVBQzVDO0FBQ08sU0FBQTtBQUNUO0FDdEJnQixTQUFBLGVBQWUsV0FBb0IsTUFBa0M7QUFDbkYsTUFBSSxtQkFBNEI7QUFFM0IsT0FBQSxRQUFRLENBQUMsVUFBVSxNQUFLO0FBQ3ZCLFFBQUEsNEJBQTRCLEVBQUUsS0FBSztBQUNSLG1DQUFBLGdCQUFnQixFQUFFO0FBQ3pDLFlBQUEsTUFBTSxPQUFPLFFBQVE7QUFDUix5QkFBQSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEsSUFBQSxX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
|
|
573
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcblxuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuXG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gICAqL1xuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXG59XG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0WWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSA9PiB7XG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxuICBpZiAoIWF0b20pIHtcbiAgICBhdG9tID0gY3JlYXRlQXRvbShgeWpzQ29sbGVjdGlvbkF0b21gKVxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcbiAgfVxuICByZXR1cm4gYXRvbVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBGcm96ZW4sXG4gIE1vZGVsLFxuICBmcm96ZW4sXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBtb2RlbCxcbiAgb25TbmFwc2hvdCxcbiAgdFByb3AsXG4gIHR5cGVzLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcblxuLy8gRGVsdGFbXVtdLCBzaW5jZSBlYWNoIHNpbmdsZSBjaGFuZ2UgaXMgYSBEZWx0YVtdXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxuXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXG5cbi8qKlxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cbiAqL1xuQG1vZGVsKHlqc1RleHRNb2RlbElkKVxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXG59KSB7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cbiAgICovXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcbiAgICAgIGRlbHRhTGlzdDogW1xuICAgICAgICBmcm96ZW4oW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc2VydDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ID09IG51bGwpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIFwidGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBtdXN0IGJlIHBhcnQgb2YgYSBib3VuZCBvYmplY3QgYmVmb3JlIGl0IGNhbiBiZSBhY2Nlc3NlZFwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGN0eC5ib3VuZE9iamVjdCwgdGhpcylcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cblxuICAvKipcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCBwcmVzZW50IGF0IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlJ3MgcGF0aC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0QXRQYXRoKCk6IHVua25vd24ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykhXG5cbiAgICByZXR1cm4gcmVzb2x2ZVlqc1BhdGgoY3R4Lnlqc09iamVjdCwgcGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB5anNUZXh0KCk6IFkuVGV4dCB7XG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXG5cbiAgICBpZiAoISh5anNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB5anNPYmplY3RcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9tIHRoYXQgZ2V0cyBjaGFuZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQgWS5qcyB0ZXh0IGNoYW5nZXMuXG4gICAqL1xuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXG4gICAqIFNob3J0Y3V0IGZvciBgeWpzVGV4dC50b1N0cmluZygpYCwgYnV0IGNvbXB1dGVkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICByZXR1cm4gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkluaXQoKSB7XG4gICAgY29uc3Qgc2hvdWxkUmVwbGljYXRlVG9ZanMgPSAoY3R4OiBZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZCk6IGN0eCBpcyBZanNCaW5kaW5nQ29udGV4dCA9PiB7XG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXG4gICAgfVxuXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgIGNvbnN0IG5ld0RlbHRhczogRnJvemVuPHVua25vd25bXT5bXSA9IFtdXG5cbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXG4gICAgICAoZGVsdGFMaXN0KSA9PiB7XG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gb2JzZXJ2ZShkZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcbiAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBnb25uYSByZXBsYWNlIHRoZW0gYWxsXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzaG91bGRSZXBsaWNhdGVUb1lqcyh5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykpKSB7XG4gICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFuZ2UudHlwZSA9PT0gXCJzcGxpY2VcIiAmJlxuICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmFkZGVkQ291bnQgPiAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuaW5kZXggPT09IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBqdXN0IGFkZGluZyBuZXcgb25lcyB0byB0aGUgZW5kXG4gICAgICAgICAgICBuZXdEZWx0YXMucHVzaCguLi5jaGFuZ2UuYWRkZWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFueSBvdGhlciBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcbiAgICAgICAgICAgICAgaWYgKHlqc1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3RGVsdGFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgICAgIG5ld0RlbHRhcy5sZW5ndGggPSAwXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXG4gICAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbVxuICAgIClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSgpXG4gICAgfVxuICB9XG59XG5cbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cbi8vIGJ5IHRoZSBkZWNvcmF0b3JcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxuXG5mdW5jdGlvbiBob29rWWpzVGV4dENoYW5nZWRBdG9tKGdldFlqc1RleHQ6ICgpID0+IFkuVGV4dCwgdGV4dENoYW5nZWRBdG9tOiBJQXRvbSkge1xuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICBjb25zdCBvYnNlcnZlRm4gPSAoKSA9PiB7XG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG5cbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxuICAgICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHtcbiAgSnNvbkFycmF5V2l0aFVuZGVmaW5lZCxcbiAgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQsXG4gIEpzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkLFxuICBKc29uVmFsdWVXaXRoVW5kZWZpbmVkLFxufSBmcm9tIFwiLi4vanNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzSnNvbkFycmF5V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uQXJyYXlXaXRoVW5kZWZpbmVkIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCB7XG4gIHJldHVybiAhaXNKc29uQXJyYXlXaXRoVW5kZWZpbmVkKHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqIE9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBZLk1hcHMsIGFycmF5cyB0byBZLkFycmF5cywgcHJpbWl0aXZlcyBhcmUgdW50b3VjaGVkLlxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfCB1bmRlZmluZWQpOiBZanNEYXRhIHtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheVdpdGhVbmRlZmluZWQodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyciBhcyBZanNEYXRhXG4gIH1cblxuICBpZiAoaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2KSkge1xuICAgIGlmICh2LiRmcm96ZW4gPT09IHRydWUpIHtcbiAgICAgIC8vIGZyb3plbiB2YWx1ZSwgc2F2ZSBhcyBpbW11dGFibGUgb2JqZWN0XG4gICAgICByZXR1cm4gdlxuICAgIH1cblxuICAgIGlmICh2LiRtb2RlbFR5cGUgPT09IHlqc1RleHRNb2RlbElkKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gbmV3IFkuVGV4dCgpXG4gICAgICBjb25zdCB5anNUZXh0TW9kZWwgPSB2IGFzIHVua25vd24gYXMgU25hcHNob3RPdXRPZjxZanNUZXh0TW9kZWw+XG4gICAgICB5anNUZXh0TW9kZWwuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHRleHRcbiAgICB9XG5cbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXG4gICAgcmV0dXJuIG1hcCBhcyBZanNEYXRhXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXlXaXRoVW5kZWZpbmVkKSB7XG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCkge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcbmltcG9ydCB7IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBjaGFuZ2VzIHRvIGRlbHRhTGlzdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFycmF5IG9ic2VydmUgaW4gdGhlIFlqc1RleHRNb2RlbCBjbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBwYXRjaC52YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIG5ld0xlbmd0aFxuICAgICAgICAgICAgICB5anMuZGVsZXRlKG5ld0xlbmd0aCwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBZanNUZXh0TW9kZWwsIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7U3RyaW5nKHBhdGNoLnBhdGhbMF0pfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25PYmplY3RXaXRoVW5kZWZpbmVkLCBKc29uVmFsdWVXaXRoVW5kZWZpbmVkIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxZanNEYXRhPiB8IFkuTWFwPFlqc0RhdGE+IHwgWS5UZXh0IHwgSnNvblZhbHVlV2l0aFVuZGVmaW5lZFxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0RhdGFUb0pzb24oeWpzRGF0YTogWWpzRGF0YSk6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogSnNvbk9iamVjdFdpdGhVbmRlZmluZWQgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZVdpdGhVbmRlZmluZWRcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQge1xuICBKc29uQXJyYXlXaXRoVW5kZWZpbmVkLFxuICBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCxcbiAgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCxcbn0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldFxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xuICAgIGxldCByZXRhaW4gPSAwXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogXCJhZGRcIixcbiAgICAgIHBhdGgsXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkIHwgSnNvbkFycmF5V2l0aFVuZGVmaW5lZFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2XG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEFueURhdGFNb2RlbCxcbiAgQW55TW9kZWwsXG4gIEFueVN0YW5kYXJkVHlwZSxcbiAgTW9kZWxDbGFzcyxcbiAgUGF0Y2gsXG4gIFNuYXBzaG90SW5PZixcbiAgVHlwZVRvRGF0YSxcbiAgYXBwbHlQYXRjaGVzLFxuICBmcm9tU25hcHNob3QsXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBvbkdsb2JhbFBhdGNoZXMsXG4gIG9uUGF0Y2hlcyxcbiAgb25TbmFwc2hvdCxcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGdldFlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IFlqc0RhdGEsIGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgYmlkaXJlY3Rpb25hbCBiaW5kaW5nIGJldHdlZW4gYSBZLmpzIGRhdGEgc3RydWN0dXJlIGFuZCBhIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICAgKi9cbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QgYXMgWWpzRGF0YSlcblxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcbiAgICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5wdXNoKHsgdGFyZ2V0LCBwYXRjaGVzIH0pXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyB1bmtub3duIGFzIFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4pLFxuICAgICAgICBiaW5kaW5nQ29udGV4dFxuICAgICAgKVxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gYWN0aW9uKChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXM6IFBhdGNoW11bXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5wdXNoKHBhdGNoZXMpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXNcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2gsIHlqc09iamVjdClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgeWpzT3JpZ2luKVxuICB9KVxuXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcblxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxuICAgICAgICB9XG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHlqc09iamVjdFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9LCB5anNPcmlnaW4pXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gICAgfSxcbiAgICB5anNPcmlnaW4sXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJZanNUZXh0TW9kZWwiLCJib3VuZE9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ3dCYSxNQUFBLG9CQUFvQixjQUE2QyxNQUFTO0FDdEN2RixNQUFNLHlDQUF5QjtBQUtsQixNQUFBLHVCQUF1QixDQUNsQyxrQkFDcUI7QUFDZCxTQUFBLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLYSxNQUFBLCtCQUErQixDQUMxQyxrQkFDUztBQUNMLE1BQUEsT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNsQix1QkFBQSxJQUFJLGVBQWUsSUFBSTtBQUFBLEVBQzVDO0FBQ08sU0FBQTtBQUNUO0FDdEJnQixTQUFBLGVBQWUsV0FBb0IsTUFBa0M7QUFDbkYsTUFBSSxtQkFBNEI7QUFFM0IsT0FBQSxRQUFRLENBQUMsVUFBVSxNQUFLO0FBQ3ZCLFFBQUEsNEJBQTRCLEVBQUUsS0FBSztBQUNSLG1DQUFBLGdCQUFnQixFQUFFO0FBQ3pDLFlBQUEsTUFBTSxPQUFPLFFBQVE7QUFDUix5QkFBQSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEs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
|
|
@@ -570,4 +570,4 @@ export {
|
|
|
570
570
|
yjsBindingContext,
|
|
571
571
|
yjsTextModelId
|
|
572
572
|
};
|
|
573
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcblxuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuXG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gICAqL1xuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXG59XG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0WWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSA9PiB7XG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxuICBpZiAoIWF0b20pIHtcbiAgICBhdG9tID0gY3JlYXRlQXRvbShgeWpzQ29sbGVjdGlvbkF0b21gKVxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcbiAgfVxuICByZXR1cm4gYXRvbVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBGcm96ZW4sXG4gIE1vZGVsLFxuICBmcm96ZW4sXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBtb2RlbCxcbiAgb25TbmFwc2hvdCxcbiAgdFByb3AsXG4gIHR5cGVzLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcblxuLy8gRGVsdGFbXVtdLCBzaW5jZSBlYWNoIHNpbmdsZSBjaGFuZ2UgaXMgYSBEZWx0YVtdXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxuXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXG5cbi8qKlxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cbiAqL1xuQG1vZGVsKHlqc1RleHRNb2RlbElkKVxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXG59KSB7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cbiAgICovXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcbiAgICAgIGRlbHRhTGlzdDogW1xuICAgICAgICBmcm96ZW4oW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc2VydDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ID09IG51bGwpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIFwidGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBtdXN0IGJlIHBhcnQgb2YgYSBib3VuZCBvYmplY3QgYmVmb3JlIGl0IGNhbiBiZSBhY2Nlc3NlZFwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGN0eC5ib3VuZE9iamVjdCwgdGhpcylcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cblxuICAvKipcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCBwcmVzZW50IGF0IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlJ3MgcGF0aC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0QXRQYXRoKCk6IHVua25vd24ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykhXG5cbiAgICByZXR1cm4gcmVzb2x2ZVlqc1BhdGgoY3R4Lnlqc09iamVjdCwgcGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB5anNUZXh0KCk6IFkuVGV4dCB7XG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXG5cbiAgICBpZiAoISh5anNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB5anNPYmplY3RcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9tIHRoYXQgZ2V0cyBjaGFuZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQgWS5qcyB0ZXh0IGNoYW5nZXMuXG4gICAqL1xuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXG4gICAqIFNob3J0Y3V0IGZvciBgeWpzVGV4dC50b1N0cmluZygpYCwgYnV0IGNvbXB1dGVkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICByZXR1cm4gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkluaXQoKSB7XG4gICAgY29uc3Qgc2hvdWxkUmVwbGljYXRlVG9ZanMgPSAoY3R4OiBZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZCk6IGN0eCBpcyBZanNCaW5kaW5nQ29udGV4dCA9PiB7XG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXG4gICAgfVxuXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgIGNvbnN0IG5ld0RlbHRhczogRnJvemVuPHVua25vd25bXT5bXSA9IFtdXG5cbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXG4gICAgICAoZGVsdGFMaXN0KSA9PiB7XG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gb2JzZXJ2ZShkZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcbiAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBnb25uYSByZXBsYWNlIHRoZW0gYWxsXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzaG91bGRSZXBsaWNhdGVUb1lqcyh5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykpKSB7XG4gICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFuZ2UudHlwZSA9PT0gXCJzcGxpY2VcIiAmJlxuICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmFkZGVkQ291bnQgPiAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuaW5kZXggPT09IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBqdXN0IGFkZGluZyBuZXcgb25lcyB0byB0aGUgZW5kXG4gICAgICAgICAgICBuZXdEZWx0YXMucHVzaCguLi5jaGFuZ2UuYWRkZWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFueSBvdGhlciBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcbiAgICAgICAgICAgICAgaWYgKHlqc1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3RGVsdGFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgICAgIG5ld0RlbHRhcy5sZW5ndGggPSAwXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXG4gICAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbVxuICAgIClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSgpXG4gICAgfVxuICB9XG59XG5cbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cbi8vIGJ5IHRoZSBkZWNvcmF0b3JcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxuXG5mdW5jdGlvbiBob29rWWpzVGV4dENoYW5nZWRBdG9tKGdldFlqc1RleHQ6ICgpID0+IFkuVGV4dCwgdGV4dENoYW5nZWRBdG9tOiBJQXRvbSkge1xuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICBjb25zdCBvYnNlcnZlRm4gPSAoKSA9PiB7XG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG5cbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxuICAgICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHtcbiAgSnNvbkFycmF5V2l0aFVuZGVmaW5lZCxcbiAgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQsXG4gIEpzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkLFxuICBKc29uVmFsdWVXaXRoVW5kZWZpbmVkLFxufSBmcm9tIFwianNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzSnNvbkFycmF5V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uQXJyYXlXaXRoVW5kZWZpbmVkIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCB7XG4gIHJldHVybiAhaXNKc29uQXJyYXlXaXRoVW5kZWZpbmVkKHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqIE9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBZLk1hcHMsIGFycmF5cyB0byBZLkFycmF5cywgcHJpbWl0aXZlcyBhcmUgdW50b3VjaGVkLlxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfCB1bmRlZmluZWQpOiBZanNEYXRhIHtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheVdpdGhVbmRlZmluZWQodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyciBhcyBZanNEYXRhXG4gIH1cblxuICBpZiAoaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2KSkge1xuICAgIGlmICh2LiRmcm96ZW4gPT09IHRydWUpIHtcbiAgICAgIC8vIGZyb3plbiB2YWx1ZSwgc2F2ZSBhcyBpbW11dGFibGUgb2JqZWN0XG4gICAgICByZXR1cm4gdlxuICAgIH1cblxuICAgIGlmICh2LiRtb2RlbFR5cGUgPT09IHlqc1RleHRNb2RlbElkKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gbmV3IFkuVGV4dCgpXG4gICAgICBjb25zdCB5anNUZXh0TW9kZWwgPSB2IGFzIHVua25vd24gYXMgU25hcHNob3RPdXRPZjxZanNUZXh0TW9kZWw+XG4gICAgICB5anNUZXh0TW9kZWwuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHRleHRcbiAgICB9XG5cbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXG4gICAgcmV0dXJuIG1hcCBhcyBZanNEYXRhXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXlXaXRoVW5kZWZpbmVkKSB7XG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCkge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcbmltcG9ydCB7IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfSBmcm9tIFwianNvblR5cGVzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBjaGFuZ2VzIHRvIGRlbHRhTGlzdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFycmF5IG9ic2VydmUgaW4gdGhlIFlqc1RleHRNb2RlbCBjbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBwYXRjaC52YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIG5ld0xlbmd0aFxuICAgICAgICAgICAgICB5anMuZGVsZXRlKG5ld0xlbmd0aCwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBZanNUZXh0TW9kZWwsIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7U3RyaW5nKHBhdGNoLnBhdGhbMF0pfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25PYmplY3RXaXRoVW5kZWZpbmVkLCBKc29uVmFsdWVXaXRoVW5kZWZpbmVkIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxZanNEYXRhPiB8IFkuTWFwPFlqc0RhdGE+IHwgWS5UZXh0IHwgSnNvblZhbHVlV2l0aFVuZGVmaW5lZFxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0RhdGFUb0pzb24oeWpzRGF0YTogWWpzRGF0YSk6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogSnNvbk9iamVjdFdpdGhVbmRlZmluZWQgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZVdpdGhVbmRlZmluZWRcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQge1xuICBKc29uQXJyYXlXaXRoVW5kZWZpbmVkLFxuICBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCxcbiAgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCxcbn0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldFxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xuICAgIGxldCByZXRhaW4gPSAwXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogXCJhZGRcIixcbiAgICAgIHBhdGgsXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkIHwgSnNvbkFycmF5V2l0aFVuZGVmaW5lZFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2XG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEFueURhdGFNb2RlbCxcbiAgQW55TW9kZWwsXG4gIEFueVN0YW5kYXJkVHlwZSxcbiAgTW9kZWxDbGFzcyxcbiAgUGF0Y2gsXG4gIFNuYXBzaG90SW5PZixcbiAgVHlwZVRvRGF0YSxcbiAgYXBwbHlQYXRjaGVzLFxuICBmcm9tU25hcHNob3QsXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBvbkdsb2JhbFBhdGNoZXMsXG4gIG9uUGF0Y2hlcyxcbiAgb25TbmFwc2hvdCxcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGdldFlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IFlqc0RhdGEsIGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgYmlkaXJlY3Rpb25hbCBiaW5kaW5nIGJldHdlZW4gYSBZLmpzIGRhdGEgc3RydWN0dXJlIGFuZCBhIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICAgKi9cbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QgYXMgWWpzRGF0YSlcblxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcbiAgICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5wdXNoKHsgdGFyZ2V0LCBwYXRjaGVzIH0pXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyB1bmtub3duIGFzIFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4pLFxuICAgICAgICBiaW5kaW5nQ29udGV4dFxuICAgICAgKVxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gYWN0aW9uKChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXM6IFBhdGNoW11bXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5wdXNoKHBhdGNoZXMpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXNcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2gsIHlqc09iamVjdClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgeWpzT3JpZ2luKVxuICB9KVxuXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcblxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxuICAgICAgICB9XG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHlqc09iamVjdFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9LCB5anNPcmlnaW4pXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gICAgfSxcbiAgICB5anNPcmlnaW4sXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJZanNUZXh0TW9kZWwiLCJib3VuZE9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ3dCYSxNQUFBLG9CQUFvQixjQUE2QyxNQUFTO0FDdEN2RixNQUFNLHlDQUF5QjtBQUtsQixNQUFBLHVCQUF1QixDQUNsQyxrQkFDcUI7QUFDZCxTQUFBLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLYSxNQUFBLCtCQUErQixDQUMxQyxrQkFDUztBQUNMLE1BQUEsT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNsQix1QkFBQSxJQUFJLGVBQWUsSUFBSTtBQUFBLEVBQzVDO0FBQ08sU0FBQTtBQUNUO0FDdEJnQixTQUFBLGVBQWUsV0FBb0IsTUFBa0M7QUFDbkYsTUFBSSxtQkFBNEI7QUFFM0IsT0FBQSxRQUFRLENBQUMsVUFBVSxNQUFLO0FBQ3ZCLFFBQUEsNEJBQTRCLEVBQUUsS0FBSztBQUNSLG1DQUFBLGdCQUFnQixFQUFFO0FBQ3pDLFlBQUEsTUFBTSxPQUFPLFFBQVE7QUFDUix5QkFBQSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEsSUFBQSxX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
|
|
573
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzQmluZGluZ0NvbnRleHQudHMiLCIuLi9zcmMvdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbS50cyIsIi4uL3NyYy9iaW5kaW5nL3Jlc29sdmVZanNQYXRoLnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcblxuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuXG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gICAqL1xuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXG59XG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7IElBdG9tLCBjcmVhdGVBdG9tIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuY29uc3QgeWpzQ29sbGVjdGlvbkF0b21zID0gbmV3IFdlYWtNYXA8WS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+LCBJQXRvbT4oKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0WWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gfCB1bmRlZmluZWQgPT4ge1xuICByZXR1cm4geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSA9PiB7XG4gIGxldCBhdG9tID0geWpzQ29sbGVjdGlvbkF0b21zLmdldCh5anNDb2xsZWN0aW9uKVxuICBpZiAoIWF0b20pIHtcbiAgICBhdG9tID0gY3JlYXRlQXRvbShgeWpzQ29sbGVjdGlvbkF0b21gKVxuICAgIHlqc0NvbGxlY3Rpb25BdG9tcy5zZXQoeWpzQ29sbGVjdGlvbiwgYXRvbSlcbiAgfVxuICByZXR1cm4gYXRvbVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IElBdG9tLCBjb21wdXRlZCwgY3JlYXRlQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBGcm96ZW4sXG4gIE1vZGVsLFxuICBmcm96ZW4sXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBtb2RlbCxcbiAgb25TbmFwc2hvdCxcbiAgdFByb3AsXG4gIHR5cGVzLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBZanNCaW5kaW5nQ29udGV4dCwgeWpzQmluZGluZ0NvbnRleHQgfSBmcm9tIFwiLi95anNCaW5kaW5nQ29udGV4dFwiXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcblxuLy8gRGVsdGFbXVtdLCBzaW5jZSBlYWNoIHNpbmdsZSBjaGFuZ2UgaXMgYSBEZWx0YVtdXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxuXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXG5cbi8qKlxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cbiAqL1xuQG1vZGVsKHlqc1RleHRNb2RlbElkKVxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXG59KSB7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cbiAgICovXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcbiAgICAgIGRlbHRhTGlzdDogW1xuICAgICAgICBmcm96ZW4oW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc2VydDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ID09IG51bGwpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIFwidGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBtdXN0IGJlIHBhcnQgb2YgYSBib3VuZCBvYmplY3QgYmVmb3JlIGl0IGNhbiBiZSBhY2Nlc3NlZFwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGN0eC5ib3VuZE9iamVjdCwgdGhpcylcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cblxuICAvKipcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCBwcmVzZW50IGF0IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlJ3MgcGF0aC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0QXRQYXRoKCk6IHVua25vd24ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykhXG5cbiAgICByZXR1cm4gcmVzb2x2ZVlqc1BhdGgoY3R4Lnlqc09iamVjdCwgcGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB5anNUZXh0KCk6IFkuVGV4dCB7XG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXG5cbiAgICBpZiAoISh5anNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB5anNPYmplY3RcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9tIHRoYXQgZ2V0cyBjaGFuZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQgWS5qcyB0ZXh0IGNoYW5nZXMuXG4gICAqL1xuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXG4gICAqIFNob3J0Y3V0IGZvciBgeWpzVGV4dC50b1N0cmluZygpYCwgYnV0IGNvbXB1dGVkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICByZXR1cm4gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkluaXQoKSB7XG4gICAgY29uc3Qgc2hvdWxkUmVwbGljYXRlVG9ZanMgPSAoY3R4OiBZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZCk6IGN0eCBpcyBZanNCaW5kaW5nQ29udGV4dCA9PiB7XG4gICAgICByZXR1cm4gISFjdHggJiYgISFjdHguYm91bmRPYmplY3QgJiYgIWN0eC5pc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lXG4gICAgfVxuXG4gICAgbGV0IHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgIGNvbnN0IG5ld0RlbHRhczogRnJvemVuPHVua25vd25bXT5bXSA9IFtdXG5cbiAgICBsZXQgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAgICgpID0+IHRoaXMuJC5kZWx0YUxpc3QsXG4gICAgICAoZGVsdGFMaXN0KSA9PiB7XG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gb2JzZXJ2ZShkZWx0YUxpc3QsIChjaGFuZ2UpID0+IHtcbiAgICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBnb25uYSByZXBsYWNlIHRoZW0gYWxsXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzaG91bGRSZXBsaWNhdGVUb1lqcyh5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykpKSB7XG4gICAgICAgICAgICAvLyB5anMgdGV4dCBpcyBhbHJlYWR5IHVwIHRvIGRhdGUgd2l0aCB0aGVzZSBjaGFuZ2VzXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGFuZ2UudHlwZSA9PT0gXCJzcGxpY2VcIiAmJlxuICAgICAgICAgICAgY2hhbmdlLnJlbW92ZWRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmFkZGVkQ291bnQgPiAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuaW5kZXggPT09IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gb3B0aW1pemF0aW9uLCBqdXN0IGFkZGluZyBuZXcgb25lcyB0byB0aGUgZW5kXG4gICAgICAgICAgICBuZXdEZWx0YXMucHVzaCguLi5jaGFuZ2UuYWRkZWQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFueSBvdGhlciBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICB7IGZpcmVJbW1lZGlhdGVseTogdHJ1ZSB9XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KHRoaXMsICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIGJldHRlciB3YXkgdGhhbiB0aGlzIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgICAvLyB3aXRob3V0IGhhdmluZyB0byByZS1jcmVhdGUgdGhlIFkuVGV4dCBvYmplY3RcbiAgICAgICAgICAgICAgaWYgKHlqc1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuZGVsZXRlKDAsIHlqc1RleHQubGVuZ3RoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV3RGVsdGFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIG5ld0RlbHRhcy5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgICAgIG5ld0RlbHRhcy5sZW5ndGggPSAwXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSA9IGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oXG4gICAgICAoKSA9PiB0aGlzLnlqc1RleHQsXG4gICAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbVxuICAgIClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXG4gICAgICBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSgpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGRpcG9zZVlqc1RleHRDaGFuZ2VkQXRvbSgpXG4gICAgfVxuICB9XG59XG5cbi8vIHdlIHVzZSB0aGlzIHRyaWNrIGp1c3QgdG8gYXZvaWQgYSBiYWJlbCBidWcgdGhhdCBjYXVzZXMgY2xhc3NlcyB1c2VkIGluc2lkZSBjbGFzc2VzIG5vdCB0byBiZSBvdmVycmlkZW5cbi8vIGJ5IHRoZSBkZWNvcmF0b3JcbmNvbnN0IERlY29yYXRlZFlqc1RleHRNb2RlbCA9IFlqc1RleHRNb2RlbFxuXG5mdW5jdGlvbiBob29rWWpzVGV4dENoYW5nZWRBdG9tKGdldFlqc1RleHQ6ICgpID0+IFkuVGV4dCwgdGV4dENoYW5nZWRBdG9tOiBJQXRvbSkge1xuICBsZXQgZGlzcG9zZU9ic2VydmVZanNUZXh0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICBjb25zdCBvYnNlcnZlRm4gPSAoKSA9PiB7XG4gICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxuICB9XG5cbiAgY29uc3QgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSA9IHJlYWN0aW9uKFxuICAgICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBnZXRZanNUZXh0KClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHtcbiAgSnNvbkFycmF5V2l0aFVuZGVmaW5lZCxcbiAgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQsXG4gIEpzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkLFxuICBKc29uVmFsdWVXaXRoVW5kZWZpbmVkLFxufSBmcm9tIFwiLi4vanNvblR5cGVzXCJcblxuZnVuY3Rpb24gaXNKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uUHJpbWl0aXZlV2l0aFVuZGVmaW5lZCB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxuICByZXR1cm4gdCA9PT0gXCJzdHJpbmdcIiB8fCB0ID09PSBcIm51bWJlclwiIHx8IHQgPT09IFwiYm9vbGVhblwiIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzSnNvbkFycmF5V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uQXJyYXlXaXRoVW5kZWZpbmVkIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2OiBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKTogdiBpcyBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCB7XG4gIHJldHVybiAhaXNKc29uQXJyYXlXaXRoVW5kZWZpbmVkKHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OIHZhbHVlIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqIE9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBZLk1hcHMsIGFycmF5cyB0byBZLkFycmF5cywgcHJpbWl0aXZlcyBhcmUgdW50b3VjaGVkLlxuICogRnJvemVuIHZhbHVlcyBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIHRoZXkgYXJlIGtlcHQgYXMgaW1tdXRhYmxlIHBsYWluIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc29uVG9ZanNEYXRhKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfCB1bmRlZmluZWQpOiBZanNEYXRhIHtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCBpc0pzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkKHYpKSB7XG4gICAgcmV0dXJuIHZcbiAgfVxuXG4gIGlmIChpc0pzb25BcnJheVdpdGhVbmRlZmluZWQodikpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXG4gICAgYXBwbHlKc29uQXJyYXlUb1lBcnJheShhcnIsIHYpXG4gICAgcmV0dXJuIGFyciBhcyBZanNEYXRhXG4gIH1cblxuICBpZiAoaXNKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCh2KSkge1xuICAgIGlmICh2LiRmcm96ZW4gPT09IHRydWUpIHtcbiAgICAgIC8vIGZyb3plbiB2YWx1ZSwgc2F2ZSBhcyBpbW11dGFibGUgb2JqZWN0XG4gICAgICByZXR1cm4gdlxuICAgIH1cblxuICAgIGlmICh2LiRtb2RlbFR5cGUgPT09IHlqc1RleHRNb2RlbElkKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gbmV3IFkuVGV4dCgpXG4gICAgICBjb25zdCB5anNUZXh0TW9kZWwgPSB2IGFzIHVua25vd24gYXMgU25hcHNob3RPdXRPZjxZanNUZXh0TW9kZWw+XG4gICAgICB5anNUZXh0TW9kZWwuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICB0ZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHRleHRcbiAgICB9XG5cbiAgICBjb25zdCBtYXAgPSBuZXcgWS5NYXAoKVxuICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChtYXAsIHYpXG4gICAgcmV0dXJuIG1hcCBhcyBZanNEYXRhXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZGVzdDogWS5BcnJheTx1bmtub3duPiwgc291cmNlOiBKc29uQXJyYXlXaXRoVW5kZWZpbmVkKSB7XG4gIGRlc3QucHVzaChzb3VyY2UubWFwKGNvbnZlcnRKc29uVG9ZanNEYXRhKSlcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSlNPTiBvYmplY3QgdG8gYSBZLk1hcCwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0OiBZLk1hcDx1bmtub3duPiwgc291cmNlOiBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCkge1xuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgIGRlc3Quc2V0KGssIGNvbnZlcnRKc29uVG9ZanNEYXRhKHYpKVxuICB9KVxufVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0SnNvblRvWWpzRGF0YSB9IGZyb20gXCIuL2NvbnZlcnRKc29uVG9ZanNEYXRhXCJcbmltcG9ydCB7IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xuICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXG5cbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIG1hcCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHBhdGNoXG4gICAgICAgICAgKX1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCh7IC4uLnBhdGNoLCBwYXRoOiByZXN0IH0sIGNoaWxkKVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBjaGFuZ2VzIHRvIGRlbHRhTGlzdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGFycmF5IG9ic2VydmUgaW4gdGhlIFlqc1RleHRNb2RlbCBjbGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gdW5rbm93biBZanMgb2JqZWN0IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0Y2hcbiAgICAgICAgKX1gXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICB5anMuc2V0KGtleSwgY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKGtleSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBwYXRjaC52YWx1ZSBhcyBudW1iZXJcbiAgICAgICAgICAgIGlmICh5anMubGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIG5ld0xlbmd0aFxuICAgICAgICAgICAgICB5anMuZGVsZXRlKG5ld0xlbmd0aCwgdG9EZWxldGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHlqcy5sZW5ndGggPCBwYXRjaC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBZanNUZXh0TW9kZWwsIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7U3RyaW5nKHBhdGNoLnBhdGhbMF0pfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IEpzb25PYmplY3RXaXRoVW5kZWZpbmVkLCBKc29uVmFsdWVXaXRoVW5kZWZpbmVkIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuXG5leHBvcnQgdHlwZSBZanNEYXRhID0gWS5BcnJheTxZanNEYXRhPiB8IFkuTWFwPFlqc0RhdGE+IHwgWS5UZXh0IHwgSnNvblZhbHVlV2l0aFVuZGVmaW5lZFxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0RhdGFUb0pzb24oeWpzRGF0YTogWWpzRGF0YSk6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogSnNvbk9iamVjdFdpdGhVbmRlZmluZWQgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZVdpdGhVbmRlZmluZWRcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQge1xuICBKc29uQXJyYXlXaXRoVW5kZWZpbmVkLFxuICBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCxcbiAgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCxcbn0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldFxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xuICAgIGxldCByZXRhaW4gPSAwXG4gICAgZXZlbnQuY2hhbmdlcy5kZWx0YS5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XG4gICAgICAgIC8vIHJlbW92ZSBYIGl0ZW1zIGF0IHJldGFpbiBwb3NpdGlvblxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogXCJhZGRcIixcbiAgICAgIHBhdGgsXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpIHtcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkIHwgSnNvbkFycmF5V2l0aFVuZGVmaW5lZFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2XG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEFueURhdGFNb2RlbCxcbiAgQW55TW9kZWwsXG4gIEFueVN0YW5kYXJkVHlwZSxcbiAgTW9kZWxDbGFzcyxcbiAgUGF0Y2gsXG4gIFNuYXBzaG90SW5PZixcbiAgVHlwZVRvRGF0YSxcbiAgYXBwbHlQYXRjaGVzLFxuICBmcm9tU25hcHNob3QsXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxuICBvbkdsb2JhbFBhdGNoZXMsXG4gIG9uUGF0Y2hlcyxcbiAgb25TbmFwc2hvdCxcbn0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGdldFlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IFlqc0RhdGEsIGNvbnZlcnRZanNEYXRhVG9Kc29uIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgYmlkaXJlY3Rpb25hbCBiaW5kaW5nIGJldHdlZW4gYSBZLmpzIGRhdGEgc3RydWN0dXJlIGFuZCBhIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXG4+KHtcbiAgeWpzRG9jLFxuICB5anNPYmplY3QsXG4gIG1vYnhLZXlzdG9uZVR5cGUsXG59OiB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICAgKi9cbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QgYXMgWWpzRGF0YSlcblxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cblxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcbiAgICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5wdXNoKHsgdGFyZ2V0LCBwYXRjaGVzIH0pXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3VuZE9iamVjdCA9IHlqc0JpbmRpbmdDb250ZXh0LmFwcGx5KFxuICAgICAgICAoKSA9PiBmcm9tU25hcHNob3QobW9ieEtleXN0b25lVHlwZSwgeWpzSnNvbiBhcyB1bmtub3duIGFzIFNuYXBzaG90SW5PZjxUeXBlVG9EYXRhPFRUeXBlPj4pLFxuICAgICAgICBiaW5kaW5nQ29udGV4dFxuICAgICAgKVxuICAgICAgeWpzQmluZGluZ0NvbnRleHQuc2V0KGJvdW5kT2JqZWN0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdCB9KVxuICAgICAgcmV0dXJuIGJvdW5kT2JqZWN0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJvdW5kT2JqZWN0ID0gY3JlYXRlQm91bmRPYmplY3QoKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSB5anMgdG8gbW9ieC1rZXlzdG9uZVxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gYWN0aW9uKChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIHBhdGNoZXMucHVzaCguLi5jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMoZXZlbnQpKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5NYXAgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBnZXRZanNDb2xsZWN0aW9uQXRvbShldmVudC50YXJnZXQpPy5yZXBvcnRDaGFuZ2VkKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUrK1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcbiAgbGV0IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXM6IFBhdGNoW11bXSA9IFtdXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XG4gICAgaWYgKGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5wdXNoKHBhdGNoZXMpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcbiAgICBpZiAocGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXNcbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gW11cblxuICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICBhcnJheU9mQXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgoYXJyYXlPZlBhdGNoZXMpID0+IHtcbiAgICAgICAgYXJyYXlPZlBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QocGF0Y2gsIHlqc09iamVjdClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgeWpzT3JpZ2luKVxuICB9KVxuXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcbiAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxuICAgIC8vIGJ1dCB3ZSBqdXN0IG5lZWQgdG8gY2F0Y2ggd2hlbiB0aG9zZSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gdGhlIGJvdW5kIG9iamVjdFxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcblxuICAgIGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlcy5mb3JFYWNoKCh7IHRhcmdldCwgcGF0Y2hlcyB9KSA9PiB7XG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm4gLy8gc2tpcFxuICAgICAgICB9XG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcbiAgICAgIC8vIHRoaXMgaXMgdW5kZWZpbmVkIG9ubHkgaWYgdGFyZ2V0IGlzIG5vdCBhIGNoaWxkIG9mIGJvdW5kTW9kZWxcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxuICAgICAgICAgICAgICBwYXRoOiBbLi4ucGFyZW50VG9DaGlsZFBhdGgsIC4uLnBhdGNoLnBhdGhdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHlqc09iamVjdFxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9LCB5anNPcmlnaW4pXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICBkaXNwb3NlT25QYXRjaGVzKClcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gICAgfSxcbiAgICB5anNPcmlnaW4sXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJZanNUZXh0TW9kZWwiLCJib3VuZE9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ3dCYSxNQUFBLG9CQUFvQixjQUE2QyxNQUFTO0FDdEN2RixNQUFNLHlDQUF5QjtBQUtsQixNQUFBLHVCQUF1QixDQUNsQyxrQkFDcUI7QUFDZCxTQUFBLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLYSxNQUFBLCtCQUErQixDQUMxQyxrQkFDUztBQUNMLE1BQUEsT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNsQix1QkFBQSxJQUFJLGVBQWUsSUFBSTtBQUFBLEVBQzVDO0FBQ08sU0FBQTtBQUNUO0FDdEJnQixTQUFBLGVBQWUsV0FBb0IsTUFBa0M7QUFDbkYsTUFBSSxtQkFBNEI7QUFFM0IsT0FBQSxRQUFRLENBQUMsVUFBVSxNQUFLO0FBQ3ZCLFFBQUEsNEJBQTRCLEVBQUUsS0FBSztBQUNSLG1DQUFBLGdCQUFnQixFQUFFO0FBQ3pDLFlBQUEsTUFBTSxPQUFPLFFBQVE7QUFDUix5QkFBQSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEsSUFBQSxXQUNsQyw0QkFBNEIsRUFBRSxPQUFPO0FBQ2pCLG1DQUFBLGdCQUFnQixFQUFFO0FBQ3pDLFlBQUEsTUFBTSxPQUFPLFFBQVE7QUFDUix5QkFBQSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEsSUFBQSxPQUN0QztBQUNMLFlBQU0sUUFDSix5Q0FBeUMsS0FBSyxVQUM1QyxLQUFLLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FDakIsNkJBQTZCLEtBQUssVUFBVSxJQUFJLENBQUMsYUFBYSxnQkFBZ0IsVUFBVTtBQUFBLElBRTdGO0FBQUEsRUFBQSxDQUNEO0FBRU0sU0FBQTtBQUNUO0FDUkEsTUFBTSxnQkFBZ0IsTUFBTSxNQUFNLE1BQU0sT0FBTyxNQUFNLFVBQXNCLENBQUEsQ0FBQztBQUVyRSxNQUFNLGlCQUFpQjtBQU1qQixJQUFBLGVBQU4sTUFBTUEsc0JBQXFCLE1BQU07QUFBQSxFQUN0QyxXQUFXLE1BQU0sZUFBZSxNQUFNLEVBQUU7Q0FDekMsRUFBQztBQUFBLEVBRks7QUFBQTtBQW1FTDtBQUFBO0FBQUE7QUFBQSw4Q0FBcUIsV0FBVyxvQkFBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBN0RwRCxPQUFPLFNBQVMsTUFBWTtBQUMxQixXQUFPLElBQUksc0JBQXNCO0FBQUEsTUFDL0IsV0FBVztBQUFBLFFBQ1QsT0FBTztBQUFBLFVBQ0w7QUFBQSxZQUNFLFFBQVE7QUFBQSxVQUNUO0FBQUEsUUFBQSxDQUNGO0FBQUEsTUFDRjtBQUFBLElBQUEsQ0FDRjtBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLElBQVksaUJBQWM7QUFDbEIsVUFBQSxNQUFNLGtCQUFrQixJQUFJLElBQUk7QUFDbEMsU0FBQSwyQkFBSyxnQkFBZSxNQUFNO0FBQzVCLFlBQU0sUUFDSixvRkFBb0Y7QUFBQSxJQUV4RjtBQUVBLFVBQU0sT0FBTyxxQkFBcUIsSUFBSSxhQUFhLElBQUk7QUFDdkQsUUFBSSxDQUFDLE1BQU07QUFDVCxZQUFNLFFBQVEsNEVBQTRFO0FBQUEsSUFDNUY7QUFFTyxXQUFBO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsSUFBWSxtQkFBZ0I7QUFDMUIsVUFBTSxPQUFPLEtBQUs7QUFFWixVQUFBLE1BQU0sa0JBQWtCLElBQUksSUFBSTtBQUUvQixXQUFBLGVBQWUsSUFBSSxXQUFXLElBQUk7QUFBQSxFQUMzQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsSUFBSSxVQUFPO0FBQ1QsVUFBTSxZQUFZLEtBQUs7QUFFbkIsUUFBQSxFQUFFLHFCQUFxQixFQUFFLE9BQU87QUFDbEMsWUFBTSxRQUFRLCtCQUErQixLQUFLLFVBQVUsS0FBSyxjQUFjLENBQUMsRUFBRTtBQUFBLElBQ3BGO0FBRU8sV0FBQTtBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWUEsSUFBSSxPQUFJO0FBQ04sU0FBSyxtQkFBbUI7QUFFakIsV0FBQSxLQUFLLFFBQVE7RUFDdEI7QUFBQSxFQUVVLFNBQU07QUFDUixVQUFBLHVCQUF1QixDQUFDLFFBQWdFO0FBQ3JGLGFBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLElBQUk7QUFBQSxJQUFBO0FBRzVDLFFBQUkseUJBQXlCO0FBQzdCLFVBQU0sWUFBaUMsQ0FBQTtBQUVuQyxRQUFBO0FBRUosVUFBTSxzQ0FBc0MsU0FDMUMsTUFBTSxLQUFLLEVBQUUsV0FDYixDQUFDLGNBQWE7O0FBRWMsZ0NBQUE7QUFFQSxnQ0FBQSxRQUFRLFdBQVcsQ0FBQyxXQUFVO0FBQ3RELFlBQUksd0JBQXdCO0FBRTFCO0FBQUEsUUFDRjtBQUNBLFlBQUksQ0FBQyxxQkFBcUIsa0JBQWtCLElBQUksSUFBSSxDQUFDLEdBQUc7QUFFdEQ7QUFBQSxRQUNGO0FBRUEsWUFDRSxPQUFPLFNBQVMsWUFDaEIsT0FBTyxpQkFBaUIsS0FDeEIsT0FBTyxhQUFhLEtBQ3BCLE9BQU8sVUFBVSxLQUFLLFVBQVUsUUFDaEM7QUFFVSxvQkFBQSxLQUFLLEdBQUcsT0FBTyxLQUFLO0FBQUEsUUFBQSxPQUN6QjtBQUVvQixtQ0FBQTtBQUFBLFFBQzNCO0FBQUEsTUFBQSxDQUNEO0FBQUEsSUFBQSxHQUVILEVBQUUsaUJBQWlCLEtBQUEsQ0FBTTtBQUdyQixVQUFBLG9CQUFvQixXQUFXLE1BQU0sTUFBSztBQUMxQyxVQUFBO0FBQ0YsWUFBSSx3QkFBd0I7QUFDcEIsZ0JBQUEsTUFBTSxrQkFBa0IsSUFBSSxJQUFJO0FBRWxDLGNBQUEscUJBQXFCLEdBQUcsR0FBRztBQUN2QixrQkFBQSxFQUFFLFFBQVksSUFBQTtBQUVoQixnQkFBQSxPQUFPLFNBQVMsTUFBSztBQUduQixrQkFBQSxRQUFRLFNBQVMsR0FBRztBQUNkLHdCQUFBLE9BQU8sR0FBRyxRQUFRLE1BQU07QUFBQSxjQUNsQztBQUVLLG1CQUFBLFVBQVUsUUFBUSxDQUFDLGlCQUFnQjtBQUM5Qix3QkFBQSxXQUFXLGFBQWEsSUFBSTtBQUFBLGNBQUEsQ0FDckM7QUFBQSxZQUFBLEdBQ0EsSUFBSSxTQUFTO0FBQUEsVUFDbEI7QUFBQSxRQUFBLFdBQ1MsVUFBVSxTQUFTLEdBQUc7QUFDekIsZ0JBQUEsTUFBTSxrQkFBa0IsSUFBSSxJQUFJO0FBRWxDLGNBQUEscUJBQXFCLEdBQUcsR0FBRztBQUN2QixrQkFBQSxFQUFFLFFBQVksSUFBQTtBQUVoQixnQkFBQSxPQUFPLFNBQVMsTUFBSztBQUNiLHdCQUFBLFFBQVEsQ0FBQyxpQkFBZ0I7QUFDekIsd0JBQUEsV0FBVyxhQUFhLElBQUk7QUFBQSxjQUFBLENBQ3JDO0FBQUEsWUFBQSxHQUNBLElBQUksU0FBUztBQUFBLFVBQ2xCO0FBQUEsUUFDRjtBQUFBLE1BQUE7QUFFeUIsaUNBQUE7QUFDekIsa0JBQVUsU0FBUztBQUFBLE1BQ3JCO0FBQUEsSUFBQSxDQUNEO0FBRUQsVUFBTSwyQkFBMkIsdUJBQy9CLE1BQU0sS0FBSyxTQUNYLEtBQUssa0JBQWtCO0FBR3pCLFdBQU8sTUFBSzs7OztBQUlnQixnQ0FBQTs7O0VBSTlCOztBQXpKQSxXQUFBO0FBQUEsRUFEQztBQWVBLEdBQUEsYUFBQSxXQUFBLGtCQUFBLElBQUE7QUFNRCxXQUFBO0FBQUEsRUFEQztBQU9BLEdBQUEsYUFBQSxXQUFBLG9CQUFBLElBQUE7QUFNRCxXQUFBO0FBQUEsRUFEQztBQVNBLEdBQUEsYUFBQSxXQUFBLFdBQUEsSUFBQTtBQVlELFdBQUE7QUFBQSxFQURDO0FBS0EsR0FBQSxhQUFBLFdBQUEsUUFBQSxJQUFBO0FBOUVVLGVBQVksV0FBQTtBQUFBLEVBRHhCLE1BQU0sY0FBYztBQUNSLEdBQUEsWUFBWTtBQW9MekIsTUFBTSx3QkFBd0I7QUFFOUIsU0FBUyx1QkFBdUIsWUFBMEIsaUJBQXNCO0FBQzFFLE1BQUE7QUFFSixRQUFNLFlBQVksTUFBSztBQUNyQixvQkFBZ0IsY0FBYTtBQUFBLEVBQUE7QUFHekIsUUFBQSwrQkFBK0IsU0FDbkMsTUFBSztBQUNDLFFBQUE7QUFDRixhQUFPO1lBQ0Q7QUFDQyxhQUFBO0FBQUEsSUFDVDtBQUFBLEVBQ0YsR0FDQSxDQUFDLFlBQVc7O0FBRWMsNEJBQUE7QUFFeEIsUUFBSSxTQUFTO0FBQ1gsY0FBUSxRQUFRLFNBQVM7QUFFekIsOEJBQXdCLE1BQUs7QUFDM0IsZ0JBQVEsVUFBVSxTQUFTO0FBQUEsTUFBQTtBQUFBLElBRS9CO0FBRUEsb0JBQWdCLGNBQWE7QUFBQSxFQUFBLEdBRS9CO0FBQUEsSUFDRSxpQkFBaUI7QUFBQSxFQUFBLENBQ2xCO0FBR0gsU0FBTyxNQUFLOzs7QUFHYyw0QkFBQTtBQUFBLEVBQUE7QUFFNUI7QUM1T0EsU0FBUyw2QkFBNkIsR0FBeUI7QUFDN0QsUUFBTSxJQUFJLE9BQU87QUFDVixTQUFBLE1BQU0sWUFBWSxNQUFNLFlBQVksTUFBTSxhQUFhLE1BQU0sUUFBUSxNQUFNO0FBQ3BGO0FBRUEsU0FBUyx5QkFBeUIsR0FBeUI7QUFDbEQsU0FBQSxNQUFNLFFBQVEsQ0FBQztBQUN4QjtBQUVBLFNBQVMsMEJBQTBCLEdBQXlCO0FBQzFELFNBQU8sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLE9BQU8sTUFBTTtBQUN0RDtBQU9NLFNBQVUscUJBQXFCLEdBQXFDO0FBQ3hFLE1BQUksTUFBTSxVQUFhLDZCQUE2QixDQUFDLEdBQUc7QUFDL0MsV0FBQTtBQUFBLEVBQ1Q7QUFFSSxNQUFBLHlCQUF5QixDQUFDLEdBQUc7QUFDekIsVUFBQSxNQUFNLElBQUksRUFBRTtBQUNsQiwyQkFBdUIsS0FBSyxDQUFDO0FBQ3RCLFdBQUE7QUFBQSxFQUNUO0FBRUksTUFBQSwwQkFBMEIsQ0FBQyxHQUFHO0FBQzVCLFFBQUEsRUFBRSxZQUFZLE1BQU07QUFFZixhQUFBO0FBQUEsSUFDVDtBQUVJLFFBQUEsRUFBRSxlQUFlLGdCQUFnQjtBQUM3QixZQUFBLE9BQU8sSUFBSSxFQUFFO0FBQ25CLFlBQU0sZUFBZTtBQUNSLG1CQUFBLFVBQVUsUUFBUSxDQUFDLGlCQUFnQjtBQUN6QyxhQUFBLFdBQVcsYUFBYSxJQUFJO0FBQUEsTUFBQSxDQUNsQztBQUNNLGFBQUE7QUFBQSxJQUNUO0FBRU0sVUFBQSxNQUFNLElBQUksRUFBRTtBQUNsQiwwQkFBc0IsS0FBSyxDQUFDO0FBQ3JCLFdBQUE7QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJLE1BQU0sMkJBQTJCLENBQUMsRUFBRTtBQUNoRDtBQUtnQixTQUFBLHVCQUF1QixNQUF3QixRQUE4QjtBQUMzRixPQUFLLEtBQUssT0FBTyxJQUFJLG9CQUFvQixDQUFDO0FBQzVDO0FBS2dCLFNBQUEsc0JBQXNCLE1BQXNCLFFBQStCO0FBQ2xGLFNBQUEsUUFBUSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQUs7QUFDeEMsU0FBSyxJQUFJLEdBQUcscUJBQXFCLENBQUMsQ0FBQztBQUFBLEVBQUEsQ0FDcEM7QUFDSDtBQ3ZFZ0IsU0FBQSxrQ0FBa0MsT0FBYyxLQUFZO0FBQ3RFLE1BQUEsTUFBTSxLQUFLLFNBQVMsR0FBRztBQUN6QixVQUFNLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxNQUFNO0FBRXpCLFFBQUEsZUFBZSxFQUFFLEtBQUs7QUFDeEIsWUFBTSxRQUFRLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNqQyxVQUFJLFVBQVUsUUFBVztBQUNqQixjQUFBLFFBQ0osNEJBQTRCLEdBQUcsbUNBQW1DLEtBQUssVUFBVSxLQUFLLENBQUMsRUFBRTtBQUFBLE1BRTdGO0FBQ0Esd0NBQWtDLEVBQUUsR0FBRyxPQUFPLE1BQU0sS0FBQSxHQUFRLEtBQUs7QUFBQSxJQUFBLFdBQ3hELGVBQWUsRUFBRSxPQUFPO0FBQ2pDLFlBQU0sUUFBUSxJQUFJLElBQUksT0FBTyxHQUFHLENBQUM7QUFDakMsVUFBSSxVQUFVLFFBQVc7QUFDakIsY0FBQSxRQUNKLDRCQUE0QixHQUFHLHFDQUFxQyxLQUFLLFVBQ3ZFLEtBQUssQ0FDTixFQUFFO0FBQUEsTUFFUDtBQUNBLHdDQUFrQyxFQUFFLEdBQUcsT0FBTyxNQUFNLEtBQUEsR0FBUSxLQUFLO0FBQUEsSUFDbkUsV0FBVyxlQUFlLEVBQUU7QUFBTTtBQUFBLFNBRTNCO0FBQ0MsWUFBQSxRQUNKLDRCQUE0QixHQUFHLDhDQUE4QyxLQUFLLFVBQ2hGLEtBQUssQ0FDTixFQUFFO0FBQUEsSUFFUDtBQUFBLEVBQ1MsV0FBQSxNQUFNLEtBQUssV0FBVyxHQUFHO0FBQzlCLFFBQUEsZUFBZSxFQUFFLEtBQUs7QUFDeEIsWUFBTSxNQUFNLE9BQU8sTUFBTSxLQUFLLENBQUMsQ0FBQztBQUVoQyxjQUFRLE1BQU0sSUFBSTtBQUFBLFFBQ2hCLEtBQUs7QUFBQSxRQUNMLEtBQUssV0FBVztBQUNkLGNBQUksSUFBSSxLQUFLLHFCQUFxQixNQUFNLEtBQStCLENBQUM7QUFDeEU7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLLFVBQVU7QUFDYixjQUFJLE9BQU8sR0FBRztBQUNkO0FBQUEsUUFDRjtBQUFBLFFBQ0EsU0FBUztBQUNQLGdCQUFNLFFBQVEsaUNBQWlDO0FBQUEsUUFDakQ7QUFBQSxNQUNGO0FBQUEsSUFBQSxXQUNTLGVBQWUsRUFBRSxPQUFPO0FBQzNCLFlBQUEsTUFBTSxNQUFNLEtBQUssQ0FBQztBQUV4QixjQUFRLE1BQU0sSUFBSTtBQUFBLFFBQ2hCLEtBQUssV0FBVztBQUNkLGNBQUksUUFBUSxVQUFVO0FBQ3BCLGtCQUFNLFlBQVksTUFBTTtBQUNwQixnQkFBQSxJQUFJLFNBQVMsV0FBVztBQUNwQixvQkFBQSxXQUFXLElBQUksU0FBUztBQUMxQixrQkFBQSxPQUFPLFdBQVcsUUFBUTtBQUFBLFlBQ3JCLFdBQUEsSUFBSSxTQUFTLE1BQU0sT0FBTztBQUM3QixvQkFBQSxXQUFXLE1BQU0sUUFBUSxJQUFJO0FBQy9CLGtCQUFBLE9BQU8sSUFBSSxRQUFRLE1BQU0sUUFBUSxFQUFFLEtBQUssTUFBUyxDQUFDO0FBQUEsWUFDeEQ7QUFBQSxVQUFBLE9BQ0s7QUFDRCxnQkFBQSxPQUFPLE9BQU8sR0FBRyxDQUFDO0FBQ2xCLGdCQUFBLE9BQU8sT0FBTyxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsTUFBTSxLQUErQixDQUFDLENBQUM7QUFBQSxVQUN2RjtBQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxPQUFPO0FBQ04sY0FBQSxPQUFPLE9BQU8sR0FBRyxHQUFHLENBQUMscUJBQXFCLE1BQU0sS0FBK0IsQ0FBQyxDQUFDO0FBQ3JGO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxVQUFVO0FBQ1QsY0FBQSxPQUFPLE9BQU8sR0FBRyxDQUFDO0FBQ3RCO0FBQUEsUUFDRjtBQUFBLFFBQ0EsU0FBUztBQUNQLGdCQUFNLFFBQVEsbUNBQW1DO0FBQUEsUUFDbkQ7QUFBQSxNQUNGO0FBQUEsSUFDRixXQUFXLGVBQWUsRUFBRTtBQUFNO0FBQUEsU0FFM0I7QUFDQyxZQUFBLFFBQ0osb0VBQW9FLE9BQU8sTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtBQUFBLElBRXRIO0FBQUEsRUFBQSxPQUNLO0FBQ0wsVUFBTSxRQUFRLHdDQUF3QztBQUFBLEVBQ3hEO0FBQ0Y7QUMxRk0sU0FBVSxxQkFBcUIsU0FBZ0I7QUFDL0MsTUFBQSxtQkFBbUIsRUFBRSxPQUFPO0FBQzlCLFdBQU8sUUFBUSxJQUFJLENBQUMsTUFBTSxxQkFBcUIsQ0FBQyxDQUFDO0FBQUEsRUFDbkQ7QUFFSSxNQUFBLG1CQUFtQixFQUFFLEtBQUs7QUFDNUIsVUFBTSxNQUErQixDQUFBO0FBQzdCLFlBQUEsUUFBUSxDQUFDLEdBQUcsTUFBSztBQUNuQixVQUFBLENBQUMsSUFBSSxxQkFBcUIsQ0FBQztBQUFBLElBQUEsQ0FDaEM7QUFDTSxXQUFBO0FBQUEsRUFDVDtBQUVJLE1BQUEsbUJBQW1CLEVBQUUsTUFBTTtBQUN2QixVQUFBLFNBQVMsUUFBUTtBQUV2QixXQUFPLDZCQUE2QixjQUFjO0FBQUEsTUFDaEQsV0FBVyxPQUFPLFNBQVMsSUFBSSxDQUFDLEVBQUUsU0FBUyxNQUFNLE1BQU0sT0FBUSxDQUFBLElBQUksQ0FBRTtBQUFBLElBQUEsQ0FDdEU7QUFBQSxFQUNIO0FBR08sU0FBQTtBQUNUO0FDckJNLFNBQVUseUJBQXlCLE9BQW9CO0FBQzNELFFBQU0sVUFBbUIsQ0FBQTtBQUVyQixNQUFBLGlCQUFpQixFQUFFLFdBQVc7QUFDaEMsVUFBTSxTQUFTLE1BQU07QUFFckIsVUFBTSxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVEsUUFBTztBQUN6QyxZQUFNLE9BQU8sQ0FBQyxHQUFHLE1BQU0sTUFBTSxHQUFHO0FBRWhDLGNBQVEsT0FBTyxRQUFRO0FBQUEsUUFDckIsS0FBSztBQUNILGtCQUFRLEtBQUs7QUFBQSxZQUNYLElBQUk7QUFBQSxZQUNKO0FBQUEsWUFDQSxPQUFPLGFBQWEsT0FBTyxJQUFJLEdBQUcsQ0FBQztBQUFBLFVBQUEsQ0FDcEM7QUFDRDtBQUFBLFFBRUYsS0FBSztBQUNILGtCQUFRLEtBQUs7QUFBQSxZQUNYLElBQUk7QUFBQSxZQUNKO0FBQUEsWUFDQSxPQUFPLGFBQWEsT0FBTyxJQUFJLEdBQUcsQ0FBQztBQUFBLFVBQUEsQ0FDcEM7QUFDRDtBQUFBLFFBRUYsS0FBSztBQUNILGtCQUFRLEtBQUs7QUFBQSxZQUNYLElBQUk7QUFBQSxZQUNKO0FBQUEsVUFBQSxDQUNEO0FBQ0Q7QUFBQSxRQUVGO0FBQ0UsZ0JBQU0sUUFBUSxxQ0FBcUMsT0FBTyxNQUFNLEVBQUU7QUFBQSxNQUN0RTtBQUFBLElBQUEsQ0FDRDtBQUFBLEVBQUEsV0FDUSxpQkFBaUIsRUFBRSxhQUFhO0FBQ3pDLFFBQUksU0FBUztBQUNiLFVBQU0sUUFBUSxNQUFNLFFBQVEsQ0FBQyxXQUFVO0FBQ3JDLFVBQUksT0FBTyxRQUFRO0FBQ2pCLGtCQUFVLE9BQU87QUFBQSxNQUNuQjtBQUVBLFVBQUksT0FBTyxRQUFRO0FBRWpCLGNBQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxNQUFNLE1BQU07QUFDbkMsaUJBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDdEMsa0JBQVEsS0FBSztBQUFBLFlBQ1gsSUFBSTtBQUFBLFlBQ0o7QUFBQSxVQUFBLENBQ0Q7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUVBLFVBQUksT0FBTyxRQUFRO0FBQ1gsY0FBQSxZQUFZLE1BQU0sUUFBUSxPQUFPLE1BQU0sSUFBSSxPQUFPLFNBQVMsQ0FBQyxPQUFPLE1BQU07QUFDckUsa0JBQUEsUUFBUSxDQUFDLE1BQUs7QUFDdEIsZ0JBQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxNQUFNLE1BQU07QUFDbkMsa0JBQVEsS0FBSztBQUFBLFlBQ1gsSUFBSTtBQUFBLFlBQ0o7QUFBQSxZQUNBLE9BQU8sYUFBYSxDQUFDO0FBQUEsVUFBQSxDQUN0QjtBQUNEO0FBQUEsUUFBQSxDQUNEO0FBQUEsTUFDSDtBQUFBLElBQUEsQ0FDRDtBQUFBLEVBQUEsV0FDUSxpQkFBaUIsRUFBRSxZQUFZO0FBQ3hDLFVBQU0sT0FBTztBQUFBLE1BQUMsR0FBRyxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQWE7QUFBQTtBQUFBLElBQUE7QUFDMUMsWUFBUSxLQUFLO0FBQUEsTUFDWCxJQUFJO0FBQUEsTUFDSjtBQUFBLE1BQ0EsT0FBTyxFQUFFLFNBQVMsTUFBTSxNQUFNLE1BQU0sTUFBTztBQUFBLElBQUEsQ0FDNUM7QUFBQSxFQUNIO0FBRU8sU0FBQTtBQUNUO0FBRUEsU0FBUyxhQUFhLEdBQXFEO0FBQ3pFLE1BQUksYUFBYSxFQUFFLE9BQU8sYUFBYSxFQUFFLE9BQU87QUFDOUMsV0FBTyxFQUFFO0VBQU0sT0FDVjtBQUNFLFdBQUE7QUFBQSxFQUNUO0FBQ0Y7QUNyRU0sU0FBVSxzQkFFZCxFQUNBLFFBQ0EsV0FDQSxvQkFjRDtBQWNPLFFBQUEsWUFBWSxPQUFPLHdDQUF3QztBQUVqRSxNQUFJLG1DQUFtQztBQUV2QyxRQUFNLGlCQUFvQztBQUFBLElBQ3hDO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxhQUFhO0FBQUE7QUFBQSxJQUViLElBQUkscUNBQWtDO0FBQ3BDLGFBQU8sbUNBQW1DO0FBQUEsSUFDNUM7QUFBQSxFQUFBO0FBR0ksUUFBQSxVQUFVLHFCQUFxQixTQUFvQjtBQUV6RCxRQUFNLDhCQUFzRSxDQUFBO0FBRTVFLFFBQU0sb0JBQW9CLE1BQUs7QUFDN0IsVUFBTSx5QkFBeUIsZ0JBQWdCLENBQUMsUUFBUSxZQUFXO0FBQ2pFLGtDQUE0QixLQUFLLEVBQUUsUUFBUSxRQUFTLENBQUE7QUFBQSxJQUFBLENBQ3JEO0FBRUcsUUFBQTtBQUNJQyxZQUFBQSxlQUFjLGtCQUFrQixNQUNwQyxNQUFNLGFBQWEsa0JBQWtCLE9BQXFELEdBQzFGLGNBQWM7QUFFaEIsd0JBQWtCLElBQUlBLGNBQWEsRUFBRSxHQUFHLGdCQUFnQixhQUFBQSxjQUFhO0FBQzlEQSxhQUFBQTtBQUFBQSxJQUFBOztJQUdUO0FBQUEsRUFBQTtBQUdGLFFBQU0sY0FBYztBQUdkLFFBQUEsZ0JBQWdCLE9BQU8sQ0FBQyxXQUEyQjtBQUN2RCxVQUFNLFVBQW1CLENBQUE7QUFDbEIsV0FBQSxRQUFRLENBQUMsVUFBUzs7QUFDbkIsVUFBQSxNQUFNLFlBQVksV0FBVyxXQUFXO0FBQzFDLGdCQUFRLEtBQUssR0FBRyx5QkFBeUIsS0FBSyxDQUFDO0FBQUEsTUFDakQ7QUFFQSxVQUFJLE1BQU0sa0JBQWtCLEVBQUUsT0FBTyxNQUFNLGtCQUFrQixFQUFFLE9BQU87QUFDL0MsbUNBQUEsTUFBTSxNQUFNLE1BQVosbUJBQWU7QUFBQSxNQUN0QztBQUFBLElBQUEsQ0FDRDtBQUVHLFFBQUEsUUFBUSxTQUFTLEdBQUc7QUFDdEI7QUFDSSxVQUFBO0FBQ0YscUJBQWEsYUFBYSxPQUFPO0FBQUEsTUFBQTtBQUVqQztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFBQSxDQUNEO0FBRUQsWUFBVSxZQUFZLGFBQWE7QUFHbkMsTUFBSSwrQkFBMEMsQ0FBQTtBQUM5QyxRQUFNLG1CQUFtQixVQUFVLGFBQWEsQ0FBQyxZQUFXO0FBQzFELFFBQUksbUNBQW1DLEdBQUc7QUFDeEM7QUFBQSxJQUNGO0FBRUEsaUNBQTZCLEtBQUssT0FBTztBQUFBLEVBQUEsQ0FDMUM7QUFHSyxRQUFBLG9CQUFvQixXQUFXLGFBQWEsTUFBSztBQUNqRCxRQUFBLDZCQUE2QixXQUFXLEdBQUc7QUFDN0M7QUFBQSxJQUNGO0FBRUEsVUFBTSx3QkFBd0I7QUFDOUIsbUNBQStCLENBQUE7QUFFL0IsV0FBTyxTQUFTLE1BQUs7QUFDRyw0QkFBQSxRQUFRLENBQUMsbUJBQWtCO0FBQ2hDLHVCQUFBLFFBQVEsQ0FBQyxVQUFTO0FBQy9CLDRDQUFrQyxPQUFPLFNBQVM7QUFBQSxRQUFBLENBQ25EO0FBQUEsTUFBQSxDQUNGO0FBQUEsT0FDQSxTQUFTO0FBQUEsRUFBQSxDQUNiO0FBR0QsU0FBTyxTQUFTLE1BQUs7QUFJbkIsUUFBSSxtQkFBbUI7QUFFdkIsZ0NBQTRCLFFBQVEsQ0FBQyxFQUFFLFFBQVEsY0FBYTtBQUMxRCxVQUFJLENBQUMsa0JBQWtCO0FBQ3JCLFlBQUksV0FBVyxhQUFhO0FBQzFCO0FBQUEsUUFDRjtBQUNtQiwyQkFBQTtBQUFBLE1BQ3JCO0FBRU0sWUFBQSxvQkFBb0IscUJBQXFCLGFBQWEsTUFBTTtBQUVsRSxVQUFJLHNCQUFzQixRQUFXO0FBQzNCLGdCQUFBLFFBQVEsQ0FBQyxVQUFTO0FBRXRCLDRDQUFBO0FBQUEsWUFDRSxHQUFHO0FBQUEsWUFDSCxNQUFNLENBQUMsR0FBRyxtQkFBbUIsR0FBRyxNQUFNLElBQUk7QUFBQSxhQUU1QyxTQUFTO0FBQUEsUUFBQSxDQUVaO0FBQUEsTUFDSDtBQUFBLElBQUEsQ0FDRDtBQUFBLEtBQ0EsU0FBUztBQUVMLFNBQUE7QUFBQSxJQUNMO0FBQUEsSUFDQSxTQUFTLE1BQUs7OztBQUdaLGdCQUFVLGNBQWMsYUFBYTtBQUFBLElBQ3ZDO0FBQUEsSUFDQTtBQUFBLEVBQUE7QUFFSjsifQ==
|
|
@@ -587,4 +587,4 @@ var __publicField = (obj, key, value) => {
|
|
|
587
587
|
exports2.yjsTextModelId = yjsTextModelId;
|
|
588
588
|
Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
|
|
589
589
|
});
|
|
590
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tLnRzIiwiLi4vc3JjL2JpbmRpbmcvcmVzb2x2ZVlqc1BhdGgudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydFlqc0V2ZW50VG9QYXRjaGVzLnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgSUF0b20sIGNyZWF0ZUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG5jb25zdCB5anNDb2xsZWN0aW9uQXRvbXMgPSBuZXcgV2Vha01hcDxZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4sIElBdG9tPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tID0+IHtcbiAgbGV0IGF0b20gPSB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG4gIGlmICghYXRvbSkge1xuICAgIGF0b20gPSBjcmVhdGVBdG9tKGB5anNDb2xsZWN0aW9uQXRvbWApXG4gICAgeWpzQ29sbGVjdGlvbkF0b21zLnNldCh5anNDb2xsZWN0aW9uLCBhdG9tKVxuICB9XG4gIHJldHVybiBhdG9tXG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0OiB1bmtub3duLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gIGxldCBjdXJyZW50WWpzT2JqZWN0OiB1bmtub3duID0geWpzT2JqZWN0XG5cbiAgcGF0aC5mb3JFYWNoKChwYXRoUGFydCwgaSkgPT4ge1xuICAgIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxuICAgICAgY3VycmVudFlqc09iamVjdCA9IGN1cnJlbnRZanNPYmplY3QuZ2V0KGtleSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IE51bWJlcihwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxuICAgICAgICApfSBpbiBvcmRlciB0byByZXNvbHZlIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0sIGJ1dCBnb3QgJHtjdXJyZW50WWpzT2JqZWN0fSBpbnN0ZWFkYFxuICAgICAgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gY3VycmVudFlqc09iamVjdFxufVxuIiwiaW1wb3J0IHsgSUF0b20sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEZyb3plbixcbiAgTW9kZWwsXG4gIGZyb3plbixcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG1vZGVsLFxuICBvblNuYXBzaG90LFxuICB0UHJvcCxcbiAgdHlwZXMsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcbmltcG9ydCB7IHJlc29sdmVZanNQYXRoIH0gZnJvbSBcIi4vcmVzb2x2ZVlqc1BhdGhcIlxuXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cbi8vIHdlIHVzZSBmcm96ZW4gc28gdGhhdCB3ZSBjYW4gcmV1c2UgZWFjaCBkZWx0YSBjaGFuZ2VcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXG5cbmV4cG9ydCBjb25zdCB5anNUZXh0TW9kZWxJZCA9IFwibW9ieC1rZXlzdG9uZS15anMvWWpzVGV4dE1vZGVsXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgbW9kZWwgdGhhdCByZXByZXNlbnRzIGEgWWpzLlRleHQgb2JqZWN0LlxuICovXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXG5leHBvcnQgY2xhc3MgWWpzVGV4dE1vZGVsIGV4dGVuZHMgTW9kZWwoe1xuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIHdpdGhUZXh0KHRleHQ6IHN0cmluZyk6IFlqc1RleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xuICAgICAgZGVsdGFMaXN0OiBbXG4gICAgICAgIGZyb3plbihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG4gICAgaWYgKGN0eD8uYm91bmRPYmplY3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxuICAgIGlmICghcGF0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcblxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcblxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcblxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHlqc09iamVjdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cbiAgICovXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcblxuICAvKipcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1iYXNlLXRvLXN0cmluZ1xuICAgIHJldHVybiB0aGlzLnlqc1RleHQudG9TdHJpbmcoKVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdCgpIHtcbiAgICBjb25zdCBzaG91bGRSZXBsaWNhdGVUb1lqcyA9IChjdHg6IFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkKTogY3R4IGlzIFlqc0JpbmRpbmdDb250ZXh0ID0+IHtcbiAgICAgIHJldHVybiAhIWN0eCAmJiAhIWN0eC5ib3VuZE9iamVjdCAmJiAhY3R4LmlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmVcbiAgICB9XG5cbiAgICBsZXQgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgY29uc3QgbmV3RGVsdGFzOiBGcm96ZW48dW5rbm93bltdPltdID0gW11cblxuICAgIGxldCBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSA9IHJlYWN0aW9uKFxuICAgICAgKCkgPT4gdGhpcy4kLmRlbHRhTGlzdCxcbiAgICAgIChkZWx0YUxpc3QpID0+IHtcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSBvYnNlcnZlKGRlbHRhTGlzdCwgKGNoYW5nZSkgPT4ge1xuICAgICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgICAvLyBhbHJlYWR5IGdvbm5hIHJlcGxhY2UgdGhlbSBhbGxcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXNob3VsZFJlcGxpY2F0ZVRvWWpzKHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSkpIHtcbiAgICAgICAgICAgIC8vIHlqcyB0ZXh0IGlzIGFscmVhZHkgdXAgdG8gZGF0ZSB3aXRoIHRoZXNlIGNoYW5nZXNcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYW5nZS50eXBlID09PSBcInNwbGljZVwiICYmXG4gICAgICAgICAgICBjaGFuZ2UucmVtb3ZlZENvdW50ID09PSAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuYWRkZWRDb3VudCA+IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS5pbmRleCA9PT0gdGhpcy5kZWx0YUxpc3QubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGp1c3QgYWRkaW5nIG5ldyBvbmVzIHRvIHRoZSBlbmRcbiAgICAgICAgICAgIG5ld0RlbHRhcy5wdXNoKC4uLmNoYW5nZS5hZGRlZClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYW55IG90aGVyIGNoYW5nZSwgd2UgbmVlZCB0byByZWFwcGx5IGFsbCBkZWx0YXNcbiAgICAgICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHsgZmlyZUltbWVkaWF0ZWx5OiB0cnVlIH1cbiAgICApXG5cbiAgICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QodGhpcywgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGEgYmV0dGVyIHdheSB0aGFuIHRoaXMgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgWS5UZXh0IG9iamVjdFxuICAgICAgICAgICAgICBpZiAoeWpzVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5kZWxldGUoMCwgeWpzVGV4dC5sZW5ndGgpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChuZXdEZWx0YXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xuXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgbmV3RGVsdGFzLmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcbiAgICAgICAgbmV3RGVsdGFzLmxlbmd0aCA9IDBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tID0gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShcbiAgICAgICgpID0+IHRoaXMueWpzVGV4dCxcbiAgICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tXG4gICAgKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcblxuICAgICAgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tKClcbiAgICB9XG4gIH1cbn1cblxuLy8gd2UgdXNlIHRoaXMgdHJpY2sganVzdCB0byBhdm9pZCBhIGJhYmVsIGJ1ZyB0aGF0IGNhdXNlcyBjbGFzc2VzIHVzZWQgaW5zaWRlIGNsYXNzZXMgbm90IHRvIGJlIG92ZXJyaWRlblxuLy8gYnkgdGhlIGRlY29yYXRvclxuY29uc3QgRGVjb3JhdGVkWWpzVGV4dE1vZGVsID0gWWpzVGV4dE1vZGVsXG5cbmZ1bmN0aW9uIGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oZ2V0WWpzVGV4dDogKCkgPT4gWS5UZXh0LCB0ZXh0Q2hhbmdlZEF0b206IElBdG9tKSB7XG4gIGxldCBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG9ic2VydmVGbiA9ICgpID0+IHtcbiAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cblxuICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlID0gcmVhY3Rpb24oXG4gICAgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdldFlqc1RleHQoKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICAgICh5anNUZXh0KSA9PiB7XG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcblxuICAgICAgaWYgKHlqc1RleHQpIHtcbiAgICAgICAgeWpzVGV4dC5vYnNlcnZlKG9ic2VydmVGbilcblxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSAoKSA9PiB7XG4gICAgICAgICAgeWpzVGV4dC51bm9ic2VydmUob2JzZXJ2ZUZuKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcbiAgICB9XG4gIClcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UoKVxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCwgeWpzVGV4dE1vZGVsSWQgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuaW1wb3J0IHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCB7IFlqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQge1xuICBKc29uQXJyYXlXaXRoVW5kZWZpbmVkLFxuICBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCxcbiAgSnNvblByaW1pdGl2ZVdpdGhVbmRlZmluZWQsXG4gIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQsXG59IGZyb20gXCJqc29uVHlwZXNcIlxuXG5mdW5jdGlvbiBpc0pzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB2XG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gaXNKc29uQXJyYXlXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25BcnJheVdpdGhVbmRlZmluZWQge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc0pzb25PYmplY3RXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkIHtcbiAgcmV0dXJuICFpc0pzb25BcnJheVdpdGhVbmRlZmluZWQodikgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIEpTT04gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXG4gKiBGcm96ZW4gdmFsdWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBhbmQgdGhleSBhcmUga2VwdCBhcyBpbW11dGFibGUgcGxhaW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB8IHVuZGVmaW5lZCk6IFlqc0RhdGEge1xuICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IGlzSnNvblByaW1pdGl2ZVdpdGhVbmRlZmluZWQodikpIHtcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgaWYgKGlzSnNvbkFycmF5V2l0aFVuZGVmaW5lZCh2KSkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcbiAgICBhcHBseUpzb25BcnJheVRvWUFycmF5KGFyciwgdilcbiAgICByZXR1cm4gYXJyIGFzIFlqc0RhdGFcbiAgfVxuXG4gIGlmIChpc0pzb25PYmplY3RXaXRoVW5kZWZpbmVkKHYpKSB7XG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcbiAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwIGFzIFlqc0RhdGFcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlUb1lBcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpzb25BcnJheVdpdGhVbmRlZmluZWQpIHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpzb25PYmplY3RXaXRoVW5kZWZpbmVkKSB7XG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgZGVzdC5zZXQoaywgY29udmVydEpzb25Ub1lqc0RhdGEodikpXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuaW1wb3J0IHsgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB9IGZyb20gXCJqc29uVHlwZXNcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcblxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpIGFzIHVua25vd25cbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgcGF0Y2hcbiAgICAgICAgICApfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAgIC8vIGNoYW5nZXMgdG8gZGVsdGFMaXN0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYXJyYXkgb2JzZXJ2ZSBpbiB0aGUgWWpzVGV4dE1vZGVsIGNsYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwYXRjaFxuICAgICAgICApfWBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRjaC5wYXRoWzBdKVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBtYXBgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IHBhdGNoLnZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gbmV3TGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5kZWxldGUobmV3TGVuZ3RoLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBhIFlqc1RleHRNb2RlbCwgZG8gbm90aGluZ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtTdHJpbmcocGF0Y2gucGF0aFswXSl9XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQsIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXG5cbmV4cG9ydCB0eXBlIFlqc0RhdGEgPSBZLkFycmF5PFlqc0RhdGE+IHwgWS5NYXA8WWpzRGF0YT4gfCBZLlRleHQgfCBKc29uVmFsdWVXaXRoVW5kZWZpbmVkXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNEYXRhOiBZanNEYXRhKTogSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB7XG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB5anNEYXRhLm1hcCgodikgPT4gY29udmVydFlqc0RhdGFUb0pzb24odikpXG4gIH1cblxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgY29uc3Qgb2JqOiBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCA9IHt9XG4gICAgeWpzRGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICBvYmpba10gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KVxuICAgIH0pXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICBjb25zdCBkZWx0YXMgPSB5anNEYXRhLnRvRGVsdGEoKSBhcyB1bmtub3duW11cblxuICAgIHJldHVybiBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhKFlqc1RleHRNb2RlbCwge1xuICAgICAgZGVsdGFMaXN0OiBkZWx0YXMubGVuZ3RoID4gMCA/IFt7ICRmcm96ZW46IHRydWUsIGRhdGE6IGRlbHRhcyB9XSA6IFtdLFxuICAgIH0pIGFzIHVua25vd24gYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZFxuICB9XG5cbiAgLy8gYXNzdW1lIGl0J3MgYSBwcmltaXRpdmVcbiAgcmV0dXJuIHlqc0RhdGFcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7XG4gIEpzb25BcnJheVdpdGhVbmRlZmluZWQsXG4gIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkLFxuICBKc29uVmFsdWVXaXRoVW5kZWZpbmVkLFxufSBmcm9tIFwiLi4vanNvblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZVGV4dEV2ZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBcImRlbHRhTGlzdFwiLCAtMSAvKiBsYXN0IGl0ZW0gKi9dXG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHZhbHVlOiB7ICRmcm96ZW46IHRydWUsIGRhdGE6IGV2ZW50LmRlbHRhIH0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRjaGVzXG59XG5cbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCkge1xuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQgfCBKc29uQXJyYXlXaXRoVW5kZWZpbmVkXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBNb2RlbENsYXNzLFxuICBQYXRjaCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgWWpzRGF0YSwgY29udmVydFlqc0RhdGFUb0pzb24gfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXG59KToge1xuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgZGlzcG9zZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG59IHtcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcblxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXG5cbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHlqc09iamVjdCBhcyBZanNEYXRhKVxuXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUJvdW5kT2JqZWN0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvdW5kT2JqZWN0ID0geWpzQmluZGluZ0NvbnRleHQuYXBwbHkoXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIHVua25vd24gYXMgU25hcHNob3RJbk9mPFR5cGVUb0RhdGE8VFR5cGU+PiksXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgICApXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIHsgLi4uYmluZGluZ0NvbnRleHQsIGJvdW5kT2JqZWN0IH0pXG4gICAgICByZXR1cm4gYm91bmRPYmplY3RcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSBhY3Rpb24oKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBZLk1hcCB8fCBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICAgIGdldFlqc0NvbGxlY3Rpb25BdG9tKGV2ZW50LnRhcmdldCk/LnJlcG9ydENoYW5nZWQoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSsrXG4gICAgICB0cnkge1xuICAgICAgICBhcHBseVBhdGNoZXMoYm91bmRPYmplY3QsIHBhdGNoZXMpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZS0tXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSBtb2J4LWtleXN0b25lIHRvIHlqc1xuICBsZXQgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlczogUGF0Y2hbXVtdID0gW11cbiAgY29uc3QgZGlzcG9zZU9uUGF0Y2hlcyA9IG9uUGF0Y2hlcyhib3VuZE9iamVjdCwgKHBhdGNoZXMpID0+IHtcbiAgICBpZiAoYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLnB1c2gocGF0Y2hlcylcbiAgfSlcblxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlc1xuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBbXVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIGFycmF5T2ZBcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChhcnJheU9mUGF0Y2hlcykgPT4ge1xuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICByZXR1cm4ge1xuICAgIGJvdW5kT2JqZWN0LFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcbiAgICB9LFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVBdG9tIiwiWSIsInR5cGVzIiwiWWpzVGV4dE1vZGVsIiwiTW9kZWwiLCJ0UHJvcCIsImZyb3plbiIsImdldFBhcmVudFRvQ2hpbGRQYXRoIiwicmVhY3Rpb24iLCJvYnNlcnZlIiwib25TbmFwc2hvdCIsImNvbXB1dGVkIiwiZXhwb3J0cyIsIm1vZGVsIiwibW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSIsIm9uR2xvYmFsUGF0Y2hlcyIsImJvdW5kT2JqZWN0IiwiZnJvbVNuYXBzaG90IiwiYWN0aW9uIiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUdNLE1BQU8sNkJBQTZCLE1BQUs7QUFBQSxJQUM3QyxZQUFZLEtBQVc7QUFDckIsWUFBTSxHQUFHO0FBR0YsYUFBQSxlQUFlLE1BQU0scUJBQXFCLFNBQVM7QUFBQSxJQUM1RDtBQUFBLEVBQ0Q7QUFLSyxXQUFVLFFBQVEsS0FBVztBQUMxQixXQUFBLElBQUkscUJBQXFCLEdBQUc7QUFBQSxFQUNyQztBQ3dCYSxRQUFBLG9CQUFvQkEsMkJBQTZDLE1BQVM7QUN0Q3ZGLFFBQU0seUNBQXlCO0FBS2xCLFFBQUEsdUJBQXVCLENBQ2xDLGtCQUNxQjtBQUNkLFdBQUEsbUJBQW1CLElBQUksYUFBYTtBQUFBLEVBQzdDO0FBS2EsUUFBQSwrQkFBK0IsQ0FDMUMsa0JBQ1M7QUFDTCxRQUFBLE9BQU8sbUJBQW1CLElBQUksYUFBYTtBQUMv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
|
|
590
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy95anNCaW5kaW5nQ29udGV4dC50cyIsIi4uL3NyYy91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tLnRzIiwiLi4vc3JjL2JpbmRpbmcvcmVzb2x2ZVlqc1BhdGgudHMiLCIuLi9zcmMvYmluZGluZy9ZanNUZXh0TW9kZWwudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0SnNvblRvWWpzRGF0YS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNEYXRhVG9Kc29uLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydFlqc0V2ZW50VG9QYXRjaGVzLnRzIiwiLi4vc3JjL2JpbmRpbmcvYmluZFlqc1RvTW9ieEtleXN0b25lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIG1vYngta2V5c3RvbmUteWpzIGVycm9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1vYnhLZXlzdG9uZVlqc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihtc2cpXHJcblxyXG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNb2J4S2V5c3RvbmVZanNFcnJvci5wcm90b3R5cGUpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZShtc2c6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgTW9ieEtleXN0b25lWWpzRXJyb3IobXNnKVxyXG59XHJcbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgSUF0b20sIGNyZWF0ZUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG5jb25zdCB5anNDb2xsZWN0aW9uQXRvbXMgPSBuZXcgV2Vha01hcDxZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4sIElBdG9tPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tID0+IHtcbiAgbGV0IGF0b20gPSB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG4gIGlmICghYXRvbSkge1xuICAgIGF0b20gPSBjcmVhdGVBdG9tKGB5anNDb2xsZWN0aW9uQXRvbWApXG4gICAgeWpzQ29sbGVjdGlvbkF0b21zLnNldCh5anNDb2xsZWN0aW9uLCBhdG9tKVxuICB9XG4gIHJldHVybiBhdG9tXG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tIH0gZnJvbSBcIi4uL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b21cIlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0OiB1bmtub3duLCBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gIGxldCBjdXJyZW50WWpzT2JqZWN0OiB1bmtub3duID0geWpzT2JqZWN0XG5cbiAgcGF0aC5mb3JFYWNoKChwYXRoUGFydCwgaSkgPT4ge1xuICAgIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxuICAgICAgY3VycmVudFlqc09iamVjdCA9IGN1cnJlbnRZanNPYmplY3QuZ2V0KGtleSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IE51bWJlcihwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxuICAgICAgICApfSBpbiBvcmRlciB0byByZXNvbHZlIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0sIGJ1dCBnb3QgJHtjdXJyZW50WWpzT2JqZWN0fSBpbnN0ZWFkYFxuICAgICAgKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gY3VycmVudFlqc09iamVjdFxufVxuIiwiaW1wb3J0IHsgSUF0b20sIGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEZyb3plbixcbiAgTW9kZWwsXG4gIGZyb3plbixcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG1vZGVsLFxuICBvblNuYXBzaG90LFxuICB0UHJvcCxcbiAgdHlwZXMsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcbmltcG9ydCB7IHJlc29sdmVZanNQYXRoIH0gZnJvbSBcIi4vcmVzb2x2ZVlqc1BhdGhcIlxuXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cbi8vIHdlIHVzZSBmcm96ZW4gc28gdGhhdCB3ZSBjYW4gcmV1c2UgZWFjaCBkZWx0YSBjaGFuZ2VcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXG5cbmV4cG9ydCBjb25zdCB5anNUZXh0TW9kZWxJZCA9IFwibW9ieC1rZXlzdG9uZS15anMvWWpzVGV4dE1vZGVsXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgbW9kZWwgdGhhdCByZXByZXNlbnRzIGEgWWpzLlRleHQgb2JqZWN0LlxuICovXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXG5leHBvcnQgY2xhc3MgWWpzVGV4dE1vZGVsIGV4dGVuZHMgTW9kZWwoe1xuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIHdpdGhUZXh0KHRleHQ6IHN0cmluZyk6IFlqc1RleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xuICAgICAgZGVsdGFMaXN0OiBbXG4gICAgICAgIGZyb3plbihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG4gICAgaWYgKGN0eD8uYm91bmRPYmplY3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxuICAgIGlmICghcGF0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcblxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcblxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcblxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHlqc09iamVjdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cbiAgICovXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcblxuICAvKipcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1iYXNlLXRvLXN0cmluZ1xuICAgIHJldHVybiB0aGlzLnlqc1RleHQudG9TdHJpbmcoKVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdCgpIHtcbiAgICBjb25zdCBzaG91bGRSZXBsaWNhdGVUb1lqcyA9IChjdHg6IFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkKTogY3R4IGlzIFlqc0JpbmRpbmdDb250ZXh0ID0+IHtcbiAgICAgIHJldHVybiAhIWN0eCAmJiAhIWN0eC5ib3VuZE9iamVjdCAmJiAhY3R4LmlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmVcbiAgICB9XG5cbiAgICBsZXQgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgY29uc3QgbmV3RGVsdGFzOiBGcm96ZW48dW5rbm93bltdPltdID0gW11cblxuICAgIGxldCBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSA9IHJlYWN0aW9uKFxuICAgICAgKCkgPT4gdGhpcy4kLmRlbHRhTGlzdCxcbiAgICAgIChkZWx0YUxpc3QpID0+IHtcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSBvYnNlcnZlKGRlbHRhTGlzdCwgKGNoYW5nZSkgPT4ge1xuICAgICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgICAvLyBhbHJlYWR5IGdvbm5hIHJlcGxhY2UgdGhlbSBhbGxcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXNob3VsZFJlcGxpY2F0ZVRvWWpzKHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSkpIHtcbiAgICAgICAgICAgIC8vIHlqcyB0ZXh0IGlzIGFscmVhZHkgdXAgdG8gZGF0ZSB3aXRoIHRoZXNlIGNoYW5nZXNcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYW5nZS50eXBlID09PSBcInNwbGljZVwiICYmXG4gICAgICAgICAgICBjaGFuZ2UucmVtb3ZlZENvdW50ID09PSAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuYWRkZWRDb3VudCA+IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS5pbmRleCA9PT0gdGhpcy5kZWx0YUxpc3QubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGp1c3QgYWRkaW5nIG5ldyBvbmVzIHRvIHRoZSBlbmRcbiAgICAgICAgICAgIG5ld0RlbHRhcy5wdXNoKC4uLmNoYW5nZS5hZGRlZClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYW55IG90aGVyIGNoYW5nZSwgd2UgbmVlZCB0byByZWFwcGx5IGFsbCBkZWx0YXNcbiAgICAgICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHsgZmlyZUltbWVkaWF0ZWx5OiB0cnVlIH1cbiAgICApXG5cbiAgICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QodGhpcywgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGEgYmV0dGVyIHdheSB0aGFuIHRoaXMgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgWS5UZXh0IG9iamVjdFxuICAgICAgICAgICAgICBpZiAoeWpzVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5kZWxldGUoMCwgeWpzVGV4dC5sZW5ndGgpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChuZXdEZWx0YXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xuXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgbmV3RGVsdGFzLmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcbiAgICAgICAgbmV3RGVsdGFzLmxlbmd0aCA9IDBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tID0gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShcbiAgICAgICgpID0+IHRoaXMueWpzVGV4dCxcbiAgICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tXG4gICAgKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcblxuICAgICAgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tKClcbiAgICB9XG4gIH1cbn1cblxuLy8gd2UgdXNlIHRoaXMgdHJpY2sganVzdCB0byBhdm9pZCBhIGJhYmVsIGJ1ZyB0aGF0IGNhdXNlcyBjbGFzc2VzIHVzZWQgaW5zaWRlIGNsYXNzZXMgbm90IHRvIGJlIG92ZXJyaWRlblxuLy8gYnkgdGhlIGRlY29yYXRvclxuY29uc3QgRGVjb3JhdGVkWWpzVGV4dE1vZGVsID0gWWpzVGV4dE1vZGVsXG5cbmZ1bmN0aW9uIGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oZ2V0WWpzVGV4dDogKCkgPT4gWS5UZXh0LCB0ZXh0Q2hhbmdlZEF0b206IElBdG9tKSB7XG4gIGxldCBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG9ic2VydmVGbiA9ICgpID0+IHtcbiAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cblxuICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlID0gcmVhY3Rpb24oXG4gICAgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdldFlqc1RleHQoKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICAgICh5anNUZXh0KSA9PiB7XG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcblxuICAgICAgaWYgKHlqc1RleHQpIHtcbiAgICAgICAgeWpzVGV4dC5vYnNlcnZlKG9ic2VydmVGbilcblxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSAoKSA9PiB7XG4gICAgICAgICAgeWpzVGV4dC51bm9ic2VydmUob2JzZXJ2ZUZuKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpcmVJbW1lZGlhdGVseTogdHJ1ZSxcbiAgICB9XG4gIClcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UoKVxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQgPSB1bmRlZmluZWRcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCwgeWpzVGV4dE1vZGVsSWQgfSBmcm9tIFwiLi9ZanNUZXh0TW9kZWxcIlxuaW1wb3J0IHsgU25hcHNob3RPdXRPZiB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCB7IFlqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQge1xuICBKc29uQXJyYXlXaXRoVW5kZWZpbmVkLFxuICBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCxcbiAgSnNvblByaW1pdGl2ZVdpdGhVbmRlZmluZWQsXG4gIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQsXG59IGZyb20gXCIuLi9qc29uVHlwZXNcIlxuXG5mdW5jdGlvbiBpc0pzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25QcmltaXRpdmVXaXRoVW5kZWZpbmVkIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB2XG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gaXNKc29uQXJyYXlXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25BcnJheVdpdGhVbmRlZmluZWQge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc0pzb25PYmplY3RXaXRoVW5kZWZpbmVkKHY6IEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpOiB2IGlzIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkIHtcbiAgcmV0dXJuICFpc0pzb25BcnJheVdpdGhVbmRlZmluZWQodikgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIEpTT04gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXG4gKiBGcm96ZW4gdmFsdWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBhbmQgdGhleSBhcmUga2VwdCBhcyBpbW11dGFibGUgcGxhaW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB8IHVuZGVmaW5lZCk6IFlqc0RhdGEge1xuICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IGlzSnNvblByaW1pdGl2ZVdpdGhVbmRlZmluZWQodikpIHtcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgaWYgKGlzSnNvbkFycmF5V2l0aFVuZGVmaW5lZCh2KSkge1xuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcbiAgICBhcHBseUpzb25BcnJheVRvWUFycmF5KGFyciwgdilcbiAgICByZXR1cm4gYXJyIGFzIFlqc0RhdGFcbiAgfVxuXG4gIGlmIChpc0pzb25PYmplY3RXaXRoVW5kZWZpbmVkKHYpKSB7XG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcbiAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwIGFzIFlqc0RhdGFcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdmFsdWUgdHlwZTogJHt2fWApXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gYXJyYXkgdG8gYSBZLkFycmF5LCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uQXJyYXlUb1lBcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpzb25BcnJheVdpdGhVbmRlZmluZWQpIHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0VG9ZTWFwKGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpzb25PYmplY3RXaXRoVW5kZWZpbmVkKSB7XG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgZGVzdC5zZXQoaywgY29udmVydEpzb25Ub1lqc0RhdGEodikpXG4gIH0pXG59XG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuaW1wb3J0IHsgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGNoLnBhdGhcblxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KFN0cmluZyhrZXkpKSBhcyB1bmtub3duXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpIGFzIHVua25vd25cbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBhcnJheSAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgcGF0Y2hcbiAgICAgICAgICApfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICAgIC8vIGNoYW5nZXMgdG8gZGVsdGFMaXN0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYXJyYXkgb2JzZXJ2ZSBpbiB0aGUgWWpzVGV4dE1vZGVsIGNsYXNzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBwYXRjaFxuICAgICAgICApfWBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRjaC5wYXRoWzBdKVxuXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHlqcy5zZXQoa2V5LCBjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBtYXBgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh5anMgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IHBhdGNoLnZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gbmV3TGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5kZWxldGUobmV3TGVuZ3RoLCB0b0RlbGV0ZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvSW5zZXJ0ID0gcGF0Y2gudmFsdWUgLSB5anMubGVuZ3RoXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBKc29uVmFsdWVXaXRoVW5kZWZpbmVkKV0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW2NvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQpXSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBhIFlqc1RleHRNb2RlbCwgZG8gbm90aGluZ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCB0aGUgWWpzIG9iamVjdCBpcyBvZiBhbiB1bmtvd24gdHlwZSwgc28ga2V5IFwiJHtTdHJpbmcocGF0Y2gucGF0aFswXSl9XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIHBhdGgsIGl0IGNhbm5vdCBiZSBlbXB0eWApXG4gIH1cbn1cbiIsImltcG9ydCB7IG1vZGVsU25hcHNob3RPdXRXaXRoTWV0YWRhdGEgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQsIEpzb25WYWx1ZVdpdGhVbmRlZmluZWQgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcbmltcG9ydCB7IFlqc1RleHRNb2RlbCB9IGZyb20gXCIuL1lqc1RleHRNb2RlbFwiXG5cbmV4cG9ydCB0eXBlIFlqc0RhdGEgPSBZLkFycmF5PFlqc0RhdGE+IHwgWS5NYXA8WWpzRGF0YT4gfCBZLlRleHQgfCBKc29uVmFsdWVXaXRoVW5kZWZpbmVkXG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNEYXRhOiBZanNEYXRhKTogSnNvblZhbHVlV2l0aFVuZGVmaW5lZCB7XG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgIHJldHVybiB5anNEYXRhLm1hcCgodikgPT4gY29udmVydFlqc0RhdGFUb0pzb24odikpXG4gIH1cblxuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgY29uc3Qgb2JqOiBKc29uT2JqZWN0V2l0aFVuZGVmaW5lZCA9IHt9XG4gICAgeWpzRGF0YS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICBvYmpba10gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KVxuICAgIH0pXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLlRleHQpIHtcbiAgICBjb25zdCBkZWx0YXMgPSB5anNEYXRhLnRvRGVsdGEoKSBhcyB1bmtub3duW11cblxuICAgIHJldHVybiBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhKFlqc1RleHRNb2RlbCwge1xuICAgICAgZGVsdGFMaXN0OiBkZWx0YXMubGVuZ3RoID4gMCA/IFt7ICRmcm96ZW46IHRydWUsIGRhdGE6IGRlbHRhcyB9XSA6IFtdLFxuICAgIH0pIGFzIHVua25vd24gYXMgSnNvblZhbHVlV2l0aFVuZGVmaW5lZFxuICB9XG5cbiAgLy8gYXNzdW1lIGl0J3MgYSBwcmltaXRpdmVcbiAgcmV0dXJuIHlqc0RhdGFcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7XG4gIEpzb25BcnJheVdpdGhVbmRlZmluZWQsXG4gIEpzb25PYmplY3RXaXRoVW5kZWZpbmVkLFxuICBKc29uVmFsdWVXaXRoVW5kZWZpbmVkLFxufSBmcm9tIFwiLi4vanNvblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxuXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0XG5cbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwga2V5XVxuXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiB0b1BsYWluVmFsdWUoc291cmNlLmdldChrZXkpKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIG1hcCBldmVudCBhY3Rpb246ICR7Y2hhbmdlLmFjdGlvbn1gKVxuICAgICAgfVxuICAgIH0pXG4gIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgbGV0IHJldGFpbiA9IDBcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmluc2VydCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgcmV0YWluXVxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgICBvcDogXCJhZGRcIixcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0YWluKytcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZVGV4dEV2ZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBcImRlbHRhTGlzdFwiLCAtMSAvKiBsYXN0IGl0ZW0gKi9dXG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHZhbHVlOiB7ICRmcm96ZW46IHRydWUsIGRhdGE6IGV2ZW50LmRlbHRhIH0sXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBwYXRjaGVzXG59XG5cbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSnNvblZhbHVlV2l0aFVuZGVmaW5lZCkge1xuICBpZiAodiBpbnN0YW5jZW9mIFkuTWFwIHx8IHYgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSnNvbk9iamVjdFdpdGhVbmRlZmluZWQgfCBKc29uQXJyYXlXaXRoVW5kZWZpbmVkXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZcbiAgfVxufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBNb2RlbENsYXNzLFxuICBQYXRjaCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgWWpzRGF0YSwgY29udmVydFlqc0RhdGFUb0pzb24gfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXG59KToge1xuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgZGlzcG9zZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG59IHtcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcblxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXG5cbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgeWpzSnNvbiA9IGNvbnZlcnRZanNEYXRhVG9Kc29uKHlqc09iamVjdCBhcyBZanNEYXRhKVxuXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGNyZWF0ZUJvdW5kT2JqZWN0ID0gKCkgPT4ge1xuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcbiAgICB9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvdW5kT2JqZWN0ID0geWpzQmluZGluZ0NvbnRleHQuYXBwbHkoXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIHVua25vd24gYXMgU25hcHNob3RJbk9mPFR5cGVUb0RhdGE8VFR5cGU+PiksXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgICApXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQoYm91bmRPYmplY3QsIHsgLi4uYmluZGluZ0NvbnRleHQsIGJvdW5kT2JqZWN0IH0pXG4gICAgICByZXR1cm4gYm91bmRPYmplY3RcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSBhY3Rpb24oKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBZLk1hcCB8fCBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICAgIGdldFlqc0NvbGxlY3Rpb25BdG9tKGV2ZW50LnRhcmdldCk/LnJlcG9ydENoYW5nZWQoKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSsrXG4gICAgICB0cnkge1xuICAgICAgICBhcHBseVBhdGNoZXMoYm91bmRPYmplY3QsIHBhdGNoZXMpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZS0tXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuXG4gIC8vIGJpbmQgYW55IGNoYW5nZXMgZnJvbSBtb2J4LWtleXN0b25lIHRvIHlqc1xuICBsZXQgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlczogUGF0Y2hbXVtdID0gW11cbiAgY29uc3QgZGlzcG9zZU9uUGF0Y2hlcyA9IG9uUGF0Y2hlcyhib3VuZE9iamVjdCwgKHBhdGNoZXMpID0+IHtcbiAgICBpZiAoYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLnB1c2gocGF0Y2hlcylcbiAgfSlcblxuICAvLyB0aGlzIGlzIG9ubHkgdXNlZCBzbyB3ZSBjYW4gdHJhbnNhY3QgYWxsIHBhdGNoZXMgdG8gdGhlIHNuYXBzaG90IGJvdW5kYXJ5XG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYXJyYXlPZkFycmF5T2ZQYXRjaGVzID0gcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlc1xuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBbXVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIGFycmF5T2ZBcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChhcnJheU9mUGF0Y2hlcykgPT4ge1xuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICByZXR1cm4ge1xuICAgIGJvdW5kT2JqZWN0LFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcbiAgICB9LFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVBdG9tIiwiWSIsInR5cGVzIiwiWWpzVGV4dE1vZGVsIiwiTW9kZWwiLCJ0UHJvcCIsImZyb3plbiIsImdldFBhcmVudFRvQ2hpbGRQYXRoIiwicmVhY3Rpb24iLCJvYnNlcnZlIiwib25TbmFwc2hvdCIsImNvbXB1dGVkIiwiZXhwb3J0cyIsIm1vZGVsIiwibW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YSIsIm9uR2xvYmFsUGF0Y2hlcyIsImJvdW5kT2JqZWN0IiwiZnJvbVNuYXBzaG90IiwiYWN0aW9uIiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUdNLE1BQU8sNkJBQTZCLE1BQUs7QUFBQSxJQUM3QyxZQUFZLEtBQVc7QUFDckIsWUFBTSxHQUFHO0FBR0YsYUFBQSxlQUFlLE1BQU0scUJBQXFCLFNBQVM7QUFBQSxJQUM1RDtBQUFBLEVBQ0Q7QUFLSyxXQUFVLFFBQVEsS0FBVztBQUMxQixXQUFBLElBQUkscUJBQXFCLEdBQUc7QUFBQSxFQUNyQztBQ3dCYSxRQUFBLG9CQUFvQkEsMkJBQTZDLE1BQVM7QUN0Q3ZGLFFBQU0seUNBQXlCO0FBS2xCLFFBQUEsdUJBQXVCLENBQ2xDLGtCQUNxQjtBQUNkLFdBQUEsbUJBQW1CLElBQUksYUFBYTtBQUFBLEVBQzdDO0FBS2EsUUFBQSwrQkFBK0IsQ0FDMUMsa0JBQ1M7QUFDTCxRQUFBLE9BQU8sbUJBQW1CLElBQUksYUFB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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Y from "yjs";
|
|
2
2
|
import { YjsData } from "./convertYjsDataToJson";
|
|
3
|
-
import { JsonArrayWithUndefined, JsonObjectWithUndefined, JsonValueWithUndefined } from "jsonTypes";
|
|
3
|
+
import { JsonArrayWithUndefined, JsonObjectWithUndefined, JsonValueWithUndefined } from "../jsonTypes";
|
|
4
4
|
/**
|
|
5
5
|
* Converts a JSON value to a Y.js data structure.
|
|
6
6
|
* Objects are converted to Y.Maps, arrays to Y.Arrays, primitives are untouched.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mobx-keystone-yjs",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "Yjs bindings for mobx-keystone",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mobx",
|
|
@@ -64,26 +64,26 @@
|
|
|
64
64
|
"yjs": "^13.0.0"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@babel/core": "^7.24.
|
|
67
|
+
"@babel/core": "^7.24.7",
|
|
68
68
|
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
|
69
|
-
"@babel/plugin-proposal-decorators": "^7.24.
|
|
70
|
-
"@babel/preset-env": "^7.24.
|
|
71
|
-
"@babel/preset-typescript": "^7.24.
|
|
69
|
+
"@babel/plugin-proposal-decorators": "^7.24.7",
|
|
70
|
+
"@babel/preset-env": "^7.24.7",
|
|
71
|
+
"@babel/preset-typescript": "^7.24.7",
|
|
72
72
|
"@types/jest": "^29.5.12",
|
|
73
|
-
"@types/node": "^20.
|
|
73
|
+
"@types/node": "^20.14.2",
|
|
74
74
|
"babel-jest": "^29.7.0",
|
|
75
75
|
"jest": "^29.7.0",
|
|
76
76
|
"mobx-keystone": "workspace:packages/lib",
|
|
77
77
|
"rollup-plugin-typescript2": "^0.36.0",
|
|
78
78
|
"shx": "^0.3.4",
|
|
79
79
|
"spec.ts": "^1.1.3",
|
|
80
|
-
"ts-jest": "^29.1.
|
|
80
|
+
"ts-jest": "^29.1.4",
|
|
81
81
|
"ts-node": "^10.9.2",
|
|
82
|
-
"typescript": "^5.4.
|
|
83
|
-
"vite": "^5.2.
|
|
82
|
+
"typescript": "^5.4.5",
|
|
83
|
+
"vite": "^5.2.13"
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
|
-
"tslib": "^2.6.
|
|
86
|
+
"tslib": "^2.6.3"
|
|
87
87
|
},
|
|
88
88
|
"directories": {
|
|
89
89
|
"test": "test"
|
|
@@ -2,7 +2,7 @@ import { Patch } from "mobx-keystone"
|
|
|
2
2
|
import * as Y from "yjs"
|
|
3
3
|
import { failure } from "../utils/error"
|
|
4
4
|
import { convertJsonToYjsData } from "./convertJsonToYjsData"
|
|
5
|
-
import { JsonValueWithUndefined } from "jsonTypes"
|
|
5
|
+
import { JsonValueWithUndefined } from "../jsonTypes"
|
|
6
6
|
|
|
7
7
|
export function applyMobxKeystonePatchToYjsObject(patch: Patch, yjs: unknown): void {
|
|
8
8
|
if (patch.path.length > 1) {
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
JsonObjectWithUndefined,
|
|
8
8
|
JsonPrimitiveWithUndefined,
|
|
9
9
|
JsonValueWithUndefined,
|
|
10
|
-
} from "jsonTypes"
|
|
10
|
+
} from "../jsonTypes"
|
|
11
11
|
|
|
12
12
|
function isJsonPrimitiveWithUndefined(v: JsonValueWithUndefined): v is JsonPrimitiveWithUndefined {
|
|
13
13
|
const t = typeof v
|