breeze-client 2.2.0-cjs → 2.2.1-cjs

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.
@@ -993,4 +993,4 @@ var ValidationError = /** @class */ (function () {
993
993
  }());
994
994
  export { ValidationError };
995
995
  export { ɵ0, ɵ1 };
996
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJbEMsTUFBTSxDQUFDLElBQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFFL0IsTUFBTSxDQUFDLElBQU0sU0FBUyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFFcEMsTUFBTSxDQUFDLElBQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLENBQUMsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO1NBMEJiLFVBQVUsT0FBMEI7SUFDL0MsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztLQUN6RztTQUFNO1FBQ0wsT0FBTyxPQUFPLENBQUM7S0FDaEI7QUFDSCxDQUFDO0FBUkgsbUVBQW1FO0FBQ25FLElBQUksV0FBVyxHQUFHO0lBQ2hCLFdBQVcsSUFNVjtDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFDekcsT0FBTyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFSCxzQkFBQztBQUFELENBQUMsQUE5RkQsSUE4RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgYXNzZXJ0UGFyYW0gfSBmcm9tICcuL2Fzc2VydC1wYXJhbSc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblByb3BlcnR5LCBEYXRhUHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcblxyXG5leHBvcnQgY29uc3QgSU5UMTZfTUlOID0gLTMyNzY4O1xyXG5leHBvcnQgY29uc3QgSU5UMTZfTUFYID0gMzI3Njc7XHJcblxyXG5leHBvcnQgY29uc3QgSU5UMzJfTUlOID0gLTIxNDc0ODM2NDg7XHJcbmV4cG9ydCBjb25zdCBJTlQzMl9NQVggPSAyMTQ3NDgzNjQ3O1xyXG5cclxuZXhwb3J0IGNvbnN0IEJZVEVfTUlOID0gMDtcclxuZXhwb3J0IGNvbnN0IEJZVEVfTUFYID0gMjU1O1xyXG5cclxuLyoqIFBhc3NlZCB0byBWYWxpZGF0aW9uRm4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uQ29udGV4dCB7XHJcbiAgZW50aXR5PzogRW50aXR5O1xyXG4gIHByb3BlcnR5PzogRGF0YVByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5O1xyXG4gIHByb3BlcnR5TmFtZT86IHN0cmluZztcclxuICB2YWx1ZT86IGFueTtcclxufVxyXG5cclxuLyoqIFVzZWQgYnkgVmFsaWRhdG9yIHRvIGNvbXBvc2UgbWVzc2FnZXMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQgZXh0ZW5kcyBWYWxpZGF0aW9uQ29udGV4dCB7XHJcbiAgbmFtZT86IHN0cmluZztcclxuICBkaXNwbGF5TmFtZT86IHN0cmluZztcclxuICBtZXNzYWdlVGVtcGxhdGU/OiBzdHJpbmc7XHJcbiAgbWVzc2FnZT86IHN0cmluZyB8ICgodmM6IFZhbGlkYXRpb25Db250ZXh0KSA9PiBzdHJpbmcpO1xyXG4gIFtrZXk6c3RyaW5nXTogYW55O1xyXG59XHJcblxyXG4vKiogRnVuY3Rpb24gY2FsbGVkIHRvIHZhbGlkYXRlIGFuIGVudGl0eSBvciBwcm9wZXJ0eSAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25GbiB7XHJcbiAgICAodmFsdWU6IGFueSwgY29udGV4dD86IFZhbGlkYXRpb25Db250ZXh0KTogYm9vbGVhbjtcclxufVxyXG5cclxuLy8gYWRkIGNvbW1vbiBwcm9wcyBhbmQgbWV0aG9kcyBmb3IgZXZlcnkgdmFsaWRhdG9yICdjb250ZXh0JyBoZXJlLlxyXG5sZXQgcm9vdENvbnRleHQgPSB7XHJcbiAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uIChjb250ZXh0OiBWYWxpZGF0aW9uQ29udGV4dCkge1xyXG4gICAgaWYgKGNvbnRleHQucHJvcGVydHkpIHtcclxuICAgICAgcmV0dXJuIGNvbnRleHQucHJvcGVydHkucmVzb2x2ZVByb3BlcnR5KFwiZGlzcGxheU5hbWVcIikgfHwgY29udGV4dC5wcm9wZXJ0eU5hbWUgfHwgY29udGV4dC5wcm9wZXJ0eS5uYW1lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFwiVmFsdWVcIjtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuSW5zdGFuY2VzIG9mIHRoZSBWYWxpZGF0b3IgY2xhc3MgcHJvdmlkZSB0aGUgbG9naWMgdG8gdmFsaWRhdGUgYW5vdGhlciBvYmplY3QgYW5kIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiBhbnkgZXJyb3JzXHJcbmVuY291bnRlcmVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLiAgVGhleSBhcmUgdHlwaWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBhICd2YWxpZGF0b3JzJyBwcm9wZXJ0eSBvbiB0aGUgZm9sbG93aW5nIHR5cGVzOiBbW0VudGl0eVR5cGVdXSxcclxuW1tEYXRhUHJvcGVydHldXSBvciBbW05hdmlnYXRpb25Qcm9wZXJ0eV1dLlxyXG5cclxuQSBudW1iZXIgb2YgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdG9ycyBhcmUgcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LCBpLmUgYWRkZWQgdG8gZWFjaCBEYXRhUHJvcGVydHkudmFsaWRhdG9ycyBwcm9wZXJ0eVxyXG5iYXNlZCBvbiBbW0RhdGFQcm9wZXJ0eV1dIG1ldGFkYXRhLiAgRm9yIGV4YW1wbGUsXHJcblxyXG4tIERhdGFQcm9wZXJ0eS5kYXRhVHlwZSAtPiBvbmUgb2YgdGhlICdkYXRhVHlwZScgdmFsaWRhdG9yIG1ldGhvZHMgc3VjaCBhcyBWYWxpZGF0b3IuaW50NjQsIFZhbGlkYXRvci5kYXRlLCBWYWxpZGF0b3IuYm9vbCBldGMuXHJcbi0gRGF0YVByb3BlcnR5Lm1heExlbmd0aCAtPiBWYWxpZGF0b3IubWF4TGVuZ3RoXHJcbi0gRGF0YVByb3BlcnR5LmlzTnVsbGFibGUgLT4gVmFsaWRhdG9yLnJlcXVpcmVkIChpZiBub3QgbnVsbGFibGUpXHJcblxyXG5AY2xhc3MgVmFsaWRhdG9yXHJcbioqL1xyXG5cclxuLyoqXHJcblZhbGlkYXRvciBjb25zdHJ1Y3RvciAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIGNyZWF0ZSBjdXN0b20gdmFsaWRhdGlvbnMuICBTZXZlcmFsXHJcbmJhc2ljIFwiVmFsaWRhdG9yXCIgY29uc3RydWN0aW9uIG1ldGhvZHMgYXJlIGFsc28gcHJvdmlkZWQgYXMgc3RhdGljIG1ldGhvZHMgdG8gdGhpcyBjbGFzcy4gVGhlc2UgbWV0aG9kc1xyXG5wcm92aWRlIGEgc2ltcGxlciBzeW50YXggZm9yIGNyZWF0aW5nIGJhc2ljIHZhbGlkYXRpb25zLlxyXG5cclxuTWFueSBvZiB0aGVzZSBzdG9jayB2YWxpZGF0b3JzIGFyZSBpbnNwaXJlZCBieSBhbmQgaW1wbGVtZW50ZWQgdG8gY29uZm9ybSB0byB0aGUgdmFsaWRhdG9ycyBkZWZpbmVkIGF0XHJcbmh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9zeXN0ZW0uY29tcG9uZW50bW9kZWwuZGF0YWFubm90YXRpb25zLmFzcHhcclxuXHJcblNvbWV0aW1lcyBhIGN1c3RvbSB2YWxpZGF0b3Igd2lsbCBiZSByZXF1aXJlZC5cclxuQGV4YW1wbGVcclxuTW9zdCB2YWxpZGF0b3JzIHdpbGwgYmUgJ3Byb3BlcnR5JyBsZXZlbCB2YWxpZGF0b3JzLCBsaWtlIHRoaXMuXHJcbkBleGFtcGxlXHJcbiAgICAvLyB2IGlzIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCwgaW4gdGhpcyBjYXNlIGEgXCJjb3VudHJ5XCIgc3RyaW5nLlxyXG4gICAgdmFyIHZhbEZuID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gKGNvcmUuc3RyaW5nU3RhcnRzV2l0aCh2LCBcIlVTXCIpKTtcclxuICAgIH07XHJcbiAgICB2YXIgY291bnRyeVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoXCJjb3VudHJ5SXNVU1wiLCB2YWxGbiwge1xyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBcIkNvdW50cnlcIiwgXHJcbiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IHN0YXJ0IHdpdGggJ1VTJ1wiIFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gTm93IHBsdWcgaXQgaW50byBCcmVlemUuXHJcbiAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgIHZhciBjdXN0VHlwZSA9IG1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgdmFyIGNvdW50cnlQcm9wID0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJDb3VudHJ5XCIpO1xyXG4gICAgLy8gTm90ZSB0aGF0IHZhbGlkYXRvciBpcyBhZGRlZCB0byBhICdEYXRhUHJvcGVydHknIHZhbGlkYXRvcnMgY29sbGVjdGlvbi5cclxuICAgIHByb3AudmFsaWRhdG9ycy5wdXNoKGNvdW50cnlWYWxpZGF0b3IpO1xyXG5FbnRpdHkgbGV2ZWwgdmFsaWRhdG9ycyBhcmUgYWxzbyBwb3NzaWJsZVxyXG5AZXhhbXBsZVxyXG4gICAgZnVuY3Rpb24gaXNWYWxpZFppcENvZGUodmFsdWUpIHtcclxuICAgICAgICB2YXIgcmUgPSAvXlxcZHs1fShbXFwtXVxcZHs0fSk/JC87XHJcbiAgICAgICAgcmV0dXJuIChyZS50ZXN0KHZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdiBpbiB0aGlzIGNhc2Ugd2lsbCBiZSBhIEN1c3RvbWVyIGVudGl0eVxyXG4gICAgdmFyIHZhbEZuID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAvLyBUaGlzIHZhbGlkYXRvciBvbmx5IHZhbGlkYXRlcyBVUyBaaXAgQ29kZXMuXHJcbiAgICAgICAgaWYgKCB2LmdldFByb3BlcnR5KFwiQ291bnRyeVwiKSA9PT0gXCJVU0FcIikge1xyXG4gICAgICAgICAgICB2YXIgcG9zdGFsQ29kZSA9IHYuZ2V0UHJvcGVydHkoXCJQb3N0YWxDb2RlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNWYWxpZFppcENvZGUocG9zdGFsQ29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIHZhciB6aXBDb2RlVmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcihcInppcENvZGVWYWxpZGF0b3JcIiwgdmFsRm4sXHJcbiAgICAgICAgeyBtZXNzYWdlVGVtcGxhdGU6IFwiRm9yIHRoZSBVUywgdGhpcyBpcyBub3QgYSB2YWxpZCBQb3N0YWxDb2RlXCIgfSk7XHJcblxyXG4gICAgLy8gTm93IHBsdWcgaXQgaW50byBCcmVlemUuXHJcbiAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgIC8vIE5vdGUgdGhhdCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gYW4gJ0VudGl0eVR5cGUnIHZhbGlkYXRvcnMgY29sbGVjdGlvbi5cclxuICAgIGN1c3RUeXBlLnZhbGlkYXRvcnMucHVzaCh6aXBDb2RlVmFsaWRhdG9yKTtcclxuV2hhdCBpcyBjb21tb25seSBuZWVkZWQgaXMgYSB3YXkgb2YgY3JlYXRpbmcgYSBwYXJhbWV0ZXJpemVkIGZ1bmN0aW9uIHRoYXQgd2lsbCBpdHNlbGZcclxucmV0dXJuIGEgbmV3IFZhbGlkYXRvci4gIFRoaXMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhICdjb250ZXh0JyBvYmplY3QuXHJcbkBleGFtcGxlXHJcbiAgICAvLyBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHdpbGwgdGFrZSBpbiBhIGNvbmZpZyBvYmplY3RcclxuICAgIC8vIGFuZCB3aWxsIHJldHVybiBhIHZhbGlkYXRvclxyXG4gICAgdmFyIG51bWVyaWNSYW5nZVZhbGlkYXRvciA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcclxuICAgICAgICB2YXIgdmFsRm4gPSBmdW5jdGlvbih2LCBjdHgpIHtcclxuICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09IFwibnVtYmVyXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGN0eC5taW4gIT0gbnVsbCAmJiB2IDwgY3R4Lm1pbikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY3R4Lm1heCAhPSBudWxsICYmIHYgPiBjdHgubWF4KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gVGhlIGxhc3QgcGFyYW1ldGVyIGJlbG93IGlzIHRoZSAnY29udGV4dCcgb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgaW50byB0aGUgJ2N0eCcgcGFyYW1ldGVyIGFib3ZlXHJcbiAgICAgICAgLy8gd2hlbiB0aGlzIHZhbGlkYXRvciBleGVjdXRlcy4gU2V2ZXJhbCBvdGhlciBwcm9wZXJ0aWVzLCBzdWNoIGFzIGRpc3BsYXlOYW1lIHdpbGwgZ2V0IGFkZGVkIHRvIHRoaXMgb2JqZWN0IGFzIHdlbGwuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJudW1lcmljUmFuZ2VcIiwgdmFsRm4sIHtcclxuICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gdGhlIHZhbHVlcyBvZiAlbWluJSBhbmQgJW1heCVcIixcclxuICAgICAgICAgICAgbWluOiBjb250ZXh0Lm1pbixcclxuICAgICAgICAgICAgbWF4OiBjb250ZXh0Lm1heFxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIC8vIEFzc3VtZSB0aGF0IGZyZWlnaHRQcm9wZXJ0eSBpcyBhIERhdGFFbnRpdHlQcm9wZXJ0eSB0aGF0IGRlc2NyaWJlcyBudW1lcmljIHZhbHVlcy5cclxuICAgIC8vIHJlZ2lzdGVyIHRoZSB2YWxpZGF0b3JcclxuICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2gobnVtZXJpY1JhbmdlVmFsaWRhdG9yKHsgbWluOiAxMDAsIG1heDogNTAwIH0pKTtcclxuXHJcbkJyZWV6ZSBzdWJzdGl0dXRlcyBjb250ZXh0IHZhbHVlcyBhbmQgZnVuY3Rpb25zIGZvciB0aGUgdG9rZW5zIGluIHRoZSBtZXNzYWdlVGVtcGxhdGUgd2hlbiBwcmVwYXJpbmcgdGhlIHJ1bnRpbWUgZXJyb3IgbWVzc2FnZTtcclxuJ2Rpc3BsYXlOYW1lJyBpcyBhIHByZS1kZWZpbmVkIGNvbnRleHQgZnVuY3Rpb24gdGhhdCBpcyBhbHdheXMgYXZhaWxhYmxlLlxyXG5cclxuUGxlYXNlIG5vdGUgdGhhdCBCcmVlemUgc3Vic3RpdHV0ZXMgdGhlIGVtcHR5IHN0cmluZyBmb3IgZmFsc2V5IHBhcmFtZXRlcnMuIFRoYXQgdXN1YWxseSB3b3JrcyBpbiB5b3VyIGZhdm9yLlxyXG5Tb21ldGltZXMgaXQgZG9lc24ndCBhcyB3aGVuIHRoZSAnbWluJyB2YWx1ZSBpcyB6ZXJvIGluIHdoaWNoIGNhc2UgdGhlIG1lc3NhZ2UgdGV4dCB3b3VsZCBoYXZlIGEgaG9sZVxyXG53aGVyZSB0aGUgJ21pbicgdmFsdWUgZ29lcywgc2F5aW5nOiBcIi4uLiBhbiBpbnRlZ2VyIGJldHdlZW4gdGhlIHZhbHVlcyBvZiBhbmQgLi4uXCIuIFRoYXQgaXMgbm90IHdoYXQgeW91IHdhbnQuXHJcblxyXG5UbyBhdm9pZCB0aGlzIGVmZmVjdCwgeW91IG1heSBjYW4gYmFrZSBjZXJ0YWluIG9mIHRoZSBjb250ZXh0IHZhbHVlcyBpbnRvIHRoZSAnbWVzc2FnZVRlbXBsYXRlJyBpdHNlbGZcclxuYXMgc2hvd24gaW4gdGhpcyByZXZpc2lvbiB0byB0aGUgcGVydGluZW50IHBhcnQgb2YgdGhlIHByZXZpb3VzIGV4YW1wbGU6XHJcbkBleGFtcGxlXHJcbiAgICAvLyAuLi4gYXMgYmVmb3JlXHJcbiAgICAvLyAuLi4gYnV0IGJha2UgdGhlIG1pbi9tYXggdmFsdWVzIGludG8gdGhlIG1lc3NhZ2UgdGVtcGxhdGUuXHJcbiAgICB2YXIgdGVtcGxhdGUgPSBicmVlemUuY29yZS5mb3JtYXRTdHJpbmcoXHJcbiAgICAgICAgXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgJTEgYW5kICUyXCIsXHJcbiAgICAgICAgY29udGV4dC5taW4sIGNvbnRleHQubWF4KTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibnVtZXJpY1JhbmdlXCIsIHZhbEZuLCB7XHJcbiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiB0ZW1wbGF0ZSxcclxuICAgICAgICBtaW46IGNvbnRleHQubWluLFxyXG4gICAgICAgIG1heDogY29udGV4dC5tYXhcclxuICAgIH0pO1xyXG5cclxuQG1ldGhvZCA8Y3Rvcj4gVmFsaWRhdG9yXHJcbkBwYXJhbSBuYW1lIHtTdHJpbmd9IFRoZSBuYW1lIG9mIHRoaXMgdmFsaWRhdG9yLlxyXG5AcGFyYW0gdmFsaWRhdG9yRm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdmFsaWRhdGlvbi5cclxuXHJcbnZhbGlkYXRvckZuKHZhbHVlLCBjb250ZXh0KVxyXG5AcGFyYW0gdmFsaWRhdG9yRm4udmFsdWUge09iamVjdH0gVmFsdWUgdG8gYmUgdmFsaWRhdGVkXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi5jb250ZXh0IHtPYmplY3R9IFRoZSBzYW1lIGNvbnRleHQgb2JqZWN0IHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlmIG5vdFxyXG5vdGhlcndpc2Ugc3BlY2lmaWVkLlxyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dC52YWx1ZSB7T2JqZWN0fSBUaGUgdmFsdWUgYmVpbmcgdmFsaWRhdGVkLlxyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dC5uYW1lIHtTdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmVpbmcgZXhlY3V0ZWQuXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi5jb250ZXh0LmRpc3BsYXlOYW1lIHtTdHJpbmd9IFRoaXMgd2lsbCBiZSBlaXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSdzICdkaXNwbGF5TmFtZScgcHJvcGVydHkgb3JcclxudGhlIHZhbHVlIG9mIGl0cyAnbmFtZScgcHJvcGVydHkgb3IgdGhlIHN0cmluZyAnVmFsdWUnXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi5jb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSB7U3RyaW5nfSBUaGlzIHdpbGwgZWl0aGVyIGJlIHRoZSB2YWx1ZSBvZiBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1sge3RoaXMgdmFsaWRhdG9ycyBuYW1lfV0gb3IgbnVsbC4gVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNcclxuaXMgYW4gb2JqZWN0IHRoYXQgaXMga2V5ZWQgYnkgdmFsaWRhdG9yIG5hbWUgYW5kIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGluIG9yZGVyIHRvICdyZWdpc3RlcicgeW91ciBvd24gbWVzc2FnZSBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuXHJcblRoZSBmb2xsb3dpbmcgcHJvcGVydHkgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGZvciBhbnkgdmFsaWRhdG9yIHRvIGZvcmNlIGEgc3BlY2lmaWMgZXJyb3JNZXNzYWdlIHN0cmluZ1xyXG5AcGFyYW0gW3ZhbGlkYXRvckZuLmNvbnRleHQubWVzc2FnZV0ge1N0cmluZ30gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlICdtZXNzYWdlVGVtcGxhdGUnIHByb3BlcnR5IHdoZW4gYW5cclxuZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuXHJcblxyXG5AcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IEEgZnJlZSBmb3JtIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIHdpbGwgbWFkZSBhdmFpbGFibGUgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIGFuZCBlcnJvciBtZXNzYWdlIGNyZWF0aW9uIHByb2Nlc3MuXHJcblRoaXMgb2JqZWN0IHdpbGwgYmUgcGFzc2VkIGludG8gdGhlIFZhbGlkYXRvcidzIHZhbGlkYXRpb24gZnVuY3Rpb24gd2hlbmV2ZXIgJ3ZhbGlkYXRlJyBpcyBjYWxsZWQuIFNlZSBhYm92ZSBmb3IgYSBkZXNjcmlwdGlvblxyXG5vZiBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhpcyBvYmplY3QgaWYgbm90IG90aGVyd2lzZSBzcGVjaWZpZWQuXHJcbkBkeW5hbWljXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yIHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfJHR5cGVOYW1lOiBzdHJpbmc7IC8vIG9uIHByb3RvXHJcblxyXG4gIG5hbWU6IHN0cmluZztcclxuICB2YWxGbjogVmFsaWRhdGlvbkZuO1xyXG4gIGNvbnRleHQ6IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICBjdXJyZW50Q29udGV4dDogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG4gIHByaXZhdGUgX2Jhc2VDb250ZXh0OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsRm46IFZhbGlkYXRpb25GbiwgY29udGV4dD86IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dCkge1xyXG4gICAgLy8gX2Jhc2VDb250ZXh0IGlzIHdoYXQgd2lsbCBnZXQgc2VyaWFsaXplZFxyXG4gICAgdGhpcy5fYmFzZUNvbnRleHQgPSBjb250ZXh0IHx8IHt9IGFzIFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICAgIHRoaXMuX2Jhc2VDb250ZXh0Lm5hbWUgPSBuYW1lO1xyXG4gICAgY29udGV4dCA9IGNvcmUuZXh0ZW5kKE9iamVjdC5jcmVhdGUocm9vdENvbnRleHQpLCB0aGlzLl9iYXNlQ29udGV4dCkgYXMgVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG4gICAgY29udGV4dC5tZXNzYWdlVGVtcGxhdGUgPSBjb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSB8fCBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1tuYW1lXTtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLnZhbEZuID0gdmFsRm47XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgVGhlIG5hbWUgb2YgdGhpcyB2YWxpZGF0b3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBuYW1lIHtTdHJpbmd9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFRoZSBjb250ZXh0IGZvciB0aGlzIHZhbGlkYXRvci5cclxuXHJcbiAgVGhpcyBvYmplY3Qgd2lsbCB0eXBpY2FsbHkgY29udGFpbiBhdCBhIG1pbmltdW0gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLiBcIm5hbWVcIiwgXCJkaXNwbGF5TmFtZVwiLCBhbmQgXCJtZXNzYWdlXCIgb3IgXCJtZXNzYWdlVGVtcGxhdGVcIi5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgY29udGV4dCB7T2JqZWN0fVxyXG4gICoqL1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgUnVuIHRoaXMgdmFsaWRhdG9yIGFnYWluc3QgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIFRoaXMgbWV0aG9kIHdpbGwgdXN1YWxseSBiZSBjYWxsZWQgaW50ZXJuYWxseSBlaXRoZXJcclxuICBhdXRvbWF0aWNhbGx5IGJ5IGFuIHByb3BlcnR5IGNoYW5nZSwgZW50aXR5IGF0dGFjaCwgcXVlcnkgb3Igc2F2ZSBvcGVyYXRpb24sIG9yIG1hbnVhbGx5IGFzIGEgcmVzdWx0IG9mXHJcbiAgYSB2YWxpZGF0ZUVudGl0eSBjYWxsIG9uIHRoZSBFbnRpdHlBc3BlY3QuIFRoZSByZXN1bHRpbmcgVmFsaWRhdGlvblJlc3VsdHMgYXJlIGF2YWlsYWJsZSB2aWEgdGhlXHJcbiAgRW50aXR5QXNwZWN0LmdldFZhbGlkYXRpb25FcnJvcnMgbWV0aG9kLlxyXG5cclxuICBIb3dldmVyLCB5b3UgY2FuIGFsc28gY2FsbCBhIHZhbGlkYXRvciBkaXJlY3RseSBlaXRoZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMgb3Igc29tZSBvdGhlciByZWFzb24gaWYgbmVlZGVkLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIHVzaW5nIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCB2YWxpZGF0b3JzXHJcbiAgICAgIHZhciB2YWxpZGF0b3IgPSBWYWxpZGF0b3IubWF4TGVuZ3RoKHsgbWF4TGVuZ3RoOiA1LCBkaXNwbGF5TmFtZTogXCJDaXR5XCIgfSk7XHJcbiAgICAgIC8vIHNob3VsZCBiZSBvayBiZWNhdXNlIFwiYXNkZlwiLmxlbmd0aCA8IDVcclxuICAgICAgdmFyIHJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZShcImFzZGZcIik7XHJcbiAgICAgIG9rKHJlc3VsdCA9PT0gbnVsbCk7XHJcbiAgICAgIHJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZShcImFkYXNkZmFzZGZcIik7XHJcbiAgICAgIC8vIGV4dHJhY3QgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAncmVzdWx0J1xyXG4gICAgICB2YXIgZXJyTXNnID0gcmVzdWx0LmVycm9yTWVzc2FnZTtcclxuICAgICAgdmFyIGNvbnRleHQgPSByZXN1bHQuY29udGV4dDtcclxuICAgICAgdmFyIHNhbWVWYWxpZGF0b3IgPSByZXN1bHQudmFsaWRhdG9yO1xyXG4gIEBtZXRob2QgdmFsaWRhdGVcclxuICBAcGFyYW0gdmFsdWUge09iamVjdH0gVmFsdWUgdG8gdmFsaWRhdGVcclxuICBAcGFyYW0gYWRkaXRpb25hbENvbnRleHQge09iamVjdH0gQW55IGFkZGl0aW9uYWwgY29udGV4dHVhbCBpbmZvcm1hdGlvbiB0aGF0IHRoZSBWYWxpZGF0b3JcclxuICBjYW4gbWFrZSB1c2Ugb2YuXHJcbiAgQHJldHVybiB7VmFsaWRhdGlvbkVycm9yfG51bGx9IEEgVmFsaWRhdGlvbkVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHMsIG51bGwgb3RoZXJ3aXNlXHJcbiAgKiovXHJcbiAgdmFsaWRhdGUodmFsdWU6IGFueSwgYWRkaXRpb25hbENvbnRleHQ/OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQpIHtcclxuICAgIGxldCBjdXJyZW50Q29udGV4dDogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0OyAvLyB7IHZhbHVlPzogT2JqZWN0IH07XHJcbiAgICBpZiAoYWRkaXRpb25hbENvbnRleHQpIHtcclxuICAgICAgY3VycmVudENvbnRleHQgPSBjb3JlLmV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMuY29udGV4dCksIGFkZGl0aW9uYWxDb250ZXh0KSBhcyBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdXJyZW50Q29udGV4dCA9IHRoaXMuY29udGV4dDtcclxuICAgIH1cclxuICAgIHRoaXMuY3VycmVudENvbnRleHQgPSBjdXJyZW50Q29udGV4dDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy52YWxGbih2YWx1ZSwgY3VycmVudENvbnRleHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3VycmVudENvbnRleHQudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcih0aGlzLCBjdXJyZW50Q29udGV4dCwgdGhpcy5nZXRNZXNzYWdlKCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHRoaXMsIGN1cnJlbnRDb250ZXh0LCBcIkV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIHZhbGlkYXRvcjogXCIgKyB0aGlzLm5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIGNvbnRleHQudmFsdWUgaXMgbm90IGF2YWlsIHVubGVzcyB2YWxpZGF0ZSB3YXMgY2FsbGVkIGZpcnN0LlxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUgbW9zdCByZWNlbnQgZXhlY3V0aW9uIG9mIHRoaXMgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIHZhciB2MCA9IFZhbGlkYXRvci5tYXhMZW5ndGgoeyBtYXhMZW5ndGg6IDUsIGRpc3BsYXlOYW1lOiBcIkNpdHlcIiB9KTtcclxuICAgICAgdjAudmFsaWRhdGUoXCJhZGFzZGZhc2RmXCIpO1xyXG4gICAgICB2YXIgZXJyTWVzc2FnZSA9IHYwLmdldE1lc3NhZ2UoKSk7XHJcbiAgQG1ldGhvZCBnZXRNZXNzYWdlXHJcbiAgQHJldHVybiB7U3RyaW5nfVxyXG4gICoqL1xyXG4gIGdldE1lc3NhZ2UoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgY29udGV4dCA9IHRoaXMuY3VycmVudENvbnRleHQ7XHJcbiAgICAgIGxldCBtZXNzYWdlID0gY29udGV4dC5tZXNzYWdlO1xyXG4gICAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKG1lc3NhZ2UpID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgIHJldHVybiBtZXNzYWdlKGNvbnRleHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXNzYWdlVGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gZm9ybWF0VGVtcGxhdGUoY29udGV4dC5tZXNzYWdlVGVtcGxhdGUsIGNvbnRleHQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBcImludmFsaWQgdmFsdWU6IFwiICsgKHRoaXMubmFtZSB8fCBcInt1bm5hbWVkIHZhbGlkYXRvcn1cIik7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIFwiVW5hYmxlIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlXCIgKyBlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b0pTT04oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmFzZUNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBDcmVhdGVzIGEgdmFsaWRhdG9yIGluc3RhbmNlIGZyb20gYSBKU09OIG9iamVjdCBvciBhbiBhcnJheSBvZiBpbnN0YW5jZXMgZnJvbSBhbiBhcnJheSBvZiBKU09OIG9iamVjdHMuXHJcbiAgQG1ldGhvZCBmcm9tSlNPTlxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0ganNvbiB7T2JqZWN0fSBKU09OIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiBhIHZhbGlkYXRvci5cclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IGFueSk6IGFueSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xyXG4gICAgICByZXR1cm4ganNvbi5tYXAoZnVuY3Rpb24gKGpzKSB7XHJcbiAgICAgICAgcmV0dXJuIFZhbGlkYXRvci5mcm9tSlNPTihqcyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGpzb24gaW5zdGFuY2VvZiBWYWxpZGF0b3IpIHtcclxuICAgICAgcmV0dXJuIGpzb247XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsaWRhdG9yTmFtZSA9IFwiVmFsaWRhdG9yLlwiICsganNvbi5uYW1lO1xyXG4gICAgbGV0IGZuID0gY29uZmlnLmdldFJlZ2lzdGVyZWRGdW5jdGlvbih2YWxpZGF0b3JOYW1lKTtcclxuICAgIGlmICghZm4pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvY2F0ZSBhIHZhbGlkYXRvciBuYW1lZDpcIiArIGpzb24ubmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZm4oanNvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZWdpc3RlciBhIHZhbGlkYXRvciBpbnN0YW5jZSBzbyB0aGF0IGFueSBkZXNlcmlhbGl6ZWQgbWV0YWRhdGEgY2FuIHJlZmVyZW5jZSBpdC5cclxuICBAbWV0aG9kIHJlZ2lzdGVyXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSB2YWxpZGF0b3Ige1ZhbGlkYXRvcn0gVmFsaWRhdG9yIHRvIHJlZ2lzdGVyLlxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXIodmFsaWRhdG9yOiBWYWxpZGF0b3IpIHtcclxuICAgIGNvbmZpZy5yZWdpc3RlckZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIHZhbGlkYXRvcjtcclxuICAgIH0sIFwiVmFsaWRhdG9yLlwiICsgdmFsaWRhdG9yLm5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmVnaXN0ZXIgYSB2YWxpZGF0b3IgZmFjdG9yeSBzbyB0aGF0IGFueSBkZXNlcmlhbGl6ZWQgbWV0YWRhdGEgY2FuIHJlZmVyZW5jZSBpdC5cclxuICBAbWV0aG9kIHJlZ2lzdGVyRmFjdG9yeVxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gdmFsaWRhdG9yRmFjdG9yeSB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCBvcHRpb25hbGx5IHRha2VzIGEgY29udGV4dCBwcm9wZXJ0eSBhbmQgcmV0dXJucyBhIFZhbGlkYXRvciBpbnN0YW5jZS5cclxuICBAcGFyYW0gbmFtZSB7U3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yLlxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJGYWN0b3J5KHZhbGlkYXRvckZhY3Rvcnk6IChvcHRpb25zPzogYW55KSA9PiBWYWxpZGF0b3IsIG5hbWU6IHN0cmluZykge1xyXG4gICAgY29uZmlnLnJlZ2lzdGVyRnVuY3Rpb24odmFsaWRhdG9yRmFjdG9yeSwgXCJWYWxpZGF0b3IuXCIgKyBuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIE1hcCBvZiBzdGFuZGFyZCBlcnJvciBtZXNzYWdlIHRlbXBsYXRlcyBrZXllZCBieSB2YWxpZGF0b3IgbmFtZS5cclxuICBZb3UgY2FuIGFkZCB0byBvciBtb2RpZnkgdGhpcyBvYmplY3QgdG8gY3VzdG9taXplIHRoZSB0ZW1wbGF0ZSB1c2VkIGZvciBhbnkgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIHYgaXMgdGhpcyBmdW5jdGlvbiBpcyB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkLCBpbiB0aGlzIGNhc2UgYSBcImNvdW50cnlcIiBzdHJpbmcuXHJcbiAgICAgIHZhciB2YWxGbiA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiAoY29yZS5zdHJpbmdTdGFydHNXaXRoKHYsIFwiVVNcIikpO1xyXG4gICAgICB9O1xyXG4gICAgICB2YXIgY291bnRyeVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoXCJjb3VudHJ5SXNVU1wiLCB2YWxGbiwgeyBkaXNwbGF5TmFtZTogXCJDb3VudHJ5XCIgfSk7XHJcbiAgICAgIFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzLmNvdW50cnlJc1VTID0gXCInJWRpc3BsYXlOYW1lJScgbXVzdCBzdGFydCB3aXRoICdVUydcIjtcclxuICAgICAgLy8gVGhpcyB3aWxsIGhhdmUgYSBzaW1pbGFyIGVmZmVjdCB0byB0aGlzXHJcbiAgICAgIHZhciBjb3VudHJ5VmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcihcImNvdW50cnlJc1VTXCIsIHZhbEZuLCB7XHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogXCJDb3VudHJ5XCIsIFxyXG4gICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IHN0YXJ0IHdpdGggJ1VTJ1wiIFxyXG4gICAgICB9KTtcclxuICBAcHJvcGVydHkgbWVzc2FnZVRlbXBsYXRlcyB7T2JqZWN0fVxyXG4gIEBzdGF0aWNcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIG1lc3NhZ2VUZW1wbGF0ZXMgPSB7XHJcbiAgICBib29sOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgJ3RydWUnIG9yICdmYWxzZScgdmFsdWVcIixcclxuICAgIGNyZWRpdENhcmQ6IFwiVGhlICVkaXNwbGF5TmFtZSUgaXMgbm90IGEgdmFsaWQgY3JlZGl0IGNhcmQgbnVtYmVyXCIsXHJcbiAgICBkYXRlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgZGF0ZVwiLFxyXG4gICAgZHVyYXRpb246IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBJU084NjAxIGR1cmF0aW9uIHN0cmluZywgc3VjaCBhcyAnUDNIMjRNNjBTJ1wiLFxyXG4gICAgZW1haWxBZGRyZXNzOiBcIlRoZSAlZGlzcGxheU5hbWUlICcldmFsdWUlJyBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIsXHJcbiAgICBndWlkOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgR1VJRFwiLFxyXG4gICAgaW50ZWdlcjogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhbiBpbnRlZ2VyXCIsXHJcbiAgICBpbnRlZ2VyUmFuZ2U6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgJW1pblZhbHVlJSBhbmQgJW1heFZhbHVlJVwiLFxyXG4gICAgbWF4TGVuZ3RoOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgc3RyaW5nIHdpdGggJW1heExlbmd0aCUgY2hhcmFjdGVycyBvciBsZXNzXCIsXHJcbiAgICBudW1iZXI6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBudW1iZXJcIixcclxuICAgIHBob25lOiBcIlRoZSAlZGlzcGxheU5hbWUlICcldmFsdWUlJyBpcyBub3QgYSB2YWxpZCBwaG9uZSBudW1iZXJcIixcclxuICAgIHJlZ3VsYXJFeHByZXNzaW9uOiBcIlRoZSAlZGlzcGxheU5hbWUlICcldmFsdWUlJyBkb2VzIG5vdCBtYXRjaCAnJWV4cHJlc3Npb24lJ1wiLFxyXG4gICAgcmVxdWlyZWQ6IFwiJyVkaXNwbGF5TmFtZSUnIGlzIHJlcXVpcmVkXCIsXHJcbiAgICBzdHJpbmc6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBzdHJpbmdcIixcclxuICAgIHN0cmluZ0xlbmd0aDogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIHN0cmluZyB3aXRoIGJldHdlZW4gJW1pbkxlbmd0aCUgYW5kICVtYXhMZW5ndGglIGNoYXJhY3RlcnNcIixcclxuICAgIHVybDogXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgaXMgbm90IGEgdmFsaWQgdXJsXCJcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgJ3JlcXVpcmVkIHZhbHVlJyBWYWxpZGF0b3JcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcmVnaW9uUHJvcGVydHkgLSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIlJlZ2lvblwiKTtcclxuICAgICAgLy8gTWFrZXMgXCJSZWdpb25cIiBvbiBDdXN0b21lciBhIHJlcXVpcmVkIHByb3BlcnR5LlxyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnJlcXVpcmVkKCkpO1xyXG4gICAgICAvLyBvciB0byBhbGxvdyBlbXB0eSBzdHJpbmdzXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IucmVxdWlyZWQoeyBhbGxvd0VtcHR5U3RyaW5nczogdHJ1ZSB9KTspO1xyXG4gIEBtZXRob2QgcmVxdWlyZWRcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGNvbnRleHQge09iamVjdH1cclxuICBAcGFyYW0gW2NvbnRleHQuYWxsb3dFbXB0eVN0cmluZ3NdIHtCb29sZWFufSBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkIG9yIGZhbHNlIHRoZW4gZW1wdHkgc3RyaW5ncyBkbyBOT1QgcGFzcyB2YWxpZGF0aW9uLlxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyByZXF1aXJlZCA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIGlmIChjdHggJiYgY3R4LmFsbG93RW1wdHlTdHJpbmdzKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdi5sZW5ndGggPiAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB2ICE9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcInJlcXVpcmVkXCIsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgbWF4aW11bSBzdHJpbmcgbGVuZ3RoIFZhbGlkYXRvcjsgdGhlIG1heGltdW0gbGVuZ3RoIG11c3QgYmUgc3BlY2lmaWVkXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5IC0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUmVnaW9uIHByb3BlcnR5IG9uIEN1c3RvbWVyIHdpbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDUgY2hhcmFjdGVycy5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5tYXhMZW5ndGgoIHttYXhMZW5ndGg6IDV9KSk7XHJcbiAgQG1ldGhvZCBtYXhMZW5ndGhcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGNvbnRleHQge09iamVjdH1cclxuICBAcGFyYW0gY29udGV4dC5tYXhMZW5ndGgge0ludGVnZXJ9XHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIG1heExlbmd0aCA9IGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgKHYpICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB2Lmxlbmd0aCA8PSBjdHgubWF4TGVuZ3RoO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibWF4TGVuZ3RoXCIsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgc3RyaW5nIGxlbmd0aCBWYWxpZGF0b3I7IGJvdGggbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGhzIG11c3QgYmUgc3BlY2lmaWVkLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciByZWdpb25Qcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFJlZ2lvbiBwcm9wZXJ0eSBvbiBDdXN0b21lciB3aWxsIGJlXHJcbiAgICAgIC8vIGJldHdlZW4gMiBhbmQgNSBjaGFyYWN0ZXJzXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3Iuc3RyaW5nTGVuZ3RoKCB7bWluTGVuZ3RoOiAyLCBtYXhMZW5ndGg6IDV9KTtcclxuICBAbWV0aG9kIHN0cmluZ0xlbmd0aFxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gY29udGV4dCB7T2JqZWN0fVxyXG4gIEBwYXJhbSBjb250ZXh0Lm1heExlbmd0aCB7SW50ZWdlcn1cclxuICBAcGFyYW0gY29udGV4dC5taW5MZW5ndGgge0ludGVnZXJ9XHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHN0cmluZ0xlbmd0aCA9IGZ1bmN0aW9uIChjb250ZXh0OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mICh2KSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoY3R4Lm1pbkxlbmd0aCAhPSBudWxsICYmIHYubGVuZ3RoIDwgY3R4Lm1pbkxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoY3R4Lm1heExlbmd0aCAhPSBudWxsICYmIHYubGVuZ3RoID4gY3R4Lm1heExlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcInN0cmluZ0xlbmd0aFwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIHN0cmluZyBkYXRhVHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5IC0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUmVnaW9uIHByb3BlcnR5IG9uIEN1c3RvbWVyIGlzIGEgc3RyaW5nLlxyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnN0cmluZygpKTtcclxuICBAbWV0aG9kIHN0cmluZ1xyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgc3RyaW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJzdHJpbmdcIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBHdWlkIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIGN1c3RvbWVySWRQcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiQ3VzdG9tZXJJRFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBDdXN0b21lcklEIHByb3BlcnR5IG9uIEN1c3RvbWVyIGlzIGEgR3VpZC5cclxuICAgICAgY3VzdG9tZXJJZFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuZ3VpZCgpKTtcclxuICBAbWV0aG9kIGd1aWRcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGd1aWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICByZXR1cm4gY29yZS5pc0d1aWQodik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJndWlkXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nICBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBldmVudFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiRXZlbnRcIik7XHJcbiAgICAgIHZhciBlbGFwc2VkVGltZVByb3BlcnR5IC0gZXZlbnRUeXBlLmdldFByb3BlcnR5KFwiRWxhcHNlZFRpbWVcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRWxhcHNlZFRpbWUgcHJvcGVydHkgb24gQ3VzdG9tZXIgaXMgYSBkdXJhdGlvbi5cclxuICAgICAgZWxhcHNlZFRpbWVQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmR1cmF0aW9uKCkpO1xyXG4gIEBtZXRob2QgZHVyYXRpb25cclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGR1cmF0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuIGNvcmUuaXNEdXJhdGlvbih2KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcImR1cmF0aW9uXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgbnVtZXJpYyBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBGcmVpZ2h0IHByb3BlcnR5IG9uIE9yZGVyIGlzIGEgbnVtYmVyLlxyXG4gICAgICBmcmVpZ2h0UHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5udW1iZXIoKSk7XHJcbiAgQG1ldGhvZCBudW1iZXJcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuXHJcbiAgICAvLyBUT0RPOiBtYXkgbmVlZCB0byBoYXZlIHNlcGVyYXRlIGxvZ2ljIGZvciBzaW5nbGUuXHJcbiAgcHVibGljIHN0YXRpYyBudW1iZXIgPSBmdW5jdGlvbihjb250ZXh0PzogYW55KSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiICYmIGN0eCAmJiBjdHguYWxsb3dTdHJpbmcpIHtcclxuICAgICAgICB2ID0gcGFyc2VGbG9hdCh2KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKHR5cGVvZiB2ID09PSBcIm51bWJlclwiICYmICFpc05hTih2KSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJudW1iZXJcIiwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcbiAgcHVibGljIHN0YXRpYyBkb3VibGUgPSBWYWxpZGF0b3IubnVtYmVyO1xyXG4gIHB1YmxpYyBzdGF0aWMgc2luZ2xlID0gVmFsaWRhdG9yLm51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIGxhcmdlIGludGVnZXIgZGF0YSB0eXBlIC0gNjQgYml0IC0gVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBGcmVpZ2h0IHByb3BlcnR5IG9uIE9yZGVyIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSA2NCBiaXQgaW50ZWdlci5cclxuICAgICAgZnJlaWdodFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuaW50NjQoKSk7XHJcbiAgQG1ldGhvZCBpbnQ2NFxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW50ZWdlciA9IGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiBjdHggJiYgY3R4LmFsbG93U3RyaW5nKSB7XHJcbiAgICAgICAgdiA9IHBhcnNlSW50KHYsIDEwKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSAmJiAoIWlzTmFOKHYpKSAmJiBNYXRoLmZsb29yKHYpID09PSB2O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwiaW50ZWdlclwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuICBwdWJsaWMgc3RhdGljIGludDY0ID0gVmFsaWRhdG9yLmludGVnZXI7XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCAzMiBiaXQgaW50ZWdlciBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgZnJlaWdodFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuaW50MzIoKSk7XHJcbiAgQG1ldGhvZCBpbnQzMlxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW50MzIgPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIHJldHVybiBpbnRSYW5nZVZhbGlkYXRvckN0b3IoXCJpbnQzMlwiLCBJTlQzMl9NSU4sIElOVDMyX01BWCwgY29udGV4dCkoKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgMTYgYml0IGludGVnZXIgZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRnJlaWdodCBwcm9wZXJ0eSBvbiBPcmRlciBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIGEgMTYgYml0IGludGVnZXIuXHJcbiAgICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmludDE2KCkpO1xyXG4gIEBtZXRob2QgaW50MTZcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGludDE2ID0gZnVuY3Rpb24oY29udGV4dDogYW55KSB7XHJcbiAgICByZXR1cm4gaW50UmFuZ2VWYWxpZGF0b3JDdG9yKFwiaW50MTZcIiwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIGNvbnRleHQpKCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIGJ5dGUgZGF0YSB0eXBlIFZhbGlkYXRvci4gKFRoaXMgaXMgYSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGluY2x1c2l2ZSBmb3IganMgcHVycG9zZXMpLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBGcmVpZ2h0IHByb3BlcnR5IG9uIE9yZGVyIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSAxNiBiaXQgaW50ZWdlci5cclxuICAgICAgLy8gUHJvYmFibHkgbm90IGEgdmVyeSBnb29kIHZhbGlkYXRpb24gdG8gcGxhY2Ugb24gdGhlIEZyZWlnaHQgcHJvcGVydHkuXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuYnl0ZSgpKTtcclxuICBAbWV0aG9kIGJ5dGVcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGJ5dGUgPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIHJldHVybiBpbnRSYW5nZVZhbGlkYXRvckN0b3IoXCJieXRlXCIsIEJZVEVfTUlOLCBCWVRFX01BWCwgY29udGV4dCkoKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgYm9vbGVhbiBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgcHJvZHVjdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiUHJvZHVjdFwiKTtcclxuICAgICAgdmFyIGRpc2NvbnRpbnVlZFByb3BlcnR5IC0gcHJvZHVjdFR5cGUuZ2V0UHJvcGVydHkoXCJEaXNjb250aW51ZWRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRGlzY29udGludWVkIHByb3BlcnR5IG9uIFByb2R1Y3QgaXMgYSBib29sZWFuXHJcbiAgICAgIGRpc2NvbnRpbnVlZFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuYm9vbCgpKTtcclxuICBAbWV0aG9kIGJvb2xcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGJvb2wgPSBmdW5jdGlvbigpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIHJldHVybiAodiA9PT0gdHJ1ZSkgfHwgKHYgPT09IGZhbHNlKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcImJvb2xcIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgbm9uZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcIm5vbmVcIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBkYXRlIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgICAgIHZhciBvcmRlckRhdGVQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIk9yZGVyRGF0ZVwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBPcmRlckRhdGUgcHJvcGVydHkgb24gT3JkZXIgaXMgYSBkYXRlXHJcbiAgICAgIC8vIFByb2JhYmx5IG5vdCBhIHZlcnkgZ29vZCB2YWxpZGF0aW9uIHRvIHBsYWNlIG9uIHRoZSBGcmVpZ2h0IHByb3BlcnR5LlxyXG4gICAgICBvcmRlckRhdGVQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmRhdGUoKSk7XHJcbiAgQG1ldGhvZCBkYXRlXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBkYXRlID0gZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgcmV0dXJuICFpc05hTihEYXRlLnBhcnNlKHYpKTtcclxuICAgICAgICAgIC8vIG9sZCBjb2RlXHJcbiAgICAgICAgICAvLyByZXR1cm4gX19pc0RhdGUobmV3IERhdGUodikpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNvcmUuaXNEYXRlKHYpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJkYXRlXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgY3JlZGl0IGNhcmQgbnVtYmVyIHZhbGlkYXRvclxyXG4gIFBlcmZvcm1zIGEgbHVobiBhbGdvcml0aG0gY2hlY2tzdW0gdGVzdCBmb3IgcGxhdXNhYmlsaXR5XHJcbiAgY2F0Y2hlcyBzaW1wbGUgbWlzdGFrZXM7IG9ubHkgc2VydmljZSBrbm93cyBmb3Igc3VyZVxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBwZXJzb25UeXBlID0gZW0ubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiUGVyc29uXCIpO1xyXG4gICAgICB2YXIgY3JlZGl0Q2FyZFByb3BlcnR5ID0gcGVyc29uVHlwZS5nZXRQcm9wZXJ0eShcImNyZWRpdENhcmRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUGVyc29uLmNyZWRpdENhcmQgcHJvcGVydHkgaXMgY3JlZGl0IGNhcmQuXHJcbiAgICAgIGNyZWRpdENhcmRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmNyZWRpdENhcmQoKSk7XHJcbiAgQG1ldGhvZCBjcmVkaXRDYXJkXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBbY29udGV4dF0ge09iamVjdH0gb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRocm91Z2ggdG8gdmFsaWRhdGlvbiBjb25zdHJ1Y3RvclxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBjcmVkaXRDYXJkID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgZnVuY3Rpb24gdmFsRm4odjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mICh2KSAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcclxuICAgICAgdiA9IHYucmVwbGFjZSgvKFxcLXxcXHMpL2csIFwiXCIpOyAvLyByZW1vdmUgZGFzaGVzIGFuZCBzcGFjZXNcclxuICAgICAgaWYgKCF2IHx8IC9cXEQvLnRlc3QodikpIHJldHVybiBmYWxzZTsgLy8gYWxsIGRpZ2l0cywgbm90IGVtcHR5XHJcbiAgICAgIHJldHVybiBsdWhuKHYpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoJ2NyZWRpdENhcmQnLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdG9yOyB0aGUgZXhwcmVzc2lvbiBtdXN0IGJlIHNwZWNpZmllZFxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFkZCB2YWxpZGF0b3IgdG8gYSBwcm9wZXJ0eS4gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RvbWVyVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcmVnaW9uUHJvcGVydHkgPSBjdXN0b21lclR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiBDdXN0b21lci5SZWdpb24gaXMgMiBjaGFyIHVwcGVyY2FzZSBhbHBoYS5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5yZWd1bGFyRXhwcmVzc2lvbigge2V4cHJlc3Npb246ICdeW0EtWl17Mn0kJ30gKTtcclxuICBAbWV0aG9kIHJlZ3VsYXJFeHByZXNzaW9uXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBjb250ZXh0IHtPYmplY3R9XHJcbiAgQHBhcmFtIGNvbnRleHQuZXhwcmVzc2lvbiB7U3RyaW5nfSBTdHJpbmcgZm9ybSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHRvIGFwcGx5XHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHJlZ3VsYXJFeHByZXNzaW9uID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgZnVuY3Rpb24gdmFsRm4odjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICAvLyBkbyBub3QgaW52YWxpZGF0ZSBpZiBlbXB0eTsgdXNlIGEgc2VwYXJhdGUgcmVxdWlyZWQgdGVzdFxyXG4gICAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiAodikgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHJlID0gbmV3IFJlZ0V4cChjdHguZXhwcmVzc2lvbik7XHJcbiAgICAgICAgcmV0dXJuIHJlLnRlc3Qodik7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBleHByZXNzaW9uIHBhcmFtZXRlciB0byByZWdFeHAgdmFsaWRhdG9yJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKCdyZWd1bGFyRXhwcmVzc2lvbicsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSBlbWFpbCBhZGRyZXNzIHZhbGlkYXRvclxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBwZXJzb25UeXBlID0gZW0ubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiUGVyc29uXCIpO1xyXG4gICAgICB2YXIgZW1haWxQcm9wZXJ0eSA9IHBlcnNvblR5cGUuZ2V0UHJvcGVydHkoXCJlbWFpbFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBQZXJzb24uZW1haWwgcHJvcGVydHkgaXMgYW4gZW1haWwgYWRkcmVzcy5cclxuICAgICAgZW1haWxQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmVtYWlsQWRkcmVzcygpKTtcclxuICBAbWV0aG9kIGVtYWlsQWRkcmVzc1xyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZW1haWxBZGRyZXNzID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zcmtpcmtsYW5kL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvYmxvYi9tYXN0ZXIvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9FbWFpbEF0dHJpYnV0ZS5jc1xyXG4gICAgbGV0IHJlRW1haWxBZGRyZXNzID0gL14oKChbYS16XXxcXGR8WyEjXFwkJSYnXFwqXFwrXFwtXFwvPVxcP1xcXl9ge1xcfH1+XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkrKFxcLihbYS16XXxcXGR8WyEjXFwkJSYnXFwqXFwrXFwtXFwvPVxcP1xcXl9ge1xcfH1+XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkrKSopfCgoXFx4MjIpKCgoKFxceDIwfFxceDA5KSooXFx4MGRcXHgwYSkpPyhcXHgyMHxcXHgwOSkrKT8oKFtcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDdmXXxcXHgyMXxbXFx4MjMtXFx4NWJdfFtcXHg1ZC1cXHg3ZV18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfChcXFxcKFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZC1cXHg3Zl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSkpKigoKFxceDIwfFxceDA5KSooXFx4MGRcXHgwYSkpPyhcXHgyMHxcXHgwOSkrKT8oXFx4MjIpKSlAKCgoW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2Etel18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLikrKChbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2Etel18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuPyQvaTtcclxuICAgIHJldHVybiBtYWtlUmVnRXhwVmFsaWRhdG9yKCdlbWFpbEFkZHJlc3MnLCByZUVtYWlsQWRkcmVzcywgbnVsbCwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgcGhvbmUgdmFsaWRhdG9yXHJcbiAgUHJvdmlkZXMgYmFzaWMgYXNzZXJ0aW9ucyBvbiB0aGUgZm9ybWF0IGFuZCB3aWxsIGhlbHAgdG8gZWxpbWluYXRlIG1vc3Qgbm9uc2Vuc2UgaW5wdXRcclxuICBNYXRjaGVzOlxyXG4gIEludGVybmF0aW9uYWwgZGlhbGluZyBwcmVmaXg6IHt7fSwgKywgMCwgMDAwMH0gKHdpdGggb3Igd2l0aG91dCBhIHRyYWlsaW5nIGJyZWFrIGNoYXJhY3RlciwgaWYgbm90ICcrJzogWy0vLiBdKVxyXG4gID4gKChcXCspfCgwKFxcZCspP1stLy5cXHNdKSlcclxuICBDb3VudHJ5IGNvZGU6IHt7fSwgMSwgLi4uLCA5OTl9ICh3aXRoIG9yIHdpdGhvdXQgYSB0cmFpbGluZyBicmVhayBjaGFyYWN0ZXI6IFstLy4gXSlcclxuICA+IFsxLTldXFxkeywyfVstLy5cXHNdP1xyXG4gIEFyZWEgY29kZTogeygwKSwgLi4uLCAoMDAwMDAwKSwgMCwgLi4uLCAwMDAwMDB9ICh3aXRoIG9yIHdpdGhvdXQgYSB0cmFpbGluZyBicmVhayBjaGFyYWN0ZXI6IFstLy4gXSlcclxuICA+ICgoXFwoXFxkezEsNn1cXCl8XFxkezEsNn0pWy0vLlxcc10/KT9cclxuICBMb2NhbDogezAsIC4uLn0rICh3aXRoIG9yIHdpdGhvdXQgYSB0cmFpbGluZyBicmVhayBjaGFyYWN0ZXI6IFstLy4gXSlcclxuICA+IChcXGQrWy0vLlxcc10/KStcXGQrXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RvbWVyVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcGhvbmVQcm9wZXJ0eSA9IGN1c3RvbWVyVHlwZS5nZXRQcm9wZXJ0eShcInBob25lXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEN1c3RvbWVyLnBob25lIHByb3BlcnR5IGlzIHBob25lLlxyXG4gICAgICBwaG9uZVByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IucGhvbmUoKSk7XHJcbiAgQG1ldGhvZCBwaG9uZVxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcGhvbmUgPSBmdW5jdGlvbiAoY29udGV4dD86IGFueSkge1xyXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zcmtpcmtsYW5kL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvYmxvYi9tYXN0ZXIvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9FeHByZXNzaW9ucy5jc1xyXG4gICAgbGV0IHJlUGhvbmUgPSAvXigoXFwrfCgwKFxcZCspP1stLy5cXHNdPykpWzEtOV1cXGR7MCwyfVstLy5cXHNdPyk/KChcXChcXGR7MSw2fVxcKXxcXGR7MSw2fSlbLS8uXFxzXT8pPyhcXGQrWy0vLlxcc10/KStcXGQrJC87XHJcbiAgICByZXR1cm4gbWFrZVJlZ0V4cFZhbGlkYXRvcigncGhvbmUnLCByZVBob25lLCBudWxsLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSBVUkwgKHByb3RvY29sIHJlcXVpcmVkKSB2YWxpZGF0b3JcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgcGVyc29uVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIlBlcnNvblwiKTtcclxuICAgICAgdmFyIHdlYnNpdGVQcm9wZXJ0eSA9IHBlcnNvblR5cGUuZ2V0UHJvcGVydHkoXCJ3ZWJzaXRlXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFBlcnNvbi53ZWJzaXRlIHByb3BlcnR5IGlzIGEgVVJMLlxyXG4gICAgICB3ZWJzaXRlUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci51cmwoKSk7XHJcbiAgQG1ldGhvZCB1cmxcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHVybCA9IGZ1bmN0aW9uIChjb250ZXh0PzogYW55KSB7XHJcbiAgICAvL1NlZSBodHRwczovL2dpdGh1Yi5jb20vc3JraXJrbGFuZC9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL2Jsb2IvbWFzdGVyL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvVXJsQXR0cmlidXRlLmNzXHJcbiAgICBsZXQgcmVVcmxQcm90b2NvbFJlcXVpcmVkID0gL14oaHR0cHM/fGZ0cCk6XFwvXFwvKCgoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDopKkApPygoKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKSl8KFthLXpBLVpdW1xcLWEtekEtWjAtOV0qKXwoKChbYS16QS1aXXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2EtekEtWl18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2EtekEtWl18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuKSsoKFthLXpBLVpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpBLVpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2EtekEtWl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4/KSg6XFxkKik/KShcXC8oKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApKyhcXC8oKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCkqKSopPyk/KFxcPygoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCl8W1xcdUUwMDAtXFx1RjhGRl18XFwvfFxcPykqKT8oXFwjKCgoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mQS1GXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKXxcXC98XFw/KSopPyQvO1xyXG4gICAgcmV0dXJuIG1ha2VSZWdFeHBWYWxpZGF0b3IoJ3VybCcsIHJlVXJsUHJvdG9jb2xSZXF1aXJlZCwgbnVsbCwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0b3Igd2l0aCBhIGZpeGVkIGV4cHJlc3Npb24uXHJcbiAgTWFueSBvZiB0aGUgc3RvY2sgdmFsaWRhdG9ycyBhcmUgYnVpbHQgd2l0aCB0aGlzIGZhY3RvcnkgbWV0aG9kLlxyXG4gIFRoZWlyIGV4cHJlc3Npb25zIGFyZSBvZnRlbiBkZXJpdmVkIGZyb21cclxuICBodHRwczovL2dpdGh1Yi5jb20vc3JraXJrbGFuZC9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL2Jsb2IvbWFzdGVyL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnNcclxuICBZb3UgY2FuIHRyeSBtYW55IG9mIHRoZW0gYXQgaHR0cDovL2RhdGFhbm5vdGF0aW9uc2V4dGVuc2lvbnMub3JnL1xyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIE1ha2UgYSB6aXBjb2RlIHZhbGlkYXRvclxyXG4gICAgICBmdW5jdGlvbiB6aXBWYWxpZGF0b3IgPSBWYWxpZGF0b3IubWFrZVJlZ0V4cFZhbGlkYXRvcihcclxuICAgICAgXCJ6aXBWYWwsXHJcbiAgICAgIC9eXFxkezV9KFtcXC1dXFxkezR9KT8kLyxcclxuICAgICAgXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgaXMgbm90IGEgdmFsaWQgVS5TLiB6aXBjb2RlXCIpO1xyXG4gICAgICAvLyBSZWdpc3RlciBpdC5cclxuICAgICAgVmFsaWRhdG9yLnJlZ2lzdGVyKHppcFZhbGlkYXRvcik7XHJcbiAgICAgIC8vIEFkZCBpdCB0byBhIGRhdGEgcHJvcGVydHkuIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgemlwUHJvcGVydHkgPSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIlBvc3RhbENvZGVcIik7XHJcbiAgICAgIHppcFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaCh6aXBWYWxpZGF0b3IpO1xyXG4gIEBtZXRob2QgbWFrZVJlZ0V4cFZhbGlkYXRvclxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gdmFsaWRhdG9yTmFtZSB7U3RyaW5nfSBuYW1lIG9mIHRoaXMgdmFsaWRhdG9yXHJcbiAgQHBhcmFtIGV4cHJlc3Npb24ge1N0cmluZyB8IFJlZ0V4cH0gcmVndWxhciBleHByZXNzaW9uIHRvIGFwcGx5XHJcbiAgQHBhcmFtIFtkZWZhdWx0TWVzc2FnZV0ge1N0cmluZ30gZGVmYXVsdCBtZXNzYWdlIGZvciBmYWlsZWQgdmFsaWRhdGlvbnNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgbWFrZVJlZ0V4cFZhbGlkYXRvciA9IG1ha2VSZWdFeHBWYWxpZGF0b3I7XHJcblxyXG59XHJcblZhbGlkYXRvci5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiVmFsaWRhdG9yXCI7XHJcblxyXG4vLyByZWdpc3RlciBhbGwgdmFsaWRhdG9yc1xyXG5FcnJvclsneCddID0gY29yZS5vYmplY3RGb3JFYWNoKFZhbGlkYXRvciwgZnVuY3Rpb24gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgaWYgKHR5cGVvZiAodmFsdWUpICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgaWYgKGtleSA9PT0gXCJmcm9tSlNPTlwiIHx8IGtleSA9PT0gXCJyZWdpc3RlclwiIHx8XHJcbiAgICAgIGtleSA9PT0gXCJyZWdpc3RlckZhY3RvcnlcIiB8fCBrZXkgPT09IFwibWFrZVJlZ0V4cFZhbGlkYXRvclwiKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25maWcucmVnaXN0ZXJGdW5jdGlvbih2YWx1ZSwgXCJWYWxpZGF0b3IuXCIgKyBrZXkpO1xyXG59KTtcclxuXHJcbmZ1bmN0aW9uIGZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIHZhcnM6IE9iamVjdCwgb3duUHJvcGVydGllc09ubHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gIGlmICghdmFycykgcmV0dXJuIHRlbXBsYXRlO1xyXG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC8lKFteJV0rKSUvZywgZnVuY3Rpb24gKF8sIGtleSkge1xyXG4gICAgbGV0IHZhbE9yRm46IGFueTtcclxuICAgIGlmIChvd25Qcm9wZXJ0aWVzT25seSkge1xyXG4gICAgICB2YWxPckZuID0gdmFycy5oYXNPd25Qcm9wZXJ0eShrZXkpID8gdmFyc1trZXldIDogJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YWxPckZuID0gdmFyc1trZXldO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbE9yRm4gIT0gbnVsbCkge1xyXG4gICAgICBpZiAoY29yZS5pc0Z1bmN0aW9uKHZhbE9yRm4pKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbE9yRm4odmFycyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbE9yRm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnRSYW5nZVZhbGlkYXRvckN0b3IodmFsaWRhdG9yTmFtZTogc3RyaW5nLCBtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyLCBjb250ZXh0OiBhbnkpIHtcclxuICBjb250ZXh0ID0gY29udGV4dCB8fCB7fTtcclxuICBpZiAobWluVmFsdWUgIT09IHVuZGVmaW5lZCkgeyBjb250ZXh0Lm1pbiA9IG1pblZhbHVlOyB9XHJcbiAgaWYgKG1heFZhbHVlICE9PSB1bmRlZmluZWQpIHsgY29udGV4dC5tYXggPSBtYXhWYWx1ZTsgfVxyXG4gIGxldCB0ZW1wbGF0ZUV4aXN0cyA9IGNvbnRleHQubWVzc2FnZVRlbXBsYXRlIHx8IFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzW3ZhbGlkYXRvck5hbWVdO1xyXG4gIGlmICghdGVtcGxhdGVFeGlzdHMpIHtcclxuICAgIFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzW3ZhbGlkYXRvck5hbWVdID0gY29yZS5mb3JtYXRTdHJpbmcoXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gdGhlIHZhbHVlcyBvZiAlMSBhbmQgJTJcIixcclxuICAgICAgICBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xyXG4gIH1cclxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiBjdHggJiYgY3R4LmFsbG93U3RyaW5nKSB7XHJcbiAgICAgICAgdiA9IHBhcnNlSW50KHYsIDApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICgodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpICYmICghaXNOYU4odikpICYmIE1hdGguZmxvb3IodikgPT09IHYpIHtcclxuICAgICAgICBpZiAobWluVmFsdWUgIT0gbnVsbCAmJiB2IDwgbWluVmFsdWUpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heFZhbHVlICE9IG51bGwgJiYgdiA+IG1heFZhbHVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKHZhbGlkYXRvck5hbWUsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlZ0V4cFZhbGlkYXRvcih2YWxpZGF0b3JOYW1lOiBzdHJpbmcsIGV4cHJlc3Npb246IFJlZ0V4cCwgZGVmYXVsdE1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCBjb250ZXh0PzogYW55KSB7XHJcbiAgaWYgKGRlZmF1bHRNZXNzYWdlKSB7XHJcbiAgICBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1t2YWxpZGF0b3JOYW1lXSA9IGRlZmF1bHRNZXNzYWdlO1xyXG4gIH1cclxuICBsZXQgcmUgPSAodHlwZW9mIChleHByZXNzaW9uKSA9PT0gJ3N0cmluZycpID8gbmV3IFJlZ0V4cChleHByZXNzaW9uKSA6IGV4cHJlc3Npb247XHJcbiAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgLy8gZG8gbm90IGludmFsaWRhdGUgaWYgZW1wdHk7IHVzZSBhIHNlcGFyYXRlIHJlcXVpcmVkIHRlc3RcclxuICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHR5cGVvZiAodikgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gcmUudGVzdCh2KTtcclxuICB9O1xyXG4gIHJldHVybiBuZXcgVmFsaWRhdG9yKHZhbGlkYXRvck5hbWUsIHZhbEZuLCBjb250ZXh0KTtcclxufVxyXG5cclxuLy8gaHR0cDovL3Jvc2V0dGFjb2RlLm9yZy93aWtpL0x1aG5fdGVzdF9vZl9jcmVkaXRfY2FyZF9udW1iZXJzI0phdmFTY3JpcHRcclxuXHJcbi8vIGZ1bmN0aW9uIGx1aG4oYTogc3RyaW5nLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyLCBlOiBudW1iZXIpIHtcclxuLy8gICBmb3IgKGQgPSArYVtiID0gYS5sZW5ndGggLSAxXSwgZSA9IDA7IGItLTsgKSB7XHJcbi8vICAgICBjID0gK2FbYl0sIGQgKz0gKytlICUgMiA/IDIgKiBjICUgMTAgKyAoYyA+IDQpIDogYztcclxuLy8gICB9XHJcbi8vICAgcmV0dXJuICEoZCAlIDEwKTtcclxuLy8gfTtcclxuXHJcbmxldCAgbHVobiA9IChmdW5jdGlvbigpIHtcclxuICBsZXQgbHVobkFyciA9IFswLCAyLCA0LCA2LCA4LCAxLCAzLCA1LCA3LCA5XTtcclxuICByZXR1cm4gZnVuY3Rpb24oc3RyOiBzdHJpbmcpIFx0e1xyXG4gICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgbGV0IGluY051bTogbnVtYmVyO1xyXG4gICAgbGV0IG9kZCA9IGZhbHNlO1xyXG4gICAgbGV0IHRlbXAgPSBTdHJpbmcoc3RyKS5yZXBsYWNlKC9bXlxcZF0vZywgXCJcIik7XHJcbiAgICBpZiAoIHRlbXAubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gdGVtcC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgIHtcclxuICAgICAgaW5jTnVtID0gcGFyc2VJbnQodGVtcC5jaGFyQXQoaSksIDEwKTtcclxuICAgICAgY291bnRlciArPSAob2RkID0gIW9kZCkgPyBpbmNOdW0gOiBsdWhuQXJyW2luY051bV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKGNvdW50ZXIgJSAxMCA9PT0gMCk7XHJcbiAgfTtcclxufSkoKTtcclxuXHJcbi8qKlxyXG5BIFZhbGlkYXRpb25FcnJvciBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgZmFpbGVkIHZhbGlkYXRpb24uXHJcblxyXG5AY2xhc3MgVmFsaWRhdGlvbkVycm9yXHJcbioqL1xyXG5cclxuLyoqXHJcbkNvbnN0cnVjdHMgYSBuZXcgVmFsaWRhdGlvbkVycm9yXHJcbkBtZXRob2QgPGN0b3I+IFZhbGlkYXRpb25FcnJvclxyXG5cclxuQHBhcmFtIHZhbGlkYXRvciB7VmFsaWRhdG9yIHx8IG51bGx9IFRoZSBWYWxpZGF0b3IgdXNlZCB0byBjcmVhdGUgdGhpcyBlcnJvciwgaWYgYW55LlxyXG5AcGFyYW0gY29udGV4dCB7IENvbnRleHRPYmplY3QgfHwgbnVsbH0gVGhlIENvbnRleHQgb2JqZWN0IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgVmFsaWRhdG9yIHRvIGNyZWF0ZSB0aGlzIGVycm9yLlxyXG5AcGFyYW0gZXJyb3JNZXNzYWdlIHsgU3RyaW5nfSBUaGUgYWN0dWFsIGVycm9yIG1lc3NhZ2VcclxuQHBhcmFtIFtrZXldIHtTdHJpbmd9IEFuIG9wdGlvbmFsIGtleSB1c2VkIHRvIGRlZmluZSBhIGtleSBmb3IgdGhpcyBlcnJvci4gT25lIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vdCBwcm92aWRlZCBoZXJlLlxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciB7XHJcbiAgdmFsaWRhdG9yPzogVmFsaWRhdG9yO1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGNvbnRleHQ6IGFueTtcclxuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICBwcm9wZXJ0eTogYW55OyAvLyBJUHJvcGVydHlcclxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcclxuICBpc1NlcnZlckVycm9yOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2YWxpZGF0b3I6IFZhbGlkYXRvciB8IG51bGwsIGNvbnRleHQ6IFZhbGlkYXRpb25Db250ZXh0LCBlcnJvck1lc3NhZ2U6IHN0cmluZywga2V5Pzogc3RyaW5nKSB7XHJcbiAgICAvLyBFcnJvciBpcyB3aXRoIGlzSW5zdGFuY2VPZihWYWxpZGF0b3IpXHJcbiAgICBhc3NlcnRQYXJhbSh2YWxpZGF0b3IsIFwidmFsaWRhdG9yXCIpLmlzT3B0aW9uYWwoKS5pc0luc3RhbmNlT2YoVmFsaWRhdG9yKS5jaGVjaygpO1xyXG4gICAgYXNzZXJ0UGFyYW0oZXJyb3JNZXNzYWdlLCBcImVycm9yTWVzc2FnZVwiKS5pc05vbkVtcHR5U3RyaW5nKCkuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKGtleSwgXCJrZXlcIikuaXNPcHRpb25hbCgpLmlzTm9uRW1wdHlTdHJpbmcoKS5jaGVjaygpO1xyXG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgdW5kZWZpbmVkO1xyXG4gICAgY29udGV4dCA9IGNvbnRleHQgfHwge307XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XHJcblxyXG4gICAgdGhpcy5wcm9wZXJ0eSA9IGNvbnRleHQucHJvcGVydHk7XHJcbiAgICB0aGlzLnByb3BlcnR5TmFtZSA9IGNvbnRleHQucHJvcGVydHlOYW1lIHx8IChjb250ZXh0LnByb3BlcnR5ICYmIGNvbnRleHQucHJvcGVydHkubmFtZSk7XHJcblxyXG4gICAgaWYgKGtleSkge1xyXG4gICAgICB0aGlzLmtleSA9IGtleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMua2V5ID0gVmFsaWRhdGlvbkVycm9yLmdldEtleSh2YWxpZGF0b3IgfHwgZXJyb3JNZXNzYWdlLCB0aGlzLnByb3BlcnR5TmFtZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzU2VydmVyRXJyb3IgPSBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICBUaGUgVmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZhbGlkYXRpb25FcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IHZhbGlkYXRvciB7VmFsaWRhdG9yfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBBICdjb250ZXh0JyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVmFsaWRhdGlvbkVycm9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgY29udGV4dCB7T2JqZWN0fVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUgRGF0YVByb3BlcnR5IG9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhpcyBWYWxpZGF0aW9uRXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBwcm9wZXJ0eSB7RGF0YVByb3BlcnR5fE5hdmlnYXRpb25Qcm9wZXJ0eX1cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIHByb3BlcnR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVmFsaWRhdGlvbkVycm9yLiBUaGlzIHdpbGwgYmUgYSBcInByb3BlcnR5IHBhdGhcIiBmb3IgYW55IHByb3BlcnRpZXMgb2YgYSBjb21wbGV4IG9iamVjdC5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IHByb3BlcnR5TmFtZSB7U3RyaW5nfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIFZhbGlkYXRpb25FcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGVycm9yTWVzc2FnZSB7c3RyaW5nfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUga2V5IGJ5IHdoaWNoIHRoaXMgdmFsaWRhdGlvbiBlcnJvciBtYXkgYmUgcmVtb3ZlZCBmcm9tIGEgY29sbGVjdGlvbiBvZiBWYWxpZGF0aW9uRXJyb3JzLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkga2V5IHtzdHJpbmd9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFdoZXRoZXIgdGhpcyBpcyBhIHNlcnZlciBlcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGlzU2VydmVyRXJyb3Ige2Jvb2x9XHJcbiAgKiovXHJcblxyXG5cclxuICAvKipcclxuICBDb21wb3NlcyBhIFZhbGlkYXRpb25FcnJvciAna2V5JyBnaXZlbiBhIHZhbGlkYXRvciBvciBhbiBlcnJvck5hbWUgYW5kIGFuIG9wdGlvbmFsIHByb3BlcnR5TmFtZVxyXG4gIEBtZXRob2QgZ2V0S2V5XHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSB2YWxpZGF0b3Ige1ZhbGlkYXRvck9yRXJyb3JLZXl9IEEgVmFsaWRhdG9yIG9yIGFuIFwiZXJyb3IgbmFtZVwiIGlmIG5vIHZhbGlkYXRvciBpcyBhdmFpbGFibGUuXHJcbiAgQHBhcmFtIFtwcm9wZXJ0eU5hbWVdIEEgcHJvcGVydHkgbmFtZVxyXG4gIEByZXR1cm4ge1N0cmluZ30gQSBWYWxpZGF0aW9uRXJyb3IgJ2tleSdcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGdldEtleSh2YWxpZGF0b3JPckVycm9yTmFtZTogVmFsaWRhdG9yIHwgc3RyaW5nLCBwcm9wZXJ0eU5hbWU/OiBzdHJpbmcpIHtcclxuICAgIGxldCBuYW1lID0gKHR5cGVvZiB2YWxpZGF0b3JPckVycm9yTmFtZSA9PT0gJ3N0cmluZycpID8gdmFsaWRhdG9yT3JFcnJvck5hbWUgOiB2YWxpZGF0b3JPckVycm9yTmFtZS5uYW1lO1xyXG4gICAgcmV0dXJuIG5hbWUgKyAocHJvcGVydHlOYW1lID8gXCI6XCIgKyBwcm9wZXJ0eU5hbWUgOiBcIlwiKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIl19
996
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL3ZhbGlkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFJbEMsTUFBTSxDQUFDLElBQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFFL0IsTUFBTSxDQUFDLElBQU0sU0FBUyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFFcEMsTUFBTSxDQUFDLElBQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLENBQUMsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO1NBMEJiLFVBQVUsT0FBMEI7SUFDL0MsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztLQUN6RztTQUFNO1FBQ0wsT0FBTyxPQUFPLENBQUM7S0FDaEI7QUFDSCxDQUFDO0FBUkgsbUVBQW1FO0FBQ25FLElBQUksV0FBVyxHQUFHO0lBQ2hCLFdBQVcsSUFNVjtDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdIRztBQUNIO0lBVUUsbUJBQVksSUFBWSxFQUFFLEtBQW1CLEVBQUUsT0FBa0M7UUFDL0UsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxJQUFJLEVBQThCLENBQUM7UUFDOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBNkIsQ0FBQztRQUNqRyxPQUFPLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUVIOzs7Ozs7T0FNRztJQUdIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXVCRztJQUNILDRCQUFRLEdBQVIsVUFBUyxLQUFVLEVBQUUsaUJBQTRDO1FBQy9ELElBQUksY0FBd0MsQ0FBQyxDQUFDLHNCQUFzQjtRQUNwRSxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGlCQUFpQixDQUE2QixDQUFDO1NBQzFHO2FBQU07WUFDTCxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUMvQjtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXJDLElBQUk7WUFDRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLGNBQWMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixPQUFPLElBQUksZUFBZSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7YUFDckU7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLG9EQUFvRCxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwSDtJQUNILENBQUM7SUFHRCwrREFBK0Q7SUFFL0Q7Ozs7Ozs7O09BUUc7SUFDSCw4QkFBVSxHQUFWO1FBQ0UsSUFBSTtZQUNGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDbEMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUM5QixJQUFJLE9BQU8sRUFBRTtnQkFDWCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxVQUFVLEVBQUU7b0JBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN6QjtxQkFBTTtvQkFDTCxPQUFPLE9BQU8sQ0FBQztpQkFDaEI7YUFDRjtpQkFBTSxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUU7Z0JBQ2xDLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDekQ7aUJBQU07Z0JBQ0wsT0FBTyxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUkscUJBQXFCLENBQUMsQ0FBQzthQUNqRTtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLGdDQUFnQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFFRCwwQkFBTSxHQUFOO1FBQ0UsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNXLGtCQUFRLEdBQXRCLFVBQXVCLElBQVM7UUFDOUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7Z0JBQzFCLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxJQUFJLFlBQVksU0FBUyxFQUFFO1lBQzdCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLGFBQWEsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUM3QyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ1csa0JBQVEsR0FBdEIsVUFBdUIsU0FBb0I7UUFDekMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1lBQ3RCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsRUFBRSxZQUFZLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDVyx5QkFBZSxHQUE3QixVQUE4QixnQkFBOEMsRUFBRSxJQUFZO1FBQ3hGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDVywwQkFBZ0IsR0FBRztRQUMvQixJQUFJLEVBQUUsbURBQW1EO1FBQ3pELFVBQVUsRUFBRSxxREFBcUQ7UUFDakUsSUFBSSxFQUFFLGdDQUFnQztRQUN0QyxRQUFRLEVBQUUsd0VBQXdFO1FBQ2xGLFlBQVksRUFBRSwwREFBMEQ7UUFDeEUsSUFBSSxFQUFFLGdDQUFnQztRQUN0QyxPQUFPLEVBQUUsb0NBQW9DO1FBQzdDLFlBQVksRUFBRSxvRkFBb0Y7UUFDbEcsU0FBUyxFQUFFLHNFQUFzRTtRQUNqRixNQUFNLEVBQUUsa0NBQWtDO1FBQzFDLEtBQUssRUFBRSx5REFBeUQ7UUFDaEUsaUJBQWlCLEVBQUUsMkRBQTJEO1FBQzlFLFFBQVEsRUFBRSw2QkFBNkI7UUFDdkMsTUFBTSxFQUFFLGtDQUFrQztRQUMxQyxZQUFZLEVBQUUsc0ZBQXNGO1FBQ3BHLEdBQUcsRUFBRSxnREFBZ0Q7S0FDdEQsQ0FBQztJQUVGOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNXLGtCQUFRLEdBQUcsVUFBUyxPQUFhO1FBQzdDLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBTSxFQUFFLEdBQVE7WUFDcEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7Z0JBQ3pCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxpQkFBaUI7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQztJQUVGOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDVyxtQkFBUyxHQUFHLFVBQVMsT0FBWTtRQUM3QyxJQUFJLEtBQUssR0FBRyxVQUFVLENBQU0sRUFBRSxHQUFRO1lBQ3BDLElBQUksQ0FBQyxJQUFJLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDM0IsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQyxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxDQUFDLENBQUM7UUFDRixPQUFPLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ1csc0JBQVksR0FBRyxVQUFVLE9BQVk7UUFDakQsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFNLEVBQUUsR0FBUTtZQUNwQyxJQUFJLENBQUMsSUFBSSxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzNCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDMUMsSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxTQUFTO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3BFLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNwRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxTQUFTLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7T0FXRztJQUNXLGdCQUFNLEdBQUc7UUFDckIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFNO1lBQzFCLElBQUksQ0FBQyxJQUFJLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDM0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQztJQUVGOzs7Ozs7Ozs7OztPQVdHO0lBQ1csY0FBSSxHQUFHO1FBQ25CLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBTTtZQUMxQixJQUFJLENBQUMsSUFBSSxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFDRixPQUFPLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7T0FXRztJQUNXLGtCQUFRLEdBQUc7UUFDdkIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFNO1lBQzFCLElBQUksQ0FBQyxJQUFJLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQztJQUVGOzs7Ozs7Ozs7OztPQVdHO0lBRUQsb0RBQW9EO0lBQ3hDLGdCQUFNLEdBQUcsVUFBUyxPQUFhO1FBQzNDLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBTSxFQUFFLEdBQVE7WUFDcEMsSUFBSSxDQUFDLElBQUksSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUMzQixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRTtnQkFDbkQsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQjtZQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7UUFDRixPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDO0lBQ1ksZ0JBQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQzFCLGdCQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUV4Qzs7Ozs7Ozs7Ozs7T0FXRztJQUNXLGlCQUFPLEdBQUcsVUFBUyxPQUFZO1FBQzNDLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBTSxFQUFFLEdBQVE7WUFDcEMsSUFBSSxDQUFDLElBQUksSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUMzQixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRTtnQkFDbkQsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDckI7WUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUM7SUFDWSxlQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUV4Qzs7Ozs7Ozs7OztPQVVHO0lBQ1csZUFBSyxHQUFHLFVBQVMsT0FBWTtRQUN6QyxPQUFPLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDekUsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7Ozs7O09BV0c7SUFDVyxlQUFLLEdBQUcsVUFBUyxPQUFZO1FBQ3pDLE9BQU8scUJBQXFCLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN6RSxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7O09BWUc7SUFDVyxjQUFJLEdBQUcsVUFBUyxPQUFZO1FBQ3hDLE9BQU8scUJBQXFCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUN0RSxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7T0FXRztJQUNXLGNBQUksR0FBRztRQUNuQixJQUFJLEtBQUssR0FBRyxVQUFVLENBQU07WUFDMUIsSUFBSSxDQUFDLElBQUksSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUMzQixPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztJQUVZLGNBQUksR0FBRztRQUNuQixJQUFJLEtBQUssR0FBRyxVQUFVLENBQU07WUFDMUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7UUFDRixPQUFPLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7O09BWUc7SUFDVyxjQUFJLEdBQUc7UUFDbkIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFNO1lBQzFCLElBQUksQ0FBQyxJQUFJLElBQUk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDM0IsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7Z0JBQ3pCLElBQUk7b0JBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdCLFdBQVc7b0JBQ1gsZ0NBQWdDO2lCQUNqQztnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO2lCQUFNO2dCQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2QjtRQUNILENBQUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztJQUVGOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ1csb0JBQVUsR0FBRyxVQUFTLE9BQWE7UUFDL0MsU0FBUyxLQUFLLENBQUMsQ0FBTTtZQUNuQixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDdkMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQywyQkFBMkI7WUFDMUQsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLHdCQUF3QjtZQUM5RCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQztJQUdGOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDVywyQkFBaUIsR0FBRyxVQUFTLE9BQWE7UUFDdEQsU0FBUyxLQUFLLENBQUMsQ0FBTSxFQUFFLEdBQVE7WUFDN0IsMkRBQTJEO1lBQzNELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUN2QyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzFDLElBQUk7Z0JBQ0YsSUFBSSxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbkI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7YUFDaEY7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7Ozs7OztPQVlHO0lBQ1csc0JBQVksR0FBRyxVQUFTLE9BQWE7UUFDakQsc0hBQXNIO1FBQ3RILElBQUksY0FBYyxHQUFHLDQ0QkFBNDRCLENBQUM7UUFDbDZCLE9BQU8sbUJBQW1CLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FzQkc7SUFDVyxlQUFLLEdBQUcsVUFBVSxPQUFhO1FBQzNDLG1IQUFtSDtRQUNuSCxJQUFJLE9BQU8sR0FBRyxrR0FBa0csQ0FBQztRQUNqSCxPQUFPLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQztJQUVGOzs7Ozs7Ozs7Ozs7T0FZRztJQUNXLGFBQUcsR0FBRyxVQUFVLE9BQWE7UUFDekMsbUhBQW1IO1FBQ25ILElBQUkscUJBQXFCLEdBQUcsbXZDQUFtdkMsQ0FBQztRQUNoeEMsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQztJQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJHO0lBQ1csNkJBQW1CLEdBQUcsbUJBQW1CLENBQUM7SUFFMUQsZ0JBQUM7Q0FBQSxBQXhvQkQsSUF3b0JDO1NBeG9CWSxTQUFTO0FBeW9CdEIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0FBRTdDLDBCQUEwQjtBQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxHQUFXLEVBQUUsS0FBVTtJQUMxRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxVQUFVLEVBQUU7UUFDakMsT0FBTztLQUNSO0lBQ0QsSUFBSSxHQUFHLEtBQUssVUFBVSxJQUFJLEdBQUcsS0FBSyxVQUFVO1FBQ3hDLEdBQUcsS0FBSyxpQkFBaUIsSUFBSSxHQUFHLEtBQUsscUJBQXFCLEVBQUU7UUFDOUQsT0FBTztLQUNSO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDLENBQUM7QUFFSCxTQUFTLGNBQWMsQ0FBQyxRQUFnQixFQUFFLElBQVksRUFBRSxpQkFBa0M7SUFBbEMsa0NBQUEsRUFBQSx5QkFBa0M7SUFDeEYsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUMzQixPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxFQUFFLEdBQUc7UUFDcEQsSUFBSSxPQUFZLENBQUM7UUFDakIsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDckQ7YUFBTTtZQUNMLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckI7UUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM1QixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QjtpQkFBTTtnQkFDTCxPQUFPLE9BQU8sQ0FBQzthQUNoQjtTQUNGO2FBQU07WUFDTCxPQUFPLEVBQUUsQ0FBQztTQUNYO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxhQUFxQixFQUFFLFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxPQUFZO0lBQ3BHLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ3hCLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDO0tBQUU7SUFDdkQsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQUUsT0FBTyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUM7S0FBRTtJQUN2RCxJQUFJLGNBQWMsR0FBRyxPQUFPLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxRixJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ25CLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG9FQUFvRSxFQUM5SCxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDekI7SUFDRCxPQUFPO1FBQ0wsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFNLEVBQUUsR0FBUTtZQUNwQyxJQUFJLENBQUMsSUFBSSxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzNCLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFO2dCQUNuRCxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNwQjtZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pFLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsUUFBUSxFQUFFO29CQUNwQyxPQUFPLEtBQUssQ0FBQztpQkFDZDtnQkFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRTtvQkFDcEMsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxPQUFPLEtBQUssQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLFNBQVMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsYUFBcUIsRUFBRSxVQUFrQixFQUFFLGNBQThCLEVBQUUsT0FBYTtJQUMxSCxJQUFJLGNBQWMsRUFBRTtRQUNsQixTQUFTLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsY0FBYyxDQUFDO0tBQzVEO0lBQ0QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDbEYsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFNO1FBQzFCLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUMsQ0FBQztJQUNGLE9BQU8sSUFBSSxTQUFTLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RCxDQUFDO1NBV1k7SUFDWCxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sVUFBUyxHQUFXO1FBQ3pCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDaEIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0MsSUFBSyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUc7WUFDMUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUMsQ0FBQztBQUNKLENBQUM7QUF2QkQsMEVBQTBFO0FBRTFFLHlFQUF5RTtBQUN6RSxtREFBbUQ7QUFDbkQsMERBQTBEO0FBQzFELE1BQU07QUFDTixzQkFBc0I7QUFDdEIsS0FBSztBQUVMLElBQUssSUFBSSxHQUFHLElBY1YsRUFBRSxDQUFDO0FBRUw7Ozs7R0FJRztBQUVIOzs7Ozs7OztHQVFHO0FBQ0g7SUFTRSx5QkFBWSxTQUEyQixFQUFFLE9BQTBCLEVBQUUsWUFBb0IsRUFBRSxHQUFZO1FBQ3JHLHdDQUF3QztRQUN4QyxXQUFXLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqRixXQUFXLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckUsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQztRQUN4QyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUVqQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhGLElBQUksR0FBRyxFQUFFO1lBQ1AsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7U0FDaEI7YUFBTTtZQUNMLElBQUksQ0FBQyxHQUFHLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNqRjtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFHRDs7Ozs7T0FLRztJQUVIOzs7OztPQUtHO0lBRUg7Ozs7O09BS0c7SUFFSDs7Ozs7T0FLRztJQUVIOzs7OztPQUtHO0lBRUg7Ozs7O09BS0c7SUFFSDs7Ozs7T0FLRztJQUdIOzs7Ozs7O09BT0c7SUFDVyxzQkFBTSxHQUFwQixVQUFxQixvQkFBd0MsRUFBRSxZQUFxQjtRQUNsRixJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFDekcsT0FBTyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFSCxzQkFBQztBQUFELENBQUMsQUE5RkQsSUE4RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgYXNzZXJ0UGFyYW0gfSBmcm9tICcuL2Fzc2VydC1wYXJhbSc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblByb3BlcnR5LCBEYXRhUHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcblxyXG5leHBvcnQgY29uc3QgSU5UMTZfTUlOID0gLTMyNzY4O1xyXG5leHBvcnQgY29uc3QgSU5UMTZfTUFYID0gMzI3Njc7XHJcblxyXG5leHBvcnQgY29uc3QgSU5UMzJfTUlOID0gLTIxNDc0ODM2NDg7XHJcbmV4cG9ydCBjb25zdCBJTlQzMl9NQVggPSAyMTQ3NDgzNjQ3O1xyXG5cclxuZXhwb3J0IGNvbnN0IEJZVEVfTUlOID0gMDtcclxuZXhwb3J0IGNvbnN0IEJZVEVfTUFYID0gMjU1O1xyXG5cclxuLyoqIFBhc3NlZCB0byBWYWxpZGF0aW9uRm4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uQ29udGV4dCB7XHJcbiAgZW50aXR5PzogRW50aXR5O1xyXG4gIHByb3BlcnR5PzogRGF0YVByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5O1xyXG4gIHByb3BlcnR5TmFtZT86IHN0cmluZztcclxuICB2YWx1ZT86IGFueTtcclxufVxyXG5cclxuLyoqIFVzZWQgYnkgVmFsaWRhdG9yIHRvIGNvbXBvc2UgbWVzc2FnZXMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQgZXh0ZW5kcyBWYWxpZGF0aW9uQ29udGV4dCB7XHJcbiAgbmFtZT86IHN0cmluZztcclxuICBkaXNwbGF5TmFtZT86IHN0cmluZztcclxuICBtZXNzYWdlVGVtcGxhdGU/OiBzdHJpbmc7XHJcbiAgbWVzc2FnZT86IHN0cmluZyB8ICgodmM6IFZhbGlkYXRpb25Db250ZXh0KSA9PiBzdHJpbmcpO1xyXG4gIFtrZXk6c3RyaW5nXTogYW55O1xyXG59XHJcblxyXG4vKiogRnVuY3Rpb24gY2FsbGVkIHRvIHZhbGlkYXRlIGFuIGVudGl0eSBvciBwcm9wZXJ0eSAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25GbiB7XHJcbiAgICAodmFsdWU6IGFueSwgY29udGV4dD86IFZhbGlkYXRpb25Db250ZXh0KTogYm9vbGVhbjtcclxufVxyXG5cclxuLy8gYWRkIGNvbW1vbiBwcm9wcyBhbmQgbWV0aG9kcyBmb3IgZXZlcnkgdmFsaWRhdG9yICdjb250ZXh0JyBoZXJlLlxyXG5sZXQgcm9vdENvbnRleHQgPSB7XHJcbiAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uIChjb250ZXh0OiBWYWxpZGF0aW9uQ29udGV4dCkge1xyXG4gICAgaWYgKGNvbnRleHQucHJvcGVydHkpIHtcclxuICAgICAgcmV0dXJuIGNvbnRleHQucHJvcGVydHkucmVzb2x2ZVByb3BlcnR5KFwiZGlzcGxheU5hbWVcIikgfHwgY29udGV4dC5wcm9wZXJ0eU5hbWUgfHwgY29udGV4dC5wcm9wZXJ0eS5uYW1lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFwiVmFsdWVcIjtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuSW5zdGFuY2VzIG9mIHRoZSBWYWxpZGF0b3IgY2xhc3MgcHJvdmlkZSB0aGUgbG9naWMgdG8gdmFsaWRhdGUgYW5vdGhlciBvYmplY3QgYW5kIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiBvZiBhbnkgZXJyb3JzXHJcbmVuY291bnRlcmVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLiAgVGhleSBhcmUgdHlwaWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBhICd2YWxpZGF0b3JzJyBwcm9wZXJ0eSBvbiB0aGUgZm9sbG93aW5nIHR5cGVzOiBbW0VudGl0eVR5cGVdXSxcclxuW1tEYXRhUHJvcGVydHldXSBvciBbW05hdmlnYXRpb25Qcm9wZXJ0eV1dLlxyXG5cclxuQSBudW1iZXIgb2YgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdG9ycyBhcmUgcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LCBpLmUgYWRkZWQgdG8gZWFjaCBEYXRhUHJvcGVydHkudmFsaWRhdG9ycyBwcm9wZXJ0eVxyXG5iYXNlZCBvbiBbW0RhdGFQcm9wZXJ0eV1dIG1ldGFkYXRhLiAgRm9yIGV4YW1wbGUsXHJcblxyXG4tIERhdGFQcm9wZXJ0eS5kYXRhVHlwZSAtPiBvbmUgb2YgdGhlICdkYXRhVHlwZScgdmFsaWRhdG9yIG1ldGhvZHMgc3VjaCBhcyBWYWxpZGF0b3IuaW50NjQsIFZhbGlkYXRvci5kYXRlLCBWYWxpZGF0b3IuYm9vbCBldGMuXHJcbi0gRGF0YVByb3BlcnR5Lm1heExlbmd0aCAtPiBWYWxpZGF0b3IubWF4TGVuZ3RoXHJcbi0gRGF0YVByb3BlcnR5LmlzTnVsbGFibGUgLT4gVmFsaWRhdG9yLnJlcXVpcmVkIChpZiBub3QgbnVsbGFibGUpXHJcblxyXG5AY2xhc3MgVmFsaWRhdG9yXHJcbioqL1xyXG5cclxuLyoqXHJcblZhbGlkYXRvciBjb25zdHJ1Y3RvciAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY3JlYXRlIGNyZWF0ZSBjdXN0b20gdmFsaWRhdGlvbnMuICBTZXZlcmFsXHJcbmJhc2ljIFwiVmFsaWRhdG9yXCIgY29uc3RydWN0aW9uIG1ldGhvZHMgYXJlIGFsc28gcHJvdmlkZWQgYXMgc3RhdGljIG1ldGhvZHMgdG8gdGhpcyBjbGFzcy4gVGhlc2UgbWV0aG9kc1xyXG5wcm92aWRlIGEgc2ltcGxlciBzeW50YXggZm9yIGNyZWF0aW5nIGJhc2ljIHZhbGlkYXRpb25zLlxyXG5cclxuTWFueSBvZiB0aGVzZSBzdG9jayB2YWxpZGF0b3JzIGFyZSBpbnNwaXJlZCBieSBhbmQgaW1wbGVtZW50ZWQgdG8gY29uZm9ybSB0byB0aGUgdmFsaWRhdG9ycyBkZWZpbmVkIGF0XHJcbmh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9zeXN0ZW0uY29tcG9uZW50bW9kZWwuZGF0YWFubm90YXRpb25zLmFzcHhcclxuXHJcblNvbWV0aW1lcyBhIGN1c3RvbSB2YWxpZGF0b3Igd2lsbCBiZSByZXF1aXJlZC5cclxuQGV4YW1wbGVcclxuTW9zdCB2YWxpZGF0b3JzIHdpbGwgYmUgJ3Byb3BlcnR5JyBsZXZlbCB2YWxpZGF0b3JzLCBsaWtlIHRoaXMuXHJcbkBleGFtcGxlXHJcbiAgICAvLyB2IGlzIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCwgaW4gdGhpcyBjYXNlIGEgXCJjb3VudHJ5XCIgc3RyaW5nLlxyXG4gICAgdmFyIHZhbEZuID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gKGNvcmUuc3RyaW5nU3RhcnRzV2l0aCh2LCBcIlVTXCIpKTtcclxuICAgIH07XHJcbiAgICB2YXIgY291bnRyeVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoXCJjb3VudHJ5SXNVU1wiLCB2YWxGbiwge1xyXG4gICAgICAgIGRpc3BsYXlOYW1lOiBcIkNvdW50cnlcIiwgXHJcbiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IHN0YXJ0IHdpdGggJ1VTJ1wiIFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gTm93IHBsdWcgaXQgaW50byBCcmVlemUuXHJcbiAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgIHZhciBjdXN0VHlwZSA9IG1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgdmFyIGNvdW50cnlQcm9wID0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJDb3VudHJ5XCIpO1xyXG4gICAgLy8gTm90ZSB0aGF0IHZhbGlkYXRvciBpcyBhZGRlZCB0byBhICdEYXRhUHJvcGVydHknIHZhbGlkYXRvcnMgY29sbGVjdGlvbi5cclxuICAgIHByb3AudmFsaWRhdG9ycy5wdXNoKGNvdW50cnlWYWxpZGF0b3IpO1xyXG5FbnRpdHkgbGV2ZWwgdmFsaWRhdG9ycyBhcmUgYWxzbyBwb3NzaWJsZVxyXG5AZXhhbXBsZVxyXG4gICAgZnVuY3Rpb24gaXNWYWxpZFppcENvZGUodmFsdWUpIHtcclxuICAgICAgICB2YXIgcmUgPSAvXlxcZHs1fShbXFwtXVxcZHs0fSk/JC87XHJcbiAgICAgICAgcmV0dXJuIChyZS50ZXN0KHZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdiBpbiB0aGlzIGNhc2Ugd2lsbCBiZSBhIEN1c3RvbWVyIGVudGl0eVxyXG4gICAgdmFyIHZhbEZuID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAvLyBUaGlzIHZhbGlkYXRvciBvbmx5IHZhbGlkYXRlcyBVUyBaaXAgQ29kZXMuXHJcbiAgICAgICAgaWYgKCB2LmdldFByb3BlcnR5KFwiQ291bnRyeVwiKSA9PT0gXCJVU0FcIikge1xyXG4gICAgICAgICAgICB2YXIgcG9zdGFsQ29kZSA9IHYuZ2V0UHJvcGVydHkoXCJQb3N0YWxDb2RlXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNWYWxpZFppcENvZGUocG9zdGFsQ29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIHZhciB6aXBDb2RlVmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcihcInppcENvZGVWYWxpZGF0b3JcIiwgdmFsRm4sXHJcbiAgICAgICAgeyBtZXNzYWdlVGVtcGxhdGU6IFwiRm9yIHRoZSBVUywgdGhpcyBpcyBub3QgYSB2YWxpZCBQb3N0YWxDb2RlXCIgfSk7XHJcblxyXG4gICAgLy8gTm93IHBsdWcgaXQgaW50byBCcmVlemUuXHJcbiAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgIC8vIE5vdGUgdGhhdCB2YWxpZGF0b3IgaXMgYWRkZWQgdG8gYW4gJ0VudGl0eVR5cGUnIHZhbGlkYXRvcnMgY29sbGVjdGlvbi5cclxuICAgIGN1c3RUeXBlLnZhbGlkYXRvcnMucHVzaCh6aXBDb2RlVmFsaWRhdG9yKTtcclxuV2hhdCBpcyBjb21tb25seSBuZWVkZWQgaXMgYSB3YXkgb2YgY3JlYXRpbmcgYSBwYXJhbWV0ZXJpemVkIGZ1bmN0aW9uIHRoYXQgd2lsbCBpdHNlbGZcclxucmV0dXJuIGEgbmV3IFZhbGlkYXRvci4gIFRoaXMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhICdjb250ZXh0JyBvYmplY3QuXHJcbkBleGFtcGxlXHJcbiAgICAvLyBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHdpbGwgdGFrZSBpbiBhIGNvbmZpZyBvYmplY3RcclxuICAgIC8vIGFuZCB3aWxsIHJldHVybiBhIHZhbGlkYXRvclxyXG4gICAgdmFyIG51bWVyaWNSYW5nZVZhbGlkYXRvciA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcclxuICAgICAgICB2YXIgdmFsRm4gPSBmdW5jdGlvbih2LCBjdHgpIHtcclxuICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09IFwibnVtYmVyXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGN0eC5taW4gIT0gbnVsbCAmJiB2IDwgY3R4Lm1pbikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY3R4Lm1heCAhPSBudWxsICYmIHYgPiBjdHgubWF4KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gVGhlIGxhc3QgcGFyYW1ldGVyIGJlbG93IGlzIHRoZSAnY29udGV4dCcgb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgaW50byB0aGUgJ2N0eCcgcGFyYW1ldGVyIGFib3ZlXHJcbiAgICAgICAgLy8gd2hlbiB0aGlzIHZhbGlkYXRvciBleGVjdXRlcy4gU2V2ZXJhbCBvdGhlciBwcm9wZXJ0aWVzLCBzdWNoIGFzIGRpc3BsYXlOYW1lIHdpbGwgZ2V0IGFkZGVkIHRvIHRoaXMgb2JqZWN0IGFzIHdlbGwuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJudW1lcmljUmFuZ2VcIiwgdmFsRm4sIHtcclxuICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gdGhlIHZhbHVlcyBvZiAlbWluJSBhbmQgJW1heCVcIixcclxuICAgICAgICAgICAgbWluOiBjb250ZXh0Lm1pbixcclxuICAgICAgICAgICAgbWF4OiBjb250ZXh0Lm1heFxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIC8vIEFzc3VtZSB0aGF0IGZyZWlnaHRQcm9wZXJ0eSBpcyBhIERhdGFFbnRpdHlQcm9wZXJ0eSB0aGF0IGRlc2NyaWJlcyBudW1lcmljIHZhbHVlcy5cclxuICAgIC8vIHJlZ2lzdGVyIHRoZSB2YWxpZGF0b3JcclxuICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2gobnVtZXJpY1JhbmdlVmFsaWRhdG9yKHsgbWluOiAxMDAsIG1heDogNTAwIH0pKTtcclxuXHJcbkJyZWV6ZSBzdWJzdGl0dXRlcyBjb250ZXh0IHZhbHVlcyBhbmQgZnVuY3Rpb25zIGZvciB0aGUgdG9rZW5zIGluIHRoZSBtZXNzYWdlVGVtcGxhdGUgd2hlbiBwcmVwYXJpbmcgdGhlIHJ1bnRpbWUgZXJyb3IgbWVzc2FnZTtcclxuJ2Rpc3BsYXlOYW1lJyBpcyBhIHByZS1kZWZpbmVkIGNvbnRleHQgZnVuY3Rpb24gdGhhdCBpcyBhbHdheXMgYXZhaWxhYmxlLlxyXG5cclxuUGxlYXNlIG5vdGUgdGhhdCBCcmVlemUgc3Vic3RpdHV0ZXMgdGhlIGVtcHR5IHN0cmluZyBmb3IgZmFsc2V5IHBhcmFtZXRlcnMuIFRoYXQgdXN1YWxseSB3b3JrcyBpbiB5b3VyIGZhdm9yLlxyXG5Tb21ldGltZXMgaXQgZG9lc24ndCBhcyB3aGVuIHRoZSAnbWluJyB2YWx1ZSBpcyB6ZXJvIGluIHdoaWNoIGNhc2UgdGhlIG1lc3NhZ2UgdGV4dCB3b3VsZCBoYXZlIGEgaG9sZVxyXG53aGVyZSB0aGUgJ21pbicgdmFsdWUgZ29lcywgc2F5aW5nOiBcIi4uLiBhbiBpbnRlZ2VyIGJldHdlZW4gdGhlIHZhbHVlcyBvZiBhbmQgLi4uXCIuIFRoYXQgaXMgbm90IHdoYXQgeW91IHdhbnQuXHJcblxyXG5UbyBhdm9pZCB0aGlzIGVmZmVjdCwgeW91IG1heSBjYW4gYmFrZSBjZXJ0YWluIG9mIHRoZSBjb250ZXh0IHZhbHVlcyBpbnRvIHRoZSAnbWVzc2FnZVRlbXBsYXRlJyBpdHNlbGZcclxuYXMgc2hvd24gaW4gdGhpcyByZXZpc2lvbiB0byB0aGUgcGVydGluZW50IHBhcnQgb2YgdGhlIHByZXZpb3VzIGV4YW1wbGU6XHJcbkBleGFtcGxlXHJcbiAgICAvLyAuLi4gYXMgYmVmb3JlXHJcbiAgICAvLyAuLi4gYnV0IGJha2UgdGhlIG1pbi9tYXggdmFsdWVzIGludG8gdGhlIG1lc3NhZ2UgdGVtcGxhdGUuXHJcbiAgICB2YXIgdGVtcGxhdGUgPSBicmVlemUuY29yZS5mb3JtYXRTdHJpbmcoXHJcbiAgICAgICAgXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgJTEgYW5kICUyXCIsXHJcbiAgICAgICAgY29udGV4dC5taW4sIGNvbnRleHQubWF4KTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibnVtZXJpY1JhbmdlXCIsIHZhbEZuLCB7XHJcbiAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiB0ZW1wbGF0ZSxcclxuICAgICAgICBtaW46IGNvbnRleHQubWluLFxyXG4gICAgICAgIG1heDogY29udGV4dC5tYXhcclxuICAgIH0pO1xyXG5cclxuQG1ldGhvZCA8Y3Rvcj4gVmFsaWRhdG9yXHJcbkBwYXJhbSBuYW1lIHtTdHJpbmd9IFRoZSBuYW1lIG9mIHRoaXMgdmFsaWRhdG9yLlxyXG5AcGFyYW0gdmFsaWRhdG9yRm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdmFsaWRhdGlvbi5cclxuXHJcbnZhbGlkYXRvckZuKHZhbHVlLCBjb250ZXh0KVxyXG5AcGFyYW0gdmFsaWRhdG9yRm4udmFsdWUge09iamVjdH0gVmFsdWUgdG8gYmUgdmFsaWRhdGVkXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi5jb250ZXh0IHtPYmplY3R9IFRoZSBzYW1lIGNvbnRleHQgb2JqZWN0IHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlmIG5vdFxyXG5vdGhlcndpc2Ugc3BlY2lmaWVkLlxyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dC52YWx1ZSB7T2JqZWN0fSBUaGUgdmFsdWUgYmVpbmcgdmFsaWRhdGVkLlxyXG5AcGFyYW0gdmFsaWRhdG9yRm4uY29udGV4dC5uYW1lIHtTdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmVpbmcgZXhlY3V0ZWQuXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi5jb250ZXh0LmRpc3BsYXlOYW1lIHtTdHJpbmd9IFRoaXMgd2lsbCBiZSBlaXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSdzICdkaXNwbGF5TmFtZScgcHJvcGVydHkgb3JcclxudGhlIHZhbHVlIG9mIGl0cyAnbmFtZScgcHJvcGVydHkgb3IgdGhlIHN0cmluZyAnVmFsdWUnXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi5jb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSB7U3RyaW5nfSBUaGlzIHdpbGwgZWl0aGVyIGJlIHRoZSB2YWx1ZSBvZiBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1sge3RoaXMgdmFsaWRhdG9ycyBuYW1lfV0gb3IgbnVsbC4gVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNcclxuaXMgYW4gb2JqZWN0IHRoYXQgaXMga2V5ZWQgYnkgdmFsaWRhdG9yIG5hbWUgYW5kIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGluIG9yZGVyIHRvICdyZWdpc3RlcicgeW91ciBvd24gbWVzc2FnZSBmb3IgYSBnaXZlbiB2YWxpZGF0b3IuXHJcblRoZSBmb2xsb3dpbmcgcHJvcGVydHkgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGZvciBhbnkgdmFsaWRhdG9yIHRvIGZvcmNlIGEgc3BlY2lmaWMgZXJyb3JNZXNzYWdlIHN0cmluZ1xyXG5AcGFyYW0gW3ZhbGlkYXRvckZuLmNvbnRleHQubWVzc2FnZV0ge1N0cmluZ30gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlICdtZXNzYWdlVGVtcGxhdGUnIHByb3BlcnR5IHdoZW4gYW5cclxuZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuXHJcblxyXG5AcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IEEgZnJlZSBmb3JtIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIHdpbGwgbWFkZSBhdmFpbGFibGUgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIGFuZCBlcnJvciBtZXNzYWdlIGNyZWF0aW9uIHByb2Nlc3MuXHJcblRoaXMgb2JqZWN0IHdpbGwgYmUgcGFzc2VkIGludG8gdGhlIFZhbGlkYXRvcidzIHZhbGlkYXRpb24gZnVuY3Rpb24gd2hlbmV2ZXIgJ3ZhbGlkYXRlJyBpcyBjYWxsZWQuIFNlZSBhYm92ZSBmb3IgYSBkZXNjcmlwdGlvblxyXG5vZiBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhpcyBvYmplY3QgaWYgbm90IG90aGVyd2lzZSBzcGVjaWZpZWQuXHJcbkBkeW5hbWljXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yIHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBkZWNsYXJlIF8kdHlwZU5hbWU6IHN0cmluZzsgLy8gb24gcHJvdG9cclxuXHJcbiAgZGVjbGFyZSBuYW1lOiBzdHJpbmc7XHJcbiAgZGVjbGFyZSB2YWxGbjogVmFsaWRhdGlvbkZuO1xyXG4gIGRlY2xhcmUgY29udGV4dDogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG4gIGRlY2xhcmUgY3VycmVudENvbnRleHQ6IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICBkZWNsYXJlIHByaXZhdGUgX2Jhc2VDb250ZXh0OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmFsRm46IFZhbGlkYXRpb25GbiwgY29udGV4dD86IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dCkge1xyXG4gICAgLy8gX2Jhc2VDb250ZXh0IGlzIHdoYXQgd2lsbCBnZXQgc2VyaWFsaXplZFxyXG4gICAgdGhpcy5fYmFzZUNvbnRleHQgPSBjb250ZXh0IHx8IHt9IGFzIFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICAgIHRoaXMuX2Jhc2VDb250ZXh0Lm5hbWUgPSBuYW1lO1xyXG4gICAgY29udGV4dCA9IGNvcmUuZXh0ZW5kKE9iamVjdC5jcmVhdGUocm9vdENvbnRleHQpLCB0aGlzLl9iYXNlQ29udGV4dCkgYXMgVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG4gICAgY29udGV4dC5tZXNzYWdlVGVtcGxhdGUgPSBjb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSB8fCBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1tuYW1lXTtcclxuICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICB0aGlzLnZhbEZuID0gdmFsRm47XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgVGhlIG5hbWUgb2YgdGhpcyB2YWxpZGF0b3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBuYW1lIHtTdHJpbmd9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFRoZSBjb250ZXh0IGZvciB0aGlzIHZhbGlkYXRvci5cclxuXHJcbiAgVGhpcyBvYmplY3Qgd2lsbCB0eXBpY2FsbHkgY29udGFpbiBhdCBhIG1pbmltdW0gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLiBcIm5hbWVcIiwgXCJkaXNwbGF5TmFtZVwiLCBhbmQgXCJtZXNzYWdlXCIgb3IgXCJtZXNzYWdlVGVtcGxhdGVcIi5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgY29udGV4dCB7T2JqZWN0fVxyXG4gICoqL1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgUnVuIHRoaXMgdmFsaWRhdG9yIGFnYWluc3QgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIFRoaXMgbWV0aG9kIHdpbGwgdXN1YWxseSBiZSBjYWxsZWQgaW50ZXJuYWxseSBlaXRoZXJcclxuICBhdXRvbWF0aWNhbGx5IGJ5IGFuIHByb3BlcnR5IGNoYW5nZSwgZW50aXR5IGF0dGFjaCwgcXVlcnkgb3Igc2F2ZSBvcGVyYXRpb24sIG9yIG1hbnVhbGx5IGFzIGEgcmVzdWx0IG9mXHJcbiAgYSB2YWxpZGF0ZUVudGl0eSBjYWxsIG9uIHRoZSBFbnRpdHlBc3BlY3QuIFRoZSByZXN1bHRpbmcgVmFsaWRhdGlvblJlc3VsdHMgYXJlIGF2YWlsYWJsZSB2aWEgdGhlXHJcbiAgRW50aXR5QXNwZWN0LmdldFZhbGlkYXRpb25FcnJvcnMgbWV0aG9kLlxyXG5cclxuICBIb3dldmVyLCB5b3UgY2FuIGFsc28gY2FsbCBhIHZhbGlkYXRvciBkaXJlY3RseSBlaXRoZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMgb3Igc29tZSBvdGhlciByZWFzb24gaWYgbmVlZGVkLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIHVzaW5nIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCB2YWxpZGF0b3JzXHJcbiAgICAgIHZhciB2YWxpZGF0b3IgPSBWYWxpZGF0b3IubWF4TGVuZ3RoKHsgbWF4TGVuZ3RoOiA1LCBkaXNwbGF5TmFtZTogXCJDaXR5XCIgfSk7XHJcbiAgICAgIC8vIHNob3VsZCBiZSBvayBiZWNhdXNlIFwiYXNkZlwiLmxlbmd0aCA8IDVcclxuICAgICAgdmFyIHJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZShcImFzZGZcIik7XHJcbiAgICAgIG9rKHJlc3VsdCA9PT0gbnVsbCk7XHJcbiAgICAgIHJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZShcImFkYXNkZmFzZGZcIik7XHJcbiAgICAgIC8vIGV4dHJhY3QgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAncmVzdWx0J1xyXG4gICAgICB2YXIgZXJyTXNnID0gcmVzdWx0LmVycm9yTWVzc2FnZTtcclxuICAgICAgdmFyIGNvbnRleHQgPSByZXN1bHQuY29udGV4dDtcclxuICAgICAgdmFyIHNhbWVWYWxpZGF0b3IgPSByZXN1bHQudmFsaWRhdG9yO1xyXG4gIEBtZXRob2QgdmFsaWRhdGVcclxuICBAcGFyYW0gdmFsdWUge09iamVjdH0gVmFsdWUgdG8gdmFsaWRhdGVcclxuICBAcGFyYW0gYWRkaXRpb25hbENvbnRleHQge09iamVjdH0gQW55IGFkZGl0aW9uYWwgY29udGV4dHVhbCBpbmZvcm1hdGlvbiB0aGF0IHRoZSBWYWxpZGF0b3JcclxuICBjYW4gbWFrZSB1c2Ugb2YuXHJcbiAgQHJldHVybiB7VmFsaWRhdGlvbkVycm9yfG51bGx9IEEgVmFsaWRhdGlvbkVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHMsIG51bGwgb3RoZXJ3aXNlXHJcbiAgKiovXHJcbiAgdmFsaWRhdGUodmFsdWU6IGFueSwgYWRkaXRpb25hbENvbnRleHQ/OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQpIHtcclxuICAgIGxldCBjdXJyZW50Q29udGV4dDogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0OyAvLyB7IHZhbHVlPzogT2JqZWN0IH07XHJcbiAgICBpZiAoYWRkaXRpb25hbENvbnRleHQpIHtcclxuICAgICAgY3VycmVudENvbnRleHQgPSBjb3JlLmV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMuY29udGV4dCksIGFkZGl0aW9uYWxDb250ZXh0KSBhcyBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdXJyZW50Q29udGV4dCA9IHRoaXMuY29udGV4dDtcclxuICAgIH1cclxuICAgIHRoaXMuY3VycmVudENvbnRleHQgPSBjdXJyZW50Q29udGV4dDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy52YWxGbih2YWx1ZSwgY3VycmVudENvbnRleHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3VycmVudENvbnRleHQudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcih0aGlzLCBjdXJyZW50Q29udGV4dCwgdGhpcy5nZXRNZXNzYWdlKCkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHRoaXMsIGN1cnJlbnRDb250ZXh0LCBcIkV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIHZhbGlkYXRvcjogXCIgKyB0aGlzLm5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIGNvbnRleHQudmFsdWUgaXMgbm90IGF2YWlsIHVubGVzcyB2YWxpZGF0ZSB3YXMgY2FsbGVkIGZpcnN0LlxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUgbW9zdCByZWNlbnQgZXhlY3V0aW9uIG9mIHRoaXMgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIHZhciB2MCA9IFZhbGlkYXRvci5tYXhMZW5ndGgoeyBtYXhMZW5ndGg6IDUsIGRpc3BsYXlOYW1lOiBcIkNpdHlcIiB9KTtcclxuICAgICAgdjAudmFsaWRhdGUoXCJhZGFzZGZhc2RmXCIpO1xyXG4gICAgICB2YXIgZXJyTWVzc2FnZSA9IHYwLmdldE1lc3NhZ2UoKSk7XHJcbiAgQG1ldGhvZCBnZXRNZXNzYWdlXHJcbiAgQHJldHVybiB7U3RyaW5nfVxyXG4gICoqL1xyXG4gIGdldE1lc3NhZ2UoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgY29udGV4dCA9IHRoaXMuY3VycmVudENvbnRleHQ7XHJcbiAgICAgIGxldCBtZXNzYWdlID0gY29udGV4dC5tZXNzYWdlO1xyXG4gICAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKG1lc3NhZ2UpID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgIHJldHVybiBtZXNzYWdlKGNvbnRleHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXNzYWdlVGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gZm9ybWF0VGVtcGxhdGUoY29udGV4dC5tZXNzYWdlVGVtcGxhdGUsIGNvbnRleHQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBcImludmFsaWQgdmFsdWU6IFwiICsgKHRoaXMubmFtZSB8fCBcInt1bm5hbWVkIHZhbGlkYXRvcn1cIik7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIFwiVW5hYmxlIHRvIGZvcm1hdCBlcnJvciBtZXNzYWdlXCIgKyBlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b0pTT04oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmFzZUNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBDcmVhdGVzIGEgdmFsaWRhdG9yIGluc3RhbmNlIGZyb20gYSBKU09OIG9iamVjdCBvciBhbiBhcnJheSBvZiBpbnN0YW5jZXMgZnJvbSBhbiBhcnJheSBvZiBKU09OIG9iamVjdHMuXHJcbiAgQG1ldGhvZCBmcm9tSlNPTlxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0ganNvbiB7T2JqZWN0fSBKU09OIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiBhIHZhbGlkYXRvci5cclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IGFueSk6IGFueSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xyXG4gICAgICByZXR1cm4ganNvbi5tYXAoZnVuY3Rpb24gKGpzKSB7XHJcbiAgICAgICAgcmV0dXJuIFZhbGlkYXRvci5mcm9tSlNPTihqcyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGpzb24gaW5zdGFuY2VvZiBWYWxpZGF0b3IpIHtcclxuICAgICAgcmV0dXJuIGpzb247XHJcbiAgICB9XHJcbiAgICBsZXQgdmFsaWRhdG9yTmFtZSA9IFwiVmFsaWRhdG9yLlwiICsganNvbi5uYW1lO1xyXG4gICAgbGV0IGZuID0gY29uZmlnLmdldFJlZ2lzdGVyZWRGdW5jdGlvbih2YWxpZGF0b3JOYW1lKTtcclxuICAgIGlmICghZm4pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvY2F0ZSBhIHZhbGlkYXRvciBuYW1lZDpcIiArIGpzb24ubmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZm4oanNvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZWdpc3RlciBhIHZhbGlkYXRvciBpbnN0YW5jZSBzbyB0aGF0IGFueSBkZXNlcmlhbGl6ZWQgbWV0YWRhdGEgY2FuIHJlZmVyZW5jZSBpdC5cclxuICBAbWV0aG9kIHJlZ2lzdGVyXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSB2YWxpZGF0b3Ige1ZhbGlkYXRvcn0gVmFsaWRhdG9yIHRvIHJlZ2lzdGVyLlxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXIodmFsaWRhdG9yOiBWYWxpZGF0b3IpIHtcclxuICAgIGNvbmZpZy5yZWdpc3RlckZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIHZhbGlkYXRvcjtcclxuICAgIH0sIFwiVmFsaWRhdG9yLlwiICsgdmFsaWRhdG9yLm5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmVnaXN0ZXIgYSB2YWxpZGF0b3IgZmFjdG9yeSBzbyB0aGF0IGFueSBkZXNlcmlhbGl6ZWQgbWV0YWRhdGEgY2FuIHJlZmVyZW5jZSBpdC5cclxuICBAbWV0aG9kIHJlZ2lzdGVyRmFjdG9yeVxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gdmFsaWRhdG9yRmFjdG9yeSB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCBvcHRpb25hbGx5IHRha2VzIGEgY29udGV4dCBwcm9wZXJ0eSBhbmQgcmV0dXJucyBhIFZhbGlkYXRvciBpbnN0YW5jZS5cclxuICBAcGFyYW0gbmFtZSB7U3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yLlxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJGYWN0b3J5KHZhbGlkYXRvckZhY3Rvcnk6IChvcHRpb25zPzogYW55KSA9PiBWYWxpZGF0b3IsIG5hbWU6IHN0cmluZykge1xyXG4gICAgY29uZmlnLnJlZ2lzdGVyRnVuY3Rpb24odmFsaWRhdG9yRmFjdG9yeSwgXCJWYWxpZGF0b3IuXCIgKyBuYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIE1hcCBvZiBzdGFuZGFyZCBlcnJvciBtZXNzYWdlIHRlbXBsYXRlcyBrZXllZCBieSB2YWxpZGF0b3IgbmFtZS5cclxuICBZb3UgY2FuIGFkZCB0byBvciBtb2RpZnkgdGhpcyBvYmplY3QgdG8gY3VzdG9taXplIHRoZSB0ZW1wbGF0ZSB1c2VkIGZvciBhbnkgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIHYgaXMgdGhpcyBmdW5jdGlvbiBpcyB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkLCBpbiB0aGlzIGNhc2UgYSBcImNvdW50cnlcIiBzdHJpbmcuXHJcbiAgICAgIHZhciB2YWxGbiA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiAoY29yZS5zdHJpbmdTdGFydHNXaXRoKHYsIFwiVVNcIikpO1xyXG4gICAgICB9O1xyXG4gICAgICB2YXIgY291bnRyeVZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoXCJjb3VudHJ5SXNVU1wiLCB2YWxGbiwgeyBkaXNwbGF5TmFtZTogXCJDb3VudHJ5XCIgfSk7XHJcbiAgICAgIFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzLmNvdW50cnlJc1VTID0gXCInJWRpc3BsYXlOYW1lJScgbXVzdCBzdGFydCB3aXRoICdVUydcIjtcclxuICAgICAgLy8gVGhpcyB3aWxsIGhhdmUgYSBzaW1pbGFyIGVmZmVjdCB0byB0aGlzXHJcbiAgICAgIHZhciBjb3VudHJ5VmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcihcImNvdW50cnlJc1VTXCIsIHZhbEZuLCB7XHJcbiAgICAgICAgICBkaXNwbGF5TmFtZTogXCJDb3VudHJ5XCIsIFxyXG4gICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IHN0YXJ0IHdpdGggJ1VTJ1wiIFxyXG4gICAgICB9KTtcclxuICBAcHJvcGVydHkgbWVzc2FnZVRlbXBsYXRlcyB7T2JqZWN0fVxyXG4gIEBzdGF0aWNcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIG1lc3NhZ2VUZW1wbGF0ZXMgPSB7XHJcbiAgICBib29sOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgJ3RydWUnIG9yICdmYWxzZScgdmFsdWVcIixcclxuICAgIGNyZWRpdENhcmQ6IFwiVGhlICVkaXNwbGF5TmFtZSUgaXMgbm90IGEgdmFsaWQgY3JlZGl0IGNhcmQgbnVtYmVyXCIsXHJcbiAgICBkYXRlOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgZGF0ZVwiLFxyXG4gICAgZHVyYXRpb246IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBJU084NjAxIGR1cmF0aW9uIHN0cmluZywgc3VjaCBhcyAnUDNIMjRNNjBTJ1wiLFxyXG4gICAgZW1haWxBZGRyZXNzOiBcIlRoZSAlZGlzcGxheU5hbWUlICcldmFsdWUlJyBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIsXHJcbiAgICBndWlkOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgR1VJRFwiLFxyXG4gICAgaW50ZWdlcjogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhbiBpbnRlZ2VyXCIsXHJcbiAgICBpbnRlZ2VyUmFuZ2U6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIHRoZSB2YWx1ZXMgb2YgJW1pblZhbHVlJSBhbmQgJW1heFZhbHVlJVwiLFxyXG4gICAgbWF4TGVuZ3RoOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgc3RyaW5nIHdpdGggJW1heExlbmd0aCUgY2hhcmFjdGVycyBvciBsZXNzXCIsXHJcbiAgICBudW1iZXI6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBudW1iZXJcIixcclxuICAgIHBob25lOiBcIlRoZSAlZGlzcGxheU5hbWUlICcldmFsdWUlJyBpcyBub3QgYSB2YWxpZCBwaG9uZSBudW1iZXJcIixcclxuICAgIHJlZ3VsYXJFeHByZXNzaW9uOiBcIlRoZSAlZGlzcGxheU5hbWUlICcldmFsdWUlJyBkb2VzIG5vdCBtYXRjaCAnJWV4cHJlc3Npb24lJ1wiLFxyXG4gICAgcmVxdWlyZWQ6IFwiJyVkaXNwbGF5TmFtZSUnIGlzIHJlcXVpcmVkXCIsXHJcbiAgICBzdHJpbmc6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBzdHJpbmdcIixcclxuICAgIHN0cmluZ0xlbmd0aDogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIHN0cmluZyB3aXRoIGJldHdlZW4gJW1pbkxlbmd0aCUgYW5kICVtYXhMZW5ndGglIGNoYXJhY3RlcnNcIixcclxuICAgIHVybDogXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgaXMgbm90IGEgdmFsaWQgdXJsXCJcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgJ3JlcXVpcmVkIHZhbHVlJyBWYWxpZGF0b3JcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcmVnaW9uUHJvcGVydHkgLSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIlJlZ2lvblwiKTtcclxuICAgICAgLy8gTWFrZXMgXCJSZWdpb25cIiBvbiBDdXN0b21lciBhIHJlcXVpcmVkIHByb3BlcnR5LlxyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnJlcXVpcmVkKCkpO1xyXG4gICAgICAvLyBvciB0byBhbGxvdyBlbXB0eSBzdHJpbmdzXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IucmVxdWlyZWQoeyBhbGxvd0VtcHR5U3RyaW5nczogdHJ1ZSB9KTspO1xyXG4gIEBtZXRob2QgcmVxdWlyZWRcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGNvbnRleHQge09iamVjdH1cclxuICBAcGFyYW0gW2NvbnRleHQuYWxsb3dFbXB0eVN0cmluZ3NdIHtCb29sZWFufSBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkIG9yIGZhbHNlIHRoZW4gZW1wdHkgc3RyaW5ncyBkbyBOT1QgcGFzcyB2YWxpZGF0aW9uLlxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyByZXF1aXJlZCA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIGlmIChjdHggJiYgY3R4LmFsbG93RW1wdHlTdHJpbmdzKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdi5sZW5ndGggPiAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB2ICE9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcInJlcXVpcmVkXCIsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgbWF4aW11bSBzdHJpbmcgbGVuZ3RoIFZhbGlkYXRvcjsgdGhlIG1heGltdW0gbGVuZ3RoIG11c3QgYmUgc3BlY2lmaWVkXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5IC0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUmVnaW9uIHByb3BlcnR5IG9uIEN1c3RvbWVyIHdpbGwgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDUgY2hhcmFjdGVycy5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5tYXhMZW5ndGgoIHttYXhMZW5ndGg6IDV9KSk7XHJcbiAgQG1ldGhvZCBtYXhMZW5ndGhcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGNvbnRleHQge09iamVjdH1cclxuICBAcGFyYW0gY29udGV4dC5tYXhMZW5ndGgge0ludGVnZXJ9XHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIG1heExlbmd0aCA9IGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgKHYpICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB2Lmxlbmd0aCA8PSBjdHgubWF4TGVuZ3RoO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibWF4TGVuZ3RoXCIsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgc3RyaW5nIGxlbmd0aCBWYWxpZGF0b3I7IGJvdGggbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGhzIG11c3QgYmUgc3BlY2lmaWVkLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciByZWdpb25Qcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFJlZ2lvbiBwcm9wZXJ0eSBvbiBDdXN0b21lciB3aWxsIGJlXHJcbiAgICAgIC8vIGJldHdlZW4gMiBhbmQgNSBjaGFyYWN0ZXJzXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3Iuc3RyaW5nTGVuZ3RoKCB7bWluTGVuZ3RoOiAyLCBtYXhMZW5ndGg6IDV9KTtcclxuICBAbWV0aG9kIHN0cmluZ0xlbmd0aFxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gY29udGV4dCB7T2JqZWN0fVxyXG4gIEBwYXJhbSBjb250ZXh0Lm1heExlbmd0aCB7SW50ZWdlcn1cclxuICBAcGFyYW0gY29udGV4dC5taW5MZW5ndGgge0ludGVnZXJ9XHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHN0cmluZ0xlbmd0aCA9IGZ1bmN0aW9uIChjb250ZXh0OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mICh2KSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoY3R4Lm1pbkxlbmd0aCAhPSBudWxsICYmIHYubGVuZ3RoIDwgY3R4Lm1pbkxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoY3R4Lm1heExlbmd0aCAhPSBudWxsICYmIHYubGVuZ3RoID4gY3R4Lm1heExlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcInN0cmluZ0xlbmd0aFwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIHN0cmluZyBkYXRhVHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5IC0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUmVnaW9uIHByb3BlcnR5IG9uIEN1c3RvbWVyIGlzIGEgc3RyaW5nLlxyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnN0cmluZygpKTtcclxuICBAbWV0aG9kIHN0cmluZ1xyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgc3RyaW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJzdHJpbmdcIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBHdWlkIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIGN1c3RvbWVySWRQcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiQ3VzdG9tZXJJRFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBDdXN0b21lcklEIHByb3BlcnR5IG9uIEN1c3RvbWVyIGlzIGEgR3VpZC5cclxuICAgICAgY3VzdG9tZXJJZFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuZ3VpZCgpKTtcclxuICBAbWV0aG9kIGd1aWRcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGd1aWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICByZXR1cm4gY29yZS5pc0d1aWQodik7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJndWlkXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nICBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBldmVudFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiRXZlbnRcIik7XHJcbiAgICAgIHZhciBlbGFwc2VkVGltZVByb3BlcnR5IC0gZXZlbnRUeXBlLmdldFByb3BlcnR5KFwiRWxhcHNlZFRpbWVcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRWxhcHNlZFRpbWUgcHJvcGVydHkgb24gQ3VzdG9tZXIgaXMgYSBkdXJhdGlvbi5cclxuICAgICAgZWxhcHNlZFRpbWVQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmR1cmF0aW9uKCkpO1xyXG4gIEBtZXRob2QgZHVyYXRpb25cclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGR1cmF0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuIGNvcmUuaXNEdXJhdGlvbih2KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcImR1cmF0aW9uXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgbnVtZXJpYyBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBGcmVpZ2h0IHByb3BlcnR5IG9uIE9yZGVyIGlzIGEgbnVtYmVyLlxyXG4gICAgICBmcmVpZ2h0UHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5udW1iZXIoKSk7XHJcbiAgQG1ldGhvZCBudW1iZXJcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuXHJcbiAgICAvLyBUT0RPOiBtYXkgbmVlZCB0byBoYXZlIHNlcGVyYXRlIGxvZ2ljIGZvciBzaW5nbGUuXHJcbiAgcHVibGljIHN0YXRpYyBudW1iZXIgPSBmdW5jdGlvbihjb250ZXh0PzogYW55KSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiICYmIGN0eCAmJiBjdHguYWxsb3dTdHJpbmcpIHtcclxuICAgICAgICB2ID0gcGFyc2VGbG9hdCh2KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKHR5cGVvZiB2ID09PSBcIm51bWJlclwiICYmICFpc05hTih2KSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJudW1iZXJcIiwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcbiAgcHVibGljIHN0YXRpYyBkb3VibGUgPSBWYWxpZGF0b3IubnVtYmVyO1xyXG4gIHB1YmxpYyBzdGF0aWMgc2luZ2xlID0gVmFsaWRhdG9yLm51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIGxhcmdlIGludGVnZXIgZGF0YSB0eXBlIC0gNjQgYml0IC0gVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBGcmVpZ2h0IHByb3BlcnR5IG9uIE9yZGVyIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSA2NCBiaXQgaW50ZWdlci5cclxuICAgICAgZnJlaWdodFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuaW50NjQoKSk7XHJcbiAgQG1ldGhvZCBpbnQ2NFxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW50ZWdlciA9IGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiBjdHggJiYgY3R4LmFsbG93U3RyaW5nKSB7XHJcbiAgICAgICAgdiA9IHBhcnNlSW50KHYsIDEwKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSAmJiAoIWlzTmFOKHYpKSAmJiBNYXRoLmZsb29yKHYpID09PSB2O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwiaW50ZWdlclwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuICBwdWJsaWMgc3RhdGljIGludDY0ID0gVmFsaWRhdG9yLmludGVnZXI7XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCAzMiBiaXQgaW50ZWdlciBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgZnJlaWdodFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuaW50MzIoKSk7XHJcbiAgQG1ldGhvZCBpbnQzMlxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW50MzIgPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIHJldHVybiBpbnRSYW5nZVZhbGlkYXRvckN0b3IoXCJpbnQzMlwiLCBJTlQzMl9NSU4sIElOVDMyX01BWCwgY29udGV4dCkoKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgMTYgYml0IGludGVnZXIgZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIGZyZWlnaHRQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIkZyZWlnaHRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRnJlaWdodCBwcm9wZXJ0eSBvbiBPcmRlciBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIGEgMTYgYml0IGludGVnZXIuXHJcbiAgICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmludDE2KCkpO1xyXG4gIEBtZXRob2QgaW50MTZcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGludDE2ID0gZnVuY3Rpb24oY29udGV4dDogYW55KSB7XHJcbiAgICByZXR1cm4gaW50UmFuZ2VWYWxpZGF0b3JDdG9yKFwiaW50MTZcIiwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIGNvbnRleHQpKCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIGJ5dGUgZGF0YSB0eXBlIFZhbGlkYXRvci4gKFRoaXMgaXMgYSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGluY2x1c2l2ZSBmb3IganMgcHVycG9zZXMpLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBGcmVpZ2h0IHByb3BlcnR5IG9uIE9yZGVyIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSAxNiBiaXQgaW50ZWdlci5cclxuICAgICAgLy8gUHJvYmFibHkgbm90IGEgdmVyeSBnb29kIHZhbGlkYXRpb24gdG8gcGxhY2Ugb24gdGhlIEZyZWlnaHQgcHJvcGVydHkuXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuYnl0ZSgpKTtcclxuICBAbWV0aG9kIGJ5dGVcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGJ5dGUgPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIHJldHVybiBpbnRSYW5nZVZhbGlkYXRvckN0b3IoXCJieXRlXCIsIEJZVEVfTUlOLCBCWVRFX01BWCwgY29udGV4dCkoKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgYm9vbGVhbiBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgcHJvZHVjdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiUHJvZHVjdFwiKTtcclxuICAgICAgdmFyIGRpc2NvbnRpbnVlZFByb3BlcnR5IC0gcHJvZHVjdFR5cGUuZ2V0UHJvcGVydHkoXCJEaXNjb250aW51ZWRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgRGlzY29udGludWVkIHByb3BlcnR5IG9uIFByb2R1Y3QgaXMgYSBib29sZWFuXHJcbiAgICAgIGRpc2NvbnRpbnVlZFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuYm9vbCgpKTtcclxuICBAbWV0aG9kIGJvb2xcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGJvb2wgPSBmdW5jdGlvbigpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIHJldHVybiAodiA9PT0gdHJ1ZSkgfHwgKHYgPT09IGZhbHNlKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcImJvb2xcIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgbm9uZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcIm5vbmVcIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBkYXRlIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgICAgIHZhciBvcmRlckRhdGVQcm9wZXJ0eSAtIG9yZGVyVHlwZS5nZXRQcm9wZXJ0eShcIk9yZGVyRGF0ZVwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBPcmRlckRhdGUgcHJvcGVydHkgb24gT3JkZXIgaXMgYSBkYXRlXHJcbiAgICAgIC8vIFByb2JhYmx5IG5vdCBhIHZlcnkgZ29vZCB2YWxpZGF0aW9uIHRvIHBsYWNlIG9uIHRoZSBGcmVpZ2h0IHByb3BlcnR5LlxyXG4gICAgICBvcmRlckRhdGVQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmRhdGUoKSk7XHJcbiAgQG1ldGhvZCBkYXRlXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBkYXRlID0gZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgcmV0dXJuICFpc05hTihEYXRlLnBhcnNlKHYpKTtcclxuICAgICAgICAgIC8vIG9sZCBjb2RlXHJcbiAgICAgICAgICAvLyByZXR1cm4gX19pc0RhdGUobmV3IERhdGUodikpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNvcmUuaXNEYXRlKHYpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJkYXRlXCIsIHZhbEZuKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgY3JlZGl0IGNhcmQgbnVtYmVyIHZhbGlkYXRvclxyXG4gIFBlcmZvcm1zIGEgbHVobiBhbGdvcml0aG0gY2hlY2tzdW0gdGVzdCBmb3IgcGxhdXNhYmlsaXR5XHJcbiAgY2F0Y2hlcyBzaW1wbGUgbWlzdGFrZXM7IG9ubHkgc2VydmljZSBrbm93cyBmb3Igc3VyZVxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBwZXJzb25UeXBlID0gZW0ubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiUGVyc29uXCIpO1xyXG4gICAgICB2YXIgY3JlZGl0Q2FyZFByb3BlcnR5ID0gcGVyc29uVHlwZS5nZXRQcm9wZXJ0eShcImNyZWRpdENhcmRcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUGVyc29uLmNyZWRpdENhcmQgcHJvcGVydHkgaXMgY3JlZGl0IGNhcmQuXHJcbiAgICAgIGNyZWRpdENhcmRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmNyZWRpdENhcmQoKSk7XHJcbiAgQG1ldGhvZCBjcmVkaXRDYXJkXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBbY29udGV4dF0ge09iamVjdH0gb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRocm91Z2ggdG8gdmFsaWRhdGlvbiBjb25zdHJ1Y3RvclxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBjcmVkaXRDYXJkID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgZnVuY3Rpb24gdmFsRm4odjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mICh2KSAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcclxuICAgICAgdiA9IHYucmVwbGFjZSgvKFxcLXxcXHMpL2csIFwiXCIpOyAvLyByZW1vdmUgZGFzaGVzIGFuZCBzcGFjZXNcclxuICAgICAgaWYgKCF2IHx8IC9cXEQvLnRlc3QodikpIHJldHVybiBmYWxzZTsgLy8gYWxsIGRpZ2l0cywgbm90IGVtcHR5XHJcbiAgICAgIHJldHVybiBsdWhuKHYpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoJ2NyZWRpdENhcmQnLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdG9yOyB0aGUgZXhwcmVzc2lvbiBtdXN0IGJlIHNwZWNpZmllZFxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFkZCB2YWxpZGF0b3IgdG8gYSBwcm9wZXJ0eS4gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RvbWVyVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcmVnaW9uUHJvcGVydHkgPSBjdXN0b21lclR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiBDdXN0b21lci5SZWdpb24gaXMgMiBjaGFyIHVwcGVyY2FzZSBhbHBoYS5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5yZWd1bGFyRXhwcmVzc2lvbigge2V4cHJlc3Npb246ICdeW0EtWl17Mn0kJ30gKTtcclxuICBAbWV0aG9kIHJlZ3VsYXJFeHByZXNzaW9uXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBjb250ZXh0IHtPYmplY3R9XHJcbiAgQHBhcmFtIGNvbnRleHQuZXhwcmVzc2lvbiB7U3RyaW5nfSBTdHJpbmcgZm9ybSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHRvIGFwcGx5XHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHJlZ3VsYXJFeHByZXNzaW9uID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgZnVuY3Rpb24gdmFsRm4odjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICAvLyBkbyBub3QgaW52YWxpZGF0ZSBpZiBlbXB0eTsgdXNlIGEgc2VwYXJhdGUgcmVxdWlyZWQgdGVzdFxyXG4gICAgICBpZiAodiA9PSBudWxsIHx8IHYgPT09ICcnKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiAodikgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHJlID0gbmV3IFJlZ0V4cChjdHguZXhwcmVzc2lvbik7XHJcbiAgICAgICAgcmV0dXJuIHJlLnRlc3Qodik7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBleHByZXNzaW9uIHBhcmFtZXRlciB0byByZWdFeHAgdmFsaWRhdG9yJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKCdyZWd1bGFyRXhwcmVzc2lvbicsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSBlbWFpbCBhZGRyZXNzIHZhbGlkYXRvclxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBwZXJzb25UeXBlID0gZW0ubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiUGVyc29uXCIpO1xyXG4gICAgICB2YXIgZW1haWxQcm9wZXJ0eSA9IHBlcnNvblR5cGUuZ2V0UHJvcGVydHkoXCJlbWFpbFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBQZXJzb24uZW1haWwgcHJvcGVydHkgaXMgYW4gZW1haWwgYWRkcmVzcy5cclxuICAgICAgZW1haWxQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLmVtYWlsQWRkcmVzcygpKTtcclxuICBAbWV0aG9kIGVtYWlsQWRkcmVzc1xyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZW1haWxBZGRyZXNzID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zcmtpcmtsYW5kL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvYmxvYi9tYXN0ZXIvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9FbWFpbEF0dHJpYnV0ZS5jc1xyXG4gICAgbGV0IHJlRW1haWxBZGRyZXNzID0gL14oKChbYS16XXxcXGR8WyEjXFwkJSYnXFwqXFwrXFwtXFwvPVxcP1xcXl9ge1xcfH1+XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkrKFxcLihbYS16XXxcXGR8WyEjXFwkJSYnXFwqXFwrXFwtXFwvPVxcP1xcXl9ge1xcfH1+XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkrKSopfCgoXFx4MjIpKCgoKFxceDIwfFxceDA5KSooXFx4MGRcXHgwYSkpPyhcXHgyMHxcXHgwOSkrKT8oKFtcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDdmXXxcXHgyMXxbXFx4MjMtXFx4NWJdfFtcXHg1ZC1cXHg3ZV18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfChcXFxcKFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZC1cXHg3Zl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSkpKigoKFxceDIwfFxceDA5KSooXFx4MGRcXHgwYSkpPyhcXHgyMHxcXHgwOSkrKT8oXFx4MjIpKSlAKCgoW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2Etel18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLikrKChbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkoW2Etel18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkqKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuPyQvaTtcclxuICAgIHJldHVybiBtYWtlUmVnRXhwVmFsaWRhdG9yKCdlbWFpbEFkZHJlc3MnLCByZUVtYWlsQWRkcmVzcywgbnVsbCwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyB0aGUgcGhvbmUgdmFsaWRhdG9yXHJcbiAgUHJvdmlkZXMgYmFzaWMgYXNzZXJ0aW9ucyBvbiB0aGUgZm9ybWF0IGFuZCB3aWxsIGhlbHAgdG8gZWxpbWluYXRlIG1vc3Qgbm9uc2Vuc2UgaW5wdXRcclxuICBNYXRjaGVzOlxyXG4gIEludGVybmF0aW9uYWwgZGlhbGluZyBwcmVmaXg6IHt7fSwgKywgMCwgMDAwMH0gKHdpdGggb3Igd2l0aG91dCBhIHRyYWlsaW5nIGJyZWFrIGNoYXJhY3RlciwgaWYgbm90ICcrJzogWy0vLiBdKVxyXG4gID4gKChcXCspfCgwKFxcZCspP1stLy5cXHNdKSlcclxuICBDb3VudHJ5IGNvZGU6IHt7fSwgMSwgLi4uLCA5OTl9ICh3aXRoIG9yIHdpdGhvdXQgYSB0cmFpbGluZyBicmVhayBjaGFyYWN0ZXI6IFstLy4gXSlcclxuICA+IFsxLTldXFxkeywyfVstLy5cXHNdP1xyXG4gIEFyZWEgY29kZTogeygwKSwgLi4uLCAoMDAwMDAwKSwgMCwgLi4uLCAwMDAwMDB9ICh3aXRoIG9yIHdpdGhvdXQgYSB0cmFpbGluZyBicmVhayBjaGFyYWN0ZXI6IFstLy4gXSlcclxuICA+ICgoXFwoXFxkezEsNn1cXCl8XFxkezEsNn0pWy0vLlxcc10/KT9cclxuICBMb2NhbDogezAsIC4uLn0rICh3aXRoIG9yIHdpdGhvdXQgYSB0cmFpbGluZyBicmVhayBjaGFyYWN0ZXI6IFstLy4gXSlcclxuICA+IChcXGQrWy0vLlxcc10/KStcXGQrXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RvbWVyVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcGhvbmVQcm9wZXJ0eSA9IGN1c3RvbWVyVHlwZS5nZXRQcm9wZXJ0eShcInBob25lXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEN1c3RvbWVyLnBob25lIHByb3BlcnR5IGlzIHBob25lLlxyXG4gICAgICBwaG9uZVByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IucGhvbmUoKSk7XHJcbiAgQG1ldGhvZCBwaG9uZVxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcGhvbmUgPSBmdW5jdGlvbiAoY29udGV4dD86IGFueSkge1xyXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zcmtpcmtsYW5kL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvYmxvYi9tYXN0ZXIvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9FeHByZXNzaW9ucy5jc1xyXG4gICAgbGV0IHJlUGhvbmUgPSAvXigoXFwrfCgwKFxcZCspP1stLy5cXHNdPykpWzEtOV1cXGR7MCwyfVstLy5cXHNdPyk/KChcXChcXGR7MSw2fVxcKXxcXGR7MSw2fSlbLS8uXFxzXT8pPyhcXGQrWy0vLlxcc10/KStcXGQrJC87XHJcbiAgICByZXR1cm4gbWFrZVJlZ0V4cFZhbGlkYXRvcigncGhvbmUnLCByZVBob25lLCBudWxsLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSBVUkwgKHByb3RvY29sIHJlcXVpcmVkKSB2YWxpZGF0b3JcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgcGVyc29uVHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIlBlcnNvblwiKTtcclxuICAgICAgdmFyIHdlYnNpdGVQcm9wZXJ0eSA9IHBlcnNvblR5cGUuZ2V0UHJvcGVydHkoXCJ3ZWJzaXRlXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFBlcnNvbi53ZWJzaXRlIHByb3BlcnR5IGlzIGEgVVJMLlxyXG4gICAgICB3ZWJzaXRlUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci51cmwoKSk7XHJcbiAgQG1ldGhvZCB1cmxcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHVybCA9IGZ1bmN0aW9uIChjb250ZXh0PzogYW55KSB7XHJcbiAgICAvL1NlZSBodHRwczovL2dpdGh1Yi5jb20vc3JraXJrbGFuZC9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL2Jsb2IvbWFzdGVyL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvVXJsQXR0cmlidXRlLmNzXHJcbiAgICBsZXQgcmVVcmxQcm90b2NvbFJlcXVpcmVkID0gL14oaHR0cHM/fGZ0cCk6XFwvXFwvKCgoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDopKkApPygoKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKSl8KFthLXpBLVpdW1xcLWEtekEtWjAtOV0qKXwoKChbYS16QS1aXXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2EtekEtWl18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2EtekEtWl18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuKSsoKFthLXpBLVpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpBLVpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2EtekEtWl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4/KSg6XFxkKik/KShcXC8oKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApKyhcXC8oKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCkqKSopPyk/KFxcPygoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCl8W1xcdUUwMDAtXFx1RjhGRl18XFwvfFxcPykqKT8oXFwjKCgoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mQS1GXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKXxcXC98XFw/KSopPyQvO1xyXG4gICAgcmV0dXJuIG1ha2VSZWdFeHBWYWxpZGF0b3IoJ3VybCcsIHJlVXJsUHJvdG9jb2xSZXF1aXJlZCwgbnVsbCwgY29udGV4dCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0b3Igd2l0aCBhIGZpeGVkIGV4cHJlc3Npb24uXHJcbiAgTWFueSBvZiB0aGUgc3RvY2sgdmFsaWRhdG9ycyBhcmUgYnVpbHQgd2l0aCB0aGlzIGZhY3RvcnkgbWV0aG9kLlxyXG4gIFRoZWlyIGV4cHJlc3Npb25zIGFyZSBvZnRlbiBkZXJpdmVkIGZyb21cclxuICBodHRwczovL2dpdGh1Yi5jb20vc3JraXJrbGFuZC9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL2Jsb2IvbWFzdGVyL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnNcclxuICBZb3UgY2FuIHRyeSBtYW55IG9mIHRoZW0gYXQgaHR0cDovL2RhdGFhbm5vdGF0aW9uc2V4dGVuc2lvbnMub3JnL1xyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIE1ha2UgYSB6aXBjb2RlIHZhbGlkYXRvclxyXG4gICAgICBmdW5jdGlvbiB6aXBWYWxpZGF0b3IgPSBWYWxpZGF0b3IubWFrZVJlZ0V4cFZhbGlkYXRvcihcclxuICAgICAgXCJ6aXBWYWwsXHJcbiAgICAgIC9eXFxkezV9KFtcXC1dXFxkezR9KT8kLyxcclxuICAgICAgXCJUaGUgJWRpc3BsYXlOYW1lJSAnJXZhbHVlJScgaXMgbm90IGEgdmFsaWQgVS5TLiB6aXBjb2RlXCIpO1xyXG4gICAgICAvLyBSZWdpc3RlciBpdC5cclxuICAgICAgVmFsaWRhdG9yLnJlZ2lzdGVyKHppcFZhbGlkYXRvcik7XHJcbiAgICAgIC8vIEFkZCBpdCB0byBhIGRhdGEgcHJvcGVydHkuIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgemlwUHJvcGVydHkgPSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIlBvc3RhbENvZGVcIik7XHJcbiAgICAgIHppcFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaCh6aXBWYWxpZGF0b3IpO1xyXG4gIEBtZXRob2QgbWFrZVJlZ0V4cFZhbGlkYXRvclxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gdmFsaWRhdG9yTmFtZSB7U3RyaW5nfSBuYW1lIG9mIHRoaXMgdmFsaWRhdG9yXHJcbiAgQHBhcmFtIGV4cHJlc3Npb24ge1N0cmluZyB8IFJlZ0V4cH0gcmVndWxhciBleHByZXNzaW9uIHRvIGFwcGx5XHJcbiAgQHBhcmFtIFtkZWZhdWx0TWVzc2FnZV0ge1N0cmluZ30gZGVmYXVsdCBtZXNzYWdlIGZvciBmYWlsZWQgdmFsaWRhdGlvbnNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgbWFrZVJlZ0V4cFZhbGlkYXRvciA9IG1ha2VSZWdFeHBWYWxpZGF0b3I7XHJcblxyXG59XHJcblZhbGlkYXRvci5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiVmFsaWRhdG9yXCI7XHJcblxyXG4vLyByZWdpc3RlciBhbGwgdmFsaWRhdG9yc1xyXG5FcnJvclsneCddID0gY29yZS5vYmplY3RGb3JFYWNoKFZhbGlkYXRvciwgZnVuY3Rpb24gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgaWYgKHR5cGVvZiAodmFsdWUpICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgaWYgKGtleSA9PT0gXCJmcm9tSlNPTlwiIHx8IGtleSA9PT0gXCJyZWdpc3RlclwiIHx8XHJcbiAgICAgIGtleSA9PT0gXCJyZWdpc3RlckZhY3RvcnlcIiB8fCBrZXkgPT09IFwibWFrZVJlZ0V4cFZhbGlkYXRvclwiKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25maWcucmVnaXN0ZXJGdW5jdGlvbih2YWx1ZSwgXCJWYWxpZGF0b3IuXCIgKyBrZXkpO1xyXG59KTtcclxuXHJcbmZ1bmN0aW9uIGZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIHZhcnM6IE9iamVjdCwgb3duUHJvcGVydGllc09ubHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gIGlmICghdmFycykgcmV0dXJuIHRlbXBsYXRlO1xyXG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC8lKFteJV0rKSUvZywgZnVuY3Rpb24gKF8sIGtleSkge1xyXG4gICAgbGV0IHZhbE9yRm46IGFueTtcclxuICAgIGlmIChvd25Qcm9wZXJ0aWVzT25seSkge1xyXG4gICAgICB2YWxPckZuID0gdmFycy5oYXNPd25Qcm9wZXJ0eShrZXkpID8gdmFyc1trZXldIDogJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YWxPckZuID0gdmFyc1trZXldO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbE9yRm4gIT0gbnVsbCkge1xyXG4gICAgICBpZiAoY29yZS5pc0Z1bmN0aW9uKHZhbE9yRm4pKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbE9yRm4odmFycyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbE9yRm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnRSYW5nZVZhbGlkYXRvckN0b3IodmFsaWRhdG9yTmFtZTogc3RyaW5nLCBtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyLCBjb250ZXh0OiBhbnkpIHtcclxuICBjb250ZXh0ID0gY29udGV4dCB8fCB7fTtcclxuICBpZiAobWluVmFsdWUgIT09IHVuZGVmaW5lZCkgeyBjb250ZXh0Lm1pbiA9IG1pblZhbHVlOyB9XHJcbiAgaWYgKG1heFZhbHVlICE9PSB1bmRlZmluZWQpIHsgY29udGV4dC5tYXggPSBtYXhWYWx1ZTsgfVxyXG4gIGxldCB0ZW1wbGF0ZUV4aXN0cyA9IGNvbnRleHQubWVzc2FnZVRlbXBsYXRlIHx8IFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzW3ZhbGlkYXRvck5hbWVdO1xyXG4gIGlmICghdGVtcGxhdGVFeGlzdHMpIHtcclxuICAgIFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzW3ZhbGlkYXRvck5hbWVdID0gY29yZS5mb3JtYXRTdHJpbmcoXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gdGhlIHZhbHVlcyBvZiAlMSBhbmQgJTJcIixcclxuICAgICAgICBtaW5WYWx1ZSwgbWF4VmFsdWUpO1xyXG4gIH1cclxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiBjdHggJiYgY3R4LmFsbG93U3RyaW5nKSB7XHJcbiAgICAgICAgdiA9IHBhcnNlSW50KHYsIDApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICgodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpICYmICghaXNOYU4odikpICYmIE1hdGguZmxvb3IodikgPT09IHYpIHtcclxuICAgICAgICBpZiAobWluVmFsdWUgIT0gbnVsbCAmJiB2IDwgbWluVmFsdWUpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1heFZhbHVlICE9IG51bGwgJiYgdiA+IG1heFZhbHVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKHZhbGlkYXRvck5hbWUsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlZ0V4cFZhbGlkYXRvcih2YWxpZGF0b3JOYW1lOiBzdHJpbmcsIGV4cHJlc3Npb246IFJlZ0V4cCwgZGVmYXVsdE1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCBjb250ZXh0PzogYW55KSB7XHJcbiAgaWYgKGRlZmF1bHRNZXNzYWdlKSB7XHJcbiAgICBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1t2YWxpZGF0b3JOYW1lXSA9IGRlZmF1bHRNZXNzYWdlO1xyXG4gIH1cclxuICBsZXQgcmUgPSAodHlwZW9mIChleHByZXNzaW9uKSA9PT0gJ3N0cmluZycpID8gbmV3IFJlZ0V4cChleHByZXNzaW9uKSA6IGV4cHJlc3Npb247XHJcbiAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgLy8gZG8gbm90IGludmFsaWRhdGUgaWYgZW1wdHk7IHVzZSBhIHNlcGFyYXRlIHJlcXVpcmVkIHRlc3RcclxuICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHR5cGVvZiAodikgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gcmUudGVzdCh2KTtcclxuICB9O1xyXG4gIHJldHVybiBuZXcgVmFsaWRhdG9yKHZhbGlkYXRvck5hbWUsIHZhbEZuLCBjb250ZXh0KTtcclxufVxyXG5cclxuLy8gaHR0cDovL3Jvc2V0dGFjb2RlLm9yZy93aWtpL0x1aG5fdGVzdF9vZl9jcmVkaXRfY2FyZF9udW1iZXJzI0phdmFTY3JpcHRcclxuXHJcbi8vIGZ1bmN0aW9uIGx1aG4oYTogc3RyaW5nLCBiOiBudW1iZXIsIGM6IG51bWJlciwgZDogbnVtYmVyLCBlOiBudW1iZXIpIHtcclxuLy8gICBmb3IgKGQgPSArYVtiID0gYS5sZW5ndGggLSAxXSwgZSA9IDA7IGItLTsgKSB7XHJcbi8vICAgICBjID0gK2FbYl0sIGQgKz0gKytlICUgMiA/IDIgKiBjICUgMTAgKyAoYyA+IDQpIDogYztcclxuLy8gICB9XHJcbi8vICAgcmV0dXJuICEoZCAlIDEwKTtcclxuLy8gfTtcclxuXHJcbmxldCAgbHVobiA9IChmdW5jdGlvbigpIHtcclxuICBsZXQgbHVobkFyciA9IFswLCAyLCA0LCA2LCA4LCAxLCAzLCA1LCA3LCA5XTtcclxuICByZXR1cm4gZnVuY3Rpb24oc3RyOiBzdHJpbmcpIFx0e1xyXG4gICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgbGV0IGluY051bTogbnVtYmVyO1xyXG4gICAgbGV0IG9kZCA9IGZhbHNlO1xyXG4gICAgbGV0IHRlbXAgPSBTdHJpbmcoc3RyKS5yZXBsYWNlKC9bXlxcZF0vZywgXCJcIik7XHJcbiAgICBpZiAoIHRlbXAubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gdGVtcC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgIHtcclxuICAgICAgaW5jTnVtID0gcGFyc2VJbnQodGVtcC5jaGFyQXQoaSksIDEwKTtcclxuICAgICAgY291bnRlciArPSAob2RkID0gIW9kZCkgPyBpbmNOdW0gOiBsdWhuQXJyW2luY051bV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKGNvdW50ZXIgJSAxMCA9PT0gMCk7XHJcbiAgfTtcclxufSkoKTtcclxuXHJcbi8qKlxyXG5BIFZhbGlkYXRpb25FcnJvciBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgZmFpbGVkIHZhbGlkYXRpb24uXHJcblxyXG5AY2xhc3MgVmFsaWRhdGlvbkVycm9yXHJcbioqL1xyXG5cclxuLyoqXHJcbkNvbnN0cnVjdHMgYSBuZXcgVmFsaWRhdGlvbkVycm9yXHJcbkBtZXRob2QgPGN0b3I+IFZhbGlkYXRpb25FcnJvclxyXG5cclxuQHBhcmFtIHZhbGlkYXRvciB7VmFsaWRhdG9yIHx8IG51bGx9IFRoZSBWYWxpZGF0b3IgdXNlZCB0byBjcmVhdGUgdGhpcyBlcnJvciwgaWYgYW55LlxyXG5AcGFyYW0gY29udGV4dCB7IENvbnRleHRPYmplY3QgfHwgbnVsbH0gVGhlIENvbnRleHQgb2JqZWN0IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgVmFsaWRhdG9yIHRvIGNyZWF0ZSB0aGlzIGVycm9yLlxyXG5AcGFyYW0gZXJyb3JNZXNzYWdlIHsgU3RyaW5nfSBUaGUgYWN0dWFsIGVycm9yIG1lc3NhZ2VcclxuQHBhcmFtIFtrZXldIHtTdHJpbmd9IEFuIG9wdGlvbmFsIGtleSB1c2VkIHRvIGRlZmluZSBhIGtleSBmb3IgdGhpcyBlcnJvci4gT25lIHdpbGwgYmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vdCBwcm92aWRlZCBoZXJlLlxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciB7XHJcbiAgdmFsaWRhdG9yPzogVmFsaWRhdG9yO1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGNvbnRleHQ6IGFueTtcclxuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICBwcm9wZXJ0eTogYW55OyAvLyBJUHJvcGVydHlcclxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcclxuICBpc1NlcnZlckVycm9yOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2YWxpZGF0b3I6IFZhbGlkYXRvciB8IG51bGwsIGNvbnRleHQ6IFZhbGlkYXRpb25Db250ZXh0LCBlcnJvck1lc3NhZ2U6IHN0cmluZywga2V5Pzogc3RyaW5nKSB7XHJcbiAgICAvLyBFcnJvciBpcyB3aXRoIGlzSW5zdGFuY2VPZihWYWxpZGF0b3IpXHJcbiAgICBhc3NlcnRQYXJhbSh2YWxpZGF0b3IsIFwidmFsaWRhdG9yXCIpLmlzT3B0aW9uYWwoKS5pc0luc3RhbmNlT2YoVmFsaWRhdG9yKS5jaGVjaygpO1xyXG4gICAgYXNzZXJ0UGFyYW0oZXJyb3JNZXNzYWdlLCBcImVycm9yTWVzc2FnZVwiKS5pc05vbkVtcHR5U3RyaW5nKCkuY2hlY2soKTtcclxuICAgIGFzc2VydFBhcmFtKGtleSwgXCJrZXlcIikuaXNPcHRpb25hbCgpLmlzTm9uRW1wdHlTdHJpbmcoKS5jaGVjaygpO1xyXG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3IgfHwgdW5kZWZpbmVkO1xyXG4gICAgY29udGV4dCA9IGNvbnRleHQgfHwge307XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XHJcblxyXG4gICAgdGhpcy5wcm9wZXJ0eSA9IGNvbnRleHQucHJvcGVydHk7XHJcbiAgICB0aGlzLnByb3BlcnR5TmFtZSA9IGNvbnRleHQucHJvcGVydHlOYW1lIHx8IChjb250ZXh0LnByb3BlcnR5ICYmIGNvbnRleHQucHJvcGVydHkubmFtZSk7XHJcblxyXG4gICAgaWYgKGtleSkge1xyXG4gICAgICB0aGlzLmtleSA9IGtleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMua2V5ID0gVmFsaWRhdGlvbkVycm9yLmdldEtleSh2YWxpZGF0b3IgfHwgZXJyb3JNZXNzYWdlLCB0aGlzLnByb3BlcnR5TmFtZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzU2VydmVyRXJyb3IgPSBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICBUaGUgVmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZhbGlkYXRpb25FcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IHZhbGlkYXRvciB7VmFsaWRhdG9yfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBBICdjb250ZXh0JyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVmFsaWRhdGlvbkVycm9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgY29udGV4dCB7T2JqZWN0fVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUgRGF0YVByb3BlcnR5IG9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhpcyBWYWxpZGF0aW9uRXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBwcm9wZXJ0eSB7RGF0YVByb3BlcnR5fE5hdmlnYXRpb25Qcm9wZXJ0eX1cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIHByb3BlcnR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVmFsaWRhdGlvbkVycm9yLiBUaGlzIHdpbGwgYmUgYSBcInByb3BlcnR5IHBhdGhcIiBmb3IgYW55IHByb3BlcnRpZXMgb2YgYSBjb21wbGV4IG9iamVjdC5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IHByb3BlcnR5TmFtZSB7U3RyaW5nfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIFZhbGlkYXRpb25FcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGVycm9yTWVzc2FnZSB7c3RyaW5nfVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUga2V5IGJ5IHdoaWNoIHRoaXMgdmFsaWRhdGlvbiBlcnJvciBtYXkgYmUgcmVtb3ZlZCBmcm9tIGEgY29sbGVjdGlvbiBvZiBWYWxpZGF0aW9uRXJyb3JzLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkga2V5IHtzdHJpbmd9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFdoZXRoZXIgdGhpcyBpcyBhIHNlcnZlciBlcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IGlzU2VydmVyRXJyb3Ige2Jvb2x9XHJcbiAgKiovXHJcblxyXG5cclxuICAvKipcclxuICBDb21wb3NlcyBhIFZhbGlkYXRpb25FcnJvciAna2V5JyBnaXZlbiBhIHZhbGlkYXRvciBvciBhbiBlcnJvck5hbWUgYW5kIGFuIG9wdGlvbmFsIHByb3BlcnR5TmFtZVxyXG4gIEBtZXRob2QgZ2V0S2V5XHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSB2YWxpZGF0b3Ige1ZhbGlkYXRvck9yRXJyb3JLZXl9IEEgVmFsaWRhdG9yIG9yIGFuIFwiZXJyb3IgbmFtZVwiIGlmIG5vIHZhbGlkYXRvciBpcyBhdmFpbGFibGUuXHJcbiAgQHBhcmFtIFtwcm9wZXJ0eU5hbWVdIEEgcHJvcGVydHkgbmFtZVxyXG4gIEByZXR1cm4ge1N0cmluZ30gQSBWYWxpZGF0aW9uRXJyb3IgJ2tleSdcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGdldEtleSh2YWxpZGF0b3JPckVycm9yTmFtZTogVmFsaWRhdG9yIHwgc3RyaW5nLCBwcm9wZXJ0eU5hbWU/OiBzdHJpbmcpIHtcclxuICAgIGxldCBuYW1lID0gKHR5cGVvZiB2YWxpZGF0b3JPckVycm9yTmFtZSA9PT0gJ3N0cmluZycpID8gdmFsaWRhdG9yT3JFcnJvck5hbWUgOiB2YWxpZGF0b3JPckVycm9yTmFtZS5uYW1lO1xyXG4gICAgcmV0dXJuIG5hbWUgKyAocHJvcGVydHlOYW1lID8gXCI6XCIgKyBwcm9wZXJ0eU5hbWUgOiBcIlwiKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIl19
@@ -63,4 +63,4 @@ function updateWithConfig(options, config) {
63
63
  }
