breeze-client 2.2.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/src/data-service.mjs +1 -19
- package/esm2022/src/entity-key.mjs +1 -3
- package/esm2022/src/entity-manager.mjs +1 -21
- package/esm2022/src/local-query-comparison-options.mjs +1 -11
- package/esm2022/src/mapping-context.mjs +1 -12
- package/esm2022/src/naming-convention.mjs +1 -5
- package/esm2022/src/query-options.mjs +1 -9
- package/esm2022/src/save-options.mjs +1 -11
- package/esm2022/src/validate.mjs +1 -8
- package/esm2022/src/validation-options.mjs +1 -15
- package/fesm2022/breeze-client.mjs +0 -104
- package/fesm2022/breeze-client.mjs.map +1 -1
- package/package.json +7 -7
package/esm2022/src/validate.mjs
CHANGED
|
@@ -154,13 +154,6 @@ of additional properties that will be automatically added to this object if not
|
|
|
154
154
|
@dynamic
|
|
155
155
|
**/
|
|
156
156
|
export class Validator {
|
|
157
|
-
/** @hidden @internal */
|
|
158
|
-
_$typeName; // on proto
|
|
159
|
-
name;
|
|
160
|
-
valFn;
|
|
161
|
-
context;
|
|
162
|
-
currentContext;
|
|
163
|
-
_baseContext;
|
|
164
157
|
constructor(name, valFn, context) {
|
|
165
158
|
// _baseContext is what will get serialized
|
|
166
159
|
this._baseContext = context || {};
|
|
@@ -999,4 +992,4 @@ export class ValidationError {
|
|
|
999
992
|
return name + (propertyName ? ":" + propertyName : "");
|
|
1000
993
|
}
|
|
1001
994
|
}
|
|
1002
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUlsQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFVLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUVwQyxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7QUF3QjVCLG1FQUFtRTtBQUNuRSxJQUFJLFdBQVcsR0FBRztJQUNoQixXQUFXLEVBQUUsVUFBVSxPQUEwQjtRQUMvQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDcEIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3pHO2FBQU07WUFDTCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtJQUNILENBQUM7Q0FDRixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3SEc7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QUFHLEdBQUcsQ0FBQztTQUNoQjthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2pGO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUdEOzs7OztPQUtHO0lBRUg7Ozs7O09BS0c7SUFFSDs7Ozs7T0FLRztJQUVIOzs7OztPQUtHO0lBRUg7Ozs7O09BS0c7SUFFSDs7Ozs7T0FLRztJQUVIOzs7OztPQUtHO0lBR0g7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQXdDLEVBQUUsWUFBcUI7UUFDbEYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLG9CQUFvQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO1FBQ3pHLE9BQU8sSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgYXNzZXJ0UGFyYW0gfSBmcm9tICcuL2Fzc2VydC1wYXJhbSc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblByb3BlcnR5LCBEYXRhUHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcblxyXG5leHBvcnQgY29uc3QgSU5UMTZfTUlOID0gLTMyNzY4O1xyXG5leHBvcnQgY29uc3QgSU5UMTZfTUFYID0gMzI3Njc7XHJcblxyXG5leHBvcnQgY29uc3QgSU5UMzJfTUlOID0gLTIxNDc0ODM2NDg7XHJcbmV4cG9ydCBjb25zdCBJTlQzMl9NQVggPSAyMTQ3NDgzNjQ3O1xyXG5cclxuZXhwb3J0IGNvbnN0IEJZVEVfTUlOID0gMDtcclxuZXhwb3J0IGNvbnN0IEJZVEVfTUFYID0gMjU1O1xyXG5cclxuLyoqIFBhc3NlZCB0byBWYWxpZGF0aW9uRm4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uQ29udGV4dCB7XHJcbiAgZW50aXR5PzogRW50aXR5O1xyXG4gIHByb3BlcnR5PzogRGF0YVByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5O1xyXG4gIHByb3BlcnR5TmFtZT86IHN0cmluZztcclxuICB2YWx1ZT86IGFueTtcclxufVxyXG5cclxuLyoqIFVzZWQgYnkgVmFsaWRhdG9yIHRvIGNvbXBvc2UgbWVzc2FnZXMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQgZXh0ZW5kcyBWYWxpZGF0aW9uQ29udGV4dCB7XHJcbiAgbmFtZT86IHN0cmluZztcclxuICBkaXNwbGF5TmFtZT86IHN0cmluZztcclxuICBtZXNzYWdlVGVtcGxhdGU/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
|
|
995
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUlsQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFVLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUVwQyxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7QUF3QjVCLG1FQUFtRTtBQUNuRSxJQUFJLFdBQVcsR0FBRztJQUNoQixXQUFXLEVBQUUsVUFBVSxPQUEwQjtRQUMvQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDcEIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3pHO2FBQU07WUFDTCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtJQUNILENBQUM7Q0FDRixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3SEc7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UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBR0Q7Ozs7O09BS0c7SUFFSDs7Ozs7T0FLRztJQUVIOzs7OztPQUtHO0lBRUg7Ozs7O09BS0c7SUFFSDs7Ozs7T0FLRztJQUVIOzs7OztPQUtHO0lBRUg7Ozs7O09BS0c7SUFHSDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBd0MsRUFBRSxZQUFxQjtRQUNsRixJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFDekcsT0FBTyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvcmUgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBhc3NlcnRQYXJhbSB9IGZyb20gJy4vYXNzZXJ0LXBhcmFtJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uUHJvcGVydHksIERhdGFQcm9wZXJ0eSB9IGZyb20gJy4vZW50aXR5LW1ldGFkYXRhJztcclxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSAnLi9lbnRpdHktYXNwZWN0JztcclxuXHJcbmV4cG9ydCBjb25zdCBJTlQxNl9NSU4gPSAtMzI3Njg7XHJcbmV4cG9ydCBjb25zdCBJTlQxNl9NQVggPSAzMjc2NztcclxuXHJcbmV4cG9ydCBjb25zdCBJTlQzMl9NSU4gPSAtMjE0NzQ4MzY0ODtcclxuZXhwb3J0IGNvbnN0IElOVDMyX01BWCA9IDIxNDc0ODM2NDc7XHJcblxyXG5leHBvcnQgY29uc3QgQllURV9NSU4gPSAwO1xyXG5leHBvcnQgY29uc3QgQllURV9NQVggPSAyNTU7XHJcblxyXG4vKiogUGFzc2VkIHRvIFZhbGlkYXRpb25GbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Db250ZXh0IHtcclxuICBlbnRpdHk/OiBFbnRpdHk7XHJcbiAgcHJvcGVydHk/OiBEYXRhUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHk7XHJcbiAgcHJvcGVydHlOYW1lPzogc3RyaW5nO1xyXG4gIHZhbHVlPzogYW55O1xyXG59XHJcblxyXG4vKiogVXNlZCBieSBWYWxpZGF0b3IgdG8gY29tcG9zZSBtZXNzYWdlcyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dCBleHRlbmRzIFZhbGlkYXRpb25Db250ZXh0IHtcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xyXG4gIG1lc3NhZ2VUZW1wbGF0ZT86IHN0cmluZztcclxuICBtZXNzYWdlPzogc3RyaW5nIHwgKCh2YzogVmFsaWRhdGlvbkNvbnRleHQpID0+IHN0cmluZyk7XHJcbiAgW2tleTpzdHJpbmddOiBhbnk7XHJcbn1cclxuXHJcbi8qKiBGdW5jdGlvbiBjYWxsZWQgdG8gdmFsaWRhdGUgYW4gZW50aXR5IG9yIHByb3BlcnR5ICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkZuIHtcclxuICAgICh2YWx1ZTogYW55LCBjb250ZXh0PzogVmFsaWRhdGlvbkNvbnRleHQpOiBib29sZWFuO1xyXG59XHJcblxyXG4vLyBhZGQgY29tbW9uIHByb3BzIGFuZCBtZXRob2RzIGZvciBldmVyeSB2YWxpZGF0b3IgJ2NvbnRleHQnIGhlcmUuXHJcbmxldCByb290Q29udGV4dCA9IHtcclxuICBkaXNwbGF5TmFtZTogZnVuY3Rpb24gKGNvbnRleHQ6IFZhbGlkYXRpb25Db250ZXh0KSB7XHJcbiAgICBpZiAoY29udGV4dC5wcm9wZXJ0eSkge1xyXG4gICAgICByZXR1cm4gY29udGV4dC5wcm9wZXJ0eS5yZXNvbHZlUHJvcGVydHkoXCJkaXNwbGF5TmFtZVwiKSB8fCBjb250ZXh0LnByb3BlcnR5TmFtZSB8fCBjb250ZXh0LnByb3BlcnR5Lm5hbWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJWYWx1ZVwiO1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbi8qKlxyXG5JbnN0YW5jZXMgb2YgdGhlIFZhbGlkYXRvciBjbGFzcyBwcm92aWRlIHRoZSBsb2dpYyB0byB2YWxpZGF0ZSBhbm90aGVyIG9iamVjdCBhbmQgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIGFueSBlcnJvcnNcclxuZW5jb3VudGVyZWQgZHVyaW5nIHRoZSB2YWxpZGF0aW9uIHByb2Nlc3MuICBUaGV5IGFyZSB0eXBpY2FsbHkgYXNzb2NpYXRlZCB3aXRoIGEgJ3ZhbGlkYXRvcnMnIHByb3BlcnR5IG9uIHRoZSBmb2xsb3dpbmcgdHlwZXM6IFtbRW50aXR5VHlwZV1dLFxyXG5bW0RhdGFQcm9wZXJ0eV1dIG9yIFtbTmF2aWdhdGlvblByb3BlcnR5XV0uXHJcblxyXG5BIG51bWJlciBvZiBwcm9wZXJ0eSBsZXZlbCB2YWxpZGF0b3JzIGFyZSByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHksIGkuZSBhZGRlZCB0byBlYWNoIERhdGFQcm9wZXJ0eS52YWxpZGF0b3JzIHByb3BlcnR5XHJcbmJhc2VkIG9uIFtbRGF0YVByb3BlcnR5XV0gbWV0YWRhdGEuICBGb3IgZXhhbXBsZSxcclxuXHJcbi0gRGF0YVByb3BlcnR5LmRhdGFUeXBlIC0+IG9uZSBvZiB0aGUgJ2RhdGFUeXBlJyB2YWxpZGF0b3IgbWV0aG9kcyBzdWNoIGFzIFZhbGlkYXRvci5pbnQ2NCwgVmFsaWRhdG9yLmRhdGUsIFZhbGlkYXRvci5ib29sIGV0Yy5cclxuLSBEYXRhUHJvcGVydHkubWF4TGVuZ3RoIC0+IFZhbGlkYXRvci5tYXhMZW5ndGhcclxuLSBEYXRhUHJvcGVydHkuaXNOdWxsYWJsZSAtPiBWYWxpZGF0b3IucmVxdWlyZWQgKGlmIG5vdCBudWxsYWJsZSlcclxuXHJcbkBjbGFzcyBWYWxpZGF0b3JcclxuKiovXHJcblxyXG4vKipcclxuVmFsaWRhdG9yIGNvbnN0cnVjdG9yIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgY3JlYXRlIGN1c3RvbSB2YWxpZGF0aW9ucy4gIFNldmVyYWxcclxuYmFzaWMgXCJWYWxpZGF0b3JcIiBjb25zdHJ1Y3Rpb24gbWV0aG9kcyBhcmUgYWxzbyBwcm92aWRlZCBhcyBzdGF0aWMgbWV0aG9kcyB0byB0aGlzIGNsYXNzLiBUaGVzZSBtZXRob2RzXHJcbnByb3ZpZGUgYSBzaW1wbGVyIHN5bnRheCBmb3IgY3JlYXRpbmcgYmFzaWMgdmFsaWRhdGlvbnMuXHJcblxyXG5NYW55IG9mIHRoZXNlIHN0b2NrIHZhbGlkYXRvcnMgYXJlIGluc3BpcmVkIGJ5IGFuZCBpbXBsZW1lbnRlZCB0byBjb25mb3JtIHRvIHRoZSB2YWxpZGF0b3JzIGRlZmluZWQgYXRcclxuaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3N5c3RlbS5jb21wb25lbnRtb2RlbC5kYXRhYW5ub3RhdGlvbnMuYXNweFxyXG5cclxuU29tZXRpbWVzIGEgY3VzdG9tIHZhbGlkYXRvciB3aWxsIGJlIHJlcXVpcmVkLlxyXG5AZXhhbXBsZVxyXG5Nb3N0IHZhbGlkYXRvcnMgd2lsbCBiZSAncHJvcGVydHknIGxldmVsIHZhbGlkYXRvcnMsIGxpa2UgdGhpcy5cclxuQGV4YW1wbGVcclxuICAgIC8vIHYgaXMgdGhpcyBmdW5jdGlvbiBpcyB0aGUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkLCBpbiB0aGlzIGNhc2UgYSBcImNvdW50cnlcIiBzdHJpbmcuXHJcbiAgICB2YXIgdmFsRm4gPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiAoY29yZS5zdHJpbmdTdGFydHNXaXRoKHYsIFwiVVNcIikpO1xyXG4gICAgfTtcclxuICAgIHZhciBjb3VudHJ5VmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcihcImNvdW50cnlJc1VTXCIsIHZhbEZuLCB7XHJcbiAgICAgICAgZGlzcGxheU5hbWU6IFwiQ291bnRyeVwiLCBcclxuICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3Qgc3RhcnQgd2l0aCAnVVMnXCIgXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBOb3cgcGx1ZyBpdCBpbnRvIEJyZWV6ZS5cclxuICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgdmFyIGN1c3RUeXBlID0gbWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICB2YXIgY291bnRyeVByb3AgPSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIkNvdW50cnlcIik7XHJcbiAgICAvLyBOb3RlIHRoYXQgdmFsaWRhdG9yIGlzIGFkZGVkIHRvIGEgJ0RhdGFQcm9wZXJ0eScgdmFsaWRhdG9ycyBjb2xsZWN0aW9uLlxyXG4gICAgcHJvcC52YWxpZGF0b3JzLnB1c2goY291bnRyeVZhbGlkYXRvcik7XHJcbkVudGl0eSBsZXZlbCB2YWxpZGF0b3JzIGFyZSBhbHNvIHBvc3NpYmxlXHJcbkBleGFtcGxlXHJcbiAgICBmdW5jdGlvbiBpc1ZhbGlkWmlwQ29kZSh2YWx1ZSkge1xyXG4gICAgICAgIHZhciByZSA9IC9eXFxkezV9KFtcXC1dXFxkezR9KT8kLztcclxuICAgICAgICByZXR1cm4gKHJlLnRlc3QodmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB2IGluIHRoaXMgY2FzZSB3aWxsIGJlIGEgQ3VzdG9tZXIgZW50aXR5XHJcbiAgICB2YXIgdmFsRm4gPSBmdW5jdGlvbiAodikge1xyXG4gICAgICAgIC8vIFRoaXMgdmFsaWRhdG9yIG9ubHkgdmFsaWRhdGVzIFVTIFppcCBDb2Rlcy5cclxuICAgICAgICBpZiAoIHYuZ2V0UHJvcGVydHkoXCJDb3VudHJ5XCIpID09PSBcIlVTQVwiKSB7XHJcbiAgICAgICAgICAgIHZhciBwb3N0YWxDb2RlID0gdi5nZXRQcm9wZXJ0eShcIlBvc3RhbENvZGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkWmlwQ29kZShwb3N0YWxDb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gICAgdmFyIHppcENvZGVWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKFwiemlwQ29kZVZhbGlkYXRvclwiLCB2YWxGbixcclxuICAgICAgICB7IG1lc3NhZ2VUZW1wbGF0ZTogXCJGb3IgdGhlIFVTLCB0aGlzIGlzIG5vdCBhIHZhbGlkIFBvc3RhbENvZGVcIiB9KTtcclxuXHJcbiAgICAvLyBOb3cgcGx1ZyBpdCBpbnRvIEJyZWV6ZS5cclxuICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgdmFyIGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgLy8gTm90ZSB0aGF0IHZhbGlkYXRvciBpcyBhZGRlZCB0byBhbiAnRW50aXR5VHlwZScgdmFsaWRhdG9ycyBjb2xsZWN0aW9uLlxyXG4gICAgY3VzdFR5cGUudmFsaWRhdG9ycy5wdXNoKHppcENvZGVWYWxpZGF0b3IpO1xyXG5XaGF0IGlzIGNvbW1vbmx5IG5lZWRlZCBpcyBhIHdheSBvZiBjcmVhdGluZyBhIHBhcmFtZXRlcml6ZWQgZnVuY3Rpb24gdGhhdCB3aWxsIGl0c2VsZlxyXG5yZXR1cm4gYSBuZXcgVmFsaWRhdG9yLiAgVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIGEgJ2NvbnRleHQnIG9iamVjdC5cclxuQGV4YW1wbGVcclxuICAgIC8vIGNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCB0YWtlIGluIGEgY29uZmlnIG9iamVjdFxyXG4gICAgLy8gYW5kIHdpbGwgcmV0dXJuIGEgdmFsaWRhdG9yXHJcbiAgICB2YXIgbnVtZXJpY1JhbmdlVmFsaWRhdG9yID0gZnVuY3Rpb24oY29udGV4dCkge1xyXG4gICAgICAgIHZhciB2YWxGbiA9IGZ1bmN0aW9uKHYsIGN0eCkge1xyXG4gICAgICAgICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZih2KSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoY3R4Lm1pbiAhPSBudWxsICYmIHYgPCBjdHgubWluKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjdHgubWF4ICE9IG51bGwgJiYgdiA+IGN0eC5tYXgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICAvLyBUaGUgbGFzdCBwYXJhbWV0ZXIgYmVsb3cgaXMgdGhlICdjb250ZXh0JyBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBpbnRvIHRoZSAnY3R4JyBwYXJhbWV0ZXIgYWJvdmVcclxuICAgICAgICAvLyB3aGVuIHRoaXMgdmFsaWRhdG9yIGV4ZWN1dGVzLiBTZXZlcmFsIG90aGVyIHByb3BlcnRpZXMsIHN1Y2ggYXMgZGlzcGxheU5hbWUgd2lsbCBnZXQgYWRkZWQgdG8gdGhpcyBvYmplY3QgYXMgd2VsbC5cclxuICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcIm51bWVyaWNSYW5nZVwiLCB2YWxGbiwge1xyXG4gICAgICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiB0aGUgdmFsdWVzIG9mICVtaW4lIGFuZCAlbWF4JVwiLFxyXG4gICAgICAgICAgICBtaW46IGNvbnRleHQubWluLFxyXG4gICAgICAgICAgICBtYXg6IGNvbnRleHQubWF4XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgLy8gQXNzdW1lIHRoYXQgZnJlaWdodFByb3BlcnR5IGlzIGEgRGF0YUVudGl0eVByb3BlcnR5IHRoYXQgZGVzY3JpYmVzIG51bWVyaWMgdmFsdWVzLlxyXG4gICAgLy8gcmVnaXN0ZXIgdGhlIHZhbGlkYXRvclxyXG4gICAgZnJlaWdodFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChudW1lcmljUmFuZ2VWYWxpZGF0b3IoeyBtaW46IDEwMCwgbWF4OiA1MDAgfSkpO1xyXG5cclxuQnJlZXplIHN1YnN0aXR1dGVzIGNvbnRleHQgdmFsdWVzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZSB0b2tlbnMgaW4gdGhlIG1lc3NhZ2VUZW1wbGF0ZSB3aGVuIHByZXBhcmluZyB0aGUgcnVudGltZSBlcnJvciBtZXNzYWdlO1xyXG4nZGlzcGxheU5hbWUnIGlzIGEgcHJlLWRlZmluZWQgY29udGV4dCBmdW5jdGlvbiB0aGF0IGlzIGFsd2F5cyBhdmFpbGFibGUuXHJcblxyXG5QbGVhc2Ugbm90ZSB0aGF0IEJyZWV6ZSBzdWJzdGl0dXRlcyB0aGUgZW1wdHkgc3RyaW5nIGZvciBmYWxzZXkgcGFyYW1ldGVycy4gVGhhdCB1c3VhbGx5IHdvcmtzIGluIHlvdXIgZmF2b3IuXHJcblNvbWV0aW1lcyBpdCBkb2Vzbid0IGFzIHdoZW4gdGhlICdtaW4nIHZhbHVlIGlzIHplcm8gaW4gd2hpY2ggY2FzZSB0aGUgbWVzc2FnZSB0ZXh0IHdvdWxkIGhhdmUgYSBob2xlXHJcbndoZXJlIHRoZSAnbWluJyB2YWx1ZSBnb2VzLCBzYXlpbmc6IFwiLi4uIGFuIGludGVnZXIgYmV0d2VlbiB0aGUgdmFsdWVzIG9mIGFuZCAuLi5cIi4gVGhhdCBpcyBub3Qgd2hhdCB5b3Ugd2FudC5cclxuXHJcblRvIGF2b2lkIHRoaXMgZWZmZWN0LCB5b3UgbWF5IGNhbiBiYWtlIGNlcnRhaW4gb2YgdGhlIGNvbnRleHQgdmFsdWVzIGludG8gdGhlICdtZXNzYWdlVGVtcGxhdGUnIGl0c2VsZlxyXG5hcyBzaG93biBpbiB0aGlzIHJldmlzaW9uIHRvIHRoZSBwZXJ0aW5lbnQgcGFydCBvZiB0aGUgcHJldmlvdXMgZXhhbXBsZTpcclxuQGV4YW1wbGVcclxuICAgIC8vIC4uLiBhcyBiZWZvcmVcclxuICAgIC8vIC4uLiBidXQgYmFrZSB0aGUgbWluL21heCB2YWx1ZXMgaW50byB0aGUgbWVzc2FnZSB0ZW1wbGF0ZS5cclxuICAgIHZhciB0ZW1wbGF0ZSA9IGJyZWV6ZS5jb3JlLmZvcm1hdFN0cmluZyhcclxuICAgICAgICBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gdGhlIHZhbHVlcyBvZiAlMSBhbmQgJTJcIixcclxuICAgICAgICBjb250ZXh0Lm1pbiwgY29udGV4dC5tYXgpO1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJudW1lcmljUmFuZ2VcIiwgdmFsRm4sIHtcclxuICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IHRlbXBsYXRlLFxyXG4gICAgICAgIG1pbjogY29udGV4dC5taW4sXHJcbiAgICAgICAgbWF4OiBjb250ZXh0Lm1heFxyXG4gICAgfSk7XHJcblxyXG5AbWV0aG9kIDxjdG9yPiBWYWxpZGF0b3JcclxuQHBhcmFtIG5hbWUge1N0cmluZ30gVGhlIG5hbWUgb2YgdGhpcyB2YWxpZGF0b3IuXHJcbkBwYXJhbSB2YWxpZGF0b3JGbiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8gcGVyZm9ybSB2YWxpZGF0aW9uLlxyXG5cclxudmFsaWRhdG9yRm4odmFsdWUsIGNvbnRleHQpXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi52YWx1ZSB7T2JqZWN0fSBWYWx1ZSB0byBiZSB2YWxpZGF0ZWRcclxuQHBhcmFtIHZhbGlkYXRvckZuLmNvbnRleHQge09iamVjdH0gVGhlIHNhbWUgY29udGV4dCBvYmplY3QgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIHdpdGggdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWYgbm90XHJcbm90aGVyd2lzZSBzcGVjaWZpZWQuXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi5jb250ZXh0LnZhbHVlIHtPYmplY3R9IFRoZSB2YWx1ZSBiZWluZyB2YWxpZGF0ZWQuXHJcbkBwYXJhbSB2YWxpZGF0b3JGbi5jb250ZXh0Lm5hbWUge1N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBiZWluZyBleGVjdXRlZC5cclxuQHBhcmFtIHZhbGlkYXRvckZuLmNvbnRleHQuZGlzcGxheU5hbWUge1N0cmluZ30gVGhpcyB3aWxsIGJlIGVpdGhlciB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5J3MgJ2Rpc3BsYXlOYW1lJyBwcm9wZXJ0eSBvclxyXG50aGUgdmFsdWUgb2YgaXRzICduYW1lJyBwcm9wZXJ0eSBvciB0aGUgc3RyaW5nICdWYWx1ZSdcclxuQHBhcmFtIHZhbGlkYXRvckZuLmNvbnRleHQubWVzc2FnZVRlbXBsYXRlIHtTdHJpbmd9IFRoaXMgd2lsbCBlaXRoZXIgYmUgdGhlIHZhbHVlIG9mIFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzWyB7dGhpcyB2YWxpZGF0b3JzIG5hbWV9XSBvciBudWxsLiBWYWxpZGF0b3IubWVzc2FnZVRlbXBsYXRlc1xyXG5pcyBhbiBvYmplY3QgdGhhdCBpcyBrZXllZCBieSB2YWxpZGF0b3IgbmFtZSBhbmQgdGhhdCBjYW4gYmUgYWRkZWQgdG8gaW4gb3JkZXIgdG8gJ3JlZ2lzdGVyJyB5b3VyIG93biBtZXNzYWdlIGZvciBhIGdpdmVuIHZhbGlkYXRvci5cclxuVGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgZm9yIGFueSB2YWxpZGF0b3IgdG8gZm9yY2UgYSBzcGVjaWZpYyBlcnJvck1lc3NhZ2Ugc3RyaW5nXHJcbkBwYXJhbSBbdmFsaWRhdG9yRm4uY29udGV4dC5tZXNzYWdlXSB7U3RyaW5nfSBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgJ21lc3NhZ2VUZW1wbGF0ZScgcHJvcGVydHkgd2hlbiBhblxyXG5lcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC5cclxuXHJcbkBwYXJhbSBbY29udGV4dF0ge09iamVjdH0gQSBmcmVlIGZvcm0gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgd2lsbCBtYWRlIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHZhbGlkYXRpb24gYW5kIGVycm9yIG1lc3NhZ2UgY3JlYXRpb24gcHJvY2Vzcy5cclxuVGhpcyBvYmplY3Qgd2lsbCBiZSBwYXNzZWQgaW50byB0aGUgVmFsaWRhdG9yJ3MgdmFsaWRhdGlvbiBmdW5jdGlvbiB3aGVuZXZlciAndmFsaWRhdGUnIGlzIGNhbGxlZC4gU2VlIGFib3ZlIGZvciBhIGRlc2NyaXB0aW9uXHJcbm9mIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGlzIG9iamVjdCBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZC5cclxuQGR5bmFtaWNcclxuKiovXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3Ige1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGRlY2xhcmUgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBvbiBwcm90b1xyXG5cclxuICBkZWNsYXJlIG5hbWU6IHN0cmluZztcclxuICBkZWNsYXJlIHZhbEZuOiBWYWxpZGF0aW9uRm47XHJcbiAgZGVjbGFyZSBjb250ZXh0OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcbiAgZGVjbGFyZSBjdXJyZW50Q29udGV4dDogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG4gIGRlY2xhcmUgcHJpdmF0ZSBfYmFzZUNvbnRleHQ6IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuXHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2YWxGbjogVmFsaWRhdGlvbkZuLCBjb250ZXh0PzogVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0KSB7XHJcbiAgICAvLyBfYmFzZUNvbnRleHQgaXMgd2hhdCB3aWxsIGdldCBzZXJpYWxpemVkXHJcbiAgICB0aGlzLl9iYXNlQ29udGV4dCA9IGNvbnRleHQgfHwge30gYXMgVmFsaWRhdGlvbk1lc3NhZ2VDb250ZXh0O1xyXG4gICAgdGhpcy5fYmFzZUNvbnRleHQubmFtZSA9IG5hbWU7XHJcbiAgICBjb250ZXh0ID0gY29yZS5leHRlbmQoT2JqZWN0LmNyZWF0ZShyb290Q29udGV4dCksIHRoaXMuX2Jhc2VDb250ZXh0KSBhcyBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7XHJcbiAgICBjb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSA9IGNvbnRleHQubWVzc2FnZVRlbXBsYXRlIHx8IFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzW25hbWVdO1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgIHRoaXMudmFsRm4gPSB2YWxGbjtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBUaGUgbmFtZSBvZiB0aGlzIHZhbGlkYXRvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IG5hbWUge1N0cmluZ31cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgVGhlIGNvbnRleHQgZm9yIHRoaXMgdmFsaWRhdG9yLlxyXG5cclxuICBUaGlzIG9iamVjdCB3aWxsIHR5cGljYWxseSBjb250YWluIGF0IGEgbWluaW11bSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMuIFwibmFtZVwiLCBcImRpc3BsYXlOYW1lXCIsIGFuZCBcIm1lc3NhZ2VcIiBvciBcIm1lc3NhZ2VUZW1wbGF0ZVwiLlxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBjb250ZXh0IHtPYmplY3R9XHJcbiAgKiovXHJcblxyXG5cclxuICAvKipcclxuICBSdW4gdGhpcyB2YWxpZGF0b3IgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHZhbHVlLiAgVGhpcyBtZXRob2Qgd2lsbCB1c3VhbGx5IGJlIGNhbGxlZCBpbnRlcm5hbGx5IGVpdGhlclxyXG4gIGF1dG9tYXRpY2FsbHkgYnkgYW4gcHJvcGVydHkgY2hhbmdlLCBlbnRpdHkgYXR0YWNoLCBxdWVyeSBvciBzYXZlIG9wZXJhdGlvbiwgb3IgbWFudWFsbHkgYXMgYSByZXN1bHQgb2ZcclxuICBhIHZhbGlkYXRlRW50aXR5IGNhbGwgb24gdGhlIEVudGl0eUFzcGVjdC4gVGhlIHJlc3VsdGluZyBWYWxpZGF0aW9uUmVzdWx0cyBhcmUgYXZhaWxhYmxlIHZpYSB0aGVcclxuICBFbnRpdHlBc3BlY3QuZ2V0VmFsaWRhdGlvbkVycm9ycyBtZXRob2QuXHJcblxyXG4gIEhvd2V2ZXIsIHlvdSBjYW4gYWxzbyBjYWxsIGEgdmFsaWRhdG9yIGRpcmVjdGx5IGVpdGhlciBmb3IgdGVzdGluZyBwdXJwb3NlcyBvciBzb21lIG90aGVyIHJlYXNvbiBpZiBuZWVkZWQuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gdXNpbmcgb25lIG9mIHRoZSBwcmVkZWZpbmVkIHZhbGlkYXRvcnNcclxuICAgICAgdmFyIHZhbGlkYXRvciA9IFZhbGlkYXRvci5tYXhMZW5ndGgoeyBtYXhMZW5ndGg6IDUsIGRpc3BsYXlOYW1lOiBcIkNpdHlcIiB9KTtcclxuICAgICAgLy8gc2hvdWxkIGJlIG9rIGJlY2F1c2UgXCJhc2RmXCIubGVuZ3RoIDwgNVxyXG4gICAgICB2YXIgcmVzdWx0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKFwiYXNkZlwiKTtcclxuICAgICAgb2socmVzdWx0ID09PSBudWxsKTtcclxuICAgICAgcmVzdWx0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKFwiYWRhc2RmYXNkZlwiKTtcclxuICAgICAgLy8gZXh0cmFjdCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlICdyZXN1bHQnXHJcbiAgICAgIHZhciBlcnJNc2cgPSByZXN1bHQuZXJyb3JNZXNzYWdlO1xyXG4gICAgICB2YXIgY29udGV4dCA9IHJlc3VsdC5jb250ZXh0O1xyXG4gICAgICB2YXIgc2FtZVZhbGlkYXRvciA9IHJlc3VsdC52YWxpZGF0b3I7XHJcbiAgQG1ldGhvZCB2YWxpZGF0ZVxyXG4gIEBwYXJhbSB2YWx1ZSB7T2JqZWN0fSBWYWx1ZSB0byB2YWxpZGF0ZVxyXG4gIEBwYXJhbSBhZGRpdGlvbmFsQ29udGV4dCB7T2JqZWN0fSBBbnkgYWRkaXRpb25hbCBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHRoYXQgdGhlIFZhbGlkYXRvclxyXG4gIGNhbiBtYWtlIHVzZSBvZi5cclxuICBAcmV0dXJuIHtWYWxpZGF0aW9uRXJyb3J8bnVsbH0gQSBWYWxpZGF0aW9uRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscywgbnVsbCBvdGhlcndpc2VcclxuICAqKi9cclxuICB2YWxpZGF0ZSh2YWx1ZTogYW55LCBhZGRpdGlvbmFsQ29udGV4dD86IFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dCkge1xyXG4gICAgbGV0IGN1cnJlbnRDb250ZXh0OiBWYWxpZGF0aW9uTWVzc2FnZUNvbnRleHQ7IC8vIHsgdmFsdWU/OiBPYmplY3QgfTtcclxuICAgIGlmIChhZGRpdGlvbmFsQ29udGV4dCkge1xyXG4gICAgICBjdXJyZW50Q29udGV4dCA9IGNvcmUuZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5jb250ZXh0KSwgYWRkaXRpb25hbENvbnRleHQpIGFzIFZhbGlkYXRpb25NZXNzYWdlQ29udGV4dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN1cnJlbnRDb250ZXh0ID0gdGhpcy5jb250ZXh0O1xyXG4gICAgfVxyXG4gICAgdGhpcy5jdXJyZW50Q29udGV4dCA9IGN1cnJlbnRDb250ZXh0O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLnZhbEZuKHZhbHVlLCBjdXJyZW50Q29udGV4dCkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjdXJyZW50Q29udGV4dC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKHRoaXMsIGN1cnJlbnRDb250ZXh0LCB0aGlzLmdldE1lc3NhZ2UoKSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IodGhpcywgY3VycmVudENvbnRleHQsIFwiRXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgdmFsaWRhdG9yOiBcIiArIHRoaXMubmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gY29udGV4dC52YWx1ZSBpcyBub3QgYXZhaWwgdW5sZXNzIHZhbGlkYXRlIHdhcyBjYWxsZWQgZmlyc3QuXHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZSBtb3N0IHJlY2VudCBleGVjdXRpb24gb2YgdGhpcyBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgdmFyIHYwID0gVmFsaWRhdG9yLm1heExlbmd0aCh7IG1heExlbmd0aDogNSwgZGlzcGxheU5hbWU6IFwiQ2l0eVwiIH0pO1xyXG4gICAgICB2MC52YWxpZGF0ZShcImFkYXNkZmFzZGZcIik7XHJcbiAgICAgIHZhciBlcnJNZXNzYWdlID0gdjAuZ2V0TWVzc2FnZSgpKTtcclxuICBAbWV0aG9kIGdldE1lc3NhZ2VcclxuICBAcmV0dXJuIHtTdHJpbmd9XHJcbiAgKiovXHJcbiAgZ2V0TWVzc2FnZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBjb250ZXh0ID0gdGhpcy5jdXJyZW50Q29udGV4dDtcclxuICAgICAgbGV0IG1lc3NhZ2UgPSBjb250ZXh0Lm1lc3NhZ2U7XHJcbiAgICAgIGlmIChtZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAobWVzc2FnZSkgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2UoY29udGV4dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSkge1xyXG4gICAgICAgIHJldHVybiBmb3JtYXRUZW1wbGF0ZShjb250ZXh0Lm1lc3NhZ2VUZW1wbGF0ZSwgY29udGV4dCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaW52YWxpZCB2YWx1ZTogXCIgKyAodGhpcy5uYW1lIHx8IFwie3VubmFtZWQgdmFsaWRhdG9yfVwiKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4gXCJVbmFibGUgdG8gZm9ybWF0IGVycm9yIG1lc3NhZ2VcIiArIGUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvSlNPTigpIHtcclxuICAgIHJldHVybiB0aGlzLl9iYXNlQ29udGV4dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIENyZWF0ZXMgYSB2YWxpZGF0b3IgaW5zdGFuY2UgZnJvbSBhIEpTT04gb2JqZWN0IG9yIGFuIGFycmF5IG9mIGluc3RhbmNlcyBmcm9tIGFuIGFycmF5IG9mIEpTT04gb2JqZWN0cy5cclxuICBAbWV0aG9kIGZyb21KU09OXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBqc29uIHtPYmplY3R9IEpTT04gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIGEgdmFsaWRhdG9yLlxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUpTT04oanNvbjogYW55KTogYW55IHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XHJcbiAgICAgIHJldHVybiBqc29uLm1hcChmdW5jdGlvbiAoanMpIHtcclxuICAgICAgICByZXR1cm4gVmFsaWRhdG9yLmZyb21KU09OKGpzKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoanNvbiBpbnN0YW5jZW9mIFZhbGlkYXRvcikge1xyXG4gICAgICByZXR1cm4ganNvbjtcclxuICAgIH1cclxuICAgIGxldCB2YWxpZGF0b3JOYW1lID0gXCJWYWxpZGF0b3IuXCIgKyBqc29uLm5hbWU7XHJcbiAgICBsZXQgZm4gPSBjb25maWcuZ2V0UmVnaXN0ZXJlZEZ1bmN0aW9uKHZhbGlkYXRvck5hbWUpO1xyXG4gICAgaWYgKCFmbikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gbG9jYXRlIGEgdmFsaWRhdG9yIG5hbWVkOlwiICsganNvbi5uYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmbihqc29uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJlZ2lzdGVyIGEgdmFsaWRhdG9yIGluc3RhbmNlIHNvIHRoYXQgYW55IGRlc2VyaWFsaXplZCBtZXRhZGF0YSBjYW4gcmVmZXJlbmNlIGl0LlxyXG4gIEBtZXRob2QgcmVnaXN0ZXJcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIHZhbGlkYXRvciB7VmFsaWRhdG9yfSBWYWxpZGF0b3IgdG8gcmVnaXN0ZXIuXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyByZWdpc3Rlcih2YWxpZGF0b3I6IFZhbGlkYXRvcikge1xyXG4gICAgY29uZmlnLnJlZ2lzdGVyRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gdmFsaWRhdG9yO1xyXG4gICAgfSwgXCJWYWxpZGF0b3IuXCIgKyB2YWxpZGF0b3IubmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZWdpc3RlciBhIHZhbGlkYXRvciBmYWN0b3J5IHNvIHRoYXQgYW55IGRlc2VyaWFsaXplZCBtZXRhZGF0YSBjYW4gcmVmZXJlbmNlIGl0LlxyXG4gIEBtZXRob2QgcmVnaXN0ZXJGYWN0b3J5XHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSB2YWxpZGF0b3JGYWN0b3J5IHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0aGF0IG9wdGlvbmFsbHkgdGFrZXMgYSBjb250ZXh0IHByb3BlcnR5IGFuZCByZXR1cm5zIGEgVmFsaWRhdG9yIGluc3RhbmNlLlxyXG4gIEBwYXJhbSBuYW1lIHtTdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IuXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyByZWdpc3RlckZhY3RvcnkodmFsaWRhdG9yRmFjdG9yeTogKG9wdGlvbnM/OiBhbnkpID0+IFZhbGlkYXRvciwgbmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25maWcucmVnaXN0ZXJGdW5jdGlvbih2YWxpZGF0b3JGYWN0b3J5LCBcIlZhbGlkYXRvci5cIiArIG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgTWFwIG9mIHN0YW5kYXJkIGVycm9yIG1lc3NhZ2UgdGVtcGxhdGVzIGtleWVkIGJ5IHZhbGlkYXRvciBuYW1lLlxyXG4gIFlvdSBjYW4gYWRkIHRvIG9yIG1vZGlmeSB0aGlzIG9iamVjdCB0byBjdXN0b21pemUgdGhlIHRlbXBsYXRlIHVzZWQgZm9yIGFueSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gdiBpcyB0aGlzIGZ1bmN0aW9uIGlzIHRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQsIGluIHRoaXMgY2FzZSBhIFwiY291bnRyeVwiIHN0cmluZy5cclxuICAgICAgdmFyIHZhbEZuID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIChjb3JlLnN0cmluZ1N0YXJ0c1dpdGgodiwgXCJVU1wiKSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHZhciBjb3VudHJ5VmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcihcImNvdW50cnlJc1VTXCIsIHZhbEZuLCB7IGRpc3BsYXlOYW1lOiBcIkNvdW50cnlcIiB9KTtcclxuICAgICAgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXMuY291bnRyeUlzVVMgPSBcIiclZGlzcGxheU5hbWUlJyBtdXN0IHN0YXJ0IHdpdGggJ1VTJ1wiO1xyXG4gICAgICAvLyBUaGlzIHdpbGwgaGF2ZSBhIHNpbWlsYXIgZWZmZWN0IHRvIHRoaXNcclxuICAgICAgdmFyIGNvdW50cnlWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKFwiY291bnRyeUlzVVNcIiwgdmFsRm4sIHtcclxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBcIkNvdW50cnlcIiwgXHJcbiAgICAgICAgICBtZXNzYWdlVGVtcGxhdGU6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3Qgc3RhcnQgd2l0aCAnVVMnXCIgXHJcbiAgICAgIH0pO1xyXG4gIEBwcm9wZXJ0eSBtZXNzYWdlVGVtcGxhdGVzIHtPYmplY3R9XHJcbiAgQHN0YXRpY1xyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgbWVzc2FnZVRlbXBsYXRlcyA9IHtcclxuICAgIGJvb2w6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSAndHJ1ZScgb3IgJ2ZhbHNlJyB2YWx1ZVwiLFxyXG4gICAgY3JlZGl0Q2FyZDogXCJUaGUgJWRpc3BsYXlOYW1lJSBpcyBub3QgYSB2YWxpZCBjcmVkaXQgY2FyZCBudW1iZXJcIixcclxuICAgIGRhdGU6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBkYXRlXCIsXHJcbiAgICBkdXJhdGlvbjogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIElTTzg2MDEgZHVyYXRpb24gc3RyaW5nLCBzdWNoIGFzICdQM0gyNE02MFMnXCIsXHJcbiAgICBlbWFpbEFkZHJlc3M6IFwiVGhlICVkaXNwbGF5TmFtZSUgJyV2YWx1ZSUnIGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIixcclxuICAgIGd1aWQ6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBHVUlEXCIsXHJcbiAgICBpbnRlZ2VyOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGFuIGludGVnZXJcIixcclxuICAgIGludGVnZXJSYW5nZTogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gdGhlIHZhbHVlcyBvZiAlbWluVmFsdWUlIGFuZCAlbWF4VmFsdWUlXCIsXHJcbiAgICBtYXhMZW5ndGg6IFwiJyVkaXNwbGF5TmFtZSUnIG11c3QgYmUgYSBzdHJpbmcgd2l0aCAlbWF4TGVuZ3RoJSBjaGFyYWN0ZXJzIG9yIGxlc3NcIixcclxuICAgIG51bWJlcjogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIG51bWJlclwiLFxyXG4gICAgcGhvbmU6IFwiVGhlICVkaXNwbGF5TmFtZSUgJyV2YWx1ZSUnIGlzIG5vdCBhIHZhbGlkIHBob25lIG51bWJlclwiLFxyXG4gICAgcmVndWxhckV4cHJlc3Npb246IFwiVGhlICVkaXNwbGF5TmFtZSUgJyV2YWx1ZSUnIGRvZXMgbm90IG1hdGNoICclZXhwcmVzc2lvbiUnXCIsXHJcbiAgICByZXF1aXJlZDogXCInJWRpc3BsYXlOYW1lJScgaXMgcmVxdWlyZWRcIixcclxuICAgIHN0cmluZzogXCInJWRpc3BsYXlOYW1lJScgbXVzdCBiZSBhIHN0cmluZ1wiLFxyXG4gICAgc3RyaW5nTGVuZ3RoOiBcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGEgc3RyaW5nIHdpdGggYmV0d2VlbiAlbWluTGVuZ3RoJSBhbmQgJW1heExlbmd0aCUgY2hhcmFjdGVyc1wiLFxyXG4gICAgdXJsOiBcIlRoZSAlZGlzcGxheU5hbWUlICcldmFsdWUlJyBpcyBub3QgYSB2YWxpZCB1cmxcIlxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCAncmVxdWlyZWQgdmFsdWUnIFZhbGlkYXRvclxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdFR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciByZWdpb25Qcm9wZXJ0eSAtIGN1c3RUeXBlLmdldFByb3BlcnR5KFwiUmVnaW9uXCIpO1xyXG4gICAgICAvLyBNYWtlcyBcIlJlZ2lvblwiIG9uIEN1c3RvbWVyIGEgcmVxdWlyZWQgcHJvcGVydHkuXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IucmVxdWlyZWQoKSk7XHJcbiAgICAgIC8vIG9yIHRvIGFsbG93IGVtcHR5IHN0cmluZ3NcclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5yZXF1aXJlZCh7IGFsbG93RW1wdHlTdHJpbmdzOiB0cnVlIH0pOyk7XHJcbiAgQG1ldGhvZCByZXF1aXJlZFxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gY29udGV4dCB7T2JqZWN0fVxyXG4gIEBwYXJhbSBbY29udGV4dC5hbGxvd0VtcHR5U3RyaW5nc10ge0Jvb2xlYW59IElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQgb3IgZmFsc2UgdGhlbiBlbXB0eSBzdHJpbmdzIGRvIE5PVCBwYXNzIHZhbGlkYXRpb24uXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHJlcXVpcmVkID0gZnVuY3Rpb24oY29udGV4dD86IGFueSkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgaWYgKGN0eCAmJiBjdHguYWxsb3dFbXB0eVN0cmluZ3MpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiB2Lmxlbmd0aCA+IDA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHYgIT0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwicmVxdWlyZWRcIiwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBtYXhpbXVtIHN0cmluZyBsZW5ndGggVmFsaWRhdG9yOyB0aGUgbWF4aW11bSBsZW5ndGggbXVzdCBiZSBzcGVjaWZpZWRcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcmVnaW9uUHJvcGVydHkgLSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIlJlZ2lvblwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBSZWdpb24gcHJvcGVydHkgb24gQ3VzdG9tZXIgd2lsbCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNSBjaGFyYWN0ZXJzLlxyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLm1heExlbmd0aCgge21heExlbmd0aDogNX0pKTtcclxuICBAbWV0aG9kIG1heExlbmd0aFxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gY29udGV4dCB7T2JqZWN0fVxyXG4gIEBwYXJhbSBjb250ZXh0Lm1heExlbmd0aCB7SW50ZWdlcn1cclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgbWF4TGVuZ3RoID0gZnVuY3Rpb24oY29udGV4dDogYW55KSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiAodikgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgcmV0dXJuIHYubGVuZ3RoIDw9IGN0eC5tYXhMZW5ndGg7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJtYXhMZW5ndGhcIiwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBzdHJpbmcgbGVuZ3RoIFZhbGlkYXRvcjsgYm90aCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aHMgbXVzdCBiZSBzcGVjaWZpZWQuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBjdXN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJDdXN0b21lclwiKTtcclxuICAgICAgdmFyIHJlZ2lvblByb3BlcnR5IC0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJSZWdpb25cIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUmVnaW9uIHByb3BlcnR5IG9uIEN1c3RvbWVyIHdpbGwgYmVcclxuICAgICAgLy8gYmV0d2VlbiAyIGFuZCA1IGNoYXJhY3RlcnNcclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5zdHJpbmdMZW5ndGgoIHttaW5MZW5ndGg6IDIsIG1heExlbmd0aDogNX0pO1xyXG4gIEBtZXRob2Qgc3RyaW5nTGVuZ3RoXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBjb250ZXh0IHtPYmplY3R9XHJcbiAgQHBhcmFtIGNvbnRleHQubWF4TGVuZ3RoIHtJbnRlZ2VyfVxyXG4gIEBwYXJhbSBjb250ZXh0Lm1pbkxlbmd0aCB7SW50ZWdlcn1cclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgc3RyaW5nTGVuZ3RoID0gZnVuY3Rpb24gKGNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSwgY3R4OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgKHYpICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmIChjdHgubWluTGVuZ3RoICE9IG51bGwgJiYgdi5sZW5ndGggPCBjdHgubWluTGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmIChjdHgubWF4TGVuZ3RoICE9IG51bGwgJiYgdi5sZW5ndGggPiBjdHgubWF4TGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwic3RyaW5nTGVuZ3RoXCIsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgc3RyaW5nIGRhdGFUeXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgcmVnaW9uUHJvcGVydHkgLSBjdXN0VHlwZS5nZXRQcm9wZXJ0eShcIlJlZ2lvblwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBSZWdpb24gcHJvcGVydHkgb24gQ3VzdG9tZXIgaXMgYSBzdHJpbmcuXHJcbiAgICAgIHJlZ2lvblByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3Iuc3RyaW5nKCkpO1xyXG4gIEBtZXRob2Qgc3RyaW5nXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBzdHJpbmcgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICByZXR1cm4gKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcInN0cmluZ1wiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIEd1aWQgZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkN1c3RvbWVyXCIpO1xyXG4gICAgICB2YXIgY3VzdG9tZXJJZFByb3BlcnR5IC0gY3VzdFR5cGUuZ2V0UHJvcGVydHkoXCJDdXN0b21lcklEXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEN1c3RvbWVySUQgcHJvcGVydHkgb24gQ3VzdG9tZXIgaXMgYSBHdWlkLlxyXG4gICAgICBjdXN0b21lcklkUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5ndWlkKCkpO1xyXG4gIEBtZXRob2QgZ3VpZFxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ3VpZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIHJldHVybiBjb3JlLmlzR3VpZCh2KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcImd1aWRcIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcgIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGV2ZW50VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJFdmVudFwiKTtcclxuICAgICAgdmFyIGVsYXBzZWRUaW1lUHJvcGVydHkgLSBldmVudFR5cGUuZ2V0UHJvcGVydHkoXCJFbGFwc2VkVGltZVwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBFbGFwc2VkVGltZSBwcm9wZXJ0eSBvbiBDdXN0b21lciBpcyBhIGR1cmF0aW9uLlxyXG4gICAgICBlbGFwc2VkVGltZVByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuZHVyYXRpb24oKSk7XHJcbiAgQG1ldGhvZCBkdXJhdGlvblxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZHVyYXRpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICByZXR1cm4gY29yZS5pc0R1cmF0aW9uKHYpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwiZHVyYXRpb25cIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBudW1lcmljIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgICAgIHZhciBmcmVpZ2h0UHJvcGVydHkgLSBvcmRlclR5cGUuZ2V0UHJvcGVydHkoXCJGcmVpZ2h0XCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEZyZWlnaHQgcHJvcGVydHkgb24gT3JkZXIgaXMgYSBudW1iZXIuXHJcbiAgICAgIGZyZWlnaHRQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLm51bWJlcigpKTtcclxuICBAbWV0aG9kIG51bWJlclxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG5cclxuICAgIC8vIFRPRE86IG1heSBuZWVkIHRvIGhhdmUgc2VwZXJhdGUgbG9naWMgZm9yIHNpbmdsZS5cclxuICBwdWJsaWMgc3RhdGljIG51bWJlciA9IGZ1bmN0aW9uKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIGlmICh2ID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIgJiYgY3R4ICYmIGN0eC5hbGxvd1N0cmluZykge1xyXG4gICAgICAgIHYgPSBwYXJzZUZsb2F0KHYpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKHYpKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcIm51bWJlclwiLCB2YWxGbiwgY29udGV4dCk7XHJcbiAgfTtcclxuICBwdWJsaWMgc3RhdGljIGRvdWJsZSA9IFZhbGlkYXRvci5udW1iZXI7XHJcbiAgcHVibGljIHN0YXRpYyBzaW5nbGUgPSBWYWxpZGF0b3IubnVtYmVyO1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgbGFyZ2UgaW50ZWdlciBkYXRhIHR5cGUgLSA2NCBiaXQgLSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgICAgIHZhciBmcmVpZ2h0UHJvcGVydHkgLSBvcmRlclR5cGUuZ2V0UHJvcGVydHkoXCJGcmVpZ2h0XCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEZyZWlnaHQgcHJvcGVydHkgb24gT3JkZXIgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBhIDY0IGJpdCBpbnRlZ2VyLlxyXG4gICAgICBmcmVpZ2h0UHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5pbnQ2NCgpKTtcclxuICBAbWV0aG9kIGludDY0XHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBpbnRlZ2VyID0gZnVuY3Rpb24oY29udGV4dDogYW55KSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiICYmIGN0eCAmJiBjdHguYWxsb3dTdHJpbmcpIHtcclxuICAgICAgICB2ID0gcGFyc2VJbnQodiwgMTApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpICYmICghaXNOYU4odikpICYmIE1hdGguZmxvb3IodikgPT09IHY7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoXCJpbnRlZ2VyXCIsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG4gIHB1YmxpYyBzdGF0aWMgaW50NjQgPSBWYWxpZGF0b3IuaW50ZWdlcjtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIDMyIGJpdCBpbnRlZ2VyIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgICAgIHZhciBmcmVpZ2h0UHJvcGVydHkgLSBvcmRlclR5cGUuZ2V0UHJvcGVydHkoXCJGcmVpZ2h0XCIpO1xyXG4gICAgICBmcmVpZ2h0UHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5pbnQzMigpKTtcclxuICBAbWV0aG9kIGludDMyXHJcbiAgQHN0YXRpY1xyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBpbnQzMiA9IGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGludFJhbmdlVmFsaWRhdG9yQ3RvcihcImludDMyXCIsIElOVDMyX01JTiwgSU5UMzJfTUFYLCBjb250ZXh0KSgpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCAxNiBiaXQgaW50ZWdlciBkYXRhIHR5cGUgVmFsaWRhdG9yLlxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgb3JkZXJUeXBlID0gZW0xLm1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIk9yZGVyXCIpO1xyXG4gICAgICB2YXIgZnJlaWdodFByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiRnJlaWdodFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBGcmVpZ2h0IHByb3BlcnR5IG9uIE9yZGVyIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSAxNiBiaXQgaW50ZWdlci5cclxuICAgICAgZnJlaWdodFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuaW50MTYoKSk7XHJcbiAgQG1ldGhvZCBpbnQxNlxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW50MTYgPSBmdW5jdGlvbihjb250ZXh0OiBhbnkpIHtcclxuICAgIHJldHVybiBpbnRSYW5nZVZhbGlkYXRvckN0b3IoXCJpbnQxNlwiLCBJTlQxNl9NSU4sIElOVDE2X01BWCwgY29udGV4dCkoKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgc3RhbmRhcmQgYnl0ZSBkYXRhIHR5cGUgVmFsaWRhdG9yLiAoVGhpcyBpcyBhIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTUgaW5jbHVzaXZlIGZvciBqcyBwdXJwb3NlcykuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBvcmRlclR5cGUgPSBlbTEubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiT3JkZXJcIik7XHJcbiAgICAgIHZhciBmcmVpZ2h0UHJvcGVydHkgLSBvcmRlclR5cGUuZ2V0UHJvcGVydHkoXCJGcmVpZ2h0XCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIEZyZWlnaHQgcHJvcGVydHkgb24gT3JkZXIgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBhIDE2IGJpdCBpbnRlZ2VyLlxyXG4gICAgICAvLyBQcm9iYWJseSBub3QgYSB2ZXJ5IGdvb2QgdmFsaWRhdGlvbiB0byBwbGFjZSBvbiB0aGUgRnJlaWdodCBwcm9wZXJ0eS5cclxuICAgICAgcmVnaW9uUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5ieXRlKCkpO1xyXG4gIEBtZXRob2QgYnl0ZVxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgYnl0ZSA9IGZ1bmN0aW9uKGNvbnRleHQ6IGFueSkge1xyXG4gICAgcmV0dXJuIGludFJhbmdlVmFsaWRhdG9yQ3RvcihcImJ5dGVcIiwgQllURV9NSU4sIEJZVEVfTUFYLCBjb250ZXh0KSgpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBzdGFuZGFyZCBib29sZWFuIGRhdGEgdHlwZSBWYWxpZGF0b3IuXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtMSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBwcm9kdWN0VHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJQcm9kdWN0XCIpO1xyXG4gICAgICB2YXIgZGlzY29udGludWVkUHJvcGVydHkgLSBwcm9kdWN0VHlwZS5nZXRQcm9wZXJ0eShcIkRpc2NvbnRpbnVlZFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBEaXNjb250aW51ZWQgcHJvcGVydHkgb24gUHJvZHVjdCBpcyBhIGJvb2xlYW5cclxuICAgICAgZGlzY29udGludWVkUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5ib29sKCkpO1xyXG4gIEBtZXRob2QgYm9vbFxyXG4gIEBzdGF0aWNcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgYm9vbCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHZhbEZuID0gZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuICh2ID09PSB0cnVlKSB8fCAodiA9PT0gZmFsc2UpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwiYm9vbFwiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBub25lID0gZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yKFwibm9uZVwiLCB2YWxGbik7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHN0YW5kYXJkIGRhdGUgZGF0YSB0eXBlIFZhbGlkYXRvci5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0xIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIG9yZGVyVHlwZSA9IGVtMS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJPcmRlclwiKTtcclxuICAgICAgdmFyIG9yZGVyRGF0ZVByb3BlcnR5IC0gb3JkZXJUeXBlLmdldFByb3BlcnR5KFwiT3JkZXJEYXRlXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIE9yZGVyRGF0ZSBwcm9wZXJ0eSBvbiBPcmRlciBpcyBhIGRhdGVcclxuICAgICAgLy8gUHJvYmFibHkgbm90IGEgdmVyeSBnb29kIHZhbGlkYXRpb24gdG8gcGxhY2Ugb24gdGhlIEZyZWlnaHQgcHJvcGVydHkuXHJcbiAgICAgIG9yZGVyRGF0ZVByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuZGF0ZSgpKTtcclxuICBAbWV0aG9kIGRhdGVcclxuICBAc3RhdGljXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGRhdGUgPSBmdW5jdGlvbigpIHtcclxuICAgIGxldCB2YWxGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXR1cm4gIWlzTmFOKERhdGUucGFyc2UodikpO1xyXG4gICAgICAgICAgLy8gb2xkIGNvZGVcclxuICAgICAgICAgIC8vIHJldHVybiBfX2lzRGF0ZShuZXcgRGF0ZSh2KSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gY29yZS5pc0RhdGUodik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcihcImRhdGVcIiwgdmFsRm4pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBjcmVkaXQgY2FyZCBudW1iZXIgdmFsaWRhdG9yXHJcbiAgUGVyZm9ybXMgYSBsdWhuIGFsZ29yaXRobSBjaGVja3N1bSB0ZXN0IGZvciBwbGF1c2FiaWxpdHlcclxuICBjYXRjaGVzIHNpbXBsZSBtaXN0YWtlczsgb25seSBzZXJ2aWNlIGtub3dzIGZvciBzdXJlXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIHBlcnNvblR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJQZXJzb25cIik7XHJcbiAgICAgIHZhciBjcmVkaXRDYXJkUHJvcGVydHkgPSBwZXJzb25UeXBlLmdldFByb3BlcnR5KFwiY3JlZGl0Q2FyZFwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBQZXJzb24uY3JlZGl0Q2FyZCBwcm9wZXJ0eSBpcyBjcmVkaXQgY2FyZC5cclxuICAgICAgY3JlZGl0Q2FyZFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuY3JlZGl0Q2FyZCgpKTtcclxuICBAbWV0aG9kIGNyZWRpdENhcmRcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIFtjb250ZXh0XSB7T2JqZWN0fSBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdGhyb3VnaCB0byB2YWxpZGF0aW9uIGNvbnN0cnVjdG9yXHJcbiAgQHJldHVybiB7VmFsaWRhdG9yfSBBIG5ldyBWYWxpZGF0b3JcclxuICAqKi9cclxuICBwdWJsaWMgc3RhdGljIGNyZWRpdENhcmQgPSBmdW5jdGlvbihjb250ZXh0PzogYW55KSB7XHJcbiAgICBmdW5jdGlvbiB2YWxGbih2OiBhbnkpIHtcclxuICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJykgcmV0dXJuIHRydWU7XHJcbiAgICAgIGlmICh0eXBlb2YgKHYpICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB2ID0gdi5yZXBsYWNlKC8oXFwtfFxccykvZywgXCJcIik7IC8vIHJlbW92ZSBkYXNoZXMgYW5kIHNwYWNlc1xyXG4gICAgICBpZiAoIXYgfHwgL1xcRC8udGVzdCh2KSkgcmV0dXJuIGZhbHNlOyAvLyBhbGwgZGlnaXRzLCBub3QgZW1wdHlcclxuICAgICAgcmV0dXJuIGx1aG4odik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvcignY3JlZGl0Q2FyZCcsIHZhbEZuLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0b3I7IHRoZSBleHByZXNzaW9uIG11c3QgYmUgc3BlY2lmaWVkXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQWRkIHZhbGlkYXRvciB0byBhIHByb3BlcnR5LiBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdG9tZXJUeXBlID0gZW0ubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciByZWdpb25Qcm9wZXJ0eSA9IGN1c3RvbWVyVHlwZS5nZXRQcm9wZXJ0eShcIlJlZ2lvblwiKTtcclxuICAgICAgLy8gVmFsaWRhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIEN1c3RvbWVyLlJlZ2lvbiBpcyAyIGNoYXIgdXBwZXJjYXNlIGFscGhhLlxyXG4gICAgICByZWdpb25Qcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnJlZ3VsYXJFeHByZXNzaW9uKCB7ZXhwcmVzc2lvbjogJ15bQS1aXXsyfSQnfSApO1xyXG4gIEBtZXRob2QgcmVndWxhckV4cHJlc3Npb25cclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIGNvbnRleHQge09iamVjdH1cclxuICBAcGFyYW0gY29udGV4dC5leHByZXNzaW9uIHtTdHJpbmd9IFN0cmluZyBmb3JtIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYXBwbHlcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVndWxhckV4cHJlc3Npb24gPSBmdW5jdGlvbihjb250ZXh0PzogYW55KSB7XHJcbiAgICBmdW5jdGlvbiB2YWxGbih2OiBhbnksIGN0eDogYW55KSB7XHJcbiAgICAgIC8vIGRvIG5vdCBpbnZhbGlkYXRlIGlmIGVtcHR5OyB1c2UgYSBzZXBhcmF0ZSByZXF1aXJlZCB0ZXN0XHJcbiAgICAgIGlmICh2ID09IG51bGwgfHwgdiA9PT0gJycpIHJldHVybiB0cnVlO1xyXG4gICAgICBpZiAodHlwZW9mICh2KSAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBsZXQgcmUgPSBuZXcgUmVnRXhwKGN0eC5leHByZXNzaW9uKTtcclxuICAgICAgICByZXR1cm4gcmUudGVzdCh2KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGV4cHJlc3Npb24gcGFyYW1ldGVyIHRvIHJlZ0V4cCB2YWxpZGF0b3InKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IoJ3JlZ3VsYXJFeHByZXNzaW9uJywgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIGVtYWlsIGFkZHJlc3MgdmFsaWRhdG9yXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIHBlcnNvblR5cGUgPSBlbS5tZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGUoXCJQZXJzb25cIik7XHJcbiAgICAgIHZhciBlbWFpbFByb3BlcnR5ID0gcGVyc29uVHlwZS5nZXRQcm9wZXJ0eShcImVtYWlsXCIpO1xyXG4gICAgICAvLyBWYWxpZGF0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIFBlcnNvbi5lbWFpbCBwcm9wZXJ0eSBpcyBhbiBlbWFpbCBhZGRyZXNzLlxyXG4gICAgICBlbWFpbFByb3BlcnR5LnZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3IuZW1haWxBZGRyZXNzKCkpO1xyXG4gIEBtZXRob2QgZW1haWxBZGRyZXNzXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBbY29udGV4dF0ge09iamVjdH0gb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRocm91Z2ggdG8gdmFsaWRhdGlvbiBjb25zdHJ1Y3RvclxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBlbWFpbEFkZHJlc3MgPSBmdW5jdGlvbihjb250ZXh0PzogYW55KSB7XHJcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Nya2lya2xhbmQvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9ibG9iL21hc3Rlci9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL0VtYWlsQXR0cmlidXRlLmNzXHJcbiAgICBsZXQgcmVFbWFpbEFkZHJlc3MgPSAvXigoKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSsoXFwuKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSspKil8KChcXHgyMikoKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPygoW1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4N2ZdfFxceDIxfFtcXHgyMy1cXHg1Yl18W1xceDVkLVxceDdlXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KFxcXFwoW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBkLVxceDdmXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSkqKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPyhcXHgyMikpKUAoKChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuKSsoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4/JC9pO1xyXG4gICAgcmV0dXJuIG1ha2VSZWdFeHBWYWxpZGF0b3IoJ2VtYWlsQWRkcmVzcycsIHJlRW1haWxBZGRyZXNzLCBudWxsLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBSZXR1cm5zIHRoZSBwaG9uZSB2YWxpZGF0b3JcclxuICBQcm92aWRlcyBiYXNpYyBhc3NlcnRpb25zIG9uIHRoZSBmb3JtYXQgYW5kIHdpbGwgaGVscCB0byBlbGltaW5hdGUgbW9zdCBub25zZW5zZSBpbnB1dFxyXG4gIE1hdGNoZXM6XHJcbiAgSW50ZXJuYXRpb25hbCBkaWFsaW5nIHByZWZpeDoge3t9LCArLCAwLCAwMDAwfSAod2l0aCBvciB3aXRob3V0IGEgdHJhaWxpbmcgYnJlYWsgY2hhcmFjdGVyLCBpZiBub3QgJysnOiBbLS8uIF0pXHJcbiAgPiAoKFxcKyl8KDAoXFxkKyk/Wy0vLlxcc10pKVxyXG4gIENvdW50cnkgY29kZToge3t9LCAxLCAuLi4sIDk5OX0gKHdpdGggb3Igd2l0aG91dCBhIHRyYWlsaW5nIGJyZWFrIGNoYXJhY3RlcjogWy0vLiBdKVxyXG4gID4gWzEtOV1cXGR7LDJ9Wy0vLlxcc10/XHJcbiAgQXJlYSBjb2RlOiB7KDApLCAuLi4sICgwMDAwMDApLCAwLCAuLi4sIDAwMDAwMH0gKHdpdGggb3Igd2l0aG91dCBhIHRyYWlsaW5nIGJyZWFrIGNoYXJhY3RlcjogWy0vLiBdKVxyXG4gID4gKChcXChcXGR7MSw2fVxcKXxcXGR7MSw2fSlbLS8uXFxzXT8pP1xyXG4gIExvY2FsOiB7MCwgLi4ufSsgKHdpdGggb3Igd2l0aG91dCBhIHRyYWlsaW5nIGJyZWFrIGNoYXJhY3RlcjogWy0vLiBdKVxyXG4gID4gKFxcZCtbLS8uXFxzXT8pK1xcZCtcclxuICBAZXhhbXBsZVxyXG4gICAgICAvLyBBc3N1bWUgZW0gaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyLlxyXG4gICAgICB2YXIgY3VzdG9tZXJUeXBlID0gZW0ubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciBwaG9uZVByb3BlcnR5ID0gY3VzdG9tZXJUeXBlLmdldFByb3BlcnR5KFwicGhvbmVcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgQ3VzdG9tZXIucGhvbmUgcHJvcGVydHkgaXMgcGhvbmUuXHJcbiAgICAgIHBob25lUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvci5waG9uZSgpKTtcclxuICBAbWV0aG9kIHBob25lXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSBbY29udGV4dF0ge09iamVjdH0gb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRocm91Z2ggdG8gdmFsaWRhdGlvbiBjb25zdHJ1Y3RvclxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBwaG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0PzogYW55KSB7XHJcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Nya2lya2xhbmQvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9ibG9iL21hc3Rlci9EYXRhQW5ub3RhdGlvbnNFeHRlbnNpb25zL0V4cHJlc3Npb25zLmNzXHJcbiAgICBsZXQgcmVQaG9uZSA9IC9eKChcXCt8KDAoXFxkKyk/Wy0vLlxcc10/KSlbMS05XVxcZHswLDJ9Wy0vLlxcc10/KT8oKFxcKFxcZHsxLDZ9XFwpfFxcZHsxLDZ9KVstLy5cXHNdPyk/KFxcZCtbLS8uXFxzXT8pK1xcZCskLztcclxuICAgIHJldHVybiBtYWtlUmVnRXhwVmFsaWRhdG9yKCdwaG9uZScsIHJlUGhvbmUsIG51bGwsIGNvbnRleHQpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgdGhlIFVSTCAocHJvdG9jb2wgcmVxdWlyZWQpIHZhbGlkYXRvclxyXG4gIEBleGFtcGxlXHJcbiAgICAgIC8vIEFzc3VtZSBlbSBpcyBhIHByZWV4aXN0aW5nIEVudGl0eU1hbmFnZXIuXHJcbiAgICAgIHZhciBwZXJzb25UeXBlID0gZW0ubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiUGVyc29uXCIpO1xyXG4gICAgICB2YXIgd2Vic2l0ZVByb3BlcnR5ID0gcGVyc29uVHlwZS5nZXRQcm9wZXJ0eShcIndlYnNpdGVcIik7XHJcbiAgICAgIC8vIFZhbGlkYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgUGVyc29uLndlYnNpdGUgcHJvcGVydHkgaXMgYSBVUkwuXHJcbiAgICAgIHdlYnNpdGVQcm9wZXJ0eS52YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9yLnVybCgpKTtcclxuICBAbWV0aG9kIHVybFxyXG4gIEBzdGF0aWNcclxuICBAcGFyYW0gW2NvbnRleHRdIHtPYmplY3R9IG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0aHJvdWdoIHRvIHZhbGlkYXRpb24gY29uc3RydWN0b3JcclxuICBAcmV0dXJuIHtWYWxpZGF0b3J9IEEgbmV3IFZhbGlkYXRvclxyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgdXJsID0gZnVuY3Rpb24gKGNvbnRleHQ/OiBhbnkpIHtcclxuICAgIC8vU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zcmtpcmtsYW5kL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvYmxvYi9tYXN0ZXIvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9ucy9VcmxBdHRyaWJ1dGUuY3NcclxuICAgIGxldCByZVVybFByb3RvY29sUmVxdWlyZWQgPSAvXihodHRwcz98ZnRwKTpcXC9cXC8oKCgoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mQS1GXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OikqQCk/KCgoXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKVxcLihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSlcXC4oXFxkfFsxLTldXFxkfDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNV0pKXwoW2EtekEtWl1bXFwtYS16QS1aMC05XSopfCgoKFthLXpBLVpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16QS1aXXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16QS1aXXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2EtekEtWl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2EtekEtWl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16QS1aXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKVxcLj8pKDpcXGQqKT8pKFxcLygoKFthLXpBLVpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCglW1xcZGEtZkEtRl17Mn0pfFshXFwkJidcXChcXClcXCpcXCssOz1dfDp8QCkrKFxcLygoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mQS1GXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKSopKik/KT8oXFw/KCgoW2EtekEtWl18XFxkfC18XFwufF98fnxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KCVbXFxkYS1mQS1GXXsyfSl8WyFcXCQmJ1xcKFxcKVxcKlxcKyw7PV18OnxAKXxbXFx1RTAwMC1cXHVGOEZGXXxcXC98XFw/KSopPyhcXCMoKChbYS16QS1aXXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoJVtcXGRhLWZBLUZdezJ9KXxbIVxcJCYnXFwoXFwpXFwqXFwrLDs9XXw6fEApfFxcL3xcXD8pKik/JC87XHJcbiAgICByZXR1cm4gbWFrZVJlZ0V4cFZhbGlkYXRvcigndXJsJywgcmVVcmxQcm90b2NvbFJlcXVpcmVkLCBudWxsLCBjb250ZXh0KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICBDcmVhdGVzIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRvciB3aXRoIGEgZml4ZWQgZXhwcmVzc2lvbi5cclxuICBNYW55IG9mIHRoZSBzdG9jayB2YWxpZGF0b3JzIGFyZSBidWlsdCB3aXRoIHRoaXMgZmFjdG9yeSBtZXRob2QuXHJcbiAgVGhlaXIgZXhwcmVzc2lvbnMgYXJlIG9mdGVuIGRlcml2ZWQgZnJvbVxyXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9zcmtpcmtsYW5kL0RhdGFBbm5vdGF0aW9uc0V4dGVuc2lvbnMvYmxvYi9tYXN0ZXIvRGF0YUFubm90YXRpb25zRXh0ZW5zaW9uc1xyXG4gIFlvdSBjYW4gdHJ5IG1hbnkgb2YgdGhlbSBhdCBodHRwOi8vZGF0YWFubm90YXRpb25zZXh0ZW5zaW9ucy5vcmcvXHJcbiAgQGV4YW1wbGVcclxuICAgICAgLy8gTWFrZSBhIHppcGNvZGUgdmFsaWRhdG9yXHJcbiAgICAgIGZ1bmN0aW9uIHppcFZhbGlkYXRvciA9IFZhbGlkYXRvci5tYWtlUmVnRXhwVmFsaWRhdG9yKFxyXG4gICAgICBcInppcFZhbCxcclxuICAgICAgL15cXGR7NX0oW1xcLV1cXGR7NH0pPyQvLFxyXG4gICAgICBcIlRoZSAlZGlzcGxheU5hbWUlICcldmFsdWUlJyBpcyBub3QgYSB2YWxpZCBVLlMuIHppcGNvZGVcIik7XHJcbiAgICAgIC8vIFJlZ2lzdGVyIGl0LlxyXG4gICAgICBWYWxpZGF0b3IucmVnaXN0ZXIoemlwVmFsaWRhdG9yKTtcclxuICAgICAgLy8gQWRkIGl0IHRvIGEgZGF0YSBwcm9wZXJ0eS4gQXNzdW1lIGVtIGlzIGEgcHJlZXhpc3RpbmcgRW50aXR5TWFuYWdlci5cclxuICAgICAgdmFyIGN1c3RUeXBlID0gZW0ubWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiQ3VzdG9tZXJcIik7XHJcbiAgICAgIHZhciB6aXBQcm9wZXJ0eSA9IGN1c3RUeXBlLmdldFByb3BlcnR5KFwiUG9zdGFsQ29kZVwiKTtcclxuICAgICAgemlwUHJvcGVydHkudmFsaWRhdG9ycy5wdXNoKHppcFZhbGlkYXRvcik7XHJcbiAgQG1ldGhvZCBtYWtlUmVnRXhwVmFsaWRhdG9yXHJcbiAgQHN0YXRpY1xyXG4gIEBwYXJhbSB2YWxpZGF0b3JOYW1lIHtTdHJpbmd9IG5hbWUgb2YgdGhpcyB2YWxpZGF0b3JcclxuICBAcGFyYW0gZXhwcmVzc2lvbiB7U3RyaW5nIHwgUmVnRXhwfSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYXBwbHlcclxuICBAcGFyYW0gW2RlZmF1bHRNZXNzYWdlXSB7U3RyaW5nfSBkZWZhdWx0IG1lc3NhZ2UgZm9yIGZhaWxlZCB2YWxpZGF0aW9uc1xyXG4gIEBwYXJhbSBbY29udGV4dF0ge09iamVjdH0gb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRocm91Z2ggdG8gdmFsaWRhdGlvbiBjb25zdHJ1Y3RvclxyXG4gIEByZXR1cm4ge1ZhbGlkYXRvcn0gQSBuZXcgVmFsaWRhdG9yXHJcbiAgKiovXHJcbiAgcHVibGljIHN0YXRpYyBtYWtlUmVnRXhwVmFsaWRhdG9yID0gbWFrZVJlZ0V4cFZhbGlkYXRvcjtcclxuXHJcbn1cclxuVmFsaWRhdG9yLnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJWYWxpZGF0b3JcIjtcclxuXHJcbi8vIHJlZ2lzdGVyIGFsbCB2YWxpZGF0b3JzXHJcbkVycm9yWyd4J10gPSBjb3JlLm9iamVjdEZvckVhY2goVmFsaWRhdG9yLCBmdW5jdGlvbiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICBpZiAodHlwZW9mICh2YWx1ZSkgIT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBpZiAoa2V5ID09PSBcImZyb21KU09OXCIgfHwga2V5ID09PSBcInJlZ2lzdGVyXCIgfHxcclxuICAgICAga2V5ID09PSBcInJlZ2lzdGVyRmFjdG9yeVwiIHx8IGtleSA9PT0gXCJtYWtlUmVnRXhwVmFsaWRhdG9yXCIpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGNvbmZpZy5yZWdpc3RlckZ1bmN0aW9uKHZhbHVlLCBcIlZhbGlkYXRvci5cIiArIGtleSk7XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gZm9ybWF0VGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgdmFyczogT2JqZWN0LCBvd25Qcm9wZXJ0aWVzT25seTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgaWYgKCF2YXJzKSByZXR1cm4gdGVtcGxhdGU7XHJcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoLyUoW14lXSspJS9nLCBmdW5jdGlvbiAoXywga2V5KSB7XHJcbiAgICBsZXQgdmFsT3JGbjogYW55O1xyXG4gICAgaWYgKG93blByb3BlcnRpZXNPbmx5KSB7XHJcbiAgICAgIHZhbE9yRm4gPSB2YXJzLmhhc093blByb3BlcnR5KGtleSkgPyB2YXJzW2tleV0gOiAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhbE9yRm4gPSB2YXJzW2tleV07XHJcbiAgICB9XHJcbiAgICBpZiAodmFsT3JGbiAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChjb3JlLmlzRnVuY3Rpb24odmFsT3JGbikpIHtcclxuICAgICAgICByZXR1cm4gdmFsT3JGbih2YXJzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdmFsT3JGbjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGludFJhbmdlVmFsaWRhdG9yQ3Rvcih2YWxpZGF0b3JOYW1lOiBzdHJpbmcsIG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIsIGNvbnRleHQ6IGFueSkge1xyXG4gIGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xyXG4gIGlmIChtaW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7IGNvbnRleHQubWluID0gbWluVmFsdWU7IH1cclxuICBpZiAobWF4VmFsdWUgIT09IHVuZGVmaW5lZCkgeyBjb250ZXh0Lm1heCA9IG1heFZhbHVlOyB9XHJcbiAgbGV0IHRlbXBsYXRlRXhpc3RzID0gY29udGV4dC5tZXNzYWdlVGVtcGxhdGUgfHwgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNbdmFsaWRhdG9yTmFtZV07XHJcbiAgaWYgKCF0ZW1wbGF0ZUV4aXN0cykge1xyXG4gICAgVmFsaWRhdG9yLm1lc3NhZ2VUZW1wbGF0ZXNbdmFsaWRhdG9yTmFtZV0gPSBjb3JlLmZvcm1hdFN0cmluZyhcIiclZGlzcGxheU5hbWUlJyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiB0aGUgdmFsdWVzIG9mICUxIGFuZCAlMlwiLFxyXG4gICAgICAgIG1pblZhbHVlLCBtYXhWYWx1ZSk7XHJcbiAgfVxyXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55LCBjdHg6IGFueSkge1xyXG4gICAgICBpZiAodiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiICYmIGN0eCAmJiBjdHguYWxsb3dTdHJpbmcpIHtcclxuICAgICAgICB2ID0gcGFyc2VJbnQodiwgMCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgJiYgKCFpc05hTih2KSkgJiYgTWF0aC5mbG9vcih2KSA9PT0gdikge1xyXG4gICAgICAgIGlmIChtaW5WYWx1ZSAhPSBudWxsICYmIHYgPCBtaW5WYWx1ZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWF4VmFsdWUgIT0gbnVsbCAmJiB2ID4gbWF4VmFsdWUpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3IodmFsaWRhdG9yTmFtZSwgdmFsRm4sIGNvbnRleHQpO1xyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVnRXhwVmFsaWRhdG9yKHZhbGlkYXRvck5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogUmVnRXhwLCBkZWZhdWx0TWVzc2FnZT86IHN0cmluZyB8IG51bGwsIGNvbnRleHQ/OiBhbnkpIHtcclxuICBpZiAoZGVmYXVsdE1lc3NhZ2UpIHtcclxuICAgIFZhbGlkYXRvci5tZXNzYWdlVGVtcGxhdGVzW3ZhbGlkYXRvck5hbWVdID0gZGVmYXVsdE1lc3NhZ2U7XHJcbiAgfVxyXG4gIGxldCByZSA9ICh0eXBlb2YgKGV4cHJlc3Npb24pID09PSAnc3RyaW5nJykgPyBuZXcgUmVnRXhwKGV4cHJlc3Npb24pIDogZXhwcmVzc2lvbjtcclxuICBsZXQgdmFsRm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAvLyBkbyBub3QgaW52YWxpZGF0ZSBpZiBlbXB0eTsgdXNlIGEgc2VwYXJhdGUgcmVxdWlyZWQgdGVzdFxyXG4gICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJykgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAodHlwZW9mICh2KSAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiByZS50ZXN0KHYpO1xyXG4gIH07XHJcbiAgcmV0dXJuIG5ldyBWYWxpZGF0b3IodmFsaWRhdG9yTmFtZSwgdmFsRm4sIGNvbnRleHQpO1xyXG59XHJcblxyXG4vLyBodHRwOi8vcm9zZXR0YWNvZGUub3JnL3dpa2kvTHVobl90ZXN0X29mX2NyZWRpdF9jYXJkX251bWJlcnMjSmF2YVNjcmlwdFxyXG5cclxuLy8gZnVuY3Rpb24gbHVobihhOiBzdHJpbmcsIGI6IG51bWJlciwgYzogbnVtYmVyLCBkOiBudW1iZXIsIGU6IG51bWJlcikge1xyXG4vLyAgIGZvciAoZCA9ICthW2IgPSBhLmxlbmd0aCAtIDFdLCBlID0gMDsgYi0tOyApIHtcclxuLy8gICAgIGMgPSArYVtiXSwgZCArPSArK2UgJSAyID8gMiAqIGMgJSAxMCArIChjID4gNCkgOiBjO1xyXG4vLyAgIH1cclxuLy8gICByZXR1cm4gIShkICUgMTApO1xyXG4vLyB9O1xyXG5cclxubGV0ICBsdWhuID0gKGZ1bmN0aW9uKCkge1xyXG4gIGxldCBsdWhuQXJyID0gWzAsIDIsIDQsIDYsIDgsIDEsIDMsIDUsIDcsIDldO1xyXG4gIHJldHVybiBmdW5jdGlvbihzdHI6IHN0cmluZykgXHR7XHJcbiAgICBsZXQgY291bnRlciA9IDA7XHJcbiAgICBsZXQgaW5jTnVtOiBudW1iZXI7XHJcbiAgICBsZXQgb2RkID0gZmFsc2U7XHJcbiAgICBsZXQgdGVtcCA9IFN0cmluZyhzdHIpLnJlcGxhY2UoL1teXFxkXS9nLCBcIlwiKTtcclxuICAgIGlmICggdGVtcC5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSB0ZW1wLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSAge1xyXG4gICAgICBpbmNOdW0gPSBwYXJzZUludCh0ZW1wLmNoYXJBdChpKSwgMTApO1xyXG4gICAgICBjb3VudGVyICs9IChvZGQgPSAhb2RkKSA/IGluY051bSA6IGx1aG5BcnJbaW5jTnVtXTtcclxuICAgIH1cclxuICAgIHJldHVybiAoY291bnRlciAlIDEwID09PSAwKTtcclxuICB9O1xyXG59KSgpO1xyXG5cclxuLyoqXHJcbkEgVmFsaWRhdGlvbkVycm9yIGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBmYWlsZWQgdmFsaWRhdGlvbi5cclxuXHJcbkBjbGFzcyBWYWxpZGF0aW9uRXJyb3JcclxuKiovXHJcblxyXG4vKipcclxuQ29uc3RydWN0cyBhIG5ldyBWYWxpZGF0aW9uRXJyb3JcclxuQG1ldGhvZCA8Y3Rvcj4gVmFsaWRhdGlvbkVycm9yXHJcblxyXG5AcGFyYW0gdmFsaWRhdG9yIHtWYWxpZGF0b3IgfHwgbnVsbH0gVGhlIFZhbGlkYXRvciB1c2VkIHRvIGNyZWF0ZSB0aGlzIGVycm9yLCBpZiBhbnkuXHJcbkBwYXJhbSBjb250ZXh0IHsgQ29udGV4dE9iamVjdCB8fCBudWxsfSBUaGUgQ29udGV4dCBvYmplY3QgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBWYWxpZGF0b3IgdG8gY3JlYXRlIHRoaXMgZXJyb3IuXHJcbkBwYXJhbSBlcnJvck1lc3NhZ2UgeyBTdHJpbmd9IFRoZSBhY3R1YWwgZXJyb3IgbWVzc2FnZVxyXG5AcGFyYW0gW2tleV0ge1N0cmluZ30gQW4gb3B0aW9uYWwga2V5IHVzZWQgdG8gZGVmaW5lIGEga2V5IGZvciB0aGlzIGVycm9yLiBPbmUgd2lsbCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgaWYgbm90IHByb3ZpZGVkIGhlcmUuXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIHtcclxuICB2YWxpZGF0b3I/OiBWYWxpZGF0b3I7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgY29udGV4dDogYW55O1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gIHByb3BlcnR5OiBhbnk7IC8vIElQcm9wZXJ0eVxyXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xyXG4gIGlzU2VydmVyRXJyb3I6IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbGlkYXRvcjogVmFsaWRhdG9yIHwgbnVsbCwgY29udGV4dDogVmFsaWRhdGlvbkNvbnRleHQsIGVycm9yTWVzc2FnZTogc3RyaW5nLCBrZXk/OiBzdHJpbmcpIHtcclxuICAgIC8vIEVycm9yIGlzIHdpdGggaXNJbnN0YW5jZU9mKFZhbGlkYXRvcilcclxuICAgIGFzc2VydFBhcmFtKHZhbGlkYXRvciwgXCJ2YWxpZGF0b3JcIikuaXNPcHRpb25hbCgpLmlzSW5zdGFuY2VPZihWYWxpZGF0b3IpLmNoZWNrKCk7XHJcbiAgICBhc3NlcnRQYXJhbShlcnJvck1lc3NhZ2UsIFwiZXJyb3JNZXNzYWdlXCIpLmlzTm9uRW1wdHlTdHJpbmcoKS5jaGVjaygpO1xyXG4gICAgYXNzZXJ0UGFyYW0oa2V5LCBcImtleVwiKS5pc09wdGlvbmFsKCkuaXNOb25FbXB0eVN0cmluZygpLmNoZWNrKCk7XHJcbiAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvciB8fCB1bmRlZmluZWQ7XHJcbiAgICBjb250ZXh0ID0gY29udGV4dCB8fCB7fTtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTtcclxuXHJcbiAgICB0aGlzLnByb3BlcnR5ID0gY29udGV4dC5wcm9wZXJ0eTtcclxuICAgIHRoaXMucHJvcGVydHlOYW1lID0gY29udGV4dC5wcm9wZXJ0eU5hbWUgfHwgKGNvbnRleHQucHJvcGVydHkgJiYgY29udGV4dC5wcm9wZXJ0eS5uYW1lKTtcclxuXHJcbiAgICBpZiAoa2V5KSB7XHJcbiAgICAgIHRoaXMua2V5ID0ga2V5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5rZXkgPSBWYWxpZGF0aW9uRXJyb3IuZ2V0S2V5KHZhbGlkYXRvciB8fCBlcnJvck1lc3NhZ2UsIHRoaXMucHJvcGVydHlOYW1lKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNTZXJ2ZXJFcnJvciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gIFRoZSBWYWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVmFsaWRhdGlvbkVycm9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgdmFsaWRhdG9yIHtWYWxpZGF0b3J9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIEEgJ2NvbnRleHQnIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBWYWxpZGF0aW9uRXJyb3IuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBjb250ZXh0IHtPYmplY3R9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFRoZSBEYXRhUHJvcGVydHkgb3IgTmF2aWdhdGlvblByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFZhbGlkYXRpb25FcnJvci5cclxuXHJcbiAgX19yZWFkT25seV9fXHJcbiAgQHByb3BlcnR5IHByb3BlcnR5IHtEYXRhUHJvcGVydHl8TmF2aWdhdGlvblByb3BlcnR5fVxyXG4gICoqL1xyXG5cclxuICAvKipcclxuICBUaGUgcHJvcGVydHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBWYWxpZGF0aW9uRXJyb3IuIFRoaXMgd2lsbCBiZSBhIFwicHJvcGVydHkgcGF0aFwiIGZvciBhbnkgcHJvcGVydGllcyBvZiBhIGNvbXBsZXggb2JqZWN0LlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgcHJvcGVydHlOYW1lIHtTdHJpbmd9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgVmFsaWRhdGlvbkVycm9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgZXJyb3JNZXNzYWdlIHtzdHJpbmd9XHJcbiAgKiovXHJcblxyXG4gIC8qKlxyXG4gIFRoZSBrZXkgYnkgd2hpY2ggdGhpcyB2YWxpZGF0aW9uIGVycm9yIG1heSBiZSByZW1vdmVkIGZyb20gYSBjb2xsZWN0aW9uIG9mIFZhbGlkYXRpb25FcnJvcnMuXHJcblxyXG4gIF9fcmVhZE9ubHlfX1xyXG4gIEBwcm9wZXJ0eSBrZXkge3N0cmluZ31cclxuICAqKi9cclxuXHJcbiAgLyoqXHJcbiAgV2hldGhlciB0aGlzIGlzIGEgc2VydmVyIGVycm9yLlxyXG5cclxuICBfX3JlYWRPbmx5X19cclxuICBAcHJvcGVydHkgaXNTZXJ2ZXJFcnJvciB7Ym9vbH1cclxuICAqKi9cclxuXHJcblxyXG4gIC8qKlxyXG4gIENvbXBvc2VzIGEgVmFsaWRhdGlvbkVycm9yICdrZXknIGdpdmVuIGEgdmFsaWRhdG9yIG9yIGFuIGVycm9yTmFtZSBhbmQgYW4gb3B0aW9uYWwgcHJvcGVydHlOYW1lXHJcbiAgQG1ldGhvZCBnZXRLZXlcclxuICBAc3RhdGljXHJcbiAgQHBhcmFtIHZhbGlkYXRvciB7VmFsaWRhdG9yT3JFcnJvcktleX0gQSBWYWxpZGF0b3Igb3IgYW4gXCJlcnJvciBuYW1lXCIgaWYgbm8gdmFsaWRhdG9yIGlzIGF2YWlsYWJsZS5cclxuICBAcGFyYW0gW3Byb3BlcnR5TmFtZV0gQSBwcm9wZXJ0eSBuYW1lXHJcbiAgQHJldHVybiB7U3RyaW5nfSBBIFZhbGlkYXRpb25FcnJvciAna2V5J1xyXG4gICoqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0S2V5KHZhbGlkYXRvck9yRXJyb3JOYW1lOiBWYWxpZGF0b3IgfCBzdHJpbmcsIHByb3BlcnR5TmFtZT86IHN0cmluZykge1xyXG4gICAgbGV0IG5hbWUgPSAodHlwZW9mIHZhbGlkYXRvck9yRXJyb3JOYW1lID09PSAnc3RyaW5nJykgPyB2YWxpZGF0b3JPckVycm9yTmFtZSA6IHZhbGlkYXRvck9yRXJyb3JOYW1lLm5hbWU7XHJcbiAgICByZXR1cm4gbmFtZSArIChwcm9wZXJ0eU5hbWUgPyBcIjpcIiArIHByb3BlcnR5TmFtZSA6IFwiXCIpO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=
|
|
@@ -5,20 +5,6 @@ A ValidationOptions instance is used to specify the conditions under which valid
|
|
|
5
5
|
|
|
6
6
|
*/
|
|
7
7
|
export class ValidationOptions {
|
|
8
|
-
/** @hidden @internal */
|
|
9
|
-
_$typeName; // on proto
|
|
10
|
-
/** Whether entity and property level validation should occur when entities are attached to the EntityManager
|
|
11
|
-
other than via a query. (default = true) __Read Only__ */
|
|
12
|
-
validateOnAttach;
|
|
13
|
-
/** Whether entity and property level validation should occur before entities are saved.
|
|
14
|
-
A failed validation will force the save to fail early. (default = true) __Read Only__ */
|
|
15
|
-
validateOnSave;
|
|
16
|
-
/** Whether entity and property level validation should occur after entities are queried from a remote server.
|
|
17
|
-
(default = false) __Read Only__ **/
|
|
18
|
-
validateOnQuery;
|
|
19
|
-
/** Whether property level validation should occur after entities are modified.
|
|
20
|
-
(default = true) __Read Only__ **/
|
|
21
|
-
validateOnPropertyChange;
|
|
22
8
|
/**
|
|
23
9
|
ValidationOptions constructor
|
|
24
10
|
> var newVo = new ValidationOptions( { validateOnSave: false, validateOnAttach: false });
|
|
@@ -75,4 +61,4 @@ function updateWithConfig(options, config) {
|
|
|
75
61
|
}
|
|
76
62
|
return options;
|
|
77
63
|
}
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24tb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFHLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWtCOUM7OztFQUdFO0FBQ0YsTUFBTSxPQUFPLGlCQUFpQjtJQWtCNUI7Ozs7OztPQU1HO0lBQ0gsWUFBWSxNQUFnQztRQUMxQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxNQUErQjtRQUNuQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pCLElBQUksTUFBTSxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxlQUFlLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQztRQUM3QyxnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLHdCQUF3QixFQUFFLElBQUk7S0FDL0IsQ0FBQyxDQUFDOztBQUVMLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLENBQUM7QUFFN0QsU0FBUyxnQkFBZ0IsQ0FBQyxPQUEwQixFQUFFLE1BQStCO0lBQ25GLElBQUksTUFBTSxFQUFFO1FBQ1YsWUFBWSxDQUFDLE1BQU0sQ0FBQzthQUNmLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRTthQUN2RCxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUU7YUFDckQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFO2FBQ3RELFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRTthQUMvRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDeEI7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29yZSAgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBhc3NlcnRDb25maWcgfSBmcm9tICcuL2Fzc2VydC1wYXJhbSc7XHJcblxyXG4vKiogQ29uZmlndXJhdGlvbiBpbmZvIHRvIGJlIHBhc3NlZCB0byB0aGUgW1tWYWxpZGF0aW9uT3B0aW9uc11dIGNvbnN0cnVjdG9yICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbk9wdGlvbnNDb25maWcge1xyXG4gIC8qKiBXaGV0aGVyIGVudGl0eSBhbmQgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgd2hlbiBlbnRpdGllcyBhcmUgYXR0YWNoZWQgdG8gdGhlIEVudGl0eU1hbmFnZXIgXHJcbiAgb3RoZXIgdGhhbiB2aWEgYSBxdWVyeS4gKGRlZmF1bHQgPSB0cnVlKSAqL1xyXG4gIHZhbGlkYXRlT25BdHRhY2g/OiBib29sZWFuO1xyXG4gIC8qKiAgV2hldGhlciBlbnRpdHkgYW5kIHByb3BlcnR5IGxldmVsIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyIGJlZm9yZSBlbnRpdGllcyBhcmUgc2F2ZWQuIFxyXG4gIEEgZmFpbGVkIHZhbGlkYXRpb24gd2lsbCBmb3JjZSB0aGUgc2F2ZSB0byBmYWlsIGVhcmx5LiAoZGVmYXVsdCA9IHRydWUpICAqL1xyXG4gIHZhbGlkYXRlT25TYXZlPzogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciBlbnRpdHkgYW5kIHByb3BlcnR5IGxldmVsIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyIGFmdGVyIGVudGl0aWVzIGFyZSBxdWVyaWVkIGZyb20gYSByZW1vdGUgc2VydmVyLlxyXG4gIChkZWZhdWx0ID0gZmFsc2UpICAqKi9cclxuICB2YWxpZGF0ZU9uUXVlcnk/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHByb3BlcnR5IGxldmVsIHZhbGlkYXRpb24gc2hvdWxkIG9jY3VyIGFmdGVyIGVudGl0aWVzIGFyZSBtb2RpZmllZC5cclxuICAoZGVmYXVsdCA9IHRydWUpICAqKi9cclxuICB2YWxpZGF0ZU9uUHJvcGVydHlDaGFuZ2U/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuQSBWYWxpZGF0aW9uT3B0aW9ucyBpbnN0YW5jZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdmFsaWRhdGlvbiB3aWxsIGJlIGV4ZWN1dGVkLlxyXG5cclxuKi9cclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25PcHRpb25zIGltcGxlbWVudHMgVmFsaWRhdGlvbk9wdGlvbnNDb25maWcge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGRlY2xhcmUgXyR0eXBlTmFtZTogc3RyaW5nOyAvLyBvbiBwcm90b1xyXG4gIC8qKiBXaGV0aGVyIGVudGl0eSBhbmQgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgd2hlbiBlbnRpdGllcyBhcmUgYXR0YWNoZWQgdG8gdGhlIEVudGl0eU1hbmFnZXIgXHJcbiAgb3RoZXIgdGhhbiB2aWEgYSBxdWVyeS4gKGRlZmF1bHQgPSB0cnVlKSBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSB2YWxpZGF0ZU9uQXR0YWNoOiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIGVudGl0eSBhbmQgcHJvcGVydHkgbGV2ZWwgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIgYmVmb3JlIGVudGl0aWVzIGFyZSBzYXZlZC4gXHJcbiAgQSBmYWlsZWQgdmFsaWRhdGlvbiB3aWxsIGZvcmNlIHRoZSBzYXZlIHRvIGZhaWwgZWFybHkuIChkZWZhdWx0ID0gdHJ1ZSkgX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgdmFsaWRhdGVPblNhdmU6IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgZW50aXR5IGFuZCBwcm9wZXJ0eSBsZXZlbCB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ciBhZnRlciBlbnRpdGllcyBhcmUgcXVlcmllZCBmcm9tIGEgcmVtb3RlIHNlcnZlci5cclxuICAoZGVmYXVsdCA9IGZhbHNlKSBfX1JlYWQgT25seV9fICAqKi9cclxuICBkZWNsYXJlIHZhbGlkYXRlT25RdWVyeTogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciBwcm9wZXJ0eSBsZXZlbCB2YWxpZGF0aW9uIHNob3VsZCBvY2N1ciBhZnRlciBlbnRpdGllcyBhcmUgbW9kaWZpZWQuXHJcbiAgKGRlZmF1bHQgPSB0cnVlKSBfX1JlYWQgT25seV9fICoqL1xyXG4gIGRlY2xhcmUgdmFsaWRhdGVPblByb3BlcnR5Q2hhbmdlOiBib29sZWFuO1xyXG5cclxuXHJcblxyXG4gIC8qKiBcclxuICBWYWxpZGF0aW9uT3B0aW9ucyBjb25zdHJ1Y3RvclxyXG4gID4gICAgIHZhciBuZXdWbyA9IG5ldyBWYWxpZGF0aW9uT3B0aW9ucyggeyB2YWxpZGF0ZU9uU2F2ZTogZmFsc2UsIHZhbGlkYXRlT25BdHRhY2g6IGZhbHNlIH0pO1xyXG4gID4gICAgIC8vIGFzc3VtZSBlbTEgaXMgYSBwcmVleGlzdGluZyBFbnRpdHlNYW5hZ2VyXHJcbiAgPiAgICAgZW0xLnNldFByb3BlcnRpZXMoIHsgdmFsaWRhdGlvbk9wdGlvbnM6IG5ld1ZvIH0pO1xyXG4gIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICoqL1xyXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IFZhbGlkYXRpb25PcHRpb25zQ29uZmlnKSB7XHJcbiAgICB1cGRhdGVXaXRoQ29uZmlnKHRoaXMsIGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBWYWxpZGF0aW9uT3B0aW9ucyB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBjb25maWcgcHJvcGVydGllcy5cclxuICA+ICAgICB2YXIgdmFsaWRhdGlvbk9wdGlvbnMgPSBuZXcgVmFsaWRhdGlvbk9wdGlvbnMoKTtcclxuICA+ICAgICB2YXIgbmV3T3B0aW9ucyA9IHZhbGlkYXRpb25PcHRpb25zLnVzaW5nKCB7IHZhbGlkYXRlT25RdWVyeTogdHJ1ZSwgdmFsaWRhdGVPblNhdmU6IGZhbHNlfSApO1xyXG4gIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgQHJldHVybiBBIG5ldyBWYWxpZGF0aW9uT3B0aW9ucyBpbnN0YW5jZS5cclxuICAqKi9cclxuICB1c2luZyhjb25maWc6IFZhbGlkYXRpb25PcHRpb25zQ29uZmlnKSB7XHJcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIHRoaXM7XHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25PcHRpb25zKHRoaXMpO1xyXG4gICAgdXBkYXRlV2l0aENvbmZpZyhyZXN1bHQsIGNvbmZpZyk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgU2V0cyB0aGUgJ2RlZmF1bHRJbnN0YW5jZScgYnkgY3JlYXRpbmcgYSBjb3B5IG9mIHRoZSBjdXJyZW50ICdkZWZhdWx0SW5zdGFuY2UnIGFuZCB0aGVuIGFwcGx5aW5nIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBpbnN0YW5jZS5cclxuICBUaGUgY3VycmVudCBpbnN0YW5jZSBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXHJcbiAgPiAgICAgdmFyIHZhbGlkYXRpb25PcHRpb25zID0gbmV3IFZhbGlkYXRpb25PcHRpb25zKClcclxuICA+ICAgICB2YXIgbmV3T3B0aW9ucyA9IHZhbGlkYXRpb25PcHRpb25zLnVzaW5nKCB7IHZhbGlkYXRlT25RdWVyeTogdHJ1ZSwgdmFsaWRhdGVPblNhdmU6IGZhbHNlfSApO1xyXG4gID4gICAgIHZhciBuZXdPcHRpb25zLnNldEFzRGVmYXVsdCgpO1xyXG4gICoqL1xyXG4gIHNldEFzRGVmYXVsdCgpIHtcclxuICAgIHJldHVybiBjb3JlLnNldEFzRGVmYXVsdCh0aGlzLCBWYWxpZGF0aW9uT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBUaGUgZGVmYXVsdCBpbnN0YW5jZSBmb3IgdXNlIHdoZW5ldmVyIFZhbGlkYXRpb25PcHRpb25zIGFyZSBub3Qgc3BlY2lmaWVkLlxyXG4gICoqL1xyXG4gIHN0YXRpYyBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgVmFsaWRhdGlvbk9wdGlvbnMoe1xyXG4gICAgdmFsaWRhdGVPbkF0dGFjaDogdHJ1ZSxcclxuICAgIHZhbGlkYXRlT25TYXZlOiB0cnVlLFxyXG4gICAgdmFsaWRhdGVPblF1ZXJ5OiBmYWxzZSxcclxuICAgIHZhbGlkYXRlT25Qcm9wZXJ0eUNoYW5nZTogdHJ1ZVxyXG4gIH0pO1xyXG59XHJcblZhbGlkYXRpb25PcHRpb25zLnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJWYWxpZGF0aW9uT3B0aW9uc1wiO1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlV2l0aENvbmZpZyhvcHRpb25zOiBWYWxpZGF0aW9uT3B0aW9ucywgY29uZmlnOiBWYWxpZGF0aW9uT3B0aW9uc0NvbmZpZykge1xyXG4gIGlmIChjb25maWcpIHtcclxuICAgIGFzc2VydENvbmZpZyhjb25maWcpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJ2YWxpZGF0ZU9uQXR0YWNoXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwidmFsaWRhdGVPblNhdmVcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJ2YWxpZGF0ZU9uUXVlcnlcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJ2YWxpZGF0ZU9uUHJvcGVydHlDaGFuZ2VcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpXHJcbiAgICAgICAgLmFwcGx5QWxsKG9wdGlvbnMpO1xyXG4gIH1cclxuICByZXR1cm4gb3B0aW9ucztcclxufVxyXG4iXX0=
|
|
@@ -1687,24 +1687,6 @@ anytime a MetadataStore.fetchMetadata call occurs with a new dataService ( or se
|
|
|
1687
1687
|
|
|
1688
1688
|
**/
|
|
1689
1689
|
class DataService {
|
|
1690
|
-
/** @hidden @internal */
|
|
1691
|
-
_$typeName; // actually put on prototype.
|
|
1692
|
-
/** The serviceName for this DataService. __Read Only__ **/
|
|
1693
|
-
serviceName;
|
|
1694
|
-
/** The adapter name for the [[IDataServiceAdapter]] to be used with this service. __Read Only__ **/
|
|
1695
|
-
adapterName;
|
|
1696
|
-
/** The [[IDataServiceAdapter]] implementation instance associated with this EntityManager. __Read Only__ **/
|
|
1697
|
-
adapterInstance;
|
|
1698
|
-
/** The adapter name for the [[IUriBuilderAdapter]] to be used with this service. __Read Only__ **/
|
|
1699
|
-
uriBuilderName;
|
|
1700
|
-
/** The [[IUriBuilderAdapter]] implementation instance associated with this EntityManager. __Read Only__ **/
|
|
1701
|
-
uriBuilder;
|
|
1702
|
-
/** Whether the server can provide metadata for this service. __Read Only__ **/
|
|
1703
|
-
hasServerMetadata;
|
|
1704
|
-
/** The [[JsonResultsAdapter]] used to process the results of any query against this DataService. __Read Only__ **/
|
|
1705
|
-
jsonResultsAdapter;
|
|
1706
|
-
/** Whether to use JSONP when performing a 'GET' request against this service. __Read Only__ **/
|
|
1707
|
-
useJsonp;
|
|
1708
1690
|
/** DataService constructor
|
|
1709
1691
|
> var dataService = new DataService({
|
|
1710
1692
|
> serviceName: altServiceName,
|
|
@@ -2061,13 +2043,6 @@ of additional properties that will be automatically added to this object if not
|
|
|
2061
2043
|
@dynamic
|
|
2062
2044
|
**/
|
|
2063
2045
|
class Validator {
|
|
2064
|
-
/** @hidden @internal */
|
|
2065
|
-
_$typeName; // on proto
|
|
2066
|
-
name;
|
|
2067
|
-
valFn;
|
|
2068
|
-
context;
|
|
2069
|
-
currentContext;
|
|
2070
|
-
_baseContext;
|
|
2071
2046
|
constructor(name, valFn, context) {
|
|
2072
2047
|
// _baseContext is what will get serialized
|
|
2073
2048
|
this._baseContext = context || {};
|
|
@@ -3570,8 +3545,6 @@ An EntityKey is an object that represents the unique identity of an entity. Ent
|
|
|
3570
3545
|
|
|
3571
3546
|
**/
|
|
3572
3547
|
class EntityKey {
|
|
3573
|
-
/** @hidden @internal */
|
|
3574
|
-
_$typeName; // actually placed on prototype
|
|
3575
3548
|
/** @hidden @internal */
|
|
3576
3549
|
static ENTITY_KEY_DELIMITER = ":::";
|
|
3577
3550
|
/** The 'EntityType' that this is a key for. __Read Only__ */
|
|
@@ -3741,14 +3714,6 @@ Error['x'] = FetchStrategy.resolveSymbols();
|
|
|
3741
3714
|
A QueryOptions instance is used to specify the 'options' under which a query will occur.
|
|
3742
3715
|
**/
|
|
3743
3716
|
class QueryOptions {
|
|
3744
|
-
/** @hidden @internal */
|
|
3745
|
-
_$typeName;
|
|
3746
|
-
/** The [[FetchStrategy]] to use with any queries. __Read Only__ */
|
|
3747
|
-
fetchStrategy;
|
|
3748
|
-
/** The [[MergeStrategy]] to use with any queries. __Read Only__ */
|
|
3749
|
-
mergeStrategy;
|
|
3750
|
-
/** Whether to include cached deleted entities in a query result (false by default). __Read Only__ */
|
|
3751
|
-
includeDeleted;
|
|
3752
3717
|
/**
|
|
3753
3718
|
The default instance for use whenever QueryOptions are not specified.
|
|
3754
3719
|
**/
|
|
@@ -7008,10 +6973,6 @@ The default NamingConvention does not perform any translation, it simply passes
|
|
|
7008
6973
|
@dynamic
|
|
7009
6974
|
**/
|
|
7010
6975
|
class NamingConvention {
|
|
7011
|
-
/** @hidden @internal */
|
|
7012
|
-
_$typeName;
|
|
7013
|
-
/** The name of this NamingConvention. __Read Only__ */
|
|
7014
|
-
name;
|
|
7015
6976
|
/** Function that takes a server property name add converts it into a client side property name. __Read Only__ */
|
|
7016
6977
|
serverPropertyNameToClient;
|
|
7017
6978
|
/** Function that takes a client property name add converts it into a server side property name. __Read Only__ */
|
|
@@ -7483,16 +7444,6 @@ The default LocalQueryComparisonOptions stipulates 'caseInsensitive" queries wit
|
|
|
7483
7444
|
length strings.
|
|
7484
7445
|
**/
|
|
7485
7446
|
class LocalQueryComparisonOptions {
|
|
7486
|
-
/** @hidden @internal */
|
|
7487
|
-
_$typeName; // on prototype
|
|
7488
|
-
/** The name for this instance. */
|
|
7489
|
-
name;
|
|
7490
|
-
/** Whether predicates that involve strings will be interpreted in a "caseSensitive" manner. (default = false). */
|
|
7491
|
-
isCaseSensitive;
|
|
7492
|
-
/* Whether or not to enforce the ANSI SQL standard
|
|
7493
|
-
of padding strings of unequal lengths before comparison with spaces. Note that per the standard, padding only occurs with equality and
|
|
7494
|
-
inequality predicates, and not with operations like 'startsWith', 'endsWith' or 'contains'. Default is true. */
|
|
7495
|
-
usesSql92CompliantStringComparison;
|
|
7496
7447
|
/**
|
|
7497
7448
|
LocalQueryComparisonOptions constructor
|
|
7498
7449
|
> // create a 'caseSensitive - non SQL' instance.
|
|
@@ -10554,20 +10505,6 @@ A ValidationOptions instance is used to specify the conditions under which valid
|
|
|
10554
10505
|
|
|
10555
10506
|
*/
|
|
10556
10507
|
class ValidationOptions {
|
|
10557
|
-
/** @hidden @internal */
|
|
10558
|
-
_$typeName; // on proto
|
|
10559
|
-
/** Whether entity and property level validation should occur when entities are attached to the EntityManager
|
|
10560
|
-
other than via a query. (default = true) __Read Only__ */
|
|
10561
|
-
validateOnAttach;
|
|
10562
|
-
/** Whether entity and property level validation should occur before entities are saved.
|
|
10563
|
-
A failed validation will force the save to fail early. (default = true) __Read Only__ */
|
|
10564
|
-
validateOnSave;
|
|
10565
|
-
/** Whether entity and property level validation should occur after entities are queried from a remote server.
|
|
10566
|
-
(default = false) __Read Only__ **/
|
|
10567
|
-
validateOnQuery;
|
|
10568
|
-
/** Whether property level validation should occur after entities are modified.
|
|
10569
|
-
(default = true) __Read Only__ **/
|
|
10570
|
-
validateOnPropertyChange;
|
|
10571
10508
|
/**
|
|
10572
10509
|
ValidationOptions constructor
|
|
10573
10510
|
> var newVo = new ValidationOptions( { validateOnSave: false, validateOnAttach: false });
|
|
@@ -10629,16 +10566,6 @@ function updateWithConfig(options, config) {
|
|
|
10629
10566
|
A SaveOptions instance is used to specify the 'options' under which a save will occur.
|
|
10630
10567
|
**/
|
|
10631
10568
|
class SaveOptions {
|
|
10632
|
-
/** @hidden @internal */
|
|
10633
|
-
_$typeName; // on proto
|
|
10634
|
-
/** Resource name to be used during the save - this defaults to "SaveChanges". __Read Only__ */
|
|
10635
|
-
resourceName;
|
|
10636
|
-
/** The DataService to be used for this save. __Read Only__ */
|
|
10637
|
-
dataService;
|
|
10638
|
-
/** Whether multiple saves can be in-flight at the same time. The default is false. __Read Only__ */
|
|
10639
|
-
allowConcurrentSaves;
|
|
10640
|
-
/** Free form value that will be sent to the server during the save. __Read Only__ */
|
|
10641
|
-
tag;
|
|
10642
10569
|
/** The default value whenever SaveOptions are not specified. */
|
|
10643
10570
|
static defaultInstance = new SaveOptions({ allowConcurrentSaves: false });
|
|
10644
10571
|
constructor(config) {
|
|
@@ -10975,18 +10902,7 @@ For use by breeze plugin authors only. The class is for use in building a [[IDat
|
|
|
10975
10902
|
@hidden
|
|
10976
10903
|
*/
|
|
10977
10904
|
class MappingContext {
|
|
10978
|
-
/** @hidden @internal */
|
|
10979
|
-
_$typeName; // on prototype
|
|
10980
10905
|
rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
|
|
10981
|
-
dataService;
|
|
10982
|
-
query;
|
|
10983
|
-
entityManager;
|
|
10984
|
-
mergeOptions;
|
|
10985
|
-
adapter; // assigned in the AbstractDataServiceAdapter.
|
|
10986
|
-
refMap; // TODO
|
|
10987
|
-
deferredFns; // TODO
|
|
10988
|
-
jsonResultsAdapter;
|
|
10989
|
-
metadataStore;
|
|
10990
10906
|
constructor(config) {
|
|
10991
10907
|
core.extend(this, config, [
|
|
10992
10908
|
"query", "entityManager", "dataService", "mergeOptions"
|
|
@@ -11443,26 +11359,6 @@ class UnattachedChildrenMap {
|
|
|
11443
11359
|
Instances of the EntityManager contain and manage collections of entities, either retrieved from a backend datastore or created on the client.
|
|
11444
11360
|
**/
|
|
11445
11361
|
class EntityManager {
|
|
11446
|
-
/** @hidden @internal */
|
|
11447
|
-
_$typeName; // actually defined on prototype
|
|
11448
|
-
/** The service name associated with this EntityManager. __Read Only__ **/
|
|
11449
|
-
serviceName;
|
|
11450
|
-
/** The DataService associated with this EntityManager. __Read Only__ **/
|
|
11451
|
-
dataService;
|
|
11452
|
-
/** The [[QueryOptions]] associated with this EntityManager. __Read Only__ **/
|
|
11453
|
-
queryOptions;
|
|
11454
|
-
/** The [[SaveOptions]] associated with this EntityManager. __Read Only__ **/
|
|
11455
|
-
saveOptions;
|
|
11456
|
-
/** The [[ValidationOptions]] associated with this EntityManager. __Read Only__ **/
|
|
11457
|
-
validationOptions;
|
|
11458
|
-
/** The [[KeyGenerator]] associated with this EntityManager. __Read Only__ **/
|
|
11459
|
-
keyGenerator;
|
|
11460
|
-
/** The [[KeyGenerator]] constructor associated with this EntityManager. __Read Only__ **/
|
|
11461
|
-
keyGeneratorCtor; // TODO: review this
|
|
11462
|
-
/** The [[MetadataStore]] associated with this EntityManager. __Read Only__ **/
|
|
11463
|
-
metadataStore;
|
|
11464
|
-
isLoading;
|
|
11465
|
-
isRejectingChanges;
|
|
11466
11362
|
// events
|
|
11467
11363
|
/**
|
|
11468
11364
|
A [[BreezeEvent]] that fires whenever a change to any entity in this EntityManager occurs. __Read Only__
|