tenebrous-sheets/static/scripts/build/_proto_cofd_api_pb_js.bundl...

4825 lines
378 KiB
JavaScript

(self["webpackChunk"] = self["webpackChunk"] || []).push([["_proto_cofd_api_pb_js"],{
/***/ "./_proto/cofd_api_pb.js":
/*!*******************************!*\
!*** ./_proto/cofd_api_pb.js ***!
\*******************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
// source: cofd_api.proto
/**
* @fileoverview
* @enhanceable
* @suppress {messageConventions} JS Compiler reports an error if a variable or
* field starts with 'MSG_' and isn't a translatable message.
* @public
*/
// GENERATED CODE -- DO NOT EDIT!
/* eslint-disable */
// @ts-nocheck
var jspb = __webpack_require__(/*! google-protobuf */ "../../node_modules/google-protobuf/google-protobuf.js");
var goog = jspb;
var global = Function('return this')();
var cofd_pb = __webpack_require__(/*! ./cofd_pb.js */ "./_proto/cofd_pb.js");
goog.object.extend(proto, cofd_pb);
goog.exportSymbol('proto.models.proto.cofd.api.Attributes', null, global);
goog.exportSymbol('proto.models.proto.cofd.api.BasicInfo', null, global);
goog.exportSymbol('proto.models.proto.cofd.api.Condition', null, global);
goog.exportSymbol('proto.models.proto.cofd.api.SkillSpecializationsUpdate', null, global);
goog.exportSymbol('proto.models.proto.cofd.api.SkillUpdate', null, global);
goog.exportSymbol('proto.models.proto.cofd.api.Skills', null, global);
goog.exportSymbol('proto.models.proto.cofd.api.UpdateAttributeRequest', null, global);
goog.exportSymbol('proto.models.proto.cofd.api.UpdateSkillValueRequest', null, global);
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.api.BasicInfo = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.api.BasicInfo, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.api.BasicInfo.displayName = 'proto.models.proto.cofd.api.BasicInfo';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.api.Attributes = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.api.Attributes, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.api.Attributes.displayName = 'proto.models.proto.cofd.api.Attributes';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.api.UpdateAttributeRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.api.UpdateAttributeRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.displayName = 'proto.models.proto.cofd.api.UpdateAttributeRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.api.Skills = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, proto.models.proto.cofd.api.Skills.repeatedFields_, null);
};
goog.inherits(proto.models.proto.cofd.api.Skills, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.api.Skills.displayName = 'proto.models.proto.cofd.api.Skills';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.api.SkillUpdate = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.api.SkillUpdate, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.api.SkillUpdate.displayName = 'proto.models.proto.cofd.api.SkillUpdate';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.api.UpdateSkillValueRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.displayName = 'proto.models.proto.cofd.api.UpdateSkillValueRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, proto.models.proto.cofd.api.SkillSpecializationsUpdate.repeatedFields_, null);
};
goog.inherits(proto.models.proto.cofd.api.SkillSpecializationsUpdate, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.displayName = 'proto.models.proto.cofd.api.SkillSpecializationsUpdate';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.api.Condition = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.api.Condition, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.api.Condition.displayName = 'proto.models.proto.cofd.api.Condition';
}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.api.BasicInfo.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.api.BasicInfo.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.api.BasicInfo} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.BasicInfo.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, ""),
gender: jspb.Message.getFieldWithDefault(msg, 2, ""),
concept: jspb.Message.getFieldWithDefault(msg, 3, ""),
chronicle: jspb.Message.getFieldWithDefault(msg, 4, ""),
age: jspb.Message.getFieldWithDefault(msg, 5, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.api.BasicInfo}
*/
proto.models.proto.cofd.api.BasicInfo.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.api.BasicInfo;
return proto.models.proto.cofd.api.BasicInfo.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.api.BasicInfo} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.api.BasicInfo}
*/
proto.models.proto.cofd.api.BasicInfo.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setGender(value);
break;
case 3:
var value = /** @type {string} */ (reader.readString());
msg.setConcept(value);
break;
case 4:
var value = /** @type {string} */ (reader.readString());
msg.setChronicle(value);
break;
case 5:
var value = /** @type {number} */ (reader.readInt32());
msg.setAge(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.api.BasicInfo.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.api.BasicInfo.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.api.BasicInfo} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.BasicInfo.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getGender();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
f = message.getConcept();
if (f.length > 0) {
writer.writeString(
3,
f
);
}
f = message.getChronicle();
if (f.length > 0) {
writer.writeString(
4,
f
);
}
f = message.getAge();
if (f !== 0) {
writer.writeInt32(
5,
f
);
}
};
/**
* optional string name = 1;
* @return {string}
*/
proto.models.proto.cofd.api.BasicInfo.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.BasicInfo} returns this
*/
proto.models.proto.cofd.api.BasicInfo.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional string gender = 2;
* @return {string}
*/
proto.models.proto.cofd.api.BasicInfo.prototype.getGender = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.BasicInfo} returns this
*/
proto.models.proto.cofd.api.BasicInfo.prototype.setGender = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
/**
* optional string concept = 3;
* @return {string}
*/
proto.models.proto.cofd.api.BasicInfo.prototype.getConcept = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.BasicInfo} returns this
*/
proto.models.proto.cofd.api.BasicInfo.prototype.setConcept = function(value) {
return jspb.Message.setProto3StringField(this, 3, value);
};
/**
* optional string chronicle = 4;
* @return {string}
*/
proto.models.proto.cofd.api.BasicInfo.prototype.getChronicle = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.BasicInfo} returns this
*/
proto.models.proto.cofd.api.BasicInfo.prototype.setChronicle = function(value) {
return jspb.Message.setProto3StringField(this, 4, value);
};
/**
* optional int32 age = 5;
* @return {number}
*/
proto.models.proto.cofd.api.BasicInfo.prototype.getAge = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.BasicInfo} returns this
*/
proto.models.proto.cofd.api.BasicInfo.prototype.setAge = function(value) {
return jspb.Message.setProto3IntField(this, 5, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.api.Attributes.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.api.Attributes.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.api.Attributes} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.Attributes.toObject = function(includeInstance, msg) {
var f, obj = {
strength: jspb.Message.getFieldWithDefault(msg, 1, 0),
dexterity: jspb.Message.getFieldWithDefault(msg, 2, 0),
stamina: jspb.Message.getFieldWithDefault(msg, 3, 0),
intelligence: jspb.Message.getFieldWithDefault(msg, 4, 0),
wits: jspb.Message.getFieldWithDefault(msg, 5, 0),
resolve: jspb.Message.getFieldWithDefault(msg, 6, 0),
presence: jspb.Message.getFieldWithDefault(msg, 7, 0),
manipulation: jspb.Message.getFieldWithDefault(msg, 8, 0),
composure: jspb.Message.getFieldWithDefault(msg, 9, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.api.Attributes}
*/
proto.models.proto.cofd.api.Attributes.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.api.Attributes;
return proto.models.proto.cofd.api.Attributes.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.api.Attributes} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.api.Attributes}
*/
proto.models.proto.cofd.api.Attributes.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {number} */ (reader.readInt32());
msg.setStrength(value);
break;
case 2:
var value = /** @type {number} */ (reader.readInt32());
msg.setDexterity(value);
break;
case 3:
var value = /** @type {number} */ (reader.readInt32());
msg.setStamina(value);
break;
case 4:
var value = /** @type {number} */ (reader.readInt32());
msg.setIntelligence(value);
break;
case 5:
var value = /** @type {number} */ (reader.readInt32());
msg.setWits(value);
break;
case 6:
var value = /** @type {number} */ (reader.readInt32());
msg.setResolve(value);
break;
case 7:
var value = /** @type {number} */ (reader.readInt32());
msg.setPresence(value);
break;
case 8:
var value = /** @type {number} */ (reader.readInt32());
msg.setManipulation(value);
break;
case 9:
var value = /** @type {number} */ (reader.readInt32());
msg.setComposure(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.api.Attributes.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.api.Attributes.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.api.Attributes} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.Attributes.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getStrength();
if (f !== 0) {
writer.writeInt32(
1,
f
);
}
f = message.getDexterity();
if (f !== 0) {
writer.writeInt32(
2,
f
);
}
f = message.getStamina();
if (f !== 0) {
writer.writeInt32(
3,
f
);
}
f = message.getIntelligence();
if (f !== 0) {
writer.writeInt32(
4,
f
);
}
f = message.getWits();
if (f !== 0) {
writer.writeInt32(
5,
f
);
}
f = message.getResolve();
if (f !== 0) {
writer.writeInt32(
6,
f
);
}
f = message.getPresence();
if (f !== 0) {
writer.writeInt32(
7,
f
);
}
f = message.getManipulation();
if (f !== 0) {
writer.writeInt32(
8,
f
);
}
f = message.getComposure();
if (f !== 0) {
writer.writeInt32(
9,
f
);
}
};
/**
* optional int32 strength = 1;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getStrength = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setStrength = function(value) {
return jspb.Message.setProto3IntField(this, 1, value);
};
/**
* optional int32 dexterity = 2;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getDexterity = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setDexterity = function(value) {
return jspb.Message.setProto3IntField(this, 2, value);
};
/**
* optional int32 stamina = 3;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getStamina = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setStamina = function(value) {
return jspb.Message.setProto3IntField(this, 3, value);
};
/**
* optional int32 intelligence = 4;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getIntelligence = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setIntelligence = function(value) {
return jspb.Message.setProto3IntField(this, 4, value);
};
/**
* optional int32 wits = 5;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getWits = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setWits = function(value) {
return jspb.Message.setProto3IntField(this, 5, value);
};
/**
* optional int32 resolve = 6;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getResolve = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setResolve = function(value) {
return jspb.Message.setProto3IntField(this, 6, value);
};
/**
* optional int32 presence = 7;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getPresence = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setPresence = function(value) {
return jspb.Message.setProto3IntField(this, 7, value);
};
/**
* optional int32 manipulation = 8;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getManipulation = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setManipulation = function(value) {
return jspb.Message.setProto3IntField(this, 8, value);
};
/**
* optional int32 composure = 9;
* @return {number}
*/
proto.models.proto.cofd.api.Attributes.prototype.getComposure = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 9, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.Attributes} returns this
*/
proto.models.proto.cofd.api.Attributes.prototype.setComposure = function(value) {
return jspb.Message.setProto3IntField(this, 9, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.api.UpdateAttributeRequest.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.api.UpdateAttributeRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.toObject = function(includeInstance, msg) {
var f, obj = {
characterUsername: jspb.Message.getFieldWithDefault(msg, 1, ""),
characterId: jspb.Message.getFieldWithDefault(msg, 2, 0),
attributeName: jspb.Message.getFieldWithDefault(msg, 3, ""),
attributeValue: jspb.Message.getFieldWithDefault(msg, 4, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.api.UpdateAttributeRequest}
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.api.UpdateAttributeRequest;
return proto.models.proto.cofd.api.UpdateAttributeRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.api.UpdateAttributeRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.api.UpdateAttributeRequest}
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setCharacterUsername(value);
break;
case 2:
var value = /** @type {number} */ (reader.readInt32());
msg.setCharacterId(value);
break;
case 3:
var value = /** @type {string} */ (reader.readString());
msg.setAttributeName(value);
break;
case 4:
var value = /** @type {number} */ (reader.readInt32());
msg.setAttributeValue(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.api.UpdateAttributeRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.api.UpdateAttributeRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getCharacterUsername();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getCharacterId();
if (f !== 0) {
writer.writeInt32(
2,
f
);
}
f = message.getAttributeName();
if (f.length > 0) {
writer.writeString(
3,
f
);
}
f = message.getAttributeValue();
if (f !== 0) {
writer.writeInt32(
4,
f
);
}
};
/**
* optional string character_username = 1;
* @return {string}
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.getCharacterUsername = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} returns this
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.setCharacterUsername = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional int32 character_id = 2;
* @return {number}
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.getCharacterId = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} returns this
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.setCharacterId = function(value) {
return jspb.Message.setProto3IntField(this, 2, value);
};
/**
* optional string attribute_name = 3;
* @return {string}
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.getAttributeName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} returns this
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.setAttributeName = function(value) {
return jspb.Message.setProto3StringField(this, 3, value);
};
/**
* optional int32 attribute_value = 4;
* @return {number}
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.getAttributeValue = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.UpdateAttributeRequest} returns this
*/
proto.models.proto.cofd.api.UpdateAttributeRequest.prototype.setAttributeValue = function(value) {
return jspb.Message.setProto3IntField(this, 4, value);
};
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.models.proto.cofd.api.Skills.repeatedFields_ = [1,2,3];
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.api.Skills.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.api.Skills.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.api.Skills} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.Skills.toObject = function(includeInstance, msg) {
var f, obj = {
physicalSkillsList: jspb.Message.toObjectList(msg.getPhysicalSkillsList(),
cofd_pb.CofdSheet.Skill.toObject, includeInstance),
mentalSkillsList: jspb.Message.toObjectList(msg.getMentalSkillsList(),
cofd_pb.CofdSheet.Skill.toObject, includeInstance),
socialSkillsList: jspb.Message.toObjectList(msg.getSocialSkillsList(),
cofd_pb.CofdSheet.Skill.toObject, includeInstance)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.api.Skills}
*/
proto.models.proto.cofd.api.Skills.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.api.Skills;
return proto.models.proto.cofd.api.Skills.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.api.Skills} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.api.Skills}
*/
proto.models.proto.cofd.api.Skills.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = new cofd_pb.CofdSheet.Skill;
reader.readMessage(value,cofd_pb.CofdSheet.Skill.deserializeBinaryFromReader);
msg.addPhysicalSkills(value);
break;
case 2:
var value = new cofd_pb.CofdSheet.Skill;
reader.readMessage(value,cofd_pb.CofdSheet.Skill.deserializeBinaryFromReader);
msg.addMentalSkills(value);
break;
case 3:
var value = new cofd_pb.CofdSheet.Skill;
reader.readMessage(value,cofd_pb.CofdSheet.Skill.deserializeBinaryFromReader);
msg.addSocialSkills(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.api.Skills.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.api.Skills.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.api.Skills} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.Skills.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getPhysicalSkillsList();
if (f.length > 0) {
writer.writeRepeatedMessage(
1,
f,
cofd_pb.CofdSheet.Skill.serializeBinaryToWriter
);
}
f = message.getMentalSkillsList();
if (f.length > 0) {
writer.writeRepeatedMessage(
2,
f,
cofd_pb.CofdSheet.Skill.serializeBinaryToWriter
);
}
f = message.getSocialSkillsList();
if (f.length > 0) {
writer.writeRepeatedMessage(
3,
f,
cofd_pb.CofdSheet.Skill.serializeBinaryToWriter
);
}
};
/**
* repeated models.proto.cofd.CofdSheet.Skill physical_skills = 1;
* @return {!Array<!proto.models.proto.cofd.CofdSheet.Skill>}
*/
proto.models.proto.cofd.api.Skills.prototype.getPhysicalSkillsList = function() {
return /** @type{!Array<!proto.models.proto.cofd.CofdSheet.Skill>} */ (
jspb.Message.getRepeatedWrapperField(this, cofd_pb.CofdSheet.Skill, 1));
};
/**
* @param {!Array<!proto.models.proto.cofd.CofdSheet.Skill>} value
* @return {!proto.models.proto.cofd.api.Skills} returns this
*/
proto.models.proto.cofd.api.Skills.prototype.setPhysicalSkillsList = function(value) {
return jspb.Message.setRepeatedWrapperField(this, 1, value);
};
/**
* @param {!proto.models.proto.cofd.CofdSheet.Skill=} opt_value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.CofdSheet.Skill}
*/
proto.models.proto.cofd.api.Skills.prototype.addPhysicalSkills = function(opt_value, opt_index) {
return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.models.proto.cofd.CofdSheet.Skill, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.api.Skills} returns this
*/
proto.models.proto.cofd.api.Skills.prototype.clearPhysicalSkillsList = function() {
return this.setPhysicalSkillsList([]);
};
/**
* repeated models.proto.cofd.CofdSheet.Skill mental_skills = 2;
* @return {!Array<!proto.models.proto.cofd.CofdSheet.Skill>}
*/
proto.models.proto.cofd.api.Skills.prototype.getMentalSkillsList = function() {
return /** @type{!Array<!proto.models.proto.cofd.CofdSheet.Skill>} */ (
jspb.Message.getRepeatedWrapperField(this, cofd_pb.CofdSheet.Skill, 2));
};
/**
* @param {!Array<!proto.models.proto.cofd.CofdSheet.Skill>} value
* @return {!proto.models.proto.cofd.api.Skills} returns this
*/
proto.models.proto.cofd.api.Skills.prototype.setMentalSkillsList = function(value) {
return jspb.Message.setRepeatedWrapperField(this, 2, value);
};
/**
* @param {!proto.models.proto.cofd.CofdSheet.Skill=} opt_value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.CofdSheet.Skill}
*/
proto.models.proto.cofd.api.Skills.prototype.addMentalSkills = function(opt_value, opt_index) {
return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.models.proto.cofd.CofdSheet.Skill, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.api.Skills} returns this
*/
proto.models.proto.cofd.api.Skills.prototype.clearMentalSkillsList = function() {
return this.setMentalSkillsList([]);
};
/**
* repeated models.proto.cofd.CofdSheet.Skill social_skills = 3;
* @return {!Array<!proto.models.proto.cofd.CofdSheet.Skill>}
*/
proto.models.proto.cofd.api.Skills.prototype.getSocialSkillsList = function() {
return /** @type{!Array<!proto.models.proto.cofd.CofdSheet.Skill>} */ (
jspb.Message.getRepeatedWrapperField(this, cofd_pb.CofdSheet.Skill, 3));
};
/**
* @param {!Array<!proto.models.proto.cofd.CofdSheet.Skill>} value
* @return {!proto.models.proto.cofd.api.Skills} returns this
*/
proto.models.proto.cofd.api.Skills.prototype.setSocialSkillsList = function(value) {
return jspb.Message.setRepeatedWrapperField(this, 3, value);
};
/**
* @param {!proto.models.proto.cofd.CofdSheet.Skill=} opt_value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.CofdSheet.Skill}
*/
proto.models.proto.cofd.api.Skills.prototype.addSocialSkills = function(opt_value, opt_index) {
return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.models.proto.cofd.CofdSheet.Skill, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.api.Skills} returns this
*/
proto.models.proto.cofd.api.Skills.prototype.clearSocialSkillsList = function() {
return this.setSocialSkillsList([]);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.api.SkillUpdate.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.api.SkillUpdate.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.api.SkillUpdate} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.SkillUpdate.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, ""),
skill: (f = msg.getSkill()) && cofd_pb.CofdSheet.Skill.toObject(includeInstance, f)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.api.SkillUpdate}
*/
proto.models.proto.cofd.api.SkillUpdate.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.api.SkillUpdate;
return proto.models.proto.cofd.api.SkillUpdate.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.api.SkillUpdate} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.api.SkillUpdate}
*/
proto.models.proto.cofd.api.SkillUpdate.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
case 2:
var value = new cofd_pb.CofdSheet.Skill;
reader.readMessage(value,cofd_pb.CofdSheet.Skill.deserializeBinaryFromReader);
msg.setSkill(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.api.SkillUpdate.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.api.SkillUpdate.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.api.SkillUpdate} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.SkillUpdate.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getSkill();
if (f != null) {
writer.writeMessage(
2,
f,
cofd_pb.CofdSheet.Skill.serializeBinaryToWriter
);
}
};
/**
* optional string name = 1;
* @return {string}
*/
proto.models.proto.cofd.api.SkillUpdate.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.SkillUpdate} returns this
*/
proto.models.proto.cofd.api.SkillUpdate.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional models.proto.cofd.CofdSheet.Skill skill = 2;
* @return {?proto.models.proto.cofd.CofdSheet.Skill}
*/
proto.models.proto.cofd.api.SkillUpdate.prototype.getSkill = function() {
return /** @type{?proto.models.proto.cofd.CofdSheet.Skill} */ (
jspb.Message.getWrapperField(this, cofd_pb.CofdSheet.Skill, 2));
};
/**
* @param {?proto.models.proto.cofd.CofdSheet.Skill|undefined} value
* @return {!proto.models.proto.cofd.api.SkillUpdate} returns this
*/
proto.models.proto.cofd.api.SkillUpdate.prototype.setSkill = function(value) {
return jspb.Message.setWrapperField(this, 2, value);
};
/**
* Clears the message field making it undefined.
* @return {!proto.models.proto.cofd.api.SkillUpdate} returns this
*/
proto.models.proto.cofd.api.SkillUpdate.prototype.clearSkill = function() {
return this.setSkill(undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.models.proto.cofd.api.SkillUpdate.prototype.hasSkill = function() {
return jspb.Message.getField(this, 2) != null;
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.api.UpdateSkillValueRequest.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.api.UpdateSkillValueRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.toObject = function(includeInstance, msg) {
var f, obj = {
characterUsername: jspb.Message.getFieldWithDefault(msg, 1, ""),
characterId: jspb.Message.getFieldWithDefault(msg, 2, 0),
skillName: jspb.Message.getFieldWithDefault(msg, 3, ""),
skillValue: jspb.Message.getFieldWithDefault(msg, 4, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest}
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.api.UpdateSkillValueRequest;
return proto.models.proto.cofd.api.UpdateSkillValueRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.api.UpdateSkillValueRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest}
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setCharacterUsername(value);
break;
case 2:
var value = /** @type {number} */ (reader.readInt32());
msg.setCharacterId(value);
break;
case 3:
var value = /** @type {string} */ (reader.readString());
msg.setSkillName(value);
break;
case 4:
var value = /** @type {number} */ (reader.readInt32());
msg.setSkillValue(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.api.UpdateSkillValueRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.api.UpdateSkillValueRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getCharacterUsername();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getCharacterId();
if (f !== 0) {
writer.writeInt32(
2,
f
);
}
f = message.getSkillName();
if (f.length > 0) {
writer.writeString(
3,
f
);
}
f = message.getSkillValue();
if (f !== 0) {
writer.writeInt32(
4,
f
);
}
};
/**
* optional string character_username = 1;
* @return {string}
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.getCharacterUsername = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} returns this
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.setCharacterUsername = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional int32 character_id = 2;
* @return {number}
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.getCharacterId = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} returns this
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.setCharacterId = function(value) {
return jspb.Message.setProto3IntField(this, 2, value);
};
/**
* optional string skill_name = 3;
* @return {string}
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.getSkillName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} returns this
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.setSkillName = function(value) {
return jspb.Message.setProto3StringField(this, 3, value);
};
/**
* optional int32 skill_value = 4;
* @return {number}
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.getSkillValue = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.api.UpdateSkillValueRequest} returns this
*/
proto.models.proto.cofd.api.UpdateSkillValueRequest.prototype.setSkillValue = function(value) {
return jspb.Message.setProto3IntField(this, 4, value);
};
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.repeatedFields_ = [2];
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.api.SkillSpecializationsUpdate.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, ""),
specializationsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate}
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.api.SkillSpecializationsUpdate;
return proto.models.proto.cofd.api.SkillSpecializationsUpdate.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate}
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.addSpecializations(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.api.SkillSpecializationsUpdate.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getSpecializationsList();
if (f.length > 0) {
writer.writeRepeatedString(
2,
f
);
}
};
/**
* optional string name = 1;
* @return {string}
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} returns this
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* repeated string specializations = 2;
* @return {!Array<string>}
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.getSpecializationsList = function() {
return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2));
};
/**
* @param {!Array<string>} value
* @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} returns this
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.setSpecializationsList = function(value) {
return jspb.Message.setField(this, 2, value || []);
};
/**
* @param {string} value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} returns this
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.addSpecializations = function(value, opt_index) {
return jspb.Message.addToRepeatedField(this, 2, value, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.api.SkillSpecializationsUpdate} returns this
*/
proto.models.proto.cofd.api.SkillSpecializationsUpdate.prototype.clearSpecializationsList = function() {
return this.setSpecializationsList([]);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.api.Condition.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.api.Condition.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.api.Condition} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.Condition.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.api.Condition}
*/
proto.models.proto.cofd.api.Condition.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.api.Condition;
return proto.models.proto.cofd.api.Condition.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.api.Condition} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.api.Condition}
*/
proto.models.proto.cofd.api.Condition.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.api.Condition.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.api.Condition.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.api.Condition} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.api.Condition.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
};
/**
* optional string name = 1;
* @return {string}
*/
proto.models.proto.cofd.api.Condition.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.api.Condition} returns this
*/
proto.models.proto.cofd.api.Condition.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
goog.object.extend(exports, proto.models.proto.cofd.api);
/***/ }),
/***/ "./_proto/cofd_pb.js":
/*!***************************!*\
!*** ./_proto/cofd_pb.js ***!
\***************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
// source: cofd.proto
/**
* @fileoverview
* @enhanceable
* @suppress {messageConventions} JS Compiler reports an error if a variable or
* field starts with 'MSG_' and isn't a translatable message.
* @public
*/
// GENERATED CODE -- DO NOT EDIT!
/* eslint-disable */
// @ts-nocheck
var jspb = __webpack_require__(/*! google-protobuf */ "../../node_modules/google-protobuf/google-protobuf.js");
var goog = jspb;
var global = Function('return this')();
goog.exportSymbol('proto.models.proto.cofd.ChangelingFields', null, global);
goog.exportSymbol('proto.models.proto.cofd.CofdSheet', null, global);
goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Attack', null, global);
goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Condition', null, global);
goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Item', null, global);
goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Merit', null, global);
goog.exportSymbol('proto.models.proto.cofd.CofdSheet.Skill', null, global);
goog.exportSymbol('proto.models.proto.cofd.CofdSheet.SystemFieldsCase', null, global);
goog.exportSymbol('proto.models.proto.cofd.CoreFields', null, global);
goog.exportSymbol('proto.models.proto.cofd.MageFields', null, global);
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.CoreFields = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.CoreFields, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.CoreFields.displayName = 'proto.models.proto.cofd.CoreFields';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.MageFields = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.MageFields, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.MageFields.displayName = 'proto.models.proto.cofd.MageFields';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.ChangelingFields = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.ChangelingFields, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.ChangelingFields.displayName = 'proto.models.proto.cofd.ChangelingFields';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.CofdSheet = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, proto.models.proto.cofd.CofdSheet.repeatedFields_, proto.models.proto.cofd.CofdSheet.oneofGroups_);
};
goog.inherits(proto.models.proto.cofd.CofdSheet, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.CofdSheet.displayName = 'proto.models.proto.cofd.CofdSheet';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.CofdSheet.Merit = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.CofdSheet.Merit, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.CofdSheet.Merit.displayName = 'proto.models.proto.cofd.CofdSheet.Merit';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.CofdSheet.Condition = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.CofdSheet.Condition, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.CofdSheet.Condition.displayName = 'proto.models.proto.cofd.CofdSheet.Condition';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.CofdSheet.Skill = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, proto.models.proto.cofd.CofdSheet.Skill.repeatedFields_, null);
};
goog.inherits(proto.models.proto.cofd.CofdSheet.Skill, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.CofdSheet.Skill.displayName = 'proto.models.proto.cofd.CofdSheet.Skill';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.CofdSheet.Item = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.CofdSheet.Item, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.CofdSheet.Item.displayName = 'proto.models.proto.cofd.CofdSheet.Item';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.models.proto.cofd.CofdSheet.Attack = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.models.proto.cofd.CofdSheet.Attack, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.models.proto.cofd.CofdSheet.Attack.displayName = 'proto.models.proto.cofd.CofdSheet.Attack';
}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.CoreFields.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.CoreFields.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.CoreFields} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CoreFields.toObject = function(includeInstance, msg) {
var f, obj = {
integrity: jspb.Message.getFieldWithDefault(msg, 1, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.CoreFields}
*/
proto.models.proto.cofd.CoreFields.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.CoreFields;
return proto.models.proto.cofd.CoreFields.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.CoreFields} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.CoreFields}
*/
proto.models.proto.cofd.CoreFields.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {number} */ (reader.readInt32());
msg.setIntegrity(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.CoreFields.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.CoreFields.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.CoreFields} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CoreFields.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getIntegrity();
if (f !== 0) {
writer.writeInt32(
1,
f
);
}
};
/**
* optional int32 integrity = 1;
* @return {number}
*/
proto.models.proto.cofd.CoreFields.prototype.getIntegrity = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CoreFields} returns this
*/
proto.models.proto.cofd.CoreFields.prototype.setIntegrity = function(value) {
return jspb.Message.setProto3IntField(this, 1, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.MageFields.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.MageFields.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.MageFields} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.MageFields.toObject = function(includeInstance, msg) {
var f, obj = {
widsom: jspb.Message.getFieldWithDefault(msg, 1, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.MageFields}
*/
proto.models.proto.cofd.MageFields.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.MageFields;
return proto.models.proto.cofd.MageFields.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.MageFields} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.MageFields}
*/
proto.models.proto.cofd.MageFields.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {number} */ (reader.readInt32());
msg.setWidsom(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.MageFields.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.MageFields.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.MageFields} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.MageFields.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getWidsom();
if (f !== 0) {
writer.writeInt32(
1,
f
);
}
};
/**
* optional int32 widsom = 1;
* @return {number}
*/
proto.models.proto.cofd.MageFields.prototype.getWidsom = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.MageFields} returns this
*/
proto.models.proto.cofd.MageFields.prototype.setWidsom = function(value) {
return jspb.Message.setProto3IntField(this, 1, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.ChangelingFields.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.ChangelingFields.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.ChangelingFields} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.ChangelingFields.toObject = function(includeInstance, msg) {
var f, obj = {
clarity: jspb.Message.getFieldWithDefault(msg, 1, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.ChangelingFields}
*/
proto.models.proto.cofd.ChangelingFields.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.ChangelingFields;
return proto.models.proto.cofd.ChangelingFields.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.ChangelingFields} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.ChangelingFields}
*/
proto.models.proto.cofd.ChangelingFields.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {number} */ (reader.readInt32());
msg.setClarity(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.ChangelingFields.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.ChangelingFields.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.ChangelingFields} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.ChangelingFields.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getClarity();
if (f !== 0) {
writer.writeInt32(
1,
f
);
}
};
/**
* optional int32 clarity = 1;
* @return {number}
*/
proto.models.proto.cofd.ChangelingFields.prototype.getClarity = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.ChangelingFields} returns this
*/
proto.models.proto.cofd.ChangelingFields.prototype.setClarity = function(value) {
return jspb.Message.setProto3IntField(this, 1, value);
};
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.models.proto.cofd.CofdSheet.repeatedFields_ = [15,19,25,26];
/**
* Oneof group definitions for this message. Each group defines the field
* numbers belonging to that group. When of these fields' value is set, all
* other fields in the group are cleared. During deserialization, if multiple
* fields are encountered for a group, only the last value seen will be kept.
* @private {!Array<!Array<number>>}
* @const
*/
proto.models.proto.cofd.CofdSheet.oneofGroups_ = [[28,29,30]];
/**
* @enum {number}
*/
proto.models.proto.cofd.CofdSheet.SystemFieldsCase = {
SYSTEM_FIELDS_NOT_SET: 0,
CORE: 28,
MAGE: 29,
CHANGELING: 30
};
/**
* @return {proto.models.proto.cofd.CofdSheet.SystemFieldsCase}
*/
proto.models.proto.cofd.CofdSheet.prototype.getSystemFieldsCase = function() {
return /** @type {proto.models.proto.cofd.CofdSheet.SystemFieldsCase} */(jspb.Message.computeOneofCase(this, proto.models.proto.cofd.CofdSheet.oneofGroups_[0]));
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.CofdSheet.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.CofdSheet.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.CofdSheet} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, ""),
player: jspb.Message.getFieldWithDefault(msg, 2, ""),
campaign: jspb.Message.getFieldWithDefault(msg, 3, ""),
description: jspb.Message.getFieldWithDefault(msg, 4, ""),
strength: jspb.Message.getFieldWithDefault(msg, 6, 0),
dexterity: jspb.Message.getFieldWithDefault(msg, 7, 0),
stamina: jspb.Message.getFieldWithDefault(msg, 8, 0),
intelligence: jspb.Message.getFieldWithDefault(msg, 9, 0),
wits: jspb.Message.getFieldWithDefault(msg, 10, 0),
resolve: jspb.Message.getFieldWithDefault(msg, 11, 0),
presence: jspb.Message.getFieldWithDefault(msg, 12, 0),
manipulation: jspb.Message.getFieldWithDefault(msg, 13, 0),
composure: jspb.Message.getFieldWithDefault(msg, 14, 0),
physicalSkillsMap: (f = msg.getPhysicalSkillsMap()) ? f.toObject(includeInstance, proto.models.proto.cofd.CofdSheet.Skill.toObject) : [],
mentalSkillsMap: (f = msg.getMentalSkillsMap()) ? f.toObject(includeInstance, proto.models.proto.cofd.CofdSheet.Skill.toObject) : [],
socialSkillsMap: (f = msg.getSocialSkillsMap()) ? f.toObject(includeInstance, proto.models.proto.cofd.CofdSheet.Skill.toObject) : [],
meritsList: jspb.Message.toObjectList(msg.getMeritsList(),
proto.models.proto.cofd.CofdSheet.Merit.toObject, includeInstance),
conditionsList: jspb.Message.toObjectList(msg.getConditionsList(),
proto.models.proto.cofd.CofdSheet.Condition.toObject, includeInstance),
size: jspb.Message.getFieldWithDefault(msg, 20, 0),
health: jspb.Message.getFieldWithDefault(msg, 21, 0),
willpower: jspb.Message.getFieldWithDefault(msg, 22, 0),
experiencePoints: jspb.Message.getFieldWithDefault(msg, 23, 0),
beats: jspb.Message.getFieldWithDefault(msg, 24, 0),
itemsList: jspb.Message.toObjectList(msg.getItemsList(),
proto.models.proto.cofd.CofdSheet.Item.toObject, includeInstance),
attacksList: jspb.Message.toObjectList(msg.getAttacksList(),
proto.models.proto.cofd.CofdSheet.Attack.toObject, includeInstance),
otherDataMap: (f = msg.getOtherDataMap()) ? f.toObject(includeInstance, undefined) : [],
core: (f = msg.getCore()) && proto.models.proto.cofd.CoreFields.toObject(includeInstance, f),
mage: (f = msg.getMage()) && proto.models.proto.cofd.MageFields.toObject(includeInstance, f),
changeling: (f = msg.getChangeling()) && proto.models.proto.cofd.ChangelingFields.toObject(includeInstance, f)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.CofdSheet}
*/
proto.models.proto.cofd.CofdSheet.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.CofdSheet;
return proto.models.proto.cofd.CofdSheet.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.CofdSheet} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.CofdSheet}
*/
proto.models.proto.cofd.CofdSheet.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setPlayer(value);
break;
case 3:
var value = /** @type {string} */ (reader.readString());
msg.setCampaign(value);
break;
case 4:
var value = /** @type {string} */ (reader.readString());
msg.setDescription(value);
break;
case 6:
var value = /** @type {number} */ (reader.readInt32());
msg.setStrength(value);
break;
case 7:
var value = /** @type {number} */ (reader.readInt32());
msg.setDexterity(value);
break;
case 8:
var value = /** @type {number} */ (reader.readInt32());
msg.setStamina(value);
break;
case 9:
var value = /** @type {number} */ (reader.readInt32());
msg.setIntelligence(value);
break;
case 10:
var value = /** @type {number} */ (reader.readInt32());
msg.setWits(value);
break;
case 11:
var value = /** @type {number} */ (reader.readInt32());
msg.setResolve(value);
break;
case 12:
var value = /** @type {number} */ (reader.readInt32());
msg.setPresence(value);
break;
case 13:
var value = /** @type {number} */ (reader.readInt32());
msg.setManipulation(value);
break;
case 14:
var value = /** @type {number} */ (reader.readInt32());
msg.setComposure(value);
break;
case 16:
var value = msg.getPhysicalSkillsMap();
reader.readMessage(value, function(message, reader) {
jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader, "", new proto.models.proto.cofd.CofdSheet.Skill());
});
break;
case 17:
var value = msg.getMentalSkillsMap();
reader.readMessage(value, function(message, reader) {
jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader, "", new proto.models.proto.cofd.CofdSheet.Skill());
});
break;
case 18:
var value = msg.getSocialSkillsMap();
reader.readMessage(value, function(message, reader) {
jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader, "", new proto.models.proto.cofd.CofdSheet.Skill());
});
break;
case 15:
var value = new proto.models.proto.cofd.CofdSheet.Merit;
reader.readMessage(value,proto.models.proto.cofd.CofdSheet.Merit.deserializeBinaryFromReader);
msg.addMerits(value);
break;
case 19:
var value = new proto.models.proto.cofd.CofdSheet.Condition;
reader.readMessage(value,proto.models.proto.cofd.CofdSheet.Condition.deserializeBinaryFromReader);
msg.addConditions(value);
break;
case 20:
var value = /** @type {number} */ (reader.readInt32());
msg.setSize(value);
break;
case 21:
var value = /** @type {number} */ (reader.readInt32());
msg.setHealth(value);
break;
case 22:
var value = /** @type {number} */ (reader.readInt32());
msg.setWillpower(value);
break;
case 23:
var value = /** @type {number} */ (reader.readInt32());
msg.setExperiencePoints(value);
break;
case 24:
var value = /** @type {number} */ (reader.readInt32());
msg.setBeats(value);
break;
case 25:
var value = new proto.models.proto.cofd.CofdSheet.Item;
reader.readMessage(value,proto.models.proto.cofd.CofdSheet.Item.deserializeBinaryFromReader);
msg.addItems(value);
break;
case 26:
var value = new proto.models.proto.cofd.CofdSheet.Attack;
reader.readMessage(value,proto.models.proto.cofd.CofdSheet.Attack.deserializeBinaryFromReader);
msg.addAttacks(value);
break;
case 27:
var value = msg.getOtherDataMap();
reader.readMessage(value, function(message, reader) {
jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", "");
});
break;
case 28:
var value = new proto.models.proto.cofd.CoreFields;
reader.readMessage(value,proto.models.proto.cofd.CoreFields.deserializeBinaryFromReader);
msg.setCore(value);
break;
case 29:
var value = new proto.models.proto.cofd.MageFields;
reader.readMessage(value,proto.models.proto.cofd.MageFields.deserializeBinaryFromReader);
msg.setMage(value);
break;
case 30:
var value = new proto.models.proto.cofd.ChangelingFields;
reader.readMessage(value,proto.models.proto.cofd.ChangelingFields.deserializeBinaryFromReader);
msg.setChangeling(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.CofdSheet.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.CofdSheet.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.CofdSheet} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getPlayer();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
f = message.getCampaign();
if (f.length > 0) {
writer.writeString(
3,
f
);
}
f = message.getDescription();
if (f.length > 0) {
writer.writeString(
4,
f
);
}
f = message.getStrength();
if (f !== 0) {
writer.writeInt32(
6,
f
);
}
f = message.getDexterity();
if (f !== 0) {
writer.writeInt32(
7,
f
);
}
f = message.getStamina();
if (f !== 0) {
writer.writeInt32(
8,
f
);
}
f = message.getIntelligence();
if (f !== 0) {
writer.writeInt32(
9,
f
);
}
f = message.getWits();
if (f !== 0) {
writer.writeInt32(
10,
f
);
}
f = message.getResolve();
if (f !== 0) {
writer.writeInt32(
11,
f
);
}
f = message.getPresence();
if (f !== 0) {
writer.writeInt32(
12,
f
);
}
f = message.getManipulation();
if (f !== 0) {
writer.writeInt32(
13,
f
);
}
f = message.getComposure();
if (f !== 0) {
writer.writeInt32(
14,
f
);
}
f = message.getPhysicalSkillsMap(true);
if (f && f.getLength() > 0) {
f.serializeBinary(16, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter);
}
f = message.getMentalSkillsMap(true);
if (f && f.getLength() > 0) {
f.serializeBinary(17, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter);
}
f = message.getSocialSkillsMap(true);
if (f && f.getLength() > 0) {
f.serializeBinary(18, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter);
}
f = message.getMeritsList();
if (f.length > 0) {
writer.writeRepeatedMessage(
15,
f,
proto.models.proto.cofd.CofdSheet.Merit.serializeBinaryToWriter
);
}
f = message.getConditionsList();
if (f.length > 0) {
writer.writeRepeatedMessage(
19,
f,
proto.models.proto.cofd.CofdSheet.Condition.serializeBinaryToWriter
);
}
f = message.getSize();
if (f !== 0) {
writer.writeInt32(
20,
f
);
}
f = message.getHealth();
if (f !== 0) {
writer.writeInt32(
21,
f
);
}
f = message.getWillpower();
if (f !== 0) {
writer.writeInt32(
22,
f
);
}
f = message.getExperiencePoints();
if (f !== 0) {
writer.writeInt32(
23,
f
);
}
f = message.getBeats();
if (f !== 0) {
writer.writeInt32(
24,
f
);
}
f = message.getItemsList();
if (f.length > 0) {
writer.writeRepeatedMessage(
25,
f,
proto.models.proto.cofd.CofdSheet.Item.serializeBinaryToWriter
);
}
f = message.getAttacksList();
if (f.length > 0) {
writer.writeRepeatedMessage(
26,
f,
proto.models.proto.cofd.CofdSheet.Attack.serializeBinaryToWriter
);
}
f = message.getOtherDataMap(true);
if (f && f.getLength() > 0) {
f.serializeBinary(27, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString);
}
f = message.getCore();
if (f != null) {
writer.writeMessage(
28,
f,
proto.models.proto.cofd.CoreFields.serializeBinaryToWriter
);
}
f = message.getMage();
if (f != null) {
writer.writeMessage(
29,
f,
proto.models.proto.cofd.MageFields.serializeBinaryToWriter
);
}
f = message.getChangeling();
if (f != null) {
writer.writeMessage(
30,
f,
proto.models.proto.cofd.ChangelingFields.serializeBinaryToWriter
);
}
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.CofdSheet.Merit.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.CofdSheet.Merit.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.CofdSheet.Merit} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Merit.toObject = function(includeInstance, msg) {
var f, obj = {
dots: jspb.Message.getFieldWithDefault(msg, 1, 0),
name: jspb.Message.getFieldWithDefault(msg, 2, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.CofdSheet.Merit}
*/
proto.models.proto.cofd.CofdSheet.Merit.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.CofdSheet.Merit;
return proto.models.proto.cofd.CofdSheet.Merit.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.CofdSheet.Merit} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.CofdSheet.Merit}
*/
proto.models.proto.cofd.CofdSheet.Merit.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {number} */ (reader.readInt32());
msg.setDots(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.CofdSheet.Merit.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.CofdSheet.Merit.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.CofdSheet.Merit} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Merit.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getDots();
if (f !== 0) {
writer.writeInt32(
1,
f
);
}
f = message.getName();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
};
/**
* optional int32 dots = 1;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.Merit.prototype.getDots = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet.Merit} returns this
*/
proto.models.proto.cofd.CofdSheet.Merit.prototype.setDots = function(value) {
return jspb.Message.setProto3IntField(this, 1, value);
};
/**
* optional string name = 2;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.Merit.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet.Merit} returns this
*/
proto.models.proto.cofd.CofdSheet.Merit.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.CofdSheet.Condition.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.CofdSheet.Condition.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.CofdSheet.Condition} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Condition.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.CofdSheet.Condition}
*/
proto.models.proto.cofd.CofdSheet.Condition.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.CofdSheet.Condition;
return proto.models.proto.cofd.CofdSheet.Condition.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.CofdSheet.Condition} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.CofdSheet.Condition}
*/
proto.models.proto.cofd.CofdSheet.Condition.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.CofdSheet.Condition.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.CofdSheet.Condition.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.CofdSheet.Condition} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Condition.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
};
/**
* optional string name = 1;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.Condition.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet.Condition} returns this
*/
proto.models.proto.cofd.CofdSheet.Condition.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.models.proto.cofd.CofdSheet.Skill.repeatedFields_ = [4];
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.CofdSheet.Skill.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.CofdSheet.Skill} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Skill.toObject = function(includeInstance, msg) {
var f, obj = {
dots: jspb.Message.getFieldWithDefault(msg, 1, 0),
name: jspb.Message.getFieldWithDefault(msg, 2, ""),
untrainedPenalty: jspb.Message.getFieldWithDefault(msg, 3, 0),
specializationsList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.CofdSheet.Skill}
*/
proto.models.proto.cofd.CofdSheet.Skill.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.CofdSheet.Skill;
return proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.CofdSheet.Skill} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.CofdSheet.Skill}
*/
proto.models.proto.cofd.CofdSheet.Skill.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {number} */ (reader.readInt32());
msg.setDots(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
case 3:
var value = /** @type {number} */ (reader.readSint32());
msg.setUntrainedPenalty(value);
break;
case 4:
var value = /** @type {string} */ (reader.readString());
msg.addSpecializations(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.CofdSheet.Skill} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Skill.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getDots();
if (f !== 0) {
writer.writeInt32(
1,
f
);
}
f = message.getName();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
f = message.getUntrainedPenalty();
if (f !== 0) {
writer.writeSint32(
3,
f
);
}
f = message.getSpecializationsList();
if (f.length > 0) {
writer.writeRepeatedString(
4,
f
);
}
};
/**
* optional int32 dots = 1;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.getDots = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.setDots = function(value) {
return jspb.Message.setProto3IntField(this, 1, value);
};
/**
* optional string name = 2;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
/**
* optional sint32 untrained_penalty = 3;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.getUntrainedPenalty = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.setUntrainedPenalty = function(value) {
return jspb.Message.setProto3IntField(this, 3, value);
};
/**
* repeated string specializations = 4;
* @return {!Array<string>}
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.getSpecializationsList = function() {
return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4));
};
/**
* @param {!Array<string>} value
* @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.setSpecializationsList = function(value) {
return jspb.Message.setField(this, 4, value || []);
};
/**
* @param {string} value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.addSpecializations = function(value, opt_index) {
return jspb.Message.addToRepeatedField(this, 4, value, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.CofdSheet.Skill} returns this
*/
proto.models.proto.cofd.CofdSheet.Skill.prototype.clearSpecializationsList = function() {
return this.setSpecializationsList([]);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.CofdSheet.Item.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.CofdSheet.Item.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.CofdSheet.Item} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Item.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, ""),
description: jspb.Message.getFieldWithDefault(msg, 2, ""),
rules: jspb.Message.getFieldWithDefault(msg, 3, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.CofdSheet.Item}
*/
proto.models.proto.cofd.CofdSheet.Item.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.CofdSheet.Item;
return proto.models.proto.cofd.CofdSheet.Item.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.CofdSheet.Item} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.CofdSheet.Item}
*/
proto.models.proto.cofd.CofdSheet.Item.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setDescription(value);
break;
case 3:
var value = /** @type {string} */ (reader.readString());
msg.setRules(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.CofdSheet.Item.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.CofdSheet.Item.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.CofdSheet.Item} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Item.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getDescription();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
f = message.getRules();
if (f.length > 0) {
writer.writeString(
3,
f
);
}
};
/**
* optional string name = 1;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.Item.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet.Item} returns this
*/
proto.models.proto.cofd.CofdSheet.Item.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional string description = 2;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.Item.prototype.getDescription = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet.Item} returns this
*/
proto.models.proto.cofd.CofdSheet.Item.prototype.setDescription = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
/**
* optional string rules = 3;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.Item.prototype.getRules = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet.Item} returns this
*/
proto.models.proto.cofd.CofdSheet.Item.prototype.setRules = function(value) {
return jspb.Message.setProto3StringField(this, 3, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.toObject = function(opt_includeInstance) {
return proto.models.proto.cofd.CofdSheet.Attack.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.models.proto.cofd.CofdSheet.Attack} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Attack.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, ""),
dicePool: jspb.Message.getFieldWithDefault(msg, 2, 0),
damage: jspb.Message.getFieldWithDefault(msg, 3, 0),
range: jspb.Message.getFieldWithDefault(msg, 4, 0),
initiativeModifier: jspb.Message.getFieldWithDefault(msg, 5, 0),
size: jspb.Message.getFieldWithDefault(msg, 6, 0)
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.models.proto.cofd.CofdSheet.Attack}
*/
proto.models.proto.cofd.CofdSheet.Attack.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.models.proto.cofd.CofdSheet.Attack;
return proto.models.proto.cofd.CofdSheet.Attack.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.models.proto.cofd.CofdSheet.Attack} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.models.proto.cofd.CofdSheet.Attack}
*/
proto.models.proto.cofd.CofdSheet.Attack.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
case 2:
var value = /** @type {number} */ (reader.readInt32());
msg.setDicePool(value);
break;
case 3:
var value = /** @type {number} */ (reader.readInt32());
msg.setDamage(value);
break;
case 4:
var value = /** @type {number} */ (reader.readInt32());
msg.setRange(value);
break;
case 5:
var value = /** @type {number} */ (reader.readSint32());
msg.setInitiativeModifier(value);
break;
case 6:
var value = /** @type {number} */ (reader.readInt32());
msg.setSize(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.models.proto.cofd.CofdSheet.Attack.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.models.proto.cofd.CofdSheet.Attack} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.models.proto.cofd.CofdSheet.Attack.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getDicePool();
if (f !== 0) {
writer.writeInt32(
2,
f
);
}
f = message.getDamage();
if (f !== 0) {
writer.writeInt32(
3,
f
);
}
f = message.getRange();
if (f !== 0) {
writer.writeInt32(
4,
f
);
}
f = message.getInitiativeModifier();
if (f !== 0) {
writer.writeSint32(
5,
f
);
}
f = message.getSize();
if (f !== 0) {
writer.writeInt32(
6,
f
);
}
};
/**
* optional string name = 1;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional int32 dice_pool = 2;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.getDicePool = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.setDicePool = function(value) {
return jspb.Message.setProto3IntField(this, 2, value);
};
/**
* optional int32 damage = 3;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.getDamage = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.setDamage = function(value) {
return jspb.Message.setProto3IntField(this, 3, value);
};
/**
* optional int32 range = 4;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.getRange = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.setRange = function(value) {
return jspb.Message.setProto3IntField(this, 4, value);
};
/**
* optional sint32 initiative_modifier = 5;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.getInitiativeModifier = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.setInitiativeModifier = function(value) {
return jspb.Message.setProto3IntField(this, 5, value);
};
/**
* optional int32 size = 6;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.getSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet.Attack} returns this
*/
proto.models.proto.cofd.CofdSheet.Attack.prototype.setSize = function(value) {
return jspb.Message.setProto3IntField(this, 6, value);
};
/**
* optional string name = 1;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional string player = 2;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.prototype.getPlayer = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setPlayer = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
/**
* optional string campaign = 3;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.prototype.getCampaign = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setCampaign = function(value) {
return jspb.Message.setProto3StringField(this, 3, value);
};
/**
* optional string description = 4;
* @return {string}
*/
proto.models.proto.cofd.CofdSheet.prototype.getDescription = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
};
/**
* @param {string} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setDescription = function(value) {
return jspb.Message.setProto3StringField(this, 4, value);
};
/**
* optional int32 strength = 6;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getStrength = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setStrength = function(value) {
return jspb.Message.setProto3IntField(this, 6, value);
};
/**
* optional int32 dexterity = 7;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getDexterity = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setDexterity = function(value) {
return jspb.Message.setProto3IntField(this, 7, value);
};
/**
* optional int32 stamina = 8;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getStamina = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setStamina = function(value) {
return jspb.Message.setProto3IntField(this, 8, value);
};
/**
* optional int32 intelligence = 9;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getIntelligence = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 9, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setIntelligence = function(value) {
return jspb.Message.setProto3IntField(this, 9, value);
};
/**
* optional int32 wits = 10;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getWits = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 10, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setWits = function(value) {
return jspb.Message.setProto3IntField(this, 10, value);
};
/**
* optional int32 resolve = 11;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getResolve = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 11, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setResolve = function(value) {
return jspb.Message.setProto3IntField(this, 11, value);
};
/**
* optional int32 presence = 12;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getPresence = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 12, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setPresence = function(value) {
return jspb.Message.setProto3IntField(this, 12, value);
};
/**
* optional int32 manipulation = 13;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getManipulation = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 13, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setManipulation = function(value) {
return jspb.Message.setProto3IntField(this, 13, value);
};
/**
* optional int32 composure = 14;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getComposure = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 14, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setComposure = function(value) {
return jspb.Message.setProto3IntField(this, 14, value);
};
/**
* map<string, Skill> physical_skills = 16;
* @param {boolean=} opt_noLazyCreate Do not create the map if
* empty, instead returning `undefined`
* @return {!jspb.Map<string,!proto.models.proto.cofd.CofdSheet.Skill>}
*/
proto.models.proto.cofd.CofdSheet.prototype.getPhysicalSkillsMap = function(opt_noLazyCreate) {
return /** @type {!jspb.Map<string,!proto.models.proto.cofd.CofdSheet.Skill>} */ (
jspb.Message.getMapField(this, 16, opt_noLazyCreate,
proto.models.proto.cofd.CofdSheet.Skill));
};
/**
* Clears values from the map. The map will be non-null.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearPhysicalSkillsMap = function() {
this.getPhysicalSkillsMap().clear();
return this;};
/**
* map<string, Skill> mental_skills = 17;
* @param {boolean=} opt_noLazyCreate Do not create the map if
* empty, instead returning `undefined`
* @return {!jspb.Map<string,!proto.models.proto.cofd.CofdSheet.Skill>}
*/
proto.models.proto.cofd.CofdSheet.prototype.getMentalSkillsMap = function(opt_noLazyCreate) {
return /** @type {!jspb.Map<string,!proto.models.proto.cofd.CofdSheet.Skill>} */ (
jspb.Message.getMapField(this, 17, opt_noLazyCreate,
proto.models.proto.cofd.CofdSheet.Skill));
};
/**
* Clears values from the map. The map will be non-null.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearMentalSkillsMap = function() {
this.getMentalSkillsMap().clear();
return this;};
/**
* map<string, Skill> social_skills = 18;
* @param {boolean=} opt_noLazyCreate Do not create the map if
* empty, instead returning `undefined`
* @return {!jspb.Map<string,!proto.models.proto.cofd.CofdSheet.Skill>}
*/
proto.models.proto.cofd.CofdSheet.prototype.getSocialSkillsMap = function(opt_noLazyCreate) {
return /** @type {!jspb.Map<string,!proto.models.proto.cofd.CofdSheet.Skill>} */ (
jspb.Message.getMapField(this, 18, opt_noLazyCreate,
proto.models.proto.cofd.CofdSheet.Skill));
};
/**
* Clears values from the map. The map will be non-null.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearSocialSkillsMap = function() {
this.getSocialSkillsMap().clear();
return this;};
/**
* repeated Merit merits = 15;
* @return {!Array<!proto.models.proto.cofd.CofdSheet.Merit>}
*/
proto.models.proto.cofd.CofdSheet.prototype.getMeritsList = function() {
return /** @type{!Array<!proto.models.proto.cofd.CofdSheet.Merit>} */ (
jspb.Message.getRepeatedWrapperField(this, proto.models.proto.cofd.CofdSheet.Merit, 15));
};
/**
* @param {!Array<!proto.models.proto.cofd.CofdSheet.Merit>} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setMeritsList = function(value) {
return jspb.Message.setRepeatedWrapperField(this, 15, value);
};
/**
* @param {!proto.models.proto.cofd.CofdSheet.Merit=} opt_value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.CofdSheet.Merit}
*/
proto.models.proto.cofd.CofdSheet.prototype.addMerits = function(opt_value, opt_index) {
return jspb.Message.addToRepeatedWrapperField(this, 15, opt_value, proto.models.proto.cofd.CofdSheet.Merit, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearMeritsList = function() {
return this.setMeritsList([]);
};
/**
* repeated Condition conditions = 19;
* @return {!Array<!proto.models.proto.cofd.CofdSheet.Condition>}
*/
proto.models.proto.cofd.CofdSheet.prototype.getConditionsList = function() {
return /** @type{!Array<!proto.models.proto.cofd.CofdSheet.Condition>} */ (
jspb.Message.getRepeatedWrapperField(this, proto.models.proto.cofd.CofdSheet.Condition, 19));
};
/**
* @param {!Array<!proto.models.proto.cofd.CofdSheet.Condition>} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setConditionsList = function(value) {
return jspb.Message.setRepeatedWrapperField(this, 19, value);
};
/**
* @param {!proto.models.proto.cofd.CofdSheet.Condition=} opt_value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.CofdSheet.Condition}
*/
proto.models.proto.cofd.CofdSheet.prototype.addConditions = function(opt_value, opt_index) {
return jspb.Message.addToRepeatedWrapperField(this, 19, opt_value, proto.models.proto.cofd.CofdSheet.Condition, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearConditionsList = function() {
return this.setConditionsList([]);
};
/**
* optional int32 size = 20;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getSize = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 20, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setSize = function(value) {
return jspb.Message.setProto3IntField(this, 20, value);
};
/**
* optional int32 health = 21;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getHealth = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 21, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setHealth = function(value) {
return jspb.Message.setProto3IntField(this, 21, value);
};
/**
* optional int32 willpower = 22;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getWillpower = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 22, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setWillpower = function(value) {
return jspb.Message.setProto3IntField(this, 22, value);
};
/**
* optional int32 experience_points = 23;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getExperiencePoints = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 23, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setExperiencePoints = function(value) {
return jspb.Message.setProto3IntField(this, 23, value);
};
/**
* optional int32 beats = 24;
* @return {number}
*/
proto.models.proto.cofd.CofdSheet.prototype.getBeats = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 24, 0));
};
/**
* @param {number} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setBeats = function(value) {
return jspb.Message.setProto3IntField(this, 24, value);
};
/**
* repeated Item items = 25;
* @return {!Array<!proto.models.proto.cofd.CofdSheet.Item>}
*/
proto.models.proto.cofd.CofdSheet.prototype.getItemsList = function() {
return /** @type{!Array<!proto.models.proto.cofd.CofdSheet.Item>} */ (
jspb.Message.getRepeatedWrapperField(this, proto.models.proto.cofd.CofdSheet.Item, 25));
};
/**
* @param {!Array<!proto.models.proto.cofd.CofdSheet.Item>} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setItemsList = function(value) {
return jspb.Message.setRepeatedWrapperField(this, 25, value);
};
/**
* @param {!proto.models.proto.cofd.CofdSheet.Item=} opt_value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.CofdSheet.Item}
*/
proto.models.proto.cofd.CofdSheet.prototype.addItems = function(opt_value, opt_index) {
return jspb.Message.addToRepeatedWrapperField(this, 25, opt_value, proto.models.proto.cofd.CofdSheet.Item, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearItemsList = function() {
return this.setItemsList([]);
};
/**
* repeated Attack attacks = 26;
* @return {!Array<!proto.models.proto.cofd.CofdSheet.Attack>}
*/
proto.models.proto.cofd.CofdSheet.prototype.getAttacksList = function() {
return /** @type{!Array<!proto.models.proto.cofd.CofdSheet.Attack>} */ (
jspb.Message.getRepeatedWrapperField(this, proto.models.proto.cofd.CofdSheet.Attack, 26));
};
/**
* @param {!Array<!proto.models.proto.cofd.CofdSheet.Attack>} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setAttacksList = function(value) {
return jspb.Message.setRepeatedWrapperField(this, 26, value);
};
/**
* @param {!proto.models.proto.cofd.CofdSheet.Attack=} opt_value
* @param {number=} opt_index
* @return {!proto.models.proto.cofd.CofdSheet.Attack}
*/
proto.models.proto.cofd.CofdSheet.prototype.addAttacks = function(opt_value, opt_index) {
return jspb.Message.addToRepeatedWrapperField(this, 26, opt_value, proto.models.proto.cofd.CofdSheet.Attack, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearAttacksList = function() {
return this.setAttacksList([]);
};
/**
* map<string, string> other_data = 27;
* @param {boolean=} opt_noLazyCreate Do not create the map if
* empty, instead returning `undefined`
* @return {!jspb.Map<string,string>}
*/
proto.models.proto.cofd.CofdSheet.prototype.getOtherDataMap = function(opt_noLazyCreate) {
return /** @type {!jspb.Map<string,string>} */ (
jspb.Message.getMapField(this, 27, opt_noLazyCreate,
null));
};
/**
* Clears values from the map. The map will be non-null.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearOtherDataMap = function() {
this.getOtherDataMap().clear();
return this;};
/**
* optional CoreFields core = 28;
* @return {?proto.models.proto.cofd.CoreFields}
*/
proto.models.proto.cofd.CofdSheet.prototype.getCore = function() {
return /** @type{?proto.models.proto.cofd.CoreFields} */ (
jspb.Message.getWrapperField(this, proto.models.proto.cofd.CoreFields, 28));
};
/**
* @param {?proto.models.proto.cofd.CoreFields|undefined} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setCore = function(value) {
return jspb.Message.setOneofWrapperField(this, 28, proto.models.proto.cofd.CofdSheet.oneofGroups_[0], value);
};
/**
* Clears the message field making it undefined.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearCore = function() {
return this.setCore(undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.models.proto.cofd.CofdSheet.prototype.hasCore = function() {
return jspb.Message.getField(this, 28) != null;
};
/**
* optional MageFields mage = 29;
* @return {?proto.models.proto.cofd.MageFields}
*/
proto.models.proto.cofd.CofdSheet.prototype.getMage = function() {
return /** @type{?proto.models.proto.cofd.MageFields} */ (
jspb.Message.getWrapperField(this, proto.models.proto.cofd.MageFields, 29));
};
/**
* @param {?proto.models.proto.cofd.MageFields|undefined} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setMage = function(value) {
return jspb.Message.setOneofWrapperField(this, 29, proto.models.proto.cofd.CofdSheet.oneofGroups_[0], value);
};
/**
* Clears the message field making it undefined.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearMage = function() {
return this.setMage(undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.models.proto.cofd.CofdSheet.prototype.hasMage = function() {
return jspb.Message.getField(this, 29) != null;
};
/**
* optional ChangelingFields changeling = 30;
* @return {?proto.models.proto.cofd.ChangelingFields}
*/
proto.models.proto.cofd.CofdSheet.prototype.getChangeling = function() {
return /** @type{?proto.models.proto.cofd.ChangelingFields} */ (
jspb.Message.getWrapperField(this, proto.models.proto.cofd.ChangelingFields, 30));
};
/**
* @param {?proto.models.proto.cofd.ChangelingFields|undefined} value
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.setChangeling = function(value) {
return jspb.Message.setOneofWrapperField(this, 30, proto.models.proto.cofd.CofdSheet.oneofGroups_[0], value);
};
/**
* Clears the message field making it undefined.
* @return {!proto.models.proto.cofd.CofdSheet} returns this
*/
proto.models.proto.cofd.CofdSheet.prototype.clearChangeling = function() {
return this.setChangeling(undefined);
};
/**
* Returns whether this field is set.
* @return {boolean}
*/
proto.models.proto.cofd.CofdSheet.prototype.hasChangeling = function() {
return jspb.Message.getField(this, 30) != null;
};
goog.object.extend(exports, proto.models.proto.cofd);
/***/ })
}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9fcHJvdG8vY29mZF9hcGlfcGIuanMiLCJ3ZWJwYWNrOi8vLy4vX3Byb3RvL2NvZmRfcGIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLG1CQUFPLENBQUMsOEVBQWlCO0FBQ3BDO0FBQ0E7O0FBRUEsY0FBYyxtQkFBTyxDQUFDLHlDQUFjO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9B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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBLG1CQUFtQixvQ0FBb0M7QUFDdkQ7QUFDQTs7O0FBR0E7QUFDQSxXQUFXLDhDQUE4QztBQUN6RCxZQUFZLG1DQUFtQztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFlBQVksbUNBQW1DO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxtQkFBbUIsb0NBQW9DO0FBQ3ZEO0FBQ0E7OztBQUdBO0FBQ0EsV0FBVyw4Q0FBOEM7QUFDekQsWUFBWSxtQ0FBbUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxZQUFZLG1DQUFtQztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsbUJBQW1CLDBDQUEwQztBQUM3RDtBQUNBOzs7QUFHQTtBQUNBLFdBQVcsb0RBQW9EO0FBQy9ELFlBQVksbUNBQW1DO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsWUFBWSxtQ0FBbUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBIiwiZmlsZSI6Il9wcm90b19jb2ZkX2FwaV9wYl9qcy5idW5kbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzb3VyY2U6IGNvZmRfYXBpLnByb3RvXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIEBlbmhhbmNlYWJsZVxuICogQHN1cHByZXNzIHttZXNzYWdlQ29udmVudGlvbnN9IEpTIENvbXBpbGVyIHJlcG9ydHMgYW4gZXJyb3IgaWYgYSB2YXJpYWJsZSBvclxuICogICAgIGZpZWxkIHN0YXJ0cyB3aXRoICdNU0dfJyBhbmQgaXNuJ3QgYSB0cmFuc2xhdGFibGUgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuLy8gR0VORVJBVEVEIENPREUgLS0gRE8gTk9UIEVESVQhXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gQHRzLW5vY2hlY2tcblxudmFyIGpzcGIgPSByZXF1aXJlKCdnb29nbGUtcHJvdG9idWYnKTtcbnZhciBnb29nID0ganNwYjtcbnZhciBnbG9iYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG52YXIgY29mZF9wYiA9IHJlcXVpcmUoJy4vY29mZF9wYi5qcycpO1xuZ29vZy5vYmplY3QuZXh0ZW5kKHByb3RvLCBjb2ZkX3BiKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcycsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mbycsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbicsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUnLCBudWxsLCBnbG9iYWwpO1xuZ29vZy5leHBvcnRTeW1ib2woJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMnLCBudWxsLCBnbG9iYWwpO1xuZ29vZy5leHBvcnRTeW1ib2woJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0JywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QnLCBudWxsLCBnbG9iYWwpO1xuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8gPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mbywganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8uZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mbyc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMsIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcyc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QsIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdC5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdCc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscyA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5yZXBlYXRlZEZpZWxkc18sIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscywganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMuZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscyc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZSwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdCA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgbnVsbCwgbnVsbCk7XG59O1xuZ29vZy5pbmhlcml0cyhwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QsIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QuZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0Jztcbn1cbi8qKlxuICogR2VuZXJhdGVkIGJ5IEpzUGJDb2RlR2VuZXJhdG9yLlxuICogQHBhcmFtIHtBcnJheT19IG9wdF9kYXRhIE9wdGlvbmFsIGluaXRpYWwgZGF0YSBhcnJheSwgdHlwaWNhbGx5IGZyb20gYVxuICogc2VydmVyIHJlc3BvbnNlLCBvciBjb25zdHJ1Y3RlZCBkaXJlY3RseSBpbiBKYXZhc2NyaXB0LiBUaGUgYXJyYXkgaXMgdXNlZFxuICogaW4gcGxhY2UgYW5kIGJlY29tZXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgb2JqZWN0LiBJdCBpcyBub3QgY2xvbmVkLlxuICogSWYgbm8gZGF0YSBpcyBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3aWxsIGJlIGVtcHR5LCBidXQgc3RpbGxcbiAqIHZhbGlkLlxuICogQGV4dGVuZHMge2pzcGIuTWVzc2FnZX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGUgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS5yZXBlYXRlZEZpZWxkc18sIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLmRpc3BsYXlOYW1lID0gJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZSc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbiA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgbnVsbCwgbnVsbCk7XG59O1xuZ29vZy5pbmhlcml0cyhwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbi5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uJztcbn1cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mby5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mby50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgbmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCBcIlwiKSxcbiAgICBnZW5kZXI6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMiwgXCJcIiksXG4gICAgY29uY2VwdDoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCBcIlwiKSxcbiAgICBjaHJvbmljbGU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgNCwgXCJcIiksXG4gICAgYWdlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDUsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mbztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRHZW5kZXIodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRDb25jZXB0KHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0Q2hyb25pY2xlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRBZ2UodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXROYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0R2VuZGVyKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0Q29uY2VwdCgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENocm9uaWNsZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgNCxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldEFnZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNSxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mby5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBnZW5kZXIgPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5nZXRHZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm99IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5zZXRHZW5kZXIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgY29uY2VwdCA9IDM7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLmdldENvbmNlcHQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMywgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm99IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQmFzaWNJbmZvLnByb3RvdHlwZS5zZXRDb25jZXB0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIGNocm9uaWNsZSA9IDQ7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLmdldENocm9uaWNsZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA0LCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLnNldENocm9uaWNsZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgNCwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIGludDMyIGFnZSA9IDU7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLmdldEFnZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA1LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkJhc2ljSW5mb30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5CYXNpY0luZm8ucHJvdG90eXBlLnNldEFnZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgNSwgdmFsdWUpO1xufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBzdHJlbmd0aDoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCAwKSxcbiAgICBkZXh0ZXJpdHk6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMiwgMCksXG4gICAgc3RhbWluYToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCAwKSxcbiAgICBpbnRlbGxpZ2VuY2U6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgNCwgMCksXG4gICAgd2l0czoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA1LCAwKSxcbiAgICByZXNvbHZlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDYsIDApLFxuICAgIHByZXNlbmNlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDcsIDApLFxuICAgIG1hbmlwdWxhdGlvbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA4LCAwKSxcbiAgICBjb21wb3N1cmU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgOSwgMClcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzO1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0U3RyZW5ndGgodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldERleHRlcml0eSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0U3RhbWluYSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0SW50ZWxsaWdlbmNlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRXaXRzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRSZXNvbHZlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRQcmVzZW5jZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0TWFuaXB1bGF0aW9uKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRDb21wb3N1cmUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlc30gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0U3RyZW5ndGgoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDEsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXREZXh0ZXJpdHkoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDIsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTdGFtaW5hKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0SW50ZWxsaWdlbmNlKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICA0LFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0V2l0cygpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFJlc29sdmUoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDYsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRQcmVzZW5jZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldE1hbmlwdWxhdGlvbigpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgOCxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENvbXBvc3VyZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgOSxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgc3RyZW5ndGggPSAxO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuZ2V0U3RyZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLnNldFN0cmVuZ3RoID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgZGV4dGVyaXR5ID0gMjtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLmdldERleHRlcml0eSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAyLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2V0RGV4dGVyaXR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgc3RhbWluYSA9IDM7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5nZXRTdGFtaW5hID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDMsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlc30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5zZXRTdGFtaW5hID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgaW50ZWxsaWdlbmNlID0gNDtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLmdldEludGVsbGlnZW5jZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA0LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2V0SW50ZWxsaWdlbmNlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA0LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgd2l0cyA9IDU7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5nZXRXaXRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDUsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlc30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5zZXRXaXRzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA1LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgcmVzb2x2ZSA9IDY7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5nZXRSZXNvbHZlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDYsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlc30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzLnByb3RvdHlwZS5zZXRSZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA2LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgcHJlc2VuY2UgPSA3O1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuZ2V0UHJlc2VuY2UgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgNywgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5BdHRyaWJ1dGVzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLnNldFByZXNlbmNlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA3LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgbWFuaXB1bGF0aW9uID0gODtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLmdldE1hbmlwdWxhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA4LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2V0TWFuaXB1bGF0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA4LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgY29tcG9zdXJlID0gOTtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXMucHJvdG90eXBlLmdldENvbXBvc3VyZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA5LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkF0dHJpYnV0ZXN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQXR0cmlidXRlcy5wcm90b3R5cGUuc2V0Q29tcG9zdXJlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA5LCB2YWx1ZSk7XG59O1xuXG5cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QudG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdH0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIGNoYXJhY3RlclVzZXJuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIGNoYXJhY3RlcklkOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIsIDApLFxuICAgIGF0dHJpYnV0ZU5hbWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMywgXCJcIiksXG4gICAgYXR0cmlidXRlVmFsdWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgNCwgMClcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0O1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3R9IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldENoYXJhY3RlclVzZXJuYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRDaGFyYWN0ZXJJZCh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldEF0dHJpYnV0ZU5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldEF0dHJpYnV0ZVZhbHVlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3R9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldENoYXJhY3RlclVzZXJuYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0Q2hhcmFjdGVySWQoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDIsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRBdHRyaWJ1dGVOYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlVmFsdWUoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDQsXG4gICAgICBmXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBjaGFyYWN0ZXJfdXNlcm5hbWUgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdC5wcm90b3R5cGUuZ2V0Q2hhcmFjdGVyVXNlcm5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLnNldENoYXJhY3RlclVzZXJuYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgY2hhcmFjdGVyX2lkID0gMjtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLmdldENoYXJhY3RlcklkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDIsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRDaGFyYWN0ZXJJZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMiwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBhdHRyaWJ1dGVfbmFtZSA9IDM7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDMsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgYXR0cmlidXRlX3ZhbHVlID0gNDtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZUF0dHJpYnV0ZVJlcXVlc3QucHJvdG90eXBlLmdldEF0dHJpYnV0ZVZhbHVlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDQsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlQXR0cmlidXRlUmVxdWVzdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVBdHRyaWJ1dGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgNCwgdmFsdWUpO1xufTtcblxuXG5cbi8qKlxuICogTGlzdCBvZiByZXBlYXRlZCBmaWVsZHMgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlLlxuICogQHByaXZhdGUgeyFBcnJheTxudW1iZXI+fVxuICogQGNvbnN0XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMucmVwZWF0ZWRGaWVsZHNfID0gWzEsMiwzXTtcblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsc30gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgcGh5c2ljYWxTa2lsbHNMaXN0OiBqc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0KG1zZy5nZXRQaHlzaWNhbFNraWxsc0xpc3QoKSxcbiAgICBjb2ZkX3BiLkNvZmRTaGVldC5Ta2lsbC50b09iamVjdCwgaW5jbHVkZUluc3RhbmNlKSxcbiAgICBtZW50YWxTa2lsbHNMaXN0OiBqc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0KG1zZy5nZXRNZW50YWxTa2lsbHNMaXN0KCksXG4gICAgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwudG9PYmplY3QsIGluY2x1ZGVJbnN0YW5jZSksXG4gICAgc29jaWFsU2tpbGxzTGlzdDoganNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdChtc2cuZ2V0U29jaWFsU2tpbGxzTGlzdCgpLFxuICAgIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLnRvT2JqZWN0LCBpbmNsdWRlSW5zdGFuY2UpXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsc30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGw7XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUsY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKTtcbiAgICAgIG1zZy5hZGRQaHlzaWNhbFNraWxscyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGw7XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUsY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKTtcbiAgICAgIG1zZy5hZGRNZW50YWxTa2lsbHModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgdmFyIHZhbHVlID0gbmV3IGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsO1xuICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHZhbHVlLGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkU29jaWFsU2tpbGxzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHN9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0UGh5c2ljYWxTa2lsbHNMaXN0KCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAxLFxuICAgICAgZixcbiAgICAgIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRNZW50YWxTa2lsbHNMaXN0KCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAyLFxuICAgICAgZixcbiAgICAgIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTb2NpYWxTa2lsbHNMaXN0KCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAzLFxuICAgICAgZixcbiAgICAgIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIHJlcGVhdGVkIG1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCBwaHlzaWNhbF9za2lsbHMgPSAxO1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5nZXRQaHlzaWNhbFNraWxsc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZXshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwsIDEpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5zZXRQaHlzaWNhbFNraWxsc0xpc3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFJlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw9fSBvcHRfdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2luZGV4XG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5hZGRQaHlzaWNhbFNraWxscyA9IGZ1bmN0aW9uKG9wdF92YWx1ZSwgb3B0X2luZGV4KSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuYWRkVG9SZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAxLCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuY2xlYXJQaHlzaWNhbFNraWxsc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0UGh5c2ljYWxTa2lsbHNMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiByZXBlYXRlZCBtb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwgbWVudGFsX3NraWxscyA9IDI7XG4gKiBAcmV0dXJuIHshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD59XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMucHJvdG90eXBlLmdldE1lbnRhbFNraWxsc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZXshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwsIDIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5zZXRNZW50YWxTa2lsbHNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPX0gb3B0X3ZhbHVlXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9pbmRleFxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuYWRkTWVudGFsU2tpbGxzID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDIsIG9wdF92YWx1ZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLCBvcHRfaW5kZXgpO1xufTtcblxuXG4vKipcbiAqIENsZWFycyB0aGUgbGlzdCBtYWtpbmcgaXQgZW1wdHkgYnV0IG5vbi1udWxsLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5jbGVhck1lbnRhbFNraWxsc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0TWVudGFsU2tpbGxzTGlzdChbXSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgbW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsIHNvY2lhbF9za2lsbHMgPSAzO1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzLnByb3RvdHlwZS5nZXRTb2NpYWxTa2lsbHNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGV7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fSAqLyAoXG4gICAganNwYi5NZXNzYWdlLmdldFJlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLCAzKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsc30gcmV0dXJucyB0aGlzXG4qL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuc2V0U29jaWFsU2tpbGxzTGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgMywgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbD19IG9wdF92YWx1ZVxuICogQHBhcmFtIHtudW1iZXI9fSBvcHRfaW5kZXhcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGx9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbHMucHJvdG90eXBlLmFkZFNvY2lhbFNraWxscyA9IGZ1bmN0aW9uKG9wdF92YWx1ZSwgb3B0X2luZGV4KSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuYWRkVG9SZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAzLCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxscy5wcm90b3R5cGUuY2xlYXJTb2NpYWxTa2lsbHNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNldFNvY2lhbFNraWxsc0xpc3QoW10pO1xufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUudG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGV9IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgbmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCBcIlwiKSxcbiAgICBza2lsbDogKGYgPSBtc2cuZ2V0U2tpbGwoKSkgJiYgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBmKVxuICB9O1xuXG4gIGlmIChpbmNsdWRlSW5zdGFuY2UpIHtcbiAgICBvYmouJGpzcGJNZXNzYWdlSW5zdGFuY2UgPSBtc2c7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG59XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbihieXRlcykge1xuICB2YXIgcmVhZGVyID0gbmV3IGpzcGIuQmluYXJ5UmVhZGVyKGJ5dGVzKTtcbiAgdmFyIG1zZyA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGU7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlfSBtc2cgVGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGRlc2VyaWFsaXplIGludG8uXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVJlYWRlcn0gcmVhZGVyIFRoZSBCaW5hcnlSZWFkZXIgdG8gdXNlLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gbmV3IGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsO1xuICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHZhbHVlLGNvZmRfcGIuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuc2V0U2tpbGwodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZX0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldE5hbWUoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDEsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTa2lsbCgpO1xuICBpZiAoZiAhPSBudWxsKSB7XG4gICAgd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgIDIsXG4gICAgICBmLFxuICAgICAgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZX0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZS5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIG1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCBza2lsbCA9IDI7XG4gKiBAcmV0dXJuIHs/cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLmdldFNraWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGV7P3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH0gKi8gKFxuICAgIGpzcGIuTWVzc2FnZS5nZXRXcmFwcGVyRmllbGQodGhpcywgY29mZF9wYi5Db2ZkU2hlZXQuU2tpbGwsIDIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0gez9wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGx8dW5kZWZpbmVkfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFVwZGF0ZX0gcmV0dXJucyB0aGlzXG4qL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsVXBkYXRlLnByb3RvdHlwZS5zZXRTa2lsbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0V3JhcHBlckZpZWxkKHRoaXMsIDIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIG1lc3NhZ2UgZmllbGQgbWFraW5nIGl0IHVuZGVmaW5lZC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGV9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLmNsZWFyU2tpbGwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0U2tpbGwodW5kZWZpbmVkKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBzZXQuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxVcGRhdGUucHJvdG90eXBlLmhhc1NraWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGQodGhpcywgMikgIT0gbnVsbDtcbn07XG5cblxuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0fSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIGNoYXJhY3RlclVzZXJuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIGNoYXJhY3RlcklkOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIsIDApLFxuICAgIHNraWxsTmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCBcIlwiKSxcbiAgICBza2lsbFZhbHVlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDQsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdDtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIobXNnLCByZWFkZXIpO1xufTtcblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpIGZyb20gdGhlXG4gKiBnaXZlbiByZWFkZXIgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3R9IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyID0gZnVuY3Rpb24obXNnLCByZWFkZXIpIHtcbiAgd2hpbGUgKHJlYWRlci5uZXh0RmllbGQoKSkge1xuICAgIGlmIChyZWFkZXIuaXNFbmRHcm91cCgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGZpZWxkID0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCk7XG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0Q2hhcmFjdGVyVXNlcm5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldENoYXJhY3RlcklkKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0U2tpbGxOYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRTa2lsbFZhbHVlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3R9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXRDaGFyYWN0ZXJVc2VybmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENoYXJhY3RlcklkKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0U2tpbGxOYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0U2tpbGxWYWx1ZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNCxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIGNoYXJhY3Rlcl91c2VybmFtZSA9IDE7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5wcm90b3R5cGUuZ2V0Q2hhcmFjdGVyVXNlcm5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5wcm90b3R5cGUuc2V0Q2hhcmFjdGVyVXNlcm5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBjaGFyYWN0ZXJfaWQgPSAyO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QucHJvdG90eXBlLmdldENoYXJhY3RlcklkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDIsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3R9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QucHJvdG90eXBlLnNldENoYXJhY3RlcklkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIHNraWxsX25hbWUgPSAzO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuVXBkYXRlU2tpbGxWYWx1ZVJlcXVlc3QucHJvdG90eXBlLmdldFNraWxsTmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAzLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnByb3RvdHlwZS5zZXRTa2lsbE5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDMsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBza2lsbF92YWx1ZSA9IDQ7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5VcGRhdGVTa2lsbFZhbHVlUmVxdWVzdC5wcm90b3R5cGUuZ2V0U2tpbGxWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA0LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlVwZGF0ZVNraWxsVmFsdWVSZXF1ZXN0LnByb3RvdHlwZS5zZXRTa2lsbFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCA0LCB2YWx1ZSk7XG59O1xuXG5cblxuLyoqXG4gKiBMaXN0IG9mIHJlcGVhdGVkIGZpZWxkcyB3aXRoaW4gdGhpcyBtZXNzYWdlIHR5cGUuXG4gKiBAcHJpdmF0ZSB7IUFycmF5PG51bWJlcj59XG4gKiBAY29uc3RcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnJlcGVhdGVkRmllbGRzXyA9IFsyXTtcblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZX0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIHNwZWNpYWxpemF0aW9uc0xpc3Q6IChmID0ganNwYi5NZXNzYWdlLmdldFJlcGVhdGVkRmllbGQobXNnLCAyKSkgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlO1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZX0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGV9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXROYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuYWRkU3BlY2lhbGl6YXRpb25zKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGV9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXROYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0U3BlY2lhbGl6YXRpb25zTGlzdCgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS5zZXROYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgc3RyaW5nIHNwZWNpYWxpemF0aW9ucyA9IDI7XG4gKiBAcmV0dXJuIHshQXJyYXk8c3RyaW5nPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS5nZXRTcGVjaWFsaXphdGlvbnNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUgeyFBcnJheTxzdHJpbmc+fSAqLyAoanNwYi5NZXNzYWdlLmdldFJlcGVhdGVkRmllbGQodGhpcywgMikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLlNraWxsU3BlY2lhbGl6YXRpb25zVXBkYXRlLnByb3RvdHlwZS5zZXRTcGVjaWFsaXphdGlvbnNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZCh0aGlzLCAyLCB2YWx1ZSB8fCBbXSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9pbmRleFxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZX0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Ta2lsbFNwZWNpYWxpemF0aW9uc1VwZGF0ZS5wcm90b3R5cGUuYWRkU3BlY2lhbGl6YXRpb25zID0gZnVuY3Rpb24odmFsdWUsIG9wdF9pbmRleCkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLmFkZFRvUmVwZWF0ZWRGaWVsZCh0aGlzLCAyLCB2YWx1ZSwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGV9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuU2tpbGxTcGVjaWFsaXphdGlvbnNVcGRhdGUucHJvdG90eXBlLmNsZWFyU3BlY2lhbGl6YXRpb25zTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zZXRTcGVjaWFsaXphdGlvbnNMaXN0KFtdKTtcbn07XG5cblxuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Db25kaXRpb24udG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9ufSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9ufVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbjtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Db25kaXRpb24uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbn0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9ufVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuYXBpLkNvbmRpdGlvbn0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXROYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Db25kaXRpb24ucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLmFwaS5Db25kaXRpb259IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkuQ29uZGl0aW9uLnByb3RvdHlwZS5zZXROYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbmdvb2cub2JqZWN0LmV4dGVuZChleHBvcnRzLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5hcGkpO1xuIiwiLy8gc291cmNlOiBjb2ZkLnByb3RvXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIEBlbmhhbmNlYWJsZVxuICogQHN1cHByZXNzIHttZXNzYWdlQ29udmVudGlvbnN9IEpTIENvbXBpbGVyIHJlcG9ydHMgYW4gZXJyb3IgaWYgYSB2YXJpYWJsZSBvclxuICogICAgIGZpZWxkIHN0YXJ0cyB3aXRoICdNU0dfJyBhbmQgaXNuJ3QgYSB0cmFuc2xhdGFibGUgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuLy8gR0VORVJBVEVEIENPREUgLS0gRE8gTk9UIEVESVQhXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gQHRzLW5vY2hlY2tcblxudmFyIGpzcGIgPSByZXF1aXJlKCdnb29nbGUtcHJvdG9idWYnKTtcbnZhciBnb29nID0ganNwYjtcbnZhciBnbG9iYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcycsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0JywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbScsIG51bGwsIGdsb2JhbCk7XG5nb29nLmV4cG9ydFN5bWJvbCgncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0JywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwnLCBudWxsLCBnbG9iYWwpO1xuZ29vZy5leHBvcnRTeW1ib2woJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5TeXN0ZW1GaWVsZHNDYXNlJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzJywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzJywgbnVsbCwgZ2xvYmFsKTtcbi8qKlxuICogR2VuZXJhdGVkIGJ5IEpzUGJDb2RlR2VuZXJhdG9yLlxuICogQHBhcmFtIHtBcnJheT19IG9wdF9kYXRhIE9wdGlvbmFsIGluaXRpYWwgZGF0YSBhcnJheSwgdHlwaWNhbGx5IGZyb20gYVxuICogc2VydmVyIHJlc3BvbnNlLCBvciBjb25zdHJ1Y3RlZCBkaXJlY3RseSBpbiBKYXZhc2NyaXB0LiBUaGUgYXJyYXkgaXMgdXNlZFxuICogaW4gcGxhY2UgYW5kIGJlY29tZXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgb2JqZWN0LiBJdCBpcyBub3QgY2xvbmVkLlxuICogSWYgbm8gZGF0YSBpcyBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3aWxsIGJlIGVtcHR5LCBidXQgc3RpbGxcbiAqIHZhbGlkLlxuICogQGV4dGVuZHMge2pzcGIuTWVzc2FnZX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMsIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzLmRpc3BsYXlOYW1lID0gJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcywganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMuZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcyc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcyA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgbnVsbCwgbnVsbCk7XG59O1xuZ29vZy5pbmhlcml0cyhwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcy5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzJztcbn1cbi8qKlxuICogR2VuZXJhdGVkIGJ5IEpzUGJDb2RlR2VuZXJhdG9yLlxuICogQHBhcmFtIHtBcnJheT19IG9wdF9kYXRhIE9wdGlvbmFsIGluaXRpYWwgZGF0YSBhcnJheSwgdHlwaWNhbGx5IGZyb20gYVxuICogc2VydmVyIHJlc3BvbnNlLCBvciBjb25zdHJ1Y3RlZCBkaXJlY3RseSBpbiBKYXZhc2NyaXB0LiBUaGUgYXJyYXkgaXMgdXNlZFxuICogaW4gcGxhY2UgYW5kIGJlY29tZXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgb2JqZWN0LiBJdCBpcyBub3QgY2xvbmVkLlxuICogSWYgbm8gZGF0YSBpcyBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3aWxsIGJlIGVtcHR5LCBidXQgc3RpbGxcbiAqIHZhbGlkLlxuICogQGV4dGVuZHMge2pzcGIuTWVzc2FnZX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5yZXBlYXRlZEZpZWxkc18sIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5vbmVvZkdyb3Vwc18pO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LmRpc3BsYXlOYW1lID0gJ3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldCc7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0ID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdCwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24gPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbiwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbic7XG59XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucmVwZWF0ZWRGaWVsZHNfLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5kaXNwbGF5TmFtZSA9ICdwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtLCBqc3BiLk1lc3NhZ2UpO1xuaWYgKGdvb2cuREVCVUcgJiYgIUNPTVBJTEVEKSB7XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBvdmVycmlkZVxuICAgKi9cbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0uZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0nO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIG51bGwsIG51bGwpO1xufTtcbmdvb2cuaW5oZXJpdHMocHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaywganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2suZGlzcGxheU5hbWUgPSAncHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjayc7XG59XG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHN9IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIGludGVncml0eToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCAwKVxuICB9O1xuXG4gIGlmIChpbmNsdWRlSW5zdGFuY2UpIHtcbiAgICBvYmouJGpzcGJNZXNzYWdlSW5zdGFuY2UgPSBtc2c7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG59XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkc31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHM7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHN9IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkc31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldEludGVncml0eSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzfSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldEludGVncml0eSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgaW50ZWdyaXR5ID0gMTtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5wcm90b3R5cGUuZ2V0SW50ZWdyaXR5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5wcm90b3R5cGUuc2V0SW50ZWdyaXR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkc30gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgd2lkc29tOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkc30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0V2lkc29tKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHN9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0V2lkc29tKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiB3aWRzb20gPSAxO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLnByb3RvdHlwZS5nZXRXaWRzb20gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHN9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzLnByb3RvdHlwZS5zZXRXaWRzb20gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMudG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBjbGFyaXR5OiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkc30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0Q2xhcml0eSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldENsYXJpdHkoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDEsXG4gICAgICBmXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIGludDMyIGNsYXJpdHkgPSAxO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLnByb3RvdHlwZS5nZXRDbGFyaXR5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcy5wcm90b3R5cGUuc2V0Q2xhcml0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG5cbi8qKlxuICogTGlzdCBvZiByZXBlYXRlZCBmaWVsZHMgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlLlxuICogQHByaXZhdGUgeyFBcnJheTxudW1iZXI+fVxuICogQGNvbnN0XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5yZXBlYXRlZEZpZWxkc18gPSBbMTUsMTksMjUsMjZdO1xuXG4vKipcbiAqIE9uZW9mIGdyb3VwIGRlZmluaXRpb25zIGZvciB0aGlzIG1lc3NhZ2UuIEVhY2ggZ3JvdXAgZGVmaW5lcyB0aGUgZmllbGRcbiAqIG51bWJlcnMgYmVsb25naW5nIHRvIHRoYXQgZ3JvdXAuIFdoZW4gb2YgdGhlc2UgZmllbGRzJyB2YWx1ZSBpcyBzZXQsIGFsbFxuICogb3RoZXIgZmllbGRzIGluIHRoZSBncm91cCBhcmUgY2xlYXJlZC4gRHVyaW5nIGRlc2VyaWFsaXphdGlvbiwgaWYgbXVsdGlwbGVcbiAqIGZpZWxkcyBhcmUgZW5jb3VudGVyZWQgZm9yIGEgZ3JvdXAsIG9ubHkgdGhlIGxhc3QgdmFsdWUgc2VlbiB3aWxsIGJlIGtlcHQuXG4gKiBAcHJpdmF0ZSB7IUFycmF5PCFBcnJheTxudW1iZXI+Pn1cbiAqIEBjb25zdFxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQub25lb2ZHcm91cHNfID0gW1syOCwyOSwzMF1dO1xuXG4vKipcbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5TeXN0ZW1GaWVsZHNDYXNlID0ge1xuICBTWVNURU1fRklFTERTX05PVF9TRVQ6IDAsXG4gIENPUkU6IDI4LFxuICBNQUdFOiAyOSxcbiAgQ0hBTkdFTElORzogMzBcbn07XG5cbi8qKlxuICogQHJldHVybiB7cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlN5c3RlbUZpZWxkc0Nhc2V9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0U3lzdGVtRmllbGRzQ2FzZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU3lzdGVtRmllbGRzQ2FzZX0gKi8oanNwYi5NZXNzYWdlLmNvbXB1dGVPbmVvZkNhc2UodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lm9uZW9mR3JvdXBzX1swXSkpO1xufTtcblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBuYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIHBsYXllcjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyLCBcIlwiKSxcbiAgICBjYW1wYWlnbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCBcIlwiKSxcbiAgICBkZXNjcmlwdGlvbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA0LCBcIlwiKSxcbiAgICBzdHJlbmd0aDoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA2LCAwKSxcbiAgICBkZXh0ZXJpdHk6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgNywgMCksXG4gICAgc3RhbWluYToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA4LCAwKSxcbiAgICBpbnRlbGxpZ2VuY2U6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgOSwgMCksXG4gICAgd2l0czoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxMCwgMCksXG4gICAgcmVzb2x2ZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxMSwgMCksXG4gICAgcHJlc2VuY2U6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMTIsIDApLFxuICAgIG1hbmlwdWxhdGlvbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxMywgMCksXG4gICAgY29tcG9zdXJlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDE0LCAwKSxcbiAgICBwaHlzaWNhbFNraWxsc01hcDogKGYgPSBtc2cuZ2V0UGh5c2ljYWxTa2lsbHNNYXAoKSkgPyBmLnRvT2JqZWN0KGluY2x1ZGVJbnN0YW5jZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnRvT2JqZWN0KSA6IFtdLFxuICAgIG1lbnRhbFNraWxsc01hcDogKGYgPSBtc2cuZ2V0TWVudGFsU2tpbGxzTWFwKCkpID8gZi50b09iamVjdChpbmNsdWRlSW5zdGFuY2UsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC50b09iamVjdCkgOiBbXSxcbiAgICBzb2NpYWxTa2lsbHNNYXA6IChmID0gbXNnLmdldFNvY2lhbFNraWxsc01hcCgpKSA/IGYudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwudG9PYmplY3QpIDogW10sXG4gICAgbWVyaXRzTGlzdDoganNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdChtc2cuZ2V0TWVyaXRzTGlzdCgpLFxuICAgIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC50b09iamVjdCwgaW5jbHVkZUluc3RhbmNlKSxcbiAgICBjb25kaXRpb25zTGlzdDoganNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdChtc2cuZ2V0Q29uZGl0aW9uc0xpc3QoKSxcbiAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uLnRvT2JqZWN0LCBpbmNsdWRlSW5zdGFuY2UpLFxuICAgIHNpemU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMjAsIDApLFxuICAgIGhlYWx0aDoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyMSwgMCksXG4gICAgd2lsbHBvd2VyOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIyLCAwKSxcbiAgICBleHBlcmllbmNlUG9pbnRzOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIzLCAwKSxcbiAgICBiZWF0czoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyNCwgMCksXG4gICAgaXRlbXNMaXN0OiBqc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0KG1zZy5nZXRJdGVtc0xpc3QoKSxcbiAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS50b09iamVjdCwgaW5jbHVkZUluc3RhbmNlKSxcbiAgICBhdHRhY2tzTGlzdDoganNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdChtc2cuZ2V0QXR0YWNrc0xpc3QoKSxcbiAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnRvT2JqZWN0LCBpbmNsdWRlSW5zdGFuY2UpLFxuICAgIG90aGVyRGF0YU1hcDogKGYgPSBtc2cuZ2V0T3RoZXJEYXRhTWFwKCkpID8gZi50b09iamVjdChpbmNsdWRlSW5zdGFuY2UsIHVuZGVmaW5lZCkgOiBbXSxcbiAgICBjb3JlOiAoZiA9IG1zZy5nZXRDb3JlKCkpICYmIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHMudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBmKSxcbiAgICBtYWdlOiAoZiA9IG1zZy5nZXRNYWdlKCkpICYmIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBmKSxcbiAgICBjaGFuZ2VsaW5nOiAoZiA9IG1zZy5nZXRDaGFuZ2VsaW5nKCkpICYmIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMudG9PYmplY3QoaW5jbHVkZUluc3RhbmNlLCBmKVxuICB9O1xuXG4gIGlmIChpbmNsdWRlSW5zdGFuY2UpIHtcbiAgICBvYmouJGpzcGJNZXNzYWdlSW5zdGFuY2UgPSBtc2c7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG59XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuZGVzZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbihieXRlcykge1xuICB2YXIgcmVhZGVyID0gbmV3IGpzcGIuQmluYXJ5UmVhZGVyKGJ5dGVzKTtcbiAgdmFyIG1zZyA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQ7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSBtc2cgVGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGRlc2VyaWFsaXplIGludG8uXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVJlYWRlcn0gcmVhZGVyIFRoZSBCaW5hcnlSZWFkZXIgdG8gdXNlLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRQbGF5ZXIodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRDYW1wYWlnbih2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldERlc2NyaXB0aW9uKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRTdHJlbmd0aCh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDc6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0RGV4dGVyaXR5KHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRTdGFtaW5hKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgOTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRJbnRlbGxpZ2VuY2UodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMDpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRXaXRzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0UmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldFByZXNlbmNlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTM6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0TWFuaXB1bGF0aW9uKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0Q29tcG9zdXJlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTY6XG4gICAgICB2YXIgdmFsdWUgPSBtc2cuZ2V0UGh5c2ljYWxTa2lsbHNNYXAoKTtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSwgZnVuY3Rpb24obWVzc2FnZSwgcmVhZGVyKSB7XG4gICAgICAgIGpzcGIuTWFwLmRlc2VyaWFsaXplQmluYXJ5KG1lc3NhZ2UsIHJlYWRlciwganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmcsIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkTWVzc2FnZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciwgXCJcIiwgbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCgpKTtcbiAgICAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxNzpcbiAgICAgIHZhciB2YWx1ZSA9IG1zZy5nZXRNZW50YWxTa2lsbHNNYXAoKTtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSwgZnVuY3Rpb24obWVzc2FnZSwgcmVhZGVyKSB7XG4gICAgICAgIGpzcGIuTWFwLmRlc2VyaWFsaXplQmluYXJ5KG1lc3NhZ2UsIHJlYWRlciwganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmcsIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkTWVzc2FnZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciwgXCJcIiwgbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCgpKTtcbiAgICAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxODpcbiAgICAgIHZhciB2YWx1ZSA9IG1zZy5nZXRTb2NpYWxTa2lsbHNNYXAoKTtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSwgZnVuY3Rpb24obWVzc2FnZSwgcmVhZGVyKSB7XG4gICAgICAgIGpzcGIuTWFwLmRlc2VyaWFsaXplQmluYXJ5KG1lc3NhZ2UsIHJlYWRlciwganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmcsIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkTWVzc2FnZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciwgXCJcIiwgbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbCgpKTtcbiAgICAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxNTpcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQ7XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUscHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkTWVyaXRzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTk6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbjtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSxwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkQ29uZGl0aW9ucyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDIwOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldFNpemUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRIZWFsdGgodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRXaWxscG93ZXIodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRFeHBlcmllbmNlUG9pbnRzKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJlYWRlci5yZWFkSW50MzIoKSk7XG4gICAgICBtc2cuc2V0QmVhdHModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyNTpcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbTtcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSxwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIpO1xuICAgICAgbXNnLmFkZEl0ZW1zKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjY6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaztcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSxwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkQXR0YWNrcyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI3OlxuICAgICAgdmFyIHZhbHVlID0gbXNnLmdldE90aGVyRGF0YU1hcCgpO1xuICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHZhbHVlLCBmdW5jdGlvbihtZXNzYWdlLCByZWFkZXIpIHtcbiAgICAgICAganNwYi5NYXAuZGVzZXJpYWxpemVCaW5hcnkobWVzc2FnZSwgcmVhZGVyLCBqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFN0cmluZywganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmcsIG51bGwsIFwiXCIsIFwiXCIpO1xuICAgICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI4OlxuICAgICAgdmFyIHZhbHVlID0gbmV3IHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvcmVGaWVsZHM7XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUscHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIpO1xuICAgICAgbXNnLnNldENvcmUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOTpcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5NYWdlRmllbGRzO1xuICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHZhbHVlLHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKTtcbiAgICAgIG1zZy5zZXRNYWdlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzA6XG4gICAgICB2YXIgdmFsdWUgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ2hhbmdlbGluZ0ZpZWxkcztcbiAgICAgIHJlYWRlci5yZWFkTWVzc2FnZSh2YWx1ZSxwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuc2V0Q2hhbmdlbGluZyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0TmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFBsYXllcigpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMixcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENhbXBhaWduKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0RGVzY3JpcHRpb24oKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDQsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTdHJlbmd0aCgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNixcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldERleHRlcml0eSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFN0YW1pbmEoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDgsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRJbnRlbGxpZ2VuY2UoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDksXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRXaXRzKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAxMCxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFJlc29sdmUoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDExLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0UHJlc2VuY2UoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDEyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0TWFuaXB1bGF0aW9uKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAxMyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENvbXBvc3VyZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgMTQsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRQaHlzaWNhbFNraWxsc01hcCh0cnVlKTtcbiAgaWYgKGYgJiYgZi5nZXRMZW5ndGgoKSA+IDApIHtcbiAgICBmLnNlcmlhbGl6ZUJpbmFyeSgxNiwgd3JpdGVyLCBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTdHJpbmcsIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZU1lc3NhZ2UsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcik7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0TWVudGFsU2tpbGxzTWFwKHRydWUpO1xuICBpZiAoZiAmJiBmLmdldExlbmd0aCgpID4gMCkge1xuICAgIGYuc2VyaWFsaXplQmluYXJ5KDE3LCB3cml0ZXIsIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVN0cmluZywganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlTWVzc2FnZSwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRTb2NpYWxTa2lsbHNNYXAodHJ1ZSk7XG4gIGlmIChmICYmIGYuZ2V0TGVuZ3RoKCkgPiAwKSB7XG4gICAgZi5zZXJpYWxpemVCaW5hcnkoMTgsIHdyaXRlciwganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU3RyaW5nLCBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVNZXNzYWdlLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIpO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldE1lcml0c0xpc3QoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgIDE1LFxuICAgICAgZixcbiAgICAgIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0Q29uZGl0aW9uc0xpc3QoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgIDE5LFxuICAgICAgZixcbiAgICAgIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFNpemUoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDIwLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0SGVhbHRoKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFdpbGxwb3dlcigpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgMjIsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRFeHBlcmllbmNlUG9pbnRzKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyMyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldEJlYXRzKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyNCxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldEl0ZW1zTGlzdCgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlUmVwZWF0ZWRNZXNzYWdlKFxuICAgICAgMjUsXG4gICAgICBmLFxuICAgICAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldEF0dGFja3NMaXN0KCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAyNixcbiAgICAgIGYsXG4gICAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRPdGhlckRhdGFNYXAodHJ1ZSk7XG4gIGlmIChmICYmIGYuZ2V0TGVuZ3RoKCkgPiAwKSB7XG4gICAgZi5zZXJpYWxpemVCaW5hcnkoMjcsIHdyaXRlciwganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU3RyaW5nLCBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTdHJpbmcpO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldENvcmUoKTtcbiAgaWYgKGYgIT0gbnVsbCkge1xuICAgIHdyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAyOCxcbiAgICAgIGYsXG4gICAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRNYWdlKCk7XG4gIGlmIChmICE9IG51bGwpIHtcbiAgICB3cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgMjksXG4gICAgICBmLFxuICAgICAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkcy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0Q2hhbmdlbGluZygpO1xuICBpZiAoZiAhPSBudWxsKSB7XG4gICAgd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgIDMwLFxuICAgICAgZixcbiAgICAgIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICApO1xuICB9XG59O1xuXG5cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdH0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICBkb3RzOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIDApLFxuICAgIG5hbWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMiwgXCJcIilcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0O1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdH0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXR9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldERvdHModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXROYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXR9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXREb3RzKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAxLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0TmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMixcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgZG90cyA9IDE7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5wcm90b3R5cGUuZ2V0RG90cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LnByb3RvdHlwZS5zZXREb3RzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdC5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMiwgdmFsdWUpO1xufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24ucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbi50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb259IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24udG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIG5hbWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMSwgXCJcIilcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb259XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uZGVzZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbihieXRlcykge1xuICB2YXIgcmVhZGVyID0gbmV3IGpzcGIuQmluYXJ5UmVhZGVyKGJ5dGVzKTtcbiAgdmFyIG1zZyA9IG5ldyBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uO1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbi5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIobXNnLCByZWFkZXIpO1xufTtcblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpIGZyb20gdGhlXG4gKiBnaXZlbiByZWFkZXIgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9ufSBtc2cgVGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGRlc2VyaWFsaXplIGludG8uXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVJlYWRlcn0gcmVhZGVyIFRoZSBCaW5hcnlSZWFkZXIgdG8gdXNlLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb259XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyID0gZnVuY3Rpb24obXNnLCByZWFkZXIpIHtcbiAgd2hpbGUgKHJlYWRlci5uZXh0RmllbGQoKSkge1xuICAgIGlmIChyZWFkZXIuaXNFbmRHcm91cCgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGZpZWxkID0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCk7XG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0TmFtZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24ucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9ufSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldE5hbWUoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDEsXG4gICAgICBmXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTtcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbi5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbn0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24ucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuXG4vKipcbiAqIExpc3Qgb2YgcmVwZWF0ZWQgZmllbGRzIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZS5cbiAqIEBwcml2YXRlIHshQXJyYXk8bnVtYmVyPn1cbiAqIEBjb25zdFxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucmVwZWF0ZWRGaWVsZHNfID0gWzRdO1xuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIGRvdHM6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMSwgMCksXG4gICAgbmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyLCBcIlwiKSxcbiAgICB1bnRyYWluZWRQZW5hbHR5OiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDMsIDApLFxuICAgIHNwZWNpYWxpemF0aW9uc0xpc3Q6IChmID0ganNwYi5NZXNzYWdlLmdldFJlcGVhdGVkRmllbGQobXNnLCA0KSkgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsO1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGx9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldERvdHModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXROYW1lKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRTaW50MzIoKSk7XG4gICAgICBtc2cuc2V0VW50cmFpbmVkUGVuYWx0eSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLmFkZFNwZWNpYWxpemF0aW9ucyh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBtc2c7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHJldHVybiB7IVVpbnQ4QXJyYXl9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSBtZXNzYWdlXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVdyaXRlcn0gd3JpdGVyXG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0RG90cygpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldE5hbWUoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDIsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRVbnRyYWluZWRQZW5hbHR5KCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlU2ludDMyKFxuICAgICAgMyxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldFNwZWNpYWxpemF0aW9uc0xpc3QoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKFxuICAgICAgNCxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgZG90cyA9IDE7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuZ2V0RG90cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnByb3RvdHlwZS5zZXREb3RzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAxLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMiwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHNpbnQzMiB1bnRyYWluZWRfcGVuYWx0eSA9IDM7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuZ2V0VW50cmFpbmVkUGVuYWx0eSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAzLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnByb3RvdHlwZS5zZXRVbnRyYWluZWRQZW5hbHR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNJbnRGaWVsZCh0aGlzLCAzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgc3RyaW5nIHNwZWNpYWxpemF0aW9ucyA9IDQ7XG4gKiBAcmV0dXJuIHshQXJyYXk8c3RyaW5nPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnByb3RvdHlwZS5nZXRTcGVjaWFsaXphdGlvbnNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUgeyFBcnJheTxzdHJpbmc+fSAqLyAoanNwYi5NZXNzYWdlLmdldFJlcGVhdGVkRmllbGQodGhpcywgNCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsLnByb3RvdHlwZS5zZXRTcGVjaWFsaXphdGlvbnNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZCh0aGlzLCA0LCB2YWx1ZSB8fCBbXSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9pbmRleFxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Ta2lsbC5wcm90b3R5cGUuYWRkU3BlY2lhbGl6YXRpb25zID0gZnVuY3Rpb24odmFsdWUsIG9wdF9pbmRleCkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLmFkZFRvUmVwZWF0ZWRGaWVsZCh0aGlzLCA0LCB2YWx1ZSwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGx9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwucHJvdG90eXBlLmNsZWFyU3BlY2lhbGl6YXRpb25zTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zZXRTcGVjaWFsaXphdGlvbnNMaXN0KFtdKTtcbn07XG5cblxuXG5cblxuaWYgKGpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QpIHtcbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90by5cbiAqIEZpZWxkIG5hbWVzIHRoYXQgYXJlIHJlc2VydmVkIGluIEphdmFTY3JpcHQgYW5kIHdpbGwgYmUgcmVuYW1lZCB0byBwYl9uYW1lLlxuICogT3B0aW9uYWwgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICogVG8gYWNjZXNzIGEgcmVzZXJ2ZWQgZmllbGQgdXNlLCBmb28ucGJfPG5hbWU+LCBlZywgZm9vLnBiX2RlZmF1bHQuXG4gKiBGb3IgdGhlIGxpc3Qgb2YgcmVzZXJ2ZWQgbmFtZXMgcGxlYXNlIHNlZTpcbiAqICAgICBuZXQvcHJvdG8yL2NvbXBpbGVyL2pzL2ludGVybmFsL2dlbmVyYXRvci5jYyNrS2V5d29yZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9pbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gd2hldGhlciB0byBpbmNsdWRlIHRoZVxuICogICAgIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtfSBtc2cgVGhlIG1zZyBpbnN0YW5jZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHshT2JqZWN0fVxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgbmFtZToganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAxLCBcIlwiKSxcbiAgICBkZXNjcmlwdGlvbjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAyLCBcIlwiKSxcbiAgICBydWxlczoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCAzLCBcIlwiKVxuICB9O1xuXG4gIGlmIChpbmNsdWRlSW5zdGFuY2UpIHtcbiAgICBvYmouJGpzcGJNZXNzYWdlSW5zdGFuY2UgPSBtc2c7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn07XG59XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlcyBUaGUgYnl0ZXMgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW19XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW07XG4gIHJldHVybiBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIobXNnLCByZWFkZXIpO1xufTtcblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpIGZyb20gdGhlXG4gKiBnaXZlbiByZWFkZXIgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbX0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyID0gZnVuY3Rpb24obXNnLCByZWFkZXIpIHtcbiAgd2hpbGUgKHJlYWRlci5uZXh0RmllbGQoKSkge1xuICAgIGlmIChyZWFkZXIuaXNFbmRHcm91cCgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGZpZWxkID0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCk7XG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0TmFtZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldERlc2NyaXB0aW9uKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0UnVsZXModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlXG4gKiBmb3JtYXQpLCB3cml0aW5nIHRvIHRoZSBnaXZlbiBCaW5hcnlXcml0ZXIuXG4gKiBAcGFyYW0geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbX0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0TmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldERlc2NyaXB0aW9uKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0UnVsZXMoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVN0cmluZyhcbiAgICAgIDMsXG4gICAgICBmXG4gICAgKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTtcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0ucHJvdG90eXBlLmdldE5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMSwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0ucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgZGVzY3JpcHRpb24gPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbS5wcm90b3R5cGUuZ2V0RGVzY3JpcHRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0ucHJvdG90eXBlLnNldERlc2NyaXB0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIHJ1bGVzID0gMztcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0ucHJvdG90eXBlLmdldFJ1bGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDMsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbX0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtLnByb3RvdHlwZS5zZXRSdWxlcyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMywgdmFsdWUpO1xufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24ob3B0X2luY2x1ZGVJbnN0YW5jZSkge1xuICByZXR1cm4gcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2t9IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sudG9PYmplY3QgPSBmdW5jdGlvbihpbmNsdWRlSW5zdGFuY2UsIG1zZykge1xuICB2YXIgZiwgb2JqID0ge1xuICAgIG5hbWU6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMSwgXCJcIiksXG4gICAgZGljZVBvb2w6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMiwgMCksXG4gICAgZGFtYWdlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDMsIDApLFxuICAgIHJhbmdlOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDQsIDApLFxuICAgIGluaXRpYXRpdmVNb2RpZmllcjoganNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQobXNnLCA1LCAwKSxcbiAgICBzaXplOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDYsIDApXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaztcbiAgcmV0dXJuIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2suZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKG1zZywgcmVhZGVyKTtcbn07XG5cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KSBmcm9tIHRoZVxuICogZ2l2ZW4gcmVhZGVyIGludG8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFja30gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlciA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyKSB7XG4gIHdoaWxlIChyZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICBpZiAocmVhZGVyLmlzRW5kR3JvdXAoKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmaWVsZCA9IHJlYWRlci5nZXRGaWVsZE51bWJlcigpO1xuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlIDE6XG4gICAgICB2YXIgdmFsdWUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKHJlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgbXNnLnNldE5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldERpY2VQb29sKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXREYW1hZ2UodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChyZWFkZXIucmVhZEludDMyKCkpO1xuICAgICAgbXNnLnNldFJhbmdlKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRTaW50MzIoKSk7XG4gICAgICBtc2cuc2V0SW5pdGlhdGl2ZU1vZGlmaWVyKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAocmVhZGVyLnJlYWRJbnQzMigpKTtcbiAgICAgIG1zZy5zZXRTaXplKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1zZztcbn07XG5cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcmV0dXJuIHshVWludDhBcnJheX1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTtcbiAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2t9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5V3JpdGVyfSB3cml0ZXJcbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5zZXJpYWxpemVCaW5hcnlUb1dyaXRlciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIHdyaXRlcikge1xuICB2YXIgZiA9IHVuZGVmaW5lZDtcbiAgZiA9IG1lc3NhZ2UuZ2V0TmFtZSgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldERpY2VQb29sKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0RGFtYWdlKCk7XG4gIGlmIChmICE9PSAwKSB7XG4gICAgd3JpdGVyLndyaXRlSW50MzIoXG4gICAgICAzLFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0UmFuZ2UoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVJbnQzMihcbiAgICAgIDQsXG4gICAgICBmXG4gICAgKTtcbiAgfVxuICBmID0gbWVzc2FnZS5nZXRJbml0aWF0aXZlTW9kaWZpZXIoKTtcbiAgaWYgKGYgIT09IDApIHtcbiAgICB3cml0ZXIud3JpdGVTaW50MzIoXG4gICAgICA1LFxuICAgICAgZlxuICAgICk7XG4gIH1cbiAgZiA9IG1lc3NhZ2UuZ2V0U2l6ZSgpO1xuICBpZiAoZiAhPT0gMCkge1xuICAgIHdyaXRlci53cml0ZUludDMyKFxuICAgICAgNixcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIGludDMyIGRpY2VfcG9vbCA9IDI7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLmdldERpY2VQb29sID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDIsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2V0RGljZVBvb2wgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBkYW1hZ2UgPSAzO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnByb3RvdHlwZS5nZXREYW1hZ2UgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMywgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2t9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnByb3RvdHlwZS5zZXREYW1hZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDMsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiByYW5nZSA9IDQ7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLmdldFJhbmdlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDQsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2V0UmFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDQsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzaW50MzIgaW5pdGlhdGl2ZV9tb2RpZmllciA9IDU7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLmdldEluaXRpYXRpdmVNb2RpZmllciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA1LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFja30gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2sucHJvdG90eXBlLnNldEluaXRpYXRpdmVNb2RpZmllciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgNSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIGludDMyIHNpemUgPSA2O1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrLnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDYsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrfSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjay5wcm90b3R5cGUuc2V0U2l6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgNiwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTtcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldE5hbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgcGxheWVyID0gMjtcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMiwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0UGxheWVyID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIGNhbXBhaWduID0gMztcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRDYW1wYWlnbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAzLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRDYW1wYWlnbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMywgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBkZXNjcmlwdGlvbiA9IDQ7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0RGVzY3JpcHRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgNCwgXCJcIikpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0RGVzY3JpcHRpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDQsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBzdHJlbmd0aCA9IDY7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0U3RyZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgNiwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0U3RyZW5ndGggPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDYsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBkZXh0ZXJpdHkgPSA3O1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldERleHRlcml0eSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA3LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXREZXh0ZXJpdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDcsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBzdGFtaW5hID0gODtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRTdGFtaW5hID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDgsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldFN0YW1pbmEgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDgsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBpbnRlbGxpZ2VuY2UgPSA5O1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldEludGVsbGlnZW5jZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCA5LCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRJbnRlbGxpZ2VuY2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDksIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiB3aXRzID0gMTA7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0V2l0cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxMCwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0V2l0cyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTAsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiByZXNvbHZlID0gMTE7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0UmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxMSwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0UmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBwcmVzZW5jZSA9IDEyO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldFByZXNlbmNlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge251bWJlcn0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEyLCAwKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRQcmVzZW5jZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBtYW5pcHVsYXRpb24gPSAxMztcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRNYW5pcHVsYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMTMsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldE1hbmlwdWxhdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTMsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBjb21wb3N1cmUgPSAxNDtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRDb21wb3N1cmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMTQsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldENvbXBvc3VyZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMTQsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBtYXA8c3RyaW5nLCBTa2lsbD4gcGh5c2ljYWxfc2tpbGxzID0gMTY7XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfbm9MYXp5Q3JlYXRlIERvIG5vdCBjcmVhdGUgdGhlIG1hcCBpZlxuICogZW1wdHksIGluc3RlYWQgcmV0dXJuaW5nIGB1bmRlZmluZWRgXG4gKiBAcmV0dXJuIHshanNwYi5NYXA8c3RyaW5nLCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldFBoeXNpY2FsU2tpbGxzTWFwID0gZnVuY3Rpb24ob3B0X25vTGF6eUNyZWF0ZSkge1xuICByZXR1cm4gLyoqIEB0eXBlIHshanNwYi5NYXA8c3RyaW5nLCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fSAqLyAoXG4gICAgICBqc3BiLk1lc3NhZ2UuZ2V0TWFwRmllbGQodGhpcywgMTYsIG9wdF9ub0xhenlDcmVhdGUsXG4gICAgICBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGwpKTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdmFsdWVzIGZyb20gdGhlIG1hcC4gVGhlIG1hcCB3aWxsIGJlIG5vbi1udWxsLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuY2xlYXJQaHlzaWNhbFNraWxsc01hcCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmdldFBoeXNpY2FsU2tpbGxzTWFwKCkuY2xlYXIoKTtcbiAgcmV0dXJuIHRoaXM7fTtcblxuXG4vKipcbiAqIG1hcDxzdHJpbmcsIFNraWxsPiBtZW50YWxfc2tpbGxzID0gMTc7XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfbm9MYXp5Q3JlYXRlIERvIG5vdCBjcmVhdGUgdGhlIG1hcCBpZlxuICogZW1wdHksIGluc3RlYWQgcmV0dXJuaW5nIGB1bmRlZmluZWRgXG4gKiBAcmV0dXJuIHshanNwYi5NYXA8c3RyaW5nLCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldE1lbnRhbFNraWxsc01hcCA9IGZ1bmN0aW9uKG9wdF9ub0xhenlDcmVhdGUpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7IWpzcGIuTWFwPHN0cmluZywhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPn0gKi8gKFxuICAgICAganNwYi5NZXNzYWdlLmdldE1hcEZpZWxkKHRoaXMsIDE3LCBvcHRfbm9MYXp5Q3JlYXRlLFxuICAgICAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsKSk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHZhbHVlcyBmcm9tIHRoZSBtYXAuIFRoZSBtYXAgd2lsbCBiZSBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmNsZWFyTWVudGFsU2tpbGxzTWFwID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZ2V0TWVudGFsU2tpbGxzTWFwKCkuY2xlYXIoKTtcbiAgcmV0dXJuIHRoaXM7fTtcblxuXG4vKipcbiAqIG1hcDxzdHJpbmcsIFNraWxsPiBzb2NpYWxfc2tpbGxzID0gMTg7XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfbm9MYXp5Q3JlYXRlIERvIG5vdCBjcmVhdGUgdGhlIG1hcCBpZlxuICogZW1wdHksIGluc3RlYWQgcmV0dXJuaW5nIGB1bmRlZmluZWRgXG4gKiBAcmV0dXJuIHshanNwYi5NYXA8c3RyaW5nLCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuU2tpbGw+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldFNvY2lhbFNraWxsc01hcCA9IGZ1bmN0aW9uKG9wdF9ub0xhenlDcmVhdGUpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7IWpzcGIuTWFwPHN0cmluZywhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsPn0gKi8gKFxuICAgICAganNwYi5NZXNzYWdlLmdldE1hcEZpZWxkKHRoaXMsIDE4LCBvcHRfbm9MYXp5Q3JlYXRlLFxuICAgICAgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LlNraWxsKSk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHZhbHVlcyBmcm9tIHRoZSBtYXAuIFRoZSBtYXAgd2lsbCBiZSBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmNsZWFyU29jaWFsU2tpbGxzTWFwID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZ2V0U29jaWFsU2tpbGxzTWFwKCkuY2xlYXIoKTtcbiAgcmV0dXJuIHRoaXM7fTtcblxuXG4vKipcbiAqIHJlcGVhdGVkIE1lcml0IG1lcml0cyA9IDE1O1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQ+fVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldE1lcml0c0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZXshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdD59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lk1lcml0LCAxNSkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXQ+fSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4qL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRNZXJpdHNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAxNSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdD19IG9wdF92YWx1ZVxuICogQHBhcmFtIHtudW1iZXI9fSBvcHRfaW5kZXhcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuTWVyaXR9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuYWRkTWVyaXRzID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDE1LCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5NZXJpdCwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmNsZWFyTWVyaXRzTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zZXRNZXJpdHNMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiByZXBlYXRlZCBDb25kaXRpb24gY29uZGl0aW9ucyA9IDE5O1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQ29uZGl0aW9uPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRDb25kaXRpb25zTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBleyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbj59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbiwgMTkpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbj59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldENvbmRpdGlvbnNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAxOSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb249fSBvcHRfdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2luZGV4XG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkNvbmRpdGlvbn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5hZGRDb25kaXRpb25zID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDE5LCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5Db25kaXRpb24sIG9wdF9pbmRleCk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHRoZSBsaXN0IG1ha2luZyBpdCBlbXB0eSBidXQgbm9uLW51bGwuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5jbGVhckNvbmRpdGlvbnNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNldENvbmRpdGlvbnNMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBzaXplID0gMjA7XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAyMCwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0U2l6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMjAsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBoZWFsdGggPSAyMTtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRIZWFsdGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMjEsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldEhlYWx0aCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMjEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiB3aWxscG93ZXIgPSAyMjtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRXaWxscG93ZXIgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMjIsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldFdpbGxwb3dlciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQodGhpcywgMjIsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBpbnQzMiBleHBlcmllbmNlX3BvaW50cyA9IDIzO1xuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldEV4cGVyaWVuY2VQb2ludHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoanNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQodGhpcywgMjMsIDApKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldEV4cGVyaWVuY2VQb2ludHMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDIzLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgaW50MzIgYmVhdHMgPSAyNDtcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRCZWF0cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAyNCwgMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0QmVhdHMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM0ludEZpZWxkKHRoaXMsIDI0LCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDI1O1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbT59XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0SXRlbXNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGV7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuSXRlbT59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lkl0ZW0sIDI1KSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHshQXJyYXk8IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtPn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0SXRlbXNMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAyNSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtPX0gb3B0X3ZhbHVlXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9pbmRleFxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmFkZEl0ZW1zID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDI1LCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5JdGVtLCBvcHRfaW5kZXgpO1xufTtcblxuXG4vKipcbiAqIENsZWFycyB0aGUgbGlzdCBtYWtpbmcgaXQgZW1wdHkgYnV0IG5vbi1udWxsLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuY2xlYXJJdGVtc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0SXRlbXNMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiByZXBlYXRlZCBBdHRhY2sgYXR0YWNrcyA9IDI2O1xuICogQHJldHVybiB7IUFycmF5PCFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQuQXR0YWNrPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRBdHRhY2tzTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBleyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaz59ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaywgMjYpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFjaz59IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldEF0dGFja3NMaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAyNiwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2s9fSBvcHRfdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2luZGV4XG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LkF0dGFja31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5hZGRBdHRhY2tzID0gZnVuY3Rpb24ob3B0X3ZhbHVlLCBvcHRfaW5kZXgpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5hZGRUb1JlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDI2LCBvcHRfdmFsdWUsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5BdHRhY2ssIG9wdF9pbmRleCk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHRoZSBsaXN0IG1ha2luZyBpdCBlbXB0eSBidXQgbm9uLW51bGwuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5jbGVhckF0dGFja3NMaXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNldEF0dGFja3NMaXN0KFtdKTtcbn07XG5cblxuLyoqXG4gKiBtYXA8c3RyaW5nLCBzdHJpbmc+IG90aGVyX2RhdGEgPSAyNztcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdF9ub0xhenlDcmVhdGUgRG8gbm90IGNyZWF0ZSB0aGUgbWFwIGlmXG4gKiBlbXB0eSwgaW5zdGVhZCByZXR1cm5pbmcgYHVuZGVmaW5lZGBcbiAqIEByZXR1cm4geyFqc3BiLk1hcDxzdHJpbmcsc3RyaW5nPn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRPdGhlckRhdGFNYXAgPSBmdW5jdGlvbihvcHRfbm9MYXp5Q3JlYXRlKSB7XG4gIHJldHVybiAvKiogQHR5cGUgeyFqc3BiLk1hcDxzdHJpbmcsc3RyaW5nPn0gKi8gKFxuICAgICAganNwYi5NZXNzYWdlLmdldE1hcEZpZWxkKHRoaXMsIDI3LCBvcHRfbm9MYXp5Q3JlYXRlLFxuICAgICAgbnVsbCkpO1xufTtcblxuXG4vKipcbiAqIENsZWFycyB2YWx1ZXMgZnJvbSB0aGUgbWFwLiBUaGUgbWFwIHdpbGwgYmUgbm9uLW51bGwuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5jbGVhck90aGVyRGF0YU1hcCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmdldE90aGVyRGF0YU1hcCgpLmNsZWFyKCk7XG4gIHJldHVybiB0aGlzO307XG5cblxuLyoqXG4gKiBvcHRpb25hbCBDb3JlRmllbGRzIGNvcmUgPSAyODtcbiAqIEByZXR1cm4gez9wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzfVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmdldENvcmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIC8qKiBAdHlwZXs/cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkc30gKi8gKFxuICAgIGpzcGIuTWVzc2FnZS5nZXRXcmFwcGVyRmllbGQodGhpcywgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29yZUZpZWxkcywgMjgpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0gez9wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db3JlRmllbGRzfHVuZGVmaW5lZH0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuc2V0Q29yZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0T25lb2ZXcmFwcGVyRmllbGQodGhpcywgMjgsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5vbmVvZkdyb3Vwc19bMF0sIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIG1lc3NhZ2UgZmllbGQgbWFraW5nIGl0IHVuZGVmaW5lZC5cbiAqIEByZXR1cm4geyFwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXR9IHJldHVybnMgdGhpc1xuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmNsZWFyQ29yZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zZXRDb3JlKHVuZGVmaW5lZCk7XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgaXMgc2V0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5oYXNDb3JlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGQodGhpcywgMjgpICE9IG51bGw7XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgTWFnZUZpZWxkcyBtYWdlID0gMjk7XG4gKiBAcmV0dXJuIHs/cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkc31cbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5nZXRNYWdlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGV7P3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHN9ICovIChcbiAgICBqc3BiLk1lc3NhZ2UuZ2V0V3JhcHBlckZpZWxkKHRoaXMsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkLk1hZ2VGaWVsZHMsIDI5KSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHs/cHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuTWFnZUZpZWxkc3x1bmRlZmluZWR9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLnNldE1hZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldE9uZW9mV3JhcHBlckZpZWxkKHRoaXMsIDI5LCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQub25lb2ZHcm91cHNfWzBdLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogQ2xlYXJzIHRoZSBtZXNzYWdlIGZpZWxkIG1ha2luZyBpdCB1bmRlZmluZWQuXG4gKiBAcmV0dXJuIHshcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5jbGVhck1hZ2UgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0TWFnZSh1bmRlZmluZWQpO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGlzIHNldC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuaGFzTWFnZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLmdldEZpZWxkKHRoaXMsIDI5KSAhPSBudWxsO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIENoYW5nZWxpbmdGaWVsZHMgY2hhbmdlbGluZyA9IDMwO1xuICogQHJldHVybiB7P3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHN9XG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuZ2V0Q2hhbmdlbGluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlez9wcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzfSAqLyAoXG4gICAganNwYi5NZXNzYWdlLmdldFdyYXBwZXJGaWVsZCh0aGlzLCBwcm90by5tb2RlbHMucHJvdG8uY29mZC5DaGFuZ2VsaW5nRmllbGRzLCAzMCkpO1xufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7P3Byb3RvLm1vZGVscy5wcm90by5jb2ZkLkNoYW5nZWxpbmdGaWVsZHN8dW5kZWZpbmVkfSB2YWx1ZVxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4qL1xucHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0LnByb3RvdHlwZS5zZXRDaGFuZ2VsaW5nID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRPbmVvZldyYXBwZXJGaWVsZCh0aGlzLCAzMCwgcHJvdG8ubW9kZWxzLnByb3RvLmNvZmQuQ29mZFNoZWV0Lm9uZW9mR3JvdXBzX1swXSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIENsZWFycyB0aGUgbWVzc2FnZSBmaWVsZCBtYWtpbmcgaXQgdW5kZWZpbmVkLlxuICogQHJldHVybiB7IXByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldH0gcmV0dXJucyB0aGlzXG4gKi9cbnByb3RvLm1vZGVscy5wcm90by5jb2ZkLkNvZmRTaGVldC5wcm90b3R5cGUuY2xlYXJDaGFuZ2VsaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNldENoYW5nZWxpbmcodW5kZWZpbmVkKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBzZXQuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5wcm90by5tb2RlbHMucHJvdG8uY29mZC5Db2ZkU2hlZXQucHJvdG90eXBlLmhhc0NoYW5nZWxpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5nZXRGaWVsZCh0aGlzLCAzMCkgIT0gbnVsbDtcbn07XG5cblxuZ29vZy5vYmplY3QuZXh0ZW5kKGV4cG9ydHMsIHByb3RvLm1vZGVscy5wcm90by5jb2ZkKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=