64
64
  return options;
65
65
  }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy92YWxpZGF0aW9uLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRyxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFrQjlDOzs7RUFHRTtBQUNGO0lBa0JFOzs7Ozs7T0FNRztJQUNILDJCQUFZLE1BQWdDO1FBQzFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBR0Q7Ozs7OztPQU1HO0lBQ0gsaUNBQUssR0FBTCxVQUFNLE1BQStCO1FBQ25DLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHdDQUFZLEdBQVo7UUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUNBQWUsR0FBRyxJQUFJLGlCQUFpQixDQUFDO1FBQzdDLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsY0FBYyxFQUFFLElBQUk7UUFDcEIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsd0JBQXdCLEVBQUUsSUFBSTtLQUMvQixDQUFDLENBQUM7SUFDTCx3QkFBQztDQUFBLEFBaEVELElBZ0VDO1NBaEVZLGlCQUFpQjtBQWlFOUIsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQztBQUU3RCxTQUFTLGdCQUFnQixDQUFDLE9BQTBCLEVBQUUsTUFBK0I7SUFDbkYsSUFBSSxNQUFNLEVBQUU7UUFDVixZQUFZLENBQUMsTUFBTSxDQUFDO2FBQ2YsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFO2FBQ3ZELFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRTthQUNyRCxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUU7YUFDdEQsVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFO2FBQy9ELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN4QjtJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlICB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IGFzc2VydENvbmZpZyB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGluZm8gdG8gYmUgcGFzc2VkIHRvIHRoZSBbW1ZhbGlkYXRpb25PcHRpb25zXV0gY29uc3RydWN0b3IgKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uT3B0aW9uc0NvbmZpZyB7XHJcbiAgLyoqIFdoZXRoZXIgZW50aXR5IGFuZCBwcm9wZXJ0eSBsZXZlbCB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ciB3aGVuIGVudGl0aWVzIGFyZSBhdHRhY2hlZCB0byB0aGUgRW50aXR5TWFuYWdlciBcclxuICBvdGhlciB0aGFuIHZpYSBhIHF1ZXJ5LiAoZGVmYXVsdCA9IHRydWUpICovXHJcbiAgdmFsaWRhdGVPbkF0dGFjaD86IGJvb2xlYW47XHJcbiAgLyoqICBXaGV0aGVyIGVudGl0eSBhbmQgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgYmVmb3JlIGVudGl0aWVzIGFyZSBzYXZlZC4gXHJcbiAgQSBmYWlsZWQgdmFsaWRhdGlvbiB3aWxsIGZvcmNlIHRoZSBzYXZlIHRvIGZhaWwgZWFybHkuIChkZWZhdWx0ID0gdHJ1ZSkgICovXHJcbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIGVudGl0eSBhbmQgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgYWZ0ZXIgZW50aXRpZXMgYXJlIHF1ZXJpZWQgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuXHJcbiAgKGRlZmF1bHQgPSBmYWxzZSkgICoqL1xyXG4gIHZhbGlkYXRlT25RdWVyeT86IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgYWZ0ZXIgZW50aXRpZXMgYXJlIG1vZGlmaWVkLlxyXG4gIChkZWZhdWx0ID0gdHJ1ZSkgICoqL1xyXG4gIHZhbGlkYXRlT25Qcm9wZXJ0eUNoYW5nZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG5BIFZhbGlkYXRpb25PcHRpb25zIGluc3RhbmNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB2YWxpZGF0aW9uIHdpbGwgYmUgZXhlY3V0ZWQuXHJcblxyXG4qL1xyXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbk9wdGlvbnMgaW1wbGVtZW50cyBWYWxpZGF0aW9uT3B0aW9uc0NvbmZpZyB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBvbiBwcm90b1xyXG4gIC8qKiBXaGV0aGVyIGVudGl0eSBhbmQgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgd2hlbiBlbnRpdGllcyBhcmUgYXR0YWNoZWQgdG8gdGhlIEVudGl0eU1hbmFnZXIgXHJcbiAgb3RoZXIgdGhhbiB2aWEgYSBxdWVyeS4gKGRlZmF1bHQgPSB0cnVlKSBfX1JlYWQgT25seV9fICovXHJcbiAgdmFsaWRhdGVPbkF0dGFjaDogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciBlbnRpdHkgYW5kIHByb3BlcnR5IGxldmVsIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyIGJlZm9yZSBlbnRpdGllcyBhcmUgc2F2ZWQuIFxyXG4gIEEgZmFpbGVkIHZhbGlkYXRpb24gd2lsbCBmb3JjZSB0aGUgc2F2ZSB0byBmYWlsIGVhcmx5LiAoZGVmYXVsdCA9IHRydWUpIF9fUmVhZCBPbmx5X18gKi9cclxuICB2YWxpZGF0ZU9uU2F2ZTogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciBlbnRpdHkgYW5kIHByb3BlcnR5IGxldmVsIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyIGFmdGVyIGVudGl0aWVzIGFyZSBxdWVyaWVkIGZyb20gYSByZW1vdGUgc2VydmVyLlxyXG4gIChkZWZhdWx0ID0gZmFsc2UpIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIHZhbGlkYXRlT25RdWVyeTogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciBwcm9wZXJ0eSBsZXZlbCB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ciBhZnRlciBlbnRpdGllcyBhcmUgbW9kaWZpZWQuXHJcbiAgKGRlZmF1bHQgPSB0cnVlKSBfX1JlYWQgT25seV9fICoqL1xyXG4gIHZhbGlkYXRlT25Qcm9wZXJ0eUNoYW5nZTogYm9vbGVhbjtcclxuXHJcblxyXG5cclxuICAvKiogXHJcbiAgVmFsaWRhdGlvbk9wdGlvbnMgY29uc3RydWN0b3JcclxuICA+ICAgICB2YXIgbmV3Vm8gPSBuZXcgVmFsaWRhdGlvbk9wdGlvbnMoIHsgdmFsaWRhdGVPblNhdmU6IGZhbHNlLCB2YWxpZGF0ZU9uQXR0YWNoOiBmYWxzZSB9KTtcclxuICA+ICAgICAvLyBhc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlclxyXG4gID4gICAgIGVtMS5zZXRQcm9wZXJ0aWVzKCB7IHZhbGlkYXRpb25PcHRpb25zOiBuZXdWbyB9KTtcclxuICBAcGFyYW0gY29uZmlnIC0gQSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuICAqKi9cclxuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBWYWxpZGF0aW9uT3B0aW9uc0NvbmZpZykge1xyXG4gICAgdXBkYXRlV2l0aENvbmZpZyh0aGlzLCBjb25maWcpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgVmFsaWRhdGlvbk9wdGlvbnMgd2l0aCBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgY29uZmlnIHByb3BlcnRpZXMuXHJcbiAgPiAgICAgdmFyIHZhbGlkYXRpb25PcHRpb25zID0gbmV3IFZhbGlkYXRpb25PcHRpb25zKCk7XHJcbiAgPiAgICAgdmFyIG5ld09wdGlvbnMgPSB2YWxpZGF0aW9uT3B0aW9ucy51c2luZyggeyB2YWxpZGF0ZU9uUXVlcnk6IHRydWUsIHZhbGlkYXRlT25TYXZlOiBmYWxzZX0gKTtcclxuICBAcGFyYW0gY29uZmlnIC0gQSBjb25maWd1cmF0aW9uIG9iamVjdFxyXG4gIEByZXR1cm4gQSBuZXcgVmFsaWRhdGlvbk9wdGlvbnMgaW5zdGFuY2UuXHJcbiAgKiovXHJcbiAgdXNpbmcoY29uZmlnOiBWYWxpZGF0aW9uT3B0aW9uc0NvbmZpZykge1xyXG4gICAgaWYgKCFjb25maWcpIHJldHVybiB0aGlzO1xyXG4gICAgbGV0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uT3B0aW9ucyh0aGlzKTtcclxuICAgIHVwZGF0ZVdpdGhDb25maWcocmVzdWx0LCBjb25maWcpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFNldHMgdGhlICdkZWZhdWx0SW5zdGFuY2UnIGJ5IGNyZWF0aW5nIGEgY29weSBvZiB0aGUgY3VycmVudCAnZGVmYXVsdEluc3RhbmNlJyBhbmQgdGhlbiBhcHBseWluZyBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UuXHJcbiAgVGhlIGN1cnJlbnQgaW5zdGFuY2UgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxyXG4gID4gICAgIHZhciB2YWxpZGF0aW9uT3B0aW9ucyA9IG5ldyBWYWxpZGF0aW9uT3B0aW9ucygpXHJcbiAgPiAgICAgdmFyIG5ld09wdGlvbnMgPSB2YWxpZGF0aW9uT3B0aW9ucy51c2luZyggeyB2YWxpZGF0ZU9uUXVlcnk6IHRydWUsIHZhbGlkYXRlT25TYXZlOiBmYWxzZX0gKTtcclxuICA+ICAgICB2YXIgbmV3T3B0aW9ucy5zZXRBc0RlZmF1bHQoKTtcclxuICAqKi9cclxuICBzZXRBc0RlZmF1bHQoKSB7XHJcbiAgICByZXR1cm4gY29yZS5zZXRBc0RlZmF1bHQodGhpcywgVmFsaWRhdGlvbk9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgVGhlIGRlZmF1bHQgaW5zdGFuY2UgZm9yIHVzZSB3aGVuZXZlciBWYWxpZGF0aW9uT3B0aW9ucyBhcmUgbm90IHNwZWNpZmllZC5cclxuICAqKi9cclxuICBzdGF0aWMgZGVmYXVsdEluc3RhbmNlID0gbmV3IFZhbGlkYXRpb25PcHRpb25zKHtcclxuICAgIHZhbGlkYXRlT25BdHRhY2g6IHRydWUsXHJcbiAgICB2YWxpZGF0ZU9uU2F2ZTogdHJ1ZSxcclxuICAgIHZhbGlkYXRlT25RdWVyeTogZmFsc2UsXHJcbiAgICB2YWxpZGF0ZU9uUHJvcGVydHlDaGFuZ2U6IHRydWVcclxuICB9KTtcclxufVxyXG5WYWxpZGF0aW9uT3B0aW9ucy5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiVmFsaWRhdGlvbk9wdGlvbnNcIjtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVdpdGhDb25maWcob3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMsIGNvbmZpZzogVmFsaWRhdGlvbk9wdGlvbnNDb25maWcpIHtcclxuICBpZiAoY29uZmlnKSB7XHJcbiAgICBhc3NlcnRDb25maWcoY29uZmlnKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwidmFsaWRhdGVPbkF0dGFjaFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKClcclxuICAgICAgICAud2hlcmVQYXJhbShcInZhbGlkYXRlT25TYXZlXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwidmFsaWRhdGVPblF1ZXJ5XCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwidmFsaWRhdGVPblByb3BlcnR5Q2hhbmdlXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC5hcHBseUFsbChvcHRpb25zKTtcclxuICB9XHJcbiAgcmV0dXJuIG9wdGlvbnM7XHJcbn1cclxuIl19
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy92YWxpZGF0aW9uLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRyxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFrQjlDOzs7RUFHRTtBQUNGO0lBa0JFOzs7Ozs7T0FNRztJQUNILDJCQUFZLE1BQWdDO1FBQzFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBR0Q7Ozs7OztPQU1HO0lBQ0gsaUNBQUssR0FBTCxVQUFNLE1BQStCO1FBQ25DLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHdDQUFZLEdBQVo7UUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUNBQWUsR0FBRyxJQUFJLGlCQUFpQixDQUFDO1FBQzdDLGdCQUFnQixFQUFFLElBQUk7UUFDdEIsY0FBYyxFQUFFLElBQUk7UUFDcEIsZUFBZSxFQUFFLEtBQUs7UUFDdEIsd0JBQXdCLEVBQUUsSUFBSTtLQUMvQixDQUFDLENBQUM7SUFDTCx3QkFBQztDQUFBLEFBaEVELElBZ0VDO1NBaEVZLGlCQUFpQjtBQWlFOUIsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQztBQUU3RCxTQUFTLGdCQUFnQixDQUFDLE9BQTBCLEVBQUUsTUFBK0I7SUFDbkYsSUFBSSxNQUFNLEVBQUU7UUFDVixZQUFZLENBQUMsTUFBTSxDQUFDO2FBQ2YsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFO2FBQ3ZELFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRTthQUNyRCxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUU7YUFDdEQsVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFO2FBQy9ELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN4QjtJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlICB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IGFzc2VydENvbmZpZyB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGluZm8gdG8gYmUgcGFzc2VkIHRvIHRoZSBbW1ZhbGlkYXRpb25PcHRpb25zXV0gY29uc3RydWN0b3IgKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uT3B0aW9uc0NvbmZpZyB7XHJcbiAgLyoqIFdoZXRoZXIgZW50aXR5IGFuZCBwcm9wZXJ0eSBsZXZlbCB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ciB3aGVuIGVudGl0aWVzIGFyZSBhdHRhY2hlZCB0byB0aGUgRW50aXR5TWFuYWdlciBcclxuICBvdGhlciB0aGFuIHZpYSBhIHF1ZXJ5LiAoZGVmYXVsdCA9IHRydWUpICovXHJcbiAgdmFsaWRhdGVPbkF0dGFjaD86IGJvb2xlYW47XHJcbiAgLyoqICBXaGV0aGVyIGVudGl0eSBhbmQgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgYmVmb3JlIGVudGl0aWVzIGFyZSBzYXZlZC4gXHJcbiAgQSBmYWlsZWQgdmFsaWRhdGlvbiB3aWxsIGZvcmNlIHRoZSBzYXZlIHRvIGZhaWwgZWFybHkuIChkZWZhdWx0ID0gdHJ1ZSkgICovXHJcbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIGVudGl0eSBhbmQgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgYWZ0ZXIgZW50aXRpZXMgYXJlIHF1ZXJpZWQgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuXHJcbiAgKGRlZmF1bHQgPSBmYWxzZSkgICoqL1xyXG4gIHZhbGlkYXRlT25RdWVyeT86IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgYWZ0ZXIgZW50aXRpZXMgYXJlIG1vZGlmaWVkLlxyXG4gIChkZWZhdWx0ID0gdHJ1ZSkgICoqL1xyXG4gIHZhbGlkYXRlT25Qcm9wZXJ0eUNoYW5nZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG5BIFZhbGlkYXRpb25PcHRpb25zIGluc3RhbmNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB2YWxpZGF0aW9uIHdpbGwgYmUgZXhlY3V0ZWQuXHJcblxyXG4qL1xyXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbk9wdGlvbnMgaW1wbGVtZW50cyBWYWxpZGF0aW9uT3B0aW9uc0NvbmZpZyB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgZGVjbGFyZSBfJHR5cGVOYW1lOiBzdHJpbmc7IC8vIG9uIHByb3RvXHJcbiAgLyoqIFdoZXRoZXIgZW50aXR5IGFuZCBwcm9wZXJ0eSBsZXZlbCB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ciB3aGVuIGVudGl0aWVzIGFyZSBhdHRhY2hlZCB0byB0aGUgRW50aXR5TWFuYWdlciBcclxuICBvdGhlciB0aGFuIHZpYSBhIHF1ZXJ5LiAoZGVmYXVsdCA9IHRydWUpIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHZhbGlkYXRlT25BdHRhY2g6IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgZW50aXR5IGFuZCBwcm9wZXJ0eSBsZXZlbCB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ciBiZWZvcmUgZW50aXRpZXMgYXJlIHNhdmVkLiBcclxuICBBIGZhaWxlZCB2YWxpZGF0aW9uIHdpbGwgZm9yY2UgdGhlIHNhdmUgdG8gZmFpbCBlYXJseS4gKGRlZmF1bHQgPSB0cnVlKSBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSB2YWxpZGF0ZU9uU2F2ZTogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciBlbnRpdHkgYW5kIHByb3BlcnR5IGxldmVsIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyIGFmdGVyIGVudGl0aWVzIGFyZSBxdWVyaWVkIGZyb20gYSByZW1vdGUgc2VydmVyLlxyXG4gIChkZWZhdWx0ID0gZmFsc2UpIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIGRlY2xhcmUgdmFsaWRhdGVPblF1ZXJ5OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHByb3BlcnR5IGxldmVsIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyIGFmdGVyIGVudGl0aWVzIGFyZSBtb2RpZmllZC5cclxuICAoZGVmYXVsdCA9IHRydWUpIF9fUmVhZCBPbmx5X18gKiovXHJcbiAgZGVjbGFyZSB2YWxpZGF0ZU9uUHJvcGVydHlDaGFuZ2U6IGJvb2xlYW47XHJcblxyXG5cclxuXHJcbiAgLyoqIFxyXG4gIFZhbGlkYXRpb25PcHRpb25zIGNvbnN0cnVjdG9yXHJcbiAgPiAgICAgdmFyIG5ld1ZvID0gbmV3IFZhbGlkYXRpb25PcHRpb25zKCB7IHZhbGlkYXRlT25TYXZlOiBmYWxzZSwgdmFsaWRhdGVPbkF0dGFjaDogZmFsc2UgfSk7XHJcbiAgPiAgICAgLy8gYXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXJcclxuICA+ICAgICBlbTEuc2V0UHJvcGVydGllcyggeyB2YWxpZGF0aW9uT3B0aW9uczogbmV3Vm8gfSk7XHJcbiAgQHBhcmFtIGNvbmZpZyAtIEEgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgKiovXHJcbiAgY29uc3RydWN0b3IoY29uZmlnPzogVmFsaWRhdGlvbk9wdGlvbnNDb25maWcpIHtcclxuICAgIHVwZGF0ZVdpdGhDb25maWcodGhpcywgY29uZmlnKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgY29weSBvZiB0aGlzIFZhbGlkYXRpb25PcHRpb25zIHdpdGggY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIGNvbmZpZyBwcm9wZXJ0aWVzLlxyXG4gID4gICAgIHZhciB2YWxpZGF0aW9uT3B0aW9ucyA9IG5ldyBWYWxpZGF0aW9uT3B0aW9ucygpO1xyXG4gID4gICAgIHZhciBuZXdPcHRpb25zID0gdmFsaWRhdGlvbk9wdGlvbnMudXNpbmcoIHsgdmFsaWRhdGVPblF1ZXJ5OiB0cnVlLCB2YWxpZGF0ZU9uU2F2ZTogZmFsc2V9ICk7XHJcbiAgQHBhcmFtIGNvbmZpZyAtIEEgY29uZmlndXJhdGlvbiBvYmplY3RcclxuICBAcmV0dXJuIEEgbmV3IFZhbGlkYXRpb25PcHRpb25zIGluc3RhbmNlLlxyXG4gICoqL1xyXG4gIHVzaW5nKGNvbmZpZzogVmFsaWRhdGlvbk9wdGlvbnNDb25maWcpIHtcclxuICAgIGlmICghY29uZmlnKSByZXR1cm4gdGhpcztcclxuICAgIGxldCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbk9wdGlvbnModGhpcyk7XHJcbiAgICB1cGRhdGVXaXRoQ29uZmlnKHJlc3VsdCwgY29uZmlnKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBTZXRzIHRoZSAnZGVmYXVsdEluc3RhbmNlJyBieSBjcmVhdGluZyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgJ2RlZmF1bHRJbnN0YW5jZScgYW5kIHRoZW4gYXBwbHlpbmcgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLlxyXG4gIFRoZSBjdXJyZW50IGluc3RhbmNlIGlzIHJldHVybmVkIHVuY2hhbmdlZC5cclxuICA+ICAgICB2YXIgdmFsaWRhdGlvbk9wdGlvbnMgPSBuZXcgVmFsaWRhdGlvbk9wdGlvbnMoKVxyXG4gID4gICAgIHZhciBuZXdPcHRpb25zID0gdmFsaWRhdGlvbk9wdGlvbnMudXNpbmcoIHsgdmFsaWRhdGVPblF1ZXJ5OiB0cnVlLCB2YWxpZGF0ZU9uU2F2ZTogZmFsc2V9ICk7XHJcbiAgPiAgICAgdmFyIG5ld09wdGlvbnMuc2V0QXNEZWZhdWx0KCk7XHJcbiAgKiovXHJcbiAgc2V0QXNEZWZhdWx0KCkge1xyXG4gICAgcmV0dXJuIGNvcmUuc2V0QXNEZWZhdWx0KHRoaXMsIFZhbGlkYXRpb25PcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFRoZSBkZWZhdWx0IGluc3RhbmNlIGZvciB1c2Ugd2hlbmV2ZXIgVmFsaWRhdGlvbk9wdGlvbnMgYXJlIG5vdCBzcGVjaWZpZWQuXHJcbiAgKiovXHJcbiAgc3RhdGljIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBWYWxpZGF0aW9uT3B0aW9ucyh7XHJcbiAgICB2YWxpZGF0ZU9uQXR0YWNoOiB0cnVlLFxyXG4gICAgdmFsaWRhdGVPblNhdmU6IHRydWUsXHJcbiAgICB2YWxpZGF0ZU9uUXVlcnk6IGZhbHNlLFxyXG4gICAgdmFsaWRhdGVPblByb3BlcnR5Q2hhbmdlOiB0cnVlXHJcbiAgfSk7XHJcbn1cclxuVmFsaWRhdGlvbk9wdGlvbnMucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIlZhbGlkYXRpb25PcHRpb25zXCI7XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVXaXRoQ29uZmlnKG9wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zLCBjb25maWc6IFZhbGlkYXRpb25PcHRpb25zQ29uZmlnKSB7XHJcbiAgaWYgKGNvbmZpZykge1xyXG4gICAgYXNzZXJ0Q29uZmlnKGNvbmZpZylcclxuICAgICAgICAud2hlcmVQYXJhbShcInZhbGlkYXRlT25BdHRhY2hcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJ2YWxpZGF0ZU9uU2F2ZVwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKClcclxuICAgICAgICAud2hlcmVQYXJhbShcInZhbGlkYXRlT25RdWVyeVwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKClcclxuICAgICAgICAud2hlcmVQYXJhbShcInZhbGlkYXRlT25Qcm9wZXJ0eUNoYW5nZVwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKClcclxuICAgICAgICAuYXBwbHlBbGwob3B0aW9ucyk7XHJcbiAgfVxyXG4gIHJldHVybiBvcHRpb25zO1xyXG59XHJcbiJdfQ==