tenebrous-dicebot/api/dist/app.bundle.js

1277 lines
709 KiB
JavaScript

/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./_proto/web-api_pb.js":
/*!******************************!*\
!*** ./_proto/web-api_pb.js ***!
\******************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
// source: web-api.proto
/**
* @fileoverview
* @enhanceable
* @suppress {missingRequire} reports error on implicit type usages.
* @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.web_api.RoomsListReply', null, global);
goog.exportSymbol('proto.web_api.RoomsListReply.Room', null, global);
goog.exportSymbol('proto.web_api.UserIdRequest', 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.web_api.UserIdRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.web_api.UserIdRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.web_api.UserIdRequest.displayName = 'proto.web_api.UserIdRequest';
}
/**
* 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.web_api.RoomsListReply = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, proto.web_api.RoomsListReply.repeatedFields_, null);
};
goog.inherits(proto.web_api.RoomsListReply, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.web_api.RoomsListReply.displayName = 'proto.web_api.RoomsListReply';
}
/**
* 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.web_api.RoomsListReply.Room = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.web_api.RoomsListReply.Room, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.web_api.RoomsListReply.Room.displayName = 'proto.web_api.RoomsListReply.Room';
}
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.web_api.UserIdRequest.prototype.toObject = function(opt_includeInstance) {
return proto.web_api.UserIdRequest.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.web_api.UserIdRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.web_api.UserIdRequest.toObject = function(includeInstance, msg) {
var f, obj = {
userId: 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.web_api.UserIdRequest}
*/
proto.web_api.UserIdRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.web_api.UserIdRequest;
return proto.web_api.UserIdRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.web_api.UserIdRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.web_api.UserIdRequest}
*/
proto.web_api.UserIdRequest.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.setUserId(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.web_api.UserIdRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.web_api.UserIdRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.web_api.UserIdRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.web_api.UserIdRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getUserId();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
};
/**
* optional string user_id = 1;
* @return {string}
*/
proto.web_api.UserIdRequest.prototype.getUserId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.web_api.UserIdRequest} returns this
*/
proto.web_api.UserIdRequest.prototype.setUserId = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.web_api.RoomsListReply.repeatedFields_ = [1];
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.web_api.RoomsListReply.prototype.toObject = function(opt_includeInstance) {
return proto.web_api.RoomsListReply.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.web_api.RoomsListReply} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.web_api.RoomsListReply.toObject = function(includeInstance, msg) {
var f, obj = {
roomsList: jspb.Message.toObjectList(msg.getRoomsList(),
proto.web_api.RoomsListReply.Room.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.web_api.RoomsListReply}
*/
proto.web_api.RoomsListReply.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.web_api.RoomsListReply;
return proto.web_api.RoomsListReply.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.web_api.RoomsListReply} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.web_api.RoomsListReply}
*/
proto.web_api.RoomsListReply.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = new proto.web_api.RoomsListReply.Room;
reader.readMessage(value,proto.web_api.RoomsListReply.Room.deserializeBinaryFromReader);
msg.addRooms(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.web_api.RoomsListReply.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.web_api.RoomsListReply.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.web_api.RoomsListReply} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.web_api.RoomsListReply.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getRoomsList();
if (f.length > 0) {
writer.writeRepeatedMessage(
1,
f,
proto.web_api.RoomsListReply.Room.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.web_api.RoomsListReply.Room.prototype.toObject = function(opt_includeInstance) {
return proto.web_api.RoomsListReply.Room.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.web_api.RoomsListReply.Room} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.web_api.RoomsListReply.Room.toObject = function(includeInstance, msg) {
var f, obj = {
roomId: jspb.Message.getFieldWithDefault(msg, 1, ""),
displayName: 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.web_api.RoomsListReply.Room}
*/
proto.web_api.RoomsListReply.Room.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.web_api.RoomsListReply.Room;
return proto.web_api.RoomsListReply.Room.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.web_api.RoomsListReply.Room} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.web_api.RoomsListReply.Room}
*/
proto.web_api.RoomsListReply.Room.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.setRoomId(value);
break;
case 2:
var value = /** @type {string} */ (reader.readString());
msg.setDisplayName(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.web_api.RoomsListReply.Room.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.web_api.RoomsListReply.Room.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.web_api.RoomsListReply.Room} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.web_api.RoomsListReply.Room.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getRoomId();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
f = message.getDisplayName();
if (f.length > 0) {
writer.writeString(
2,
f
);
}
};
/**
* optional string room_id = 1;
* @return {string}
*/
proto.web_api.RoomsListReply.Room.prototype.getRoomId = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.web_api.RoomsListReply.Room} returns this
*/
proto.web_api.RoomsListReply.Room.prototype.setRoomId = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
/**
* optional string display_name = 2;
* @return {string}
*/
proto.web_api.RoomsListReply.Room.prototype.getDisplayName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
};
/**
* @param {string} value
* @return {!proto.web_api.RoomsListReply.Room} returns this
*/
proto.web_api.RoomsListReply.Room.prototype.setDisplayName = function(value) {
return jspb.Message.setProto3StringField(this, 2, value);
};
/**
* repeated Room rooms = 1;
* @return {!Array<!proto.web_api.RoomsListReply.Room>}
*/
proto.web_api.RoomsListReply.prototype.getRoomsList = function() {
return /** @type{!Array<!proto.web_api.RoomsListReply.Room>} */ (
jspb.Message.getRepeatedWrapperField(this, proto.web_api.RoomsListReply.Room, 1));
};
/**
* @param {!Array<!proto.web_api.RoomsListReply.Room>} value
* @return {!proto.web_api.RoomsListReply} returns this
*/
proto.web_api.RoomsListReply.prototype.setRoomsList = function(value) {
return jspb.Message.setRepeatedWrapperField(this, 1, value);
};
/**
* @param {!proto.web_api.RoomsListReply.Room=} opt_value
* @param {number=} opt_index
* @return {!proto.web_api.RoomsListReply.Room}
*/
proto.web_api.RoomsListReply.prototype.addRooms = function(opt_value, opt_index) {
return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.web_api.RoomsListReply.Room, opt_index);
};
/**
* Clears the list making it empty but non-null.
* @return {!proto.web_api.RoomsListReply} returns this
*/
proto.web_api.RoomsListReply.prototype.clearRoomsList = function() {
return this.setRoomsList([]);
};
goog.object.extend(exports, proto.web_api);
/***/ }),
/***/ "./_proto/web-api_pb_service.js":
/*!**************************************!*\
!*** ./_proto/web-api_pb_service.js ***!
\**************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
// package: web_api
// file: web-api.proto
var web_api_pb = __webpack_require__(/*! ./web-api_pb */ "./_proto/web-api_pb.js");
var grpc = __webpack_require__(/*! @improbable-eng/grpc-web */ "./node_modules/@improbable-eng/grpc-web/dist/grpc-web-client.umd.js").grpc;
var WebApi = (function () {
function WebApi() {}
WebApi.serviceName = "web_api.WebApi";
return WebApi;
}());
WebApi.ListRoom = {
methodName: "ListRoom",
service: WebApi,
requestStream: false,
responseStream: false,
requestType: web_api_pb.UserIdRequest,
responseType: web_api_pb.RoomsListReply
};
exports.WebApi = WebApi;
function WebApiClient(serviceHost, options) {
this.serviceHost = serviceHost;
this.options = options || {};
}
WebApiClient.prototype.listRoom = function listRoom(requestMessage, metadata, callback) {
if (arguments.length === 2) {
callback = arguments[1];
}
var client = grpc.unary(WebApi.ListRoom, {
request: requestMessage,
host: this.serviceHost,
metadata: metadata,
transport: this.options.transport,
debug: this.options.debug,
onEnd: function (response) {
if (callback) {
if (response.status !== grpc.Code.OK) {
var err = new Error(response.statusMessage);
err.code = response.status;
err.metadata = response.trailers;
callback(err, null);
} else {
callback(null, response.message);
}
}
}
});
return {
cancel: function () {
callback = null;
client.close();
}
};
};
exports.WebApiClient = WebApiClient;
/***/ }),
/***/ "./node_modules/@improbable-eng/grpc-web/dist/grpc-web-client.umd.js":
/*!***************************************************************************!*\
!*** ./node_modules/@improbable-eng/grpc-web/dist/grpc-web-client.umd.js ***!
\***************************************************************************/
/***/ (function(module) {
!function(e,t){if(true)module.exports=t();else { var n, r; }}(this,function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=10)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3);t.Metadata=n.BrowserHeaders},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];console.debug?console.debug.apply(null,e):console.log.apply(null,e)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),o=r(8),s=r(9),i=r(1),a=r(4),u=r(14);t.client=function(e,t){return new d(e,t)};var d=function(){function e(e,t){this.started=!1,this.sentFirstMessage=!1,this.completed=!1,this.closed=!1,this.finishedSending=!1,this.onHeadersCallbacks=[],this.onMessageCallbacks=[],this.onEndCallbacks=[],this.parser=new o.ChunkParser,this.methodDefinition=e,this.props=t,this.createTransport()}return e.prototype.createTransport=function(){var e=this.props.host+"/"+this.methodDefinition.service.serviceName+"/"+this.methodDefinition.methodName,t={methodDefinition:this.methodDefinition,debug:this.props.debug||!1,url:e,onHeaders:this.onTransportHeaders.bind(this),onChunk:this.onTransportChunk.bind(this),onEnd:this.onTransportEnd.bind(this)};this.props.transport?this.transport=this.props.transport(t):this.transport=a.makeDefaultTransport(t)},e.prototype.onTransportHeaders=function(e,t){if(this.props.debug&&i.debug("onHeaders",e,t),this.closed)this.props.debug&&i.debug("grpc.onHeaders received after request was closed - ignoring");else if(0===t);else{this.responseHeaders=e,this.props.debug&&i.debug("onHeaders.responseHeaders",JSON.stringify(this.responseHeaders,null,2));var r=c(e);this.props.debug&&i.debug("onHeaders.gRPCStatus",r);var n=r&&r>=0?r:s.httpStatusToCode(t);this.props.debug&&i.debug("onHeaders.code",n);var o=e.get("grpc-message")||[];if(this.props.debug&&i.debug("onHeaders.gRPCMessage",o),this.rawOnHeaders(e),n!==s.Code.OK){var a=this.decodeGRPCStatus(o[0]);this.rawOnError(n,a,e)}}},e.prototype.onTransportChunk=function(e){var t=this;if(this.closed)this.props.debug&&i.debug("grpc.onChunk received after request was closed - ignoring");else{var r=[];try{r=this.parser.parse(e)}catch(e){return this.props.debug&&i.debug("onChunk.parsing error",e,e.message),void this.rawOnError(s.Code.Internal,"parsing error: "+e.message)}r.forEach(function(e){if(e.chunkType===o.ChunkType.MESSAGE){var r=t.methodDefinition.responseType.deserializeBinary(e.data);t.rawOnMessage(r)}else e.chunkType===o.ChunkType.TRAILERS&&(t.responseHeaders?(t.responseTrailers=new n.Metadata(e.trailers),t.props.debug&&i.debug("onChunk.trailers",t.responseTrailers)):(t.responseHeaders=new n.Metadata(e.trailers),t.rawOnHeaders(t.responseHeaders)))})}},e.prototype.onTransportEnd=function(){if(this.props.debug&&i.debug("grpc.onEnd"),this.closed)this.props.debug&&i.debug("grpc.onEnd received after request was closed - ignoring");else if(void 0!==this.responseTrailers){var e=c(this.responseTrailers);if(null!==e){var t=this.responseTrailers.get("grpc-message"),r=this.decodeGRPCStatus(t[0]);this.rawOnEnd(e,r,this.responseTrailers)}else this.rawOnError(s.Code.Internal,"Response closed without grpc-status (Trailers provided)")}else{if(void 0===this.responseHeaders)return void this.rawOnError(s.Code.Unknown,"Response closed without headers");var n=c(this.responseHeaders),o=this.responseHeaders.get("grpc-message");if(this.props.debug&&i.debug("grpc.headers only response ",n,o),null===n)return void this.rawOnEnd(s.Code.Unknown,"Response closed without grpc-status (Headers only)",this.responseHeaders);var a=this.decodeGRPCStatus(o[0]);this.rawOnEnd(n,a,this.responseHeaders)}},e.prototype.decodeGRPCStatus=function(e){if(!e)return"";try{return decodeURIComponent(e)}catch(t){return e}},e.prototype.rawOnEnd=function(e,t,r){var n=this;this.props.debug&&i.debug("rawOnEnd",e,t,r),this.completed||(this.completed=!0,this.onEndCallbacks.forEach(function(o){if(!n.closed)try{o(e,t,r)}catch(e){setTimeout(function(){throw e})}}))},e.prototype.rawOnHeaders=function(e){this.props.debug&&i.debug("rawOnHeaders",e),this.completed||this.onHeadersCallbacks.forEach(function(t){try{t(e)}catch(e){setTimeout(function(){throw e})}})},e.prototype.rawOnError=function(e,t,r){var o=this;void 0===r&&(r=new n.Metadata),this.props.debug&&i.debug("rawOnError",e,t),this.completed||(this.completed=!0,this.onEndCallbacks.forEach(function(n){if(!o.closed)try{n(e,t,r)}catch(e){setTimeout(function(){throw e})}}))},e.prototype.rawOnMessage=function(e){var t=this;this.props.debug&&i.debug("rawOnMessage",e.toObject()),this.completed||this.closed||this.onMessageCallbacks.forEach(function(r){if(!t.closed)try{r(e)}catch(e){setTimeout(function(){throw e})}})},e.prototype.onHeaders=function(e){this.onHeadersCallbacks.push(e)},e.prototype.onMessage=function(e){this.onMessageCallbacks.push(e)},e.prototype.onEnd=function(e){this.onEndCallbacks.push(e)},e.prototype.start=function(e){if(this.started)throw new Error("Client already started - cannot .start()");this.started=!0;var t=new n.Metadata(e||{});t.set("content-type","application/grpc-web+proto"),t.set("x-grpc-web","1"),this.transport.start(t)},e.prototype.send=function(e){if(!this.started)throw new Error("Client not started - .start() must be called before .send()");if(this.closed)throw new Error("Client already closed - cannot .send()");if(this.finishedSending)throw new Error("Client already finished sending - cannot .send()");if(!this.methodDefinition.requestStream&&this.sentFirstMessage)throw new Error("Message already sent for non-client-streaming method - cannot .send()");this.sentFirstMessage=!0;var t=u.frameRequest(e);this.transport.sendMessage(t)},e.prototype.finishSend=function(){if(!this.started)throw new Error("Client not started - .finishSend() must be called before .close()");if(this.closed)throw new Error("Client already closed - cannot .send()");if(this.finishedSending)throw new Error("Client already finished sending - cannot .finishSend()");this.finishedSending=!0,this.transport.finishSend()},e.prototype.close=function(){if(!this.started)throw new Error("Client not started - .start() must be called before .close()");if(this.closed)throw new Error("Client already closed - cannot .close()");this.closed=!0,this.props.debug&&i.debug("request.abort aborting request"),this.transport.cancel()},e}();function c(e){var t=e.get("grpc-status")||[];if(t.length>0)try{var r=t[0];return parseInt(r,10)}catch(e){return null}return null}},function(e,t,r){var n;n=function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3);var o=function(){function e(e,t){void 0===e&&(e={}),void 0===t&&(t={splitValues:!1});var r,o=this;if(this.headersMap={},e)if("undefined"!=typeof Headers&&e instanceof Headers)n.getHeaderKeys(e).forEach(function(r){n.getHeaderValues(e,r).forEach(function(e){t.splitValues?o.append(r,n.splitHeaderValue(e)):o.append(r,e)})});else if("object"==typeof(r=e)&&"object"==typeof r.headersMap&&"function"==typeof r.forEach)e.forEach(function(e,t){o.append(e,t)});else if("undefined"!=typeof Map&&e instanceof Map){e.forEach(function(e,t){o.append(t,e)})}else"string"==typeof e?this.appendFromString(e):"object"==typeof e&&Object.getOwnPropertyNames(e).forEach(function(t){var r=e[t];Array.isArray(r)?r.forEach(function(e){o.append(t,e)}):o.append(t,r)})}return e.prototype.appendFromString=function(e){for(var t=e.split("\r\n"),r=0;r<t.length;r++){var n=t[r],o=n.indexOf(":");if(o>0){var s=n.substring(0,o).trim(),i=n.substring(o+1).trim();this.append(s,i)}}},e.prototype.delete=function(e,t){var r=n.normalizeName(e);if(void 0===t)delete this.headersMap[r];else{var o=this.headersMap[r];if(o){var s=o.indexOf(t);s>=0&&o.splice(s,1),0===o.length&&delete this.headersMap[r]}}},e.prototype.append=function(e,t){var r=this,o=n.normalizeName(e);Array.isArray(this.headersMap[o])||(this.headersMap[o]=[]),Array.isArray(t)?t.forEach(function(e){r.headersMap[o].push(n.normalizeValue(e))}):this.headersMap[o].push(n.normalizeValue(t))},e.prototype.set=function(e,t){var r=n.normalizeName(e);if(Array.isArray(t)){var o=[];t.forEach(function(e){o.push(n.normalizeValue(e))}),this.headersMap[r]=o}else this.headersMap[r]=[n.normalizeValue(t)]},e.prototype.has=function(e,t){var r=this.headersMap[n.normalizeName(e)];if(!Array.isArray(r))return!1;if(void 0!==t){var o=n.normalizeValue(t);return r.indexOf(o)>=0}return!0},e.prototype.get=function(e){var t=this.headersMap[n.normalizeName(e)];return void 0!==t?t.concat():[]},e.prototype.forEach=function(e){var t=this;Object.getOwnPropertyNames(this.headersMap).forEach(function(r){e(r,t.headersMap[r])},this)},e.prototype.toHeaders=function(){if("undefined"!=typeof Headers){var e=new Headers;return this.forEach(function(t,r){r.forEach(function(r){e.append(t,r)})}),e}throw new Error("Headers class is not defined")},e}();t.BrowserHeaders=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0);t.BrowserHeaders=n.BrowserHeaders},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.iterateHeaders=function(e,t){for(var r=e[Symbol.iterator](),n=r.next();!n.done;)t(n.value[0]),n=r.next()},t.iterateHeadersKeys=function(e,t){for(var r=e.keys(),n=r.next();!n.done;)t(n.value),n=r.next()}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(2);function o(e){return e}t.normalizeName=function(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()},t.normalizeValue=function(e){return"string"!=typeof e&&(e=String(e)),e},t.getHeaderValues=function(e,t){var r=o(e);if(r instanceof Headers&&r.getAll)return r.getAll(t);var n=r.get(t);return n&&"string"==typeof n?[n]:n},t.getHeaderKeys=function(e){var t=o(e),r={},s=[];return t.keys?n.iterateHeadersKeys(t,function(e){r[e]||(r[e]=!0,s.push(e))}):t.forEach?t.forEach(function(e,t){r[t]||(r[t]=!0,s.push(t))}):n.iterateHeaders(t,function(e){var t=e[0];r[t]||(r[t]=!0,s.push(t))}),s},t.splitHeaderValue=function(e){var t=[];return e.split(", ").forEach(function(e){e.split(",").forEach(function(e){t.push(e)})}),t}}])},e.exports=n()},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5),o=function(e){return n.CrossBrowserHttpTransport({withCredentials:!1})(e)};t.setDefaultTransportFactory=function(e){o=e},t.makeDefaultTransport=function(e){return o(e)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(6),o=r(7);t.CrossBrowserHttpTransport=function(e){if(n.detectFetchSupport()){var t={credentials:e.withCredentials?"include":"same-origin"};return n.FetchReadableStreamTransport(t)}return o.XhrTransport({withCredentials:e.withCredentials})}},function(e,t,r){"use strict";var n=this&&this.__assign||function(){return(n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0});var o=r(0),s=r(1);t.FetchReadableStreamTransport=function(e){return function(t){return function(e,t){return e.debug&&s.debug("fetchRequest",e),new i(e,t)}(t,e)}};var i=function(){function e(e,t){this.cancelled=!1,this.controller=self.AbortController&&new AbortController,this.options=e,this.init=t}return e.prototype.pump=function(e,t){var r=this;if(this.reader=e,this.cancelled)return this.options.debug&&s.debug("Fetch.pump.cancel at first pump"),void this.reader.cancel();this.reader.read().then(function(e){if(e.done)return r.options.onEnd(),t;r.options.onChunk(e.value),r.pump(r.reader,t)}).catch(function(e){r.cancelled?r.options.debug&&s.debug("Fetch.catch - request cancelled"):(r.cancelled=!0,r.options.debug&&s.debug("Fetch.catch",e.message),r.options.onEnd(e))})},e.prototype.send=function(e){var t=this;fetch(this.options.url,n({},this.init,{headers:this.metadata.toHeaders(),method:"POST",body:e,signal:this.controller&&this.controller.signal})).then(function(e){if(t.options.debug&&s.debug("Fetch.response",e),t.options.onHeaders(new o.Metadata(e.headers),e.status),!e.body)return e;t.pump(e.body.getReader(),e)}).catch(function(e){t.cancelled?t.options.debug&&s.debug("Fetch.catch - request cancelled"):(t.cancelled=!0,t.options.debug&&s.debug("Fetch.catch",e.message),t.options.onEnd(e))})},e.prototype.sendMessage=function(e){this.send(e)},e.prototype.finishSend=function(){},e.prototype.start=function(e){this.metadata=e},e.prototype.cancel=function(){this.cancelled?this.options.debug&&s.debug("Fetch.abort.cancel already cancelled"):(this.cancelled=!0,this.reader?(this.options.debug&&s.debug("Fetch.abort.cancel"),this.reader.cancel()):this.options.debug&&s.debug("Fetch.abort.cancel before reader"),this.controller&&this.controller.abort())},e}();t.detectFetchSupport=function(){return"undefined"!=typeof Response&&Response.prototype.hasOwnProperty("body")&&"function"==typeof Headers}},function(e,t,r){"use strict";var n,o=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var s=r(0),i=r(1),a=r(11);t.XhrTransport=function(e){return function(t){if(a.detectMozXHRSupport())return new d(t,e);if(a.detectXHROverrideMimeTypeSupport())return new u(t,e);throw new Error("This environment's XHR implementation cannot support binary transfer.")}};var u=function(){function e(e,t){this.options=e,this.init=t}return e.prototype.onProgressEvent=function(){this.options.debug&&i.debug("XHR.onProgressEvent.length: ",this.xhr.response.length);var e=this.xhr.response.substr(this.index);this.index=this.xhr.response.length;var t=p(e);this.options.onChunk(t)},e.prototype.onLoadEvent=function(){this.options.debug&&i.debug("XHR.onLoadEvent"),this.options.onEnd()},e.prototype.onStateChange=function(){this.options.debug&&i.debug("XHR.onStateChange",this.xhr.readyState),this.xhr.readyState===XMLHttpRequest.HEADERS_RECEIVED&&this.options.onHeaders(new s.Metadata(this.xhr.getAllResponseHeaders()),this.xhr.status)},e.prototype.sendMessage=function(e){this.xhr.send(e)},e.prototype.finishSend=function(){},e.prototype.start=function(e){var t=this;this.metadata=e;var r=new XMLHttpRequest;this.xhr=r,r.open("POST",this.options.url),this.configureXhr(),this.metadata.forEach(function(e,t){r.setRequestHeader(e,t.join(", "))}),r.withCredentials=Boolean(this.init.withCredentials),r.addEventListener("readystatechange",this.onStateChange.bind(this)),r.addEventListener("progress",this.onProgressEvent.bind(this)),r.addEventListener("loadend",this.onLoadEvent.bind(this)),r.addEventListener("error",function(e){t.options.debug&&i.debug("XHR.error",e),t.options.onEnd(e.error)})},e.prototype.configureXhr=function(){this.xhr.responseType="text",this.xhr.overrideMimeType("text/plain; charset=x-user-defined")},e.prototype.cancel=function(){this.options.debug&&i.debug("XHR.abort"),this.xhr.abort()},e}();t.XHR=u;var d=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.configureXhr=function(){this.options.debug&&i.debug("MozXHR.configureXhr: setting responseType to 'moz-chunked-arraybuffer'"),this.xhr.responseType="moz-chunked-arraybuffer"},t.prototype.onProgressEvent=function(){var e=this.xhr.response;this.options.debug&&i.debug("MozXHR.onProgressEvent: ",new Uint8Array(e)),this.options.onChunk(new Uint8Array(e))},t}(u);function c(e,t){var r=e.charCodeAt(t);if(r>=55296&&r<=56319){var n=e.charCodeAt(t+1);n>=56320&&n<=57343&&(r=65536+(r-55296<<10)+(n-56320))}return r}function p(e){for(var t=new Uint8Array(e.length),r=0,n=0;n<e.length;n++){var o=String.prototype.codePointAt?e.codePointAt(n):c(e,n);t[r++]=255&o}return t}t.MozChunkedArrayBufferXHR=d,t.stringToArrayBuffer=p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,o=r(0),s=function(e){return 9===e||10===e||13===e};function i(e){return s(e)||e>=32&&e<=126}function a(e){for(var t=0;t!==e.length;++t)if(!i(e[t]))throw new Error("Metadata is not valid (printable) ASCII");return String.fromCharCode.apply(String,Array.prototype.slice.call(e))}function u(e){return 128==(128&e.getUint8(0))}function d(e){return e.getUint32(1,!1)}function c(e,t,r){return e.byteLength-t>=r}function p(e,t,r){if(e.slice)return e.slice(t,r);var n=e.length;void 0!==r&&(n=r);for(var o=new Uint8Array(n-t),s=0,i=t;i<n;i++)o[s++]=e[i];return o}t.decodeASCII=a,t.encodeASCII=function(e){for(var t=new Uint8Array(e.length),r=0;r!==e.length;++r){var n=e.charCodeAt(r);if(!i(n))throw new Error("Metadata contains invalid ASCII");t[r]=n}return t},function(e){e[e.MESSAGE=1]="MESSAGE",e[e.TRAILERS=2]="TRAILERS"}(n=t.ChunkType||(t.ChunkType={}));var h=function(){function e(){this.buffer=null,this.position=0}return e.prototype.parse=function(e,t){if(0===e.length&&t)return[];var r,s=[];if(null==this.buffer)this.buffer=e,this.position=0;else if(this.position===this.buffer.byteLength)this.buffer=e,this.position=0;else{var i=this.buffer.byteLength-this.position,h=new Uint8Array(i+e.byteLength),f=p(this.buffer,this.position);h.set(f,0);var l=new Uint8Array(e);h.set(l,i),this.buffer=h,this.position=0}for(;;){if(!c(this.buffer,this.position,5))return s;var g=p(this.buffer,this.position,this.position+5),b=new DataView(g.buffer,g.byteOffset,g.byteLength),y=d(b);if(!c(this.buffer,this.position,5+y))return s;var v=p(this.buffer,this.position+5,this.position+5+y);if(this.position+=5+y,u(b))return s.push({chunkType:n.TRAILERS,trailers:(r=v,new o.Metadata(a(r)))}),s;s.push({chunkType:n.MESSAGE,data:v})}},e}();t.ChunkParser=h},function(e,t,r){"use strict";var n;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.OK=0]="OK",e[e.Canceled=1]="Canceled",e[e.Unknown=2]="Unknown",e[e.InvalidArgument=3]="InvalidArgument",e[e.DeadlineExceeded=4]="DeadlineExceeded",e[e.NotFound=5]="NotFound",e[e.AlreadyExists=6]="AlreadyExists",e[e.PermissionDenied=7]="PermissionDenied",e[e.ResourceExhausted=8]="ResourceExhausted",e[e.FailedPrecondition=9]="FailedPrecondition",e[e.Aborted=10]="Aborted",e[e.OutOfRange=11]="OutOfRange",e[e.Unimplemented=12]="Unimplemented",e[e.Internal=13]="Internal",e[e.Unavailable=14]="Unavailable",e[e.DataLoss=15]="DataLoss",e[e.Unauthenticated=16]="Unauthenticated"}(n=t.Code||(t.Code={})),t.httpStatusToCode=function(e){switch(e){case 0:return n.Internal;case 200:return n.OK;case 400:return n.InvalidArgument;case 401:return n.Unauthenticated;case 403:return n.PermissionDenied;case 404:return n.NotFound;case 409:return n.Aborted;case 412:return n.FailedPrecondition;case 429:return n.ResourceExhausted;case 499:return n.Canceled;case 500:return n.Unknown;case 501:return n.Unimplemented;case 503:return n.Unavailable;case 504:return n.DeadlineExceeded;default:return n.Unknown}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3),o=r(4),s=r(6),i=r(12),a=r(7),u=r(5),d=r(9),c=r(13),p=r(15),h=r(2);!function(e){e.setDefaultTransport=o.setDefaultTransportFactory,e.CrossBrowserHttpTransport=u.CrossBrowserHttpTransport,e.FetchReadableStreamTransport=s.FetchReadableStreamTransport,e.XhrTransport=a.XhrTransport,e.WebsocketTransport=i.WebsocketTransport,e.Code=d.Code,e.Metadata=n.BrowserHeaders,e.client=function(e,t){return h.client(e,t)},e.invoke=c.invoke,e.unary=p.unary}(t.grpc||(t.grpc={}))},function(e,t,r){"use strict";var n;function o(){if(void 0!==n)return n;if(XMLHttpRequest){n=new XMLHttpRequest;try{n.open("GET","https://localhost")}catch(e){}}return n}function s(e){var t=o();if(!t)return!1;try{return t.responseType=e,t.responseType===e}catch(e){}return!1}Object.defineProperty(t,"__esModule",{value:!0}),t.xhrSupportsResponseType=s,t.detectMozXHRSupport=function(){return"undefined"!=typeof XMLHttpRequest&&s("moz-chunked-arraybuffer")},t.detectXHROverrideMimeTypeSupport=function(){return"undefined"!=typeof XMLHttpRequest&&XMLHttpRequest.prototype.hasOwnProperty("overrideMimeType")}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,o=r(1),s=r(8);!function(e){e[e.FINISH_SEND=1]="FINISH_SEND"}(n||(n={}));var i=new Uint8Array([1]);t.WebsocketTransport=function(){return function(e){return function(e){e.debug&&o.debug("websocketRequest",e);var t,r=function(e){if("https://"===e.substr(0,8))return"wss://"+e.substr(8);if("http://"===e.substr(0,7))return"ws://"+e.substr(7);throw new Error("Websocket transport constructed with non-https:// or http:// host.")}(e.url),a=[];function u(e){if(e===n.FINISH_SEND)t.send(i);else{var r=e,o=new Int8Array(r.byteLength+1);o.set(new Uint8Array([0])),o.set(r,1),t.send(o)}}return{sendMessage:function(e){t&&t.readyState!==t.CONNECTING?u(e):a.push(e)},finishSend:function(){t&&t.readyState!==t.CONNECTING?u(n.FINISH_SEND):a.push(n.FINISH_SEND)},start:function(n){(t=new WebSocket(r,["grpc-websockets"])).binaryType="arraybuffer",t.onopen=function(){var r;e.debug&&o.debug("websocketRequest.onopen"),t.send((r="",n.forEach(function(e,t){r+=e+": "+t.join(", ")+"\r\n"}),s.encodeASCII(r))),a.forEach(function(e){u(e)})},t.onclose=function(t){e.debug&&o.debug("websocketRequest.onclose",t),e.onEnd()},t.onerror=function(t){e.debug&&o.debug("websocketRequest.onerror",t)},t.onmessage=function(t){e.onChunk(new Uint8Array(t.data))}},cancel:function(){e.debug&&o.debug("websocket.abort"),t.close()}}}(e)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(2);t.invoke=function(e,t){if(e.requestStream)throw new Error(".invoke cannot be used with client-streaming methods. Use .client instead.");var r=n.client(e,{host:t.host,transport:t.transport,debug:t.debug});return t.onHeaders&&r.onHeaders(t.onHeaders),t.onMessage&&r.onMessage(t.onMessage),t.onEnd&&r.onEnd(t.onEnd),r.start(t.metadata),r.send(t.request),r.finishSend(),{close:function(){r.close()}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.frameRequest=function(e){var t=e.serializeBinary(),r=new ArrayBuffer(t.byteLength+5);return new DataView(r,1,4).setUint32(0,t.length,!1),new Uint8Array(r,5).set(t),new Uint8Array(r)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(0),o=r(2);t.unary=function(e,t){if(e.responseStream)throw new Error(".unary cannot be used with server-streaming methods. Use .invoke or .client instead.");if(e.requestStream)throw new Error(".unary cannot be used with client-streaming methods. Use .client instead.");var r=null,s=null,i=o.client(e,{host:t.host,transport:t.transport,debug:t.debug});return i.onHeaders(function(e){r=e}),i.onMessage(function(e){s=e}),i.onEnd(function(e,o,i){t.onEnd({status:e,statusMessage:o,headers:r||new n.Metadata,message:s,trailers:i})}),i.start(t.metadata),i.send(t.request),i.finishSend(),{close:function(){i.close()}}}}])});
/***/ }),
/***/ "./node_modules/google-protobuf/google-protobuf.js":
/*!*********************************************************!*\
!*** ./node_modules/google-protobuf/google-protobuf.js ***!
\*********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e<d;e++){var f=a[e];if(b.call(c,f,e,a))return{i:e,v:f}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;
$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};$jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof __webpack_require__.g&&null!=__webpack_require__.g?__webpack_require__.g:a};$jscomp.global=$jscomp.getGlobal(this);
$jscomp.polyfill=function(a,b,c,d){if(b){c=$jscomp.global;a=a.split(".");for(d=0;d<a.length-1;d++){var e=a[d];e in c||(c[e]={});c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b})}};$jscomp.polyfill("Array.prototype.findIndex",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).i}},"es6","es3");
$jscomp.checkStringArgs=function(a,b,c){if(null==a)throw new TypeError("The 'this' value for String.prototype."+c+" must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype."+c+" must not be a regular expression");return a+""};
$jscomp.polyfill("String.prototype.endsWith",function(a){return a?a:function(a,c){var b=$jscomp.checkStringArgs(this,a,"endsWith");a+="";void 0===c&&(c=b.length);c=Math.max(0,Math.min(c|0,b.length));for(var e=a.length;0<e&&0<c;)if(b[--c]!=a[--e])return!1;return 0>=e}},"es6","es3");$jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6","es3");
$jscomp.polyfill("String.prototype.startsWith",function(a){return a?a:function(a,c){var b=$jscomp.checkStringArgs(this,a,"startsWith");a+="";var e=b.length,f=a.length;c=Math.max(0,Math.min(c|0,b.length));for(var g=0;g<f&&c<e;)if(b[c++]!=a[g++])return!1;return g>=f}},"es6","es3");
$jscomp.polyfill("String.prototype.repeat",function(a){return a?a:function(a){var b=$jscomp.checkStringArgs(this,null,"repeat");if(0>a||1342177279<a)throw new RangeError("Invalid count value");a|=0;for(var d="";a;)if(a&1&&(d+=b),a>>>=1)b+=b;return d}},"es6","es3");var COMPILED=!0,goog=goog||{};goog.global=this||self;goog.isDef=function(a){return void 0!==a};goog.isString=function(a){return"string"==typeof a};goog.isBoolean=function(a){return"boolean"==typeof a};
goog.isNumber=function(a){return"number"==typeof a};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}};
goog.define=function(a,b){if(!COMPILED){var c=goog.global.CLOSURE_UNCOMPILED_DEFINES,d=goog.global.CLOSURE_DEFINES;c&&void 0===c.nodeType&&Object.prototype.hasOwnProperty.call(c,a)?b=c[a]:d&&void 0===d.nodeType&&Object.prototype.hasOwnProperty.call(d,a)&&(b=d[a])}return b};goog.FEATURESET_YEAR=2012;goog.DEBUG=!0;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG;goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1;
goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide cannot be used within a module.");if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var c=a;(c=c.substring(0,c.lastIndexOf(".")))&&!goog.getObjectByName(c);)goog.implicitNamespaces_[c]=!0}goog.exportPath_(a,b)};
goog.getScriptNonce=function(a){if(a&&a!=goog.global)return goog.getScriptNonce_(a.document);null===goog.cspNonce_&&(goog.cspNonce_=goog.getScriptNonce_(goog.global.document));return goog.cspNonce_};goog.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/;goog.cspNonce_=null;goog.getScriptNonce_=function(a){return(a=a.querySelector&&a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.NONCE_PATTERN_.test(a)?a:""};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/;
goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInGoogModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.");
if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}};goog.module.get=function(a){return goog.module.getInternal_(a)};
goog.module.getInternal_=function(a){if(!COMPILED){if(a in goog.loadedModules_)return goog.loadedModules_[a].exports;if(!goog.implicitNamespaces_[a])return a=goog.getObjectByName(a),null!=a?a:null}return null};goog.ModuleType={ES6:"es6",GOOG:"goog"};goog.moduleLoaderState_=null;goog.isInModuleLoader_=function(){return goog.isInGoogModuleLoader_()||goog.isInEs6ModuleLoader_()};goog.isInGoogModuleLoader_=function(){return!!goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.GOOG};
goog.isInEs6ModuleLoader_=function(){if(goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.ES6)return!0;var a=goog.global.$jscomp;return a?"function"!=typeof a.getCurrentModulePath?!1:!!a.getCurrentModulePath():!1};
goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInGoogModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");goog.moduleLoaderState_.declareLegacyNamespace=!0};
goog.declareModuleId=function(a){if(!COMPILED){if(!goog.isInEs6ModuleLoader_())throw Error("goog.declareModuleId may only be called from within an ES6 module");if(goog.moduleLoaderState_&&goog.moduleLoaderState_.moduleName)throw Error("goog.declareModuleId may only be called once per module.");if(a in goog.loadedModules_)throw Error('Module with namespace "'+a+'" already exists.');}if(goog.moduleLoaderState_)goog.moduleLoaderState_.moduleName=a;else{var b=goog.global.$jscomp;if(!b||"function"!=typeof b.getCurrentModulePath)throw Error('Module with namespace "'+
a+'" has been loaded incorrectly.');b=b.require(b.getCurrentModulePath());goog.loadedModules_[a]={exports:b,type:goog.ModuleType.ES6,moduleId:a}}};goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){};
COMPILED||(goog.isProvided_=function(a){return a in goog.loadedModules_||!goog.implicitNamespaces_[a]&&goog.isDefAndNotNull(goog.getObjectByName(a))},goog.implicitNamespaces_={"goog.module":!0});goog.getObjectByName=function(a,b){a=a.split(".");b=b||goog.global;for(var c=0;c<a.length;c++)if(b=b[a[c]],!goog.isDefAndNotNull(b))return null;return b};goog.globalize=function(a,b){b=b||goog.global;for(var c in a)b[c]=a[c]};
goog.addDependency=function(a,b,c,d){!COMPILED&&goog.DEPENDENCIES_ENABLED&&goog.debugLoader_.addDependency(a,b,c,d)};goog.ENABLE_DEBUG_LOADER=!0;goog.logToConsole_=function(a){goog.global.console&&goog.global.console.error(a)};
goog.require=function(a){if(!COMPILED){goog.ENABLE_DEBUG_LOADER&&goog.debugLoader_.requested(a);if(goog.isProvided_(a)){if(goog.isInModuleLoader_())return goog.module.getInternal_(a)}else if(goog.ENABLE_DEBUG_LOADER){var b=goog.moduleLoaderState_;goog.moduleLoaderState_=null;try{goog.debugLoader_.load_(a)}finally{goog.moduleLoaderState_=b}}return null}};goog.requireType=function(a){return{}};goog.basePath="";goog.nullFunction=function(){};
goog.abstractMethod=function(){throw Error("unimplemented abstract method");};goog.addSingletonGetter=function(a){a.instance_=void 0;a.getInstance=function(){if(a.instance_)return a.instance_;goog.DEBUG&&(goog.instantiatedSingletons_[goog.instantiatedSingletons_.length]=a);return a.instance_=new a}};goog.instantiatedSingletons_=[];goog.LOAD_MODULE_USING_EVAL=!0;goog.SEAL_MODULE_EXPORTS=goog.DEBUG;goog.loadedModules_={};goog.DEPENDENCIES_ENABLED=!COMPILED&&goog.ENABLE_DEBUG_LOADER;goog.TRANSPILE="detect";
goog.ASSUME_ES_MODULES_TRANSPILED=!1;goog.TRANSPILE_TO_LANGUAGE="";goog.TRANSPILER="transpile.js";goog.hasBadLetScoping=null;goog.useSafari10Workaround=function(){if(null==goog.hasBadLetScoping){try{var a=!eval('"use strict";let x = 1; function f() { return typeof x; };f() == "number";')}catch(b){a=!1}goog.hasBadLetScoping=a}return goog.hasBadLetScoping};goog.workaroundSafari10EvalBug=function(a){return"(function(){"+a+"\n;})();\n"};
goog.loadModule=function(a){var b=goog.moduleLoaderState_;try{goog.moduleLoaderState_={moduleName:"",declareLegacyNamespace:!1,type:goog.ModuleType.GOOG};if(goog.isFunction(a))var c=a.call(void 0,{});else if(goog.isString(a))goog.useSafari10Workaround()&&(a=goog.workaroundSafari10EvalBug(a)),c=goog.loadModuleFromSource_.call(void 0,a);else throw Error("Invalid module definition");var d=goog.moduleLoaderState_.moduleName;if(goog.isString(d)&&d)goog.moduleLoaderState_.declareLegacyNamespace?goog.constructNamespace_(d,
c):goog.SEAL_MODULE_EXPORTS&&Object.seal&&"object"==typeof c&&null!=c&&Object.seal(c),goog.loadedModules_[d]={exports:c,type:goog.ModuleType.GOOG,moduleId:goog.moduleLoaderState_.moduleName};else throw Error('Invalid module name "'+d+'"');}finally{goog.moduleLoaderState_=b}};goog.loadModuleFromSource_=function(a){eval(a);return{}};goog.normalizePath_=function(a){a=a.split("/");for(var b=0;b<a.length;)"."==a[b]?a.splice(b,1):b&&".."==a[b]&&a[b-1]&&".."!=a[b-1]?a.splice(--b,2):b++;return a.join("/")};
goog.loadFileSync_=function(a){if(goog.global.CLOSURE_LOAD_FILE_SYNC)return goog.global.CLOSURE_LOAD_FILE_SYNC(a);try{var b=new goog.global.XMLHttpRequest;b.open("get",a,!1);b.send();return 0==b.status||200==b.status?b.responseText:null}catch(c){return null}};
goog.transpile_=function(a,b,c){var d=goog.global.$jscomp;d||(goog.global.$jscomp=d={});var e=d.transpile;if(!e){var f=goog.basePath+goog.TRANSPILER,g=goog.loadFileSync_(f);if(g){(function(){(0,eval)(g+"\n//# sourceURL="+f)}).call(goog.global);if(goog.global.$gwtExport&&goog.global.$gwtExport.$jscomp&&!goog.global.$gwtExport.$jscomp.transpile)throw Error('The transpiler did not properly export the "transpile" method. $gwtExport: '+JSON.stringify(goog.global.$gwtExport));goog.global.$jscomp.transpile=
goog.global.$gwtExport.$jscomp.transpile;d=goog.global.$jscomp;e=d.transpile}}e||(e=d.transpile=function(a,b){goog.logToConsole_(b+" requires transpilation but no transpiler was found.");return a});return e(a,b,c)};
goog.typeOf=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";
else if("function"==b&&"undefined"==typeof a.call)return"object";return b};goog.isNull=function(a){return null===a};goog.isDefAndNotNull=function(a){return null!=a};goog.isArray=function(a){return"array"==goog.typeOf(a)};goog.isArrayLike=function(a){var b=goog.typeOf(a);return"array"==b||"object"==b&&"number"==typeof a.length};goog.isDateLike=function(a){return goog.isObject(a)&&"function"==typeof a.getFullYear};goog.isFunction=function(a){return"function"==goog.typeOf(a)};
goog.isObject=function(a){var b=typeof a;return"object"==b&&null!=a||"function"==b};goog.getUid=function(a){return a[goog.UID_PROPERTY_]||(a[goog.UID_PROPERTY_]=++goog.uidCounter_)};goog.hasUid=function(a){return!!a[goog.UID_PROPERTY_]};goog.removeUid=function(a){null!==a&&"removeAttribute"in a&&a.removeAttribute(goog.UID_PROPERTY_);try{delete a[goog.UID_PROPERTY_]}catch(b){}};goog.UID_PROPERTY_="closure_uid_"+(1E9*Math.random()>>>0);goog.uidCounter_=0;goog.getHashCode=goog.getUid;
goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if("function"===typeof a.clone)return a.clone();b="array"==b?[]:{};for(var c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)};
goog.bindJs_=function(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}};goog.bind=function(a,b,c){Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?goog.bind=goog.bindNative_:goog.bind=goog.bindJs_;return goog.bind.apply(null,arguments)};
goog.partial=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}};goog.mixin=function(a,b){for(var c in b)a[c]=b[c]};goog.now=goog.TRUSTED_SITE&&Date.now||function(){return+new Date};
goog.globalEval=function(a){if(goog.global.execScript)goog.global.execScript(a,"JavaScript");else if(goog.global.eval){if(null==goog.evalWorksForGlobals_){try{goog.global.eval("var _evalTest_ = 1;")}catch(d){}if("undefined"!=typeof goog.global._evalTest_){try{delete goog.global._evalTest_}catch(d){}goog.evalWorksForGlobals_=!0}else goog.evalWorksForGlobals_=!1}if(goog.evalWorksForGlobals_)goog.global.eval(a);else{var b=goog.global.document,c=b.createElement("SCRIPT");c.type="text/javascript";c.defer=
!1;c.appendChild(b.createTextNode(a));b.head.appendChild(c);b.head.removeChild(c)}}else throw Error("goog.globalEval not available");};goog.evalWorksForGlobals_=null;
goog.getCssName=function(a,b){if("."==String(a).charAt(0))throw Error('className passed in goog.getCssName must not start with ".". You passed: '+a);var c=function(a){return goog.cssNameMapping_[a]||a},d=function(a){a=a.split("-");for(var b=[],d=0;d<a.length;d++)b.push(c(a[d]));return b.join("-")};d=goog.cssNameMapping_?"BY_WHOLE"==goog.cssNameMappingStyle_?c:d:function(a){return a};a=b?a+"-"+d(b):d(a);return goog.global.CLOSURE_CSS_NAME_MAP_FN?goog.global.CLOSURE_CSS_NAME_MAP_FN(a):a};
goog.setCssNameMapping=function(a,b){goog.cssNameMapping_=a;goog.cssNameMappingStyle_=b};!COMPILED&&goog.global.CLOSURE_CSS_NAME_MAPPING&&(goog.cssNameMapping_=goog.global.CLOSURE_CSS_NAME_MAPPING);goog.getMsg=function(a,b,c){c&&c.html&&(a=a.replace(/</g,"&lt;"));b&&(a=a.replace(/\{\$([^}]+)}/g,function(a,c){return null!=b&&c in b?b[c]:a}));return a};goog.getMsgWithFallback=function(a,b){return a};goog.exportSymbol=function(a,b,c){goog.exportPath_(a,b,c)};
goog.exportProperty=function(a,b,c){a[b]=c};goog.inherits=function(a,b){function c(){}c.prototype=b.prototype;a.superClass_=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.base=function(a,c,f){for(var d=Array(arguments.length-2),e=2;e<arguments.length;e++)d[e-2]=arguments[e];return b.prototype[c].apply(a,d)}};
goog.base=function(a,b,c){var d=arguments.callee.caller;if(goog.STRICT_MODE_COMPATIBLE||goog.DEBUG&&!d)throw Error("arguments.caller not defined. goog.base() cannot be used with strict mode code. See http://www.ecma-international.org/ecma-262/5.1/#sec-C");if("undefined"!==typeof d.superClass_){for(var e=Array(arguments.length-1),f=1;f<arguments.length;f++)e[f-1]=arguments[f];return d.superClass_.constructor.apply(a,e)}if("string"!=typeof b&&"symbol"!=typeof b)throw Error("method names provided to goog.base must be a string or a symbol");
e=Array(arguments.length-2);for(f=2;f<arguments.length;f++)e[f-2]=arguments[f];f=!1;for(var g=a.constructor.prototype;g;g=Object.getPrototypeOf(g))if(g[b]===d)f=!0;else if(f)return g[b].apply(a,e);if(a[b]===d)return a.constructor.prototype[b].apply(a,e);throw Error("goog.base called from a method of one name to a method of a different name");};goog.scope=function(a){if(goog.isInModuleLoader_())throw Error("goog.scope is not supported within a module.");a.call(goog.global)};
COMPILED||(goog.global.COMPILED=COMPILED);goog.defineClass=function(a,b){var c=b.constructor,d=b.statics;c&&c!=Object.prototype.constructor||(c=function(){throw Error("cannot instantiate an interface (no constructor defined).");});c=goog.defineClass.createSealingConstructor_(c,a);a&&goog.inherits(c,a);delete b.constructor;delete b.statics;goog.defineClass.applyProperties_(c.prototype,b);null!=d&&(d instanceof Function?d(c):goog.defineClass.applyProperties_(c,d));return c};
goog.defineClass.SEAL_CLASS_INSTANCES=goog.DEBUG;goog.defineClass.createSealingConstructor_=function(a,b){if(!goog.defineClass.SEAL_CLASS_INSTANCES)return a;var c=!goog.defineClass.isUnsealable_(b),d=function(){var b=a.apply(this,arguments)||this;b[goog.UID_PROPERTY_]=b[goog.UID_PROPERTY_];this.constructor===d&&c&&Object.seal instanceof Function&&Object.seal(b);return b};return d};goog.defineClass.isUnsealable_=function(a){return a&&a.prototype&&a.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_]};
goog.defineClass.OBJECT_PROTOTYPE_FIELDS_="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");goog.defineClass.applyProperties_=function(a,b){for(var c in b)Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c]);for(var d=0;d<goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length;d++)c=goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[d],Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c])};
goog.tagUnsealableClass=function(a){!COMPILED&&goog.defineClass.SEAL_CLASS_INSTANCES&&(a.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_]=!0)};goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_="goog_defineClass_legacy_unsealable";
!COMPILED&&goog.DEPENDENCIES_ENABLED&&(goog.inHtmlDocument_=function(){var a=goog.global.document;return null!=a&&"write"in a},goog.isDocumentLoading_=function(){var a=goog.global.document;return a.attachEvent?"complete"!=a.readyState:"loading"==a.readyState},goog.findBasePath_=function(){if(goog.isDef(goog.global.CLOSURE_BASE_PATH)&&goog.isString(goog.global.CLOSURE_BASE_PATH))goog.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_()){var a=goog.global.document,b=a.currentScript;
a=b?[b]:a.getElementsByTagName("SCRIPT");for(b=a.length-1;0<=b;--b){var c=a[b].src,d=c.lastIndexOf("?");d=-1==d?c.length:d;if("base.js"==c.substr(d-7,7)){goog.basePath=c.substr(0,d-7);break}}}},goog.findBasePath_(),goog.Transpiler=function(){this.requiresTranspilation_=null;this.transpilationTarget_=goog.TRANSPILE_TO_LANGUAGE},goog.Transpiler.prototype.createRequiresTranspilation_=function(){function a(a,b){e?d[a]=!0:b()?(c=a,d[a]=!1):e=d[a]=!0}function b(a){try{return!!eval(a)}catch(h){return!1}}
var c="es3",d={es3:!1},e=!1,f=goog.global.navigator&&goog.global.navigator.userAgent?goog.global.navigator.userAgent:"";a("es5",function(){return b("[1,].length==1")});a("es6",function(){return f.match(/Edge\/(\d+)(\.\d)*/i)?!1:b('(()=>{"use strict";class X{constructor(){if(new.target!=String)throw 1;this.x=42}}let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof String))throw 1;for(const a of[2,3]){if(a==2)continue;function f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()==3}})()')});
a("es7",function(){return b("2 ** 2 == 4")});a("es8",function(){return b("async () => 1, true")});a("es9",function(){return b("({...rest} = {}), true")});a("es_next",function(){return!1});return{target:c,map:d}},goog.Transpiler.prototype.needsTranspile=function(a,b){if("always"==goog.TRANSPILE)return!0;if("never"==goog.TRANSPILE)return!1;if(!this.requiresTranspilation_){var c=this.createRequiresTranspilation_();this.requiresTranspilation_=c.map;this.transpilationTarget_=this.transpilationTarget_||
c.target}if(a in this.requiresTranspilation_)return this.requiresTranspilation_[a]?!0:!goog.inHtmlDocument_()||"es6"!=b||"noModule"in goog.global.document.createElement("script")?!1:!0;throw Error("Unknown language mode: "+a);},goog.Transpiler.prototype.transpile=function(a,b){return goog.transpile_(a,b,this.transpilationTarget_)},goog.transpiler_=new goog.Transpiler,goog.protectScriptTag_=function(a){return a.replace(/<\/(SCRIPT)/ig,"\\x3c/$1")},goog.DebugLoader_=function(){this.dependencies_={};
this.idToPath_={};this.written_={};this.loadingDeps_=[];this.depsToLoad_=[];this.paused_=!1;this.factory_=new goog.DependencyFactory(goog.transpiler_);this.deferredCallbacks_={};this.deferredQueue_=[]},goog.DebugLoader_.prototype.bootstrap=function(a,b){function c(){d&&(goog.global.setTimeout(d,0),d=null)}var d=b;if(a.length){b=[];for(var e=0;e<a.length;e++){var f=this.getPathFromDeps_(a[e]);if(!f)throw Error("Unregonized namespace: "+a[e]);b.push(this.dependencies_[f])}f=goog.require;var g=0;for(e=
0;e<a.length;e++)f(a[e]),b[e].onLoad(function(){++g==a.length&&c()})}else c()},goog.DebugLoader_.prototype.loadClosureDeps=function(){this.depsToLoad_.push(this.factory_.createDependency(goog.normalizePath_(goog.basePath+"deps.js"),"deps.js",[],[],{},!1));this.loadDeps_()},goog.DebugLoader_.prototype.requested=function(a,b){(a=this.getPathFromDeps_(a))&&(b||this.areDepsLoaded_(this.dependencies_[a].requires))&&(b=this.deferredCallbacks_[a])&&(delete this.deferredCallbacks_[a],b())},goog.DebugLoader_.prototype.setDependencyFactory=
function(a){this.factory_=a},goog.DebugLoader_.prototype.load_=function(a){if(this.getPathFromDeps_(a)){var b=this,c=[],d=function(a){var e=b.getPathFromDeps_(a);if(!e)throw Error("Bad dependency path or symbol: "+a);if(!b.written_[e]){b.written_[e]=!0;a=b.dependencies_[e];for(e=0;e<a.requires.length;e++)goog.isProvided_(a.requires[e])||d(a.requires[e]);c.push(a)}};d(a);a=!!this.depsToLoad_.length;this.depsToLoad_=this.depsToLoad_.concat(c);this.paused_||a||this.loadDeps_()}else throw a="goog.require could not find: "+
a,goog.logToConsole_(a),Error(a);},goog.DebugLoader_.prototype.loadDeps_=function(){for(var a=this,b=this.paused_;this.depsToLoad_.length&&!b;)(function(){var c=!1,d=a.depsToLoad_.shift(),e=!1;a.loading_(d);var f={pause:function(){if(c)throw Error("Cannot call pause after the call to load.");b=!0},resume:function(){c?a.resume_():b=!1},loaded:function(){if(e)throw Error("Double call to loaded.");e=!0;a.loaded_(d)},pending:function(){for(var b=[],c=0;c<a.loadingDeps_.length;c++)b.push(a.loadingDeps_[c]);
return b},setModuleState:function(a){goog.moduleLoaderState_={type:a,moduleName:"",declareLegacyNamespace:!1}},registerEs6ModuleExports:function(a,b,c){c&&(goog.loadedModules_[c]={exports:b,type:goog.ModuleType.ES6,moduleId:c||""})},registerGoogModuleExports:function(a,b){goog.loadedModules_[a]={exports:b,type:goog.ModuleType.GOOG,moduleId:a}},clearModuleState:function(){goog.moduleLoaderState_=null},defer:function(b){if(c)throw Error("Cannot register with defer after the call to load.");a.defer_(d,
b)},areDepsLoaded:function(){return a.areDepsLoaded_(d.requires)}};try{d.load(f)}finally{c=!0}})();b&&this.pause_()},goog.DebugLoader_.prototype.pause_=function(){this.paused_=!0},goog.DebugLoader_.prototype.resume_=function(){this.paused_&&(this.paused_=!1,this.loadDeps_())},goog.DebugLoader_.prototype.loading_=function(a){this.loadingDeps_.push(a)},goog.DebugLoader_.prototype.loaded_=function(a){for(var b=0;b<this.loadingDeps_.length;b++)if(this.loadingDeps_[b]==a){this.loadingDeps_.splice(b,1);
break}for(b=0;b<this.deferredQueue_.length;b++)if(this.deferredQueue_[b]==a.path){this.deferredQueue_.splice(b,1);break}if(this.loadingDeps_.length==this.deferredQueue_.length&&!this.depsToLoad_.length)for(;this.deferredQueue_.length;)this.requested(this.deferredQueue_.shift(),!0);a.loaded()},goog.DebugLoader_.prototype.areDepsLoaded_=function(a){for(var b=0;b<a.length;b++){var c=this.getPathFromDeps_(a[b]);if(!c||!(c in this.deferredCallbacks_||goog.isProvided_(a[b])))return!1}return!0},goog.DebugLoader_.prototype.getPathFromDeps_=
function(a){return a in this.idToPath_?this.idToPath_[a]:a in this.dependencies_?a:null},goog.DebugLoader_.prototype.defer_=function(a,b){this.deferredCallbacks_[a.path]=b;this.deferredQueue_.push(a.path)},goog.LoadController=function(){},goog.LoadController.prototype.pause=function(){},goog.LoadController.prototype.resume=function(){},goog.LoadController.prototype.loaded=function(){},goog.LoadController.prototype.pending=function(){},goog.LoadController.prototype.registerEs6ModuleExports=function(a,
b,c){},goog.LoadController.prototype.setModuleState=function(a){},goog.LoadController.prototype.clearModuleState=function(){},goog.LoadController.prototype.defer=function(a){},goog.LoadController.prototype.areDepsLoaded=function(){},goog.Dependency=function(a,b,c,d,e){this.path=a;this.relativePath=b;this.provides=c;this.requires=d;this.loadFlags=e;this.loaded_=!1;this.loadCallbacks_=[]},goog.Dependency.prototype.getPathName=function(){var a=this.path,b=a.indexOf("://");0<=b&&(a=a.substring(b+3),b=
a.indexOf("/"),0<=b&&(a=a.substring(b+1)));return a},goog.Dependency.prototype.onLoad=function(a){this.loaded_?a():this.loadCallbacks_.push(a)},goog.Dependency.prototype.loaded=function(){this.loaded_=!0;var a=this.loadCallbacks_;this.loadCallbacks_=[];for(var b=0;b<a.length;b++)a[b]()},goog.Dependency.defer_=!1,goog.Dependency.callbackMap_={},goog.Dependency.registerCallback_=function(a){var b=Math.random().toString(32);goog.Dependency.callbackMap_[b]=a;return b},goog.Dependency.unregisterCallback_=
function(a){delete goog.Dependency.callbackMap_[a]},goog.Dependency.callback_=function(a,b){if(a in goog.Dependency.callbackMap_){for(var c=goog.Dependency.callbackMap_[a],d=[],e=1;e<arguments.length;e++)d.push(arguments[e]);c.apply(void 0,d)}else throw Error("Callback key "+a+" does not exist (was base.js loaded more than once?).");},goog.Dependency.prototype.load=function(a){if(goog.global.CLOSURE_IMPORT_SCRIPT)goog.global.CLOSURE_IMPORT_SCRIPT(this.path)?a.loaded():a.pause();else if(goog.inHtmlDocument_()){var b=
goog.global.document;if("complete"==b.readyState&&!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING){if(/\bdeps.js$/.test(this.path)){a.loaded();return}throw Error('Cannot write "'+this.path+'" after document load');}if(!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING&&goog.isDocumentLoading_()){var c=goog.Dependency.registerCallback_(function(b){goog.DebugLoader_.IS_OLD_IE_&&"complete"!=b.readyState||(goog.Dependency.unregisterCallback_(c),a.loaded())}),d=!goog.DebugLoader_.IS_OLD_IE_&&goog.getScriptNonce()?
' nonce="'+goog.getScriptNonce()+'"':"";d='<script src="'+this.path+'" '+(goog.DebugLoader_.IS_OLD_IE_?"onreadystatechange":"onload")+"=\"goog.Dependency.callback_('"+c+'\', this)" type="text/javascript" '+(goog.Dependency.defer_?"defer":"")+d+">\x3c/script>";b.write(goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createHTML(d):d)}else{var e=b.createElement("script");e.defer=goog.Dependency.defer_;e.async=!1;e.type="text/javascript";(d=goog.getScriptNonce())&&e.setAttribute("nonce",d);goog.DebugLoader_.IS_OLD_IE_?
(a.pause(),e.onreadystatechange=function(){if("loaded"==e.readyState||"complete"==e.readyState)a.loaded(),a.resume()}):e.onload=function(){e.onload=null;a.loaded()};e.src=goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createScriptURL(this.path):this.path;b.head.appendChild(e)}}else goog.logToConsole_("Cannot use default debug loader outside of HTML documents."),"deps.js"==this.relativePath?(goog.logToConsole_("Consider setting CLOSURE_IMPORT_SCRIPT before loading base.js, or setting CLOSURE_NO_DEPS to true."),
a.loaded()):a.pause()},goog.Es6ModuleDependency=function(a,b,c,d,e){goog.Dependency.call(this,a,b,c,d,e)},goog.inherits(goog.Es6ModuleDependency,goog.Dependency),goog.Es6ModuleDependency.prototype.load=function(a){function b(a,b){a=b?'<script type="module" crossorigin>'+b+"\x3c/script>":'<script type="module" crossorigin src="'+a+'">\x3c/script>';d.write(goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createHTML(a):a)}function c(a,b){var c=d.createElement("script");c.defer=!0;c.async=!1;c.type=
"module";c.setAttribute("crossorigin",!0);var e=goog.getScriptNonce();e&&c.setAttribute("nonce",e);b?c.textContent=goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createScript(b):b:c.src=goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createScriptURL(a):a;d.head.appendChild(c)}if(goog.global.CLOSURE_IMPORT_SCRIPT)goog.global.CLOSURE_IMPORT_SCRIPT(this.path)?a.loaded():a.pause();else if(goog.inHtmlDocument_()){var d=goog.global.document,e=this;if(goog.isDocumentLoading_()){var f=b;goog.Dependency.defer_=
!0}else f=c;var g=goog.Dependency.registerCallback_(function(){goog.Dependency.unregisterCallback_(g);a.setModuleState(goog.ModuleType.ES6)});f(void 0,'goog.Dependency.callback_("'+g+'")');f(this.path,void 0);var h=goog.Dependency.registerCallback_(function(b){goog.Dependency.unregisterCallback_(h);a.registerEs6ModuleExports(e.path,b,goog.moduleLoaderState_.moduleName)});f(void 0,'import * as m from "'+this.path+'"; goog.Dependency.callback_("'+h+'", m)');var k=goog.Dependency.registerCallback_(function(){goog.Dependency.unregisterCallback_(k);
a.clearModuleState();a.loaded()});f(void 0,'goog.Dependency.callback_("'+k+'")')}else goog.logToConsole_("Cannot use default debug loader outside of HTML documents."),a.pause()},goog.TransformedDependency=function(a,b,c,d,e){goog.Dependency.call(this,a,b,c,d,e);this.contents_=null;this.lazyFetch_=!goog.inHtmlDocument_()||!("noModule"in goog.global.document.createElement("script"))},goog.inherits(goog.TransformedDependency,goog.Dependency),goog.TransformedDependency.prototype.load=function(a){function b(){e.contents_=
goog.loadFileSync_(e.path);e.contents_&&(e.contents_=e.transform(e.contents_),e.contents_&&(e.contents_+="\n//# sourceURL="+e.path))}function c(){e.lazyFetch_&&b();if(e.contents_){f&&a.setModuleState(goog.ModuleType.ES6);try{var c=e.contents_;e.contents_=null;goog.globalEval(c);if(f)var d=goog.moduleLoaderState_.moduleName}finally{f&&a.clearModuleState()}f&&goog.global.$jscomp.require.ensure([e.getPathName()],function(){a.registerEs6ModuleExports(e.path,goog.global.$jscomp.require(e.getPathName()),
d)});a.loaded()}}function d(){var a=goog.global.document,b=goog.Dependency.registerCallback_(function(){goog.Dependency.unregisterCallback_(b);c()}),d='<script type="text/javascript">'+goog.protectScriptTag_('goog.Dependency.callback_("'+b+'");')+"\x3c/script>";a.write(goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createHTML(d):d)}var e=this;if(goog.global.CLOSURE_IMPORT_SCRIPT)b(),this.contents_&&goog.global.CLOSURE_IMPORT_SCRIPT("",this.contents_)?(this.contents_=null,a.loaded()):a.pause();
else{var f=this.loadFlags.module==goog.ModuleType.ES6;this.lazyFetch_||b();var g=1<a.pending().length,h=g&&goog.DebugLoader_.IS_OLD_IE_;g=goog.Dependency.defer_&&(g||goog.isDocumentLoading_());if(h||g)a.defer(function(){c()});else{var k=goog.global.document;h=goog.inHtmlDocument_()&&"ActiveXObject"in goog.global;if(f&&goog.inHtmlDocument_()&&goog.isDocumentLoading_()&&!h){goog.Dependency.defer_=!0;a.pause();var l=k.onreadystatechange;k.onreadystatechange=function(){"interactive"==k.readyState&&(k.onreadystatechange=
l,c(),a.resume());goog.isFunction(l)&&l.apply(void 0,arguments)}}else!goog.DebugLoader_.IS_OLD_IE_&&goog.inHtmlDocument_()&&goog.isDocumentLoading_()?d():c()}}},goog.TransformedDependency.prototype.transform=function(a){},goog.TranspiledDependency=function(a,b,c,d,e,f){goog.TransformedDependency.call(this,a,b,c,d,e);this.transpiler=f},goog.inherits(goog.TranspiledDependency,goog.TransformedDependency),goog.TranspiledDependency.prototype.transform=function(a){return this.transpiler.transpile(a,this.getPathName())},
goog.PreTranspiledEs6ModuleDependency=function(a,b,c,d,e){goog.TransformedDependency.call(this,a,b,c,d,e)},goog.inherits(goog.PreTranspiledEs6ModuleDependency,goog.TransformedDependency),goog.PreTranspiledEs6ModuleDependency.prototype.transform=function(a){return a},goog.GoogModuleDependency=function(a,b,c,d,e,f,g){goog.TransformedDependency.call(this,a,b,c,d,e);this.needsTranspile_=f;this.transpiler_=g},goog.inherits(goog.GoogModuleDependency,goog.TransformedDependency),goog.GoogModuleDependency.prototype.transform=
function(a){this.needsTranspile_&&(a=this.transpiler_.transpile(a,this.getPathName()));return goog.LOAD_MODULE_USING_EVAL&&goog.isDef(goog.global.JSON)?"goog.loadModule("+goog.global.JSON.stringify(a+"\n//# sourceURL="+this.path+"\n")+");":'goog.loadModule(function(exports) {"use strict";'+a+"\n;return exports});\n//# sourceURL="+this.path+"\n"},goog.DebugLoader_.IS_OLD_IE_=!(goog.global.atob||!goog.global.document||!goog.global.document.all),goog.DebugLoader_.prototype.addDependency=function(a,b,
c,d){b=b||[];a=a.replace(/\\/g,"/");var e=goog.normalizePath_(goog.basePath+a);d&&"boolean"!==typeof d||(d=d?{module:goog.ModuleType.GOOG}:{});c=this.factory_.createDependency(e,a,b,c,d,goog.transpiler_.needsTranspile(d.lang||"es3",d.module));this.dependencies_[e]=c;for(c=0;c<b.length;c++)this.idToPath_[b[c]]=e;this.idToPath_[a]=e},goog.DependencyFactory=function(a){this.transpiler=a},goog.DependencyFactory.prototype.createDependency=function(a,b,c,d,e,f){return e.module==goog.ModuleType.GOOG?new goog.GoogModuleDependency(a,
b,c,d,e,f,this.transpiler):f?new goog.TranspiledDependency(a,b,c,d,e,this.transpiler):e.module==goog.ModuleType.ES6?"never"==goog.TRANSPILE&&goog.ASSUME_ES_MODULES_TRANSPILED?new goog.PreTranspiledEs6ModuleDependency(a,b,c,d,e):new goog.Es6ModuleDependency(a,b,c,d,e):new goog.Dependency(a,b,c,d,e)},goog.debugLoader_=new goog.DebugLoader_,goog.loadClosureDeps=function(){goog.debugLoader_.loadClosureDeps()},goog.setDependencyFactory=function(a){goog.debugLoader_.setDependencyFactory(a)},goog.global.CLOSURE_NO_DEPS||
goog.debugLoader_.loadClosureDeps(),goog.bootstrap=function(a,b){goog.debugLoader_.bootstrap(a,b)});goog.TRUSTED_TYPES_POLICY_NAME="";goog.identity_=function(a){return a};goog.createTrustedTypesPolicy=function(a){var b=null;if("undefined"===typeof TrustedTypes||!TrustedTypes.createPolicy)return b;try{b=TrustedTypes.createPolicy(a,{createHTML:goog.identity_,createScript:goog.identity_,createScriptURL:goog.identity_,createURL:goog.identity_})}catch(c){goog.logToConsole_(c.message)}return b};
goog.TRUSTED_TYPES_POLICY_=goog.TRUSTED_TYPES_POLICY_NAME?goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME+"#base"):null;var jspb={BinaryConstants:{},ConstBinaryMessage:function(){},BinaryMessage:function(){}};jspb.BinaryConstants.FieldType={INVALID:-1,DOUBLE:1,FLOAT:2,INT64:3,UINT64:4,INT32:5,FIXED64:6,FIXED32:7,BOOL:8,STRING:9,GROUP:10,MESSAGE:11,BYTES:12,UINT32:13,ENUM:14,SFIXED32:15,SFIXED64:16,SINT32:17,SINT64:18,FHASH64:30,VHASH64:31};jspb.BinaryConstants.WireType={INVALID:-1,VARINT:0,FIXED64:1,DELIMITED:2,START_GROUP:3,END_GROUP:4,FIXED32:5};
jspb.BinaryConstants.FieldTypeToWireType=function(a){var b=jspb.BinaryConstants.FieldType,c=jspb.BinaryConstants.WireType;switch(a){case b.INT32:case b.INT64:case b.UINT32:case b.UINT64:case b.SINT32:case b.SINT64:case b.BOOL:case b.ENUM:case b.VHASH64:return c.VARINT;case b.DOUBLE:case b.FIXED64:case b.SFIXED64:case b.FHASH64:return c.FIXED64;case b.STRING:case b.MESSAGE:case b.BYTES:return c.DELIMITED;case b.FLOAT:case b.FIXED32:case b.SFIXED32:return c.FIXED32;default:return c.INVALID}};
jspb.BinaryConstants.INVALID_FIELD_NUMBER=-1;jspb.BinaryConstants.FLOAT32_EPS=1.401298464324817E-45;jspb.BinaryConstants.FLOAT32_MIN=1.1754943508222875E-38;jspb.BinaryConstants.FLOAT32_MAX=3.4028234663852886E38;jspb.BinaryConstants.FLOAT64_EPS=4.9E-324;jspb.BinaryConstants.FLOAT64_MIN=2.2250738585072014E-308;jspb.BinaryConstants.FLOAT64_MAX=1.7976931348623157E308;jspb.BinaryConstants.TWO_TO_20=1048576;jspb.BinaryConstants.TWO_TO_23=8388608;jspb.BinaryConstants.TWO_TO_31=2147483648;
jspb.BinaryConstants.TWO_TO_32=4294967296;jspb.BinaryConstants.TWO_TO_52=4503599627370496;jspb.BinaryConstants.TWO_TO_63=0x7fffffffffffffff;jspb.BinaryConstants.TWO_TO_64=1.8446744073709552E19;jspb.BinaryConstants.ZERO_HASH="\x00\x00\x00\x00\x00\x00\x00\x00";goog.dom={};goog.dom.NodeType={ELEMENT:1,ATTRIBUTE:2,TEXT:3,CDATA_SECTION:4,ENTITY_REFERENCE:5,ENTITY:6,PROCESSING_INSTRUCTION:7,COMMENT:8,DOCUMENT:9,DOCUMENT_TYPE:10,DOCUMENT_FRAGMENT:11,NOTATION:12};goog.debug={};goog.debug.Error=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,goog.debug.Error);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a));this.reportErrorToServer=!0};goog.inherits(goog.debug.Error,Error);goog.debug.Error.prototype.name="CustomError";goog.asserts={};goog.asserts.ENABLE_ASSERTS=goog.DEBUG;goog.asserts.AssertionError=function(a,b){goog.debug.Error.call(this,goog.asserts.subs_(a,b));this.messagePattern=a};goog.inherits(goog.asserts.AssertionError,goog.debug.Error);goog.asserts.AssertionError.prototype.name="AssertionError";goog.asserts.DEFAULT_ERROR_HANDLER=function(a){throw a;};goog.asserts.errorHandler_=goog.asserts.DEFAULT_ERROR_HANDLER;
goog.asserts.subs_=function(a,b){a=a.split("%s");for(var c="",d=a.length-1,e=0;e<d;e++)c+=a[e]+(e<b.length?b[e]:"%s");return c+a[d]};goog.asserts.doAssertFailure_=function(a,b,c,d){var e="Assertion failed";if(c){e+=": "+c;var f=d}else a&&(e+=": "+a,f=b);a=new goog.asserts.AssertionError(""+e,f||[]);goog.asserts.errorHandler_(a)};goog.asserts.setErrorHandler=function(a){goog.asserts.ENABLE_ASSERTS&&(goog.asserts.errorHandler_=a)};
goog.asserts.assert=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!a&&goog.asserts.doAssertFailure_("",null,b,Array.prototype.slice.call(arguments,2));return a};goog.asserts.assertExists=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&null==a&&goog.asserts.doAssertFailure_("Expected to exist: %s.",[a],b,Array.prototype.slice.call(arguments,2));return a};
goog.asserts.fail=function(a,b){goog.asserts.ENABLE_ASSERTS&&goog.asserts.errorHandler_(new goog.asserts.AssertionError("Failure"+(a?": "+a:""),Array.prototype.slice.call(arguments,1)))};goog.asserts.assertNumber=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isNumber(a)&&goog.asserts.doAssertFailure_("Expected number but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};
goog.asserts.assertString=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isString(a)&&goog.asserts.doAssertFailure_("Expected string but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};goog.asserts.assertFunction=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isFunction(a)&&goog.asserts.doAssertFailure_("Expected function but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};
goog.asserts.assertObject=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isObject(a)&&goog.asserts.doAssertFailure_("Expected object but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};goog.asserts.assertArray=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isArray(a)&&goog.asserts.doAssertFailure_("Expected array but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};
goog.asserts.assertBoolean=function(a,b,c){goog.asserts.ENABLE_ASSERTS&&!goog.isBoolean(a)&&goog.asserts.doAssertFailure_("Expected boolean but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};goog.asserts.assertElement=function(a,b,c){!goog.asserts.ENABLE_ASSERTS||goog.isObject(a)&&a.nodeType==goog.dom.NodeType.ELEMENT||goog.asserts.doAssertFailure_("Expected Element but got %s: %s.",[goog.typeOf(a),a],b,Array.prototype.slice.call(arguments,2));return a};
goog.asserts.assertInstanceof=function(a,b,c,d){!goog.asserts.ENABLE_ASSERTS||a instanceof b||goog.asserts.doAssertFailure_("Expected instanceof %s but got %s.",[goog.asserts.getType_(b),goog.asserts.getType_(a)],c,Array.prototype.slice.call(arguments,3));return a};goog.asserts.assertFinite=function(a,b,c){!goog.asserts.ENABLE_ASSERTS||"number"==typeof a&&isFinite(a)||goog.asserts.doAssertFailure_("Expected %s to be a finite number but it is not.",[a],b,Array.prototype.slice.call(arguments,2));return a};
goog.asserts.assertObjectPrototypeIsIntact=function(){for(var a in Object.prototype)goog.asserts.fail(a+" should not be enumerable in Object.prototype.")};goog.asserts.getType_=function(a){return a instanceof Function?a.displayName||a.name||"unknown type name":a instanceof Object?a.constructor.displayName||a.constructor.name||Object.prototype.toString.call(a):null===a?"null":typeof a};goog.array={};goog.NATIVE_ARRAY_PROTOTYPES=goog.TRUSTED_SITE;goog.array.ASSUME_NATIVE_FUNCTIONS=2012<goog.FEATURESET_YEAR;goog.array.peek=function(a){return a[a.length-1]};goog.array.last=goog.array.peek;
goog.array.indexOf=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.indexOf)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(goog.isString(a))return goog.isString(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};
goog.array.lastIndexOf=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.lastIndexOf)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.lastIndexOf.call(a,b,null==c?a.length-1:c)}:function(a,b,c){c=null==c?a.length-1:c;0>c&&(c=Math.max(0,a.length+c));if(goog.isString(a))return goog.isString(b)&&1==b.length?a.lastIndexOf(b,c):-1;for(;0<=c;c--)if(c in a&&a[c]===b)return c;return-1};
goog.array.forEach=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.forEach)?function(a,b,c){goog.asserts.assert(null!=a.length);Array.prototype.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;f<d;f++)f in e&&b.call(c,e[f],f,a)};goog.array.forEachRight=function(a,b,c){var d=a.length,e=goog.isString(a)?a.split(""):a;for(--d;0<=d;--d)d in e&&b.call(c,e[d],d,a)};
goog.array.filter=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.filter)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.filter.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=[],f=0,g=goog.isString(a)?a.split(""):a,h=0;h<d;h++)if(h in g){var k=g[h];b.call(c,k,h,a)&&(e[f++]=k)}return e};
goog.array.map=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.map)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.map.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=Array(d),f=goog.isString(a)?a.split(""):a,g=0;g<d;g++)g in f&&(e[g]=b.call(c,f[g],g,a));return e};
goog.array.reduce=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.reduce)?function(a,b,c,d){goog.asserts.assert(null!=a.length);d&&(b=goog.bind(b,d));return Array.prototype.reduce.call(a,b,c)}:function(a,b,c,d){var e=c;goog.array.forEach(a,function(c,g){e=b.call(d,e,c,g,a)});return e};
goog.array.reduceRight=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.reduceRight)?function(a,b,c,d){goog.asserts.assert(null!=a.length);goog.asserts.assert(null!=b);d&&(b=goog.bind(b,d));return Array.prototype.reduceRight.call(a,b,c)}:function(a,b,c,d){var e=c;goog.array.forEachRight(a,function(c,g){e=b.call(d,e,c,g,a)});return e};
goog.array.some=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.some)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.some.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&b.call(c,e[f],f,a))return!0;return!1};
goog.array.every=goog.NATIVE_ARRAY_PROTOTYPES&&(goog.array.ASSUME_NATIVE_FUNCTIONS||Array.prototype.every)?function(a,b,c){goog.asserts.assert(null!=a.length);return Array.prototype.every.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&!b.call(c,e[f],f,a))return!1;return!0};goog.array.count=function(a,b,c){var d=0;goog.array.forEach(a,function(a,f,g){b.call(c,a,f,g)&&++d},c);return d};
goog.array.find=function(a,b,c){b=goog.array.findIndex(a,b,c);return 0>b?null:goog.isString(a)?a.charAt(b):a[b]};goog.array.findIndex=function(a,b,c){for(var d=a.length,e=goog.isString(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&b.call(c,e[f],f,a))return f;return-1};goog.array.findRight=function(a,b,c){b=goog.array.findIndexRight(a,b,c);return 0>b?null:goog.isString(a)?a.charAt(b):a[b]};
goog.array.findIndexRight=function(a,b,c){var d=a.length,e=goog.isString(a)?a.split(""):a;for(--d;0<=d;d--)if(d in e&&b.call(c,e[d],d,a))return d;return-1};goog.array.contains=function(a,b){return 0<=goog.array.indexOf(a,b)};goog.array.isEmpty=function(a){return 0==a.length};goog.array.clear=function(a){if(!goog.isArray(a))for(var b=a.length-1;0<=b;b--)delete a[b];a.length=0};goog.array.insert=function(a,b){goog.array.contains(a,b)||a.push(b)};
goog.array.insertAt=function(a,b,c){goog.array.splice(a,c,0,b)};goog.array.insertArrayAt=function(a,b,c){goog.partial(goog.array.splice,a,c,0).apply(null,b)};goog.array.insertBefore=function(a,b,c){var d;2==arguments.length||0>(d=goog.array.indexOf(a,c))?a.push(b):goog.array.insertAt(a,b,d)};goog.array.remove=function(a,b){b=goog.array.indexOf(a,b);var c;(c=0<=b)&&goog.array.removeAt(a,b);return c};
goog.array.removeLast=function(a,b){b=goog.array.lastIndexOf(a,b);return 0<=b?(goog.array.removeAt(a,b),!0):!1};goog.array.removeAt=function(a,b){goog.asserts.assert(null!=a.length);return 1==Array.prototype.splice.call(a,b,1).length};goog.array.removeIf=function(a,b,c){b=goog.array.findIndex(a,b,c);return 0<=b?(goog.array.removeAt(a,b),!0):!1};goog.array.removeAllIf=function(a,b,c){var d=0;goog.array.forEachRight(a,function(e,f){b.call(c,e,f,a)&&goog.array.removeAt(a,f)&&d++});return d};
goog.array.concat=function(a){return Array.prototype.concat.apply([],arguments)};goog.array.join=function(a){return Array.prototype.concat.apply([],arguments)};goog.array.toArray=function(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]};goog.array.clone=goog.array.toArray;goog.array.extend=function(a,b){for(var c=1;c<arguments.length;c++){var d=arguments[c];if(goog.isArrayLike(d)){var e=a.length||0,f=d.length||0;a.length=e+f;for(var g=0;g<f;g++)a[e+g]=d[g]}else a.push(d)}};
goog.array.splice=function(a,b,c,d){goog.asserts.assert(null!=a.length);return Array.prototype.splice.apply(a,goog.array.slice(arguments,1))};goog.array.slice=function(a,b,c){goog.asserts.assert(null!=a.length);return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};
goog.array.removeDuplicates=function(a,b,c){b=b||a;var d=function(a){return goog.isObject(a)?"o"+goog.getUid(a):(typeof a).charAt(0)+a};c=c||d;d={};for(var e=0,f=0;f<a.length;){var g=a[f++],h=c(g);Object.prototype.hasOwnProperty.call(d,h)||(d[h]=!0,b[e++]=g)}b.length=e};goog.array.binarySearch=function(a,b,c){return goog.array.binarySearch_(a,c||goog.array.defaultCompare,!1,b)};goog.array.binarySelect=function(a,b,c){return goog.array.binarySearch_(a,b,!0,void 0,c)};
goog.array.binarySearch_=function(a,b,c,d,e){for(var f=0,g=a.length,h;f<g;){var k=f+g>>1;var l=c?b.call(e,a[k],k,a):b(d,a[k]);0<l?f=k+1:(g=k,h=!l)}return h?f:~f};goog.array.sort=function(a,b){a.sort(b||goog.array.defaultCompare)};goog.array.stableSort=function(a,b){for(var c=Array(a.length),d=0;d<a.length;d++)c[d]={index:d,value:a[d]};var e=b||goog.array.defaultCompare;goog.array.sort(c,function(a,b){return e(a.value,b.value)||a.index-b.index});for(d=0;d<a.length;d++)a[d]=c[d].value};
goog.array.sortByKey=function(a,b,c){var d=c||goog.array.defaultCompare;goog.array.sort(a,function(a,c){return d(b(a),b(c))})};goog.array.sortObjectsByKey=function(a,b,c){goog.array.sortByKey(a,function(a){return a[b]},c)};goog.array.isSorted=function(a,b,c){b=b||goog.array.defaultCompare;for(var d=1;d<a.length;d++){var e=b(a[d-1],a[d]);if(0<e||0==e&&c)return!1}return!0};
goog.array.equals=function(a,b,c){if(!goog.isArrayLike(a)||!goog.isArrayLike(b)||a.length!=b.length)return!1;var d=a.length;c=c||goog.array.defaultCompareEquality;for(var e=0;e<d;e++)if(!c(a[e],b[e]))return!1;return!0};goog.array.compare3=function(a,b,c){c=c||goog.array.defaultCompare;for(var d=Math.min(a.length,b.length),e=0;e<d;e++){var f=c(a[e],b[e]);if(0!=f)return f}return goog.array.defaultCompare(a.length,b.length)};goog.array.defaultCompare=function(a,b){return a>b?1:a<b?-1:0};
goog.array.inverseDefaultCompare=function(a,b){return-goog.array.defaultCompare(a,b)};goog.array.defaultCompareEquality=function(a,b){return a===b};goog.array.binaryInsert=function(a,b,c){c=goog.array.binarySearch(a,b,c);return 0>c?(goog.array.insertAt(a,b,-(c+1)),!0):!1};goog.array.binaryRemove=function(a,b,c){b=goog.array.binarySearch(a,b,c);return 0<=b?goog.array.removeAt(a,b):!1};
goog.array.bucket=function(a,b,c){for(var d={},e=0;e<a.length;e++){var f=a[e],g=b.call(c,f,e,a);goog.isDef(g)&&(d[g]||(d[g]=[])).push(f)}return d};goog.array.toObject=function(a,b,c){var d={};goog.array.forEach(a,function(e,f){d[b.call(c,e,f,a)]=e});return d};goog.array.range=function(a,b,c){var d=[],e=0,f=a;c=c||1;void 0!==b&&(e=a,f=b);if(0>c*(f-e))return[];if(0<c)for(a=e;a<f;a+=c)d.push(a);else for(a=e;a>f;a+=c)d.push(a);return d};
goog.array.repeat=function(a,b){for(var c=[],d=0;d<b;d++)c[d]=a;return c};goog.array.flatten=function(a){for(var b=[],c=0;c<arguments.length;c++){var d=arguments[c];if(goog.isArray(d))for(var e=0;e<d.length;e+=8192){var f=goog.array.slice(d,e,e+8192);f=goog.array.flatten.apply(null,f);for(var g=0;g<f.length;g++)b.push(f[g])}else b.push(d)}return b};
goog.array.rotate=function(a,b){goog.asserts.assert(null!=a.length);a.length&&(b%=a.length,0<b?Array.prototype.unshift.apply(a,a.splice(-b,b)):0>b&&Array.prototype.push.apply(a,a.splice(0,-b)));return a};goog.array.moveItem=function(a,b,c){goog.asserts.assert(0<=b&&b<a.length);goog.asserts.assert(0<=c&&c<a.length);b=Array.prototype.splice.call(a,b,1);Array.prototype.splice.call(a,c,0,b[0])};
goog.array.zip=function(a){if(!arguments.length)return[];for(var b=[],c=arguments[0].length,d=1;d<arguments.length;d++)arguments[d].length<c&&(c=arguments[d].length);for(d=0;d<c;d++){for(var e=[],f=0;f<arguments.length;f++)e.push(arguments[f][d]);b.push(e)}return b};goog.array.shuffle=function(a,b){b=b||Math.random;for(var c=a.length-1;0<c;c--){var d=Math.floor(b()*(c+1)),e=a[c];a[c]=a[d];a[d]=e}};goog.array.copyByIndex=function(a,b){var c=[];goog.array.forEach(b,function(b){c.push(a[b])});return c};
goog.array.concatMap=function(a,b,c){return goog.array.concat.apply([],goog.array.map(a,b,c))};goog.crypt={};goog.crypt.stringToByteArray=function(a){for(var b=[],c=0,d=0;d<a.length;d++){var e=a.charCodeAt(d);255<e&&(b[c++]=e&255,e>>=8);b[c++]=e}return b};goog.crypt.byteArrayToString=function(a){if(8192>=a.length)return String.fromCharCode.apply(null,a);for(var b="",c=0;c<a.length;c+=8192){var d=goog.array.slice(a,c,c+8192);b+=String.fromCharCode.apply(null,d)}return b};
goog.crypt.byteArrayToHex=function(a,b){return goog.array.map(a,function(a){a=a.toString(16);return 1<a.length?a:"0"+a}).join(b||"")};goog.crypt.hexToByteArray=function(a){goog.asserts.assert(0==a.length%2,"Key string length must be multiple of 2");for(var b=[],c=0;c<a.length;c+=2)b.push(parseInt(a.substring(c,c+2),16));return b};
goog.crypt.stringToUtf8ByteArray=function(a){for(var b=[],c=0,d=0;d<a.length;d++){var e=a.charCodeAt(d);128>e?b[c++]=e:(2048>e?b[c++]=e>>6|192:(55296==(e&64512)&&d+1<a.length&&56320==(a.charCodeAt(d+1)&64512)?(e=65536+((e&1023)<<10)+(a.charCodeAt(++d)&1023),b[c++]=e>>18|240,b[c++]=e>>12&63|128):b[c++]=e>>12|224,b[c++]=e>>6&63|128),b[c++]=e&63|128)}return b};
goog.crypt.utf8ByteArrayToString=function(a){for(var b=[],c=0,d=0;c<a.length;){var e=a[c++];if(128>e)b[d++]=String.fromCharCode(e);else if(191<e&&224>e){var f=a[c++];b[d++]=String.fromCharCode((e&31)<<6|f&63)}else if(239<e&&365>e){f=a[c++];var g=a[c++],h=a[c++];e=((e&7)<<18|(f&63)<<12|(g&63)<<6|h&63)-65536;b[d++]=String.fromCharCode(55296+(e>>10));b[d++]=String.fromCharCode(56320+(e&1023))}else f=a[c++],g=a[c++],b[d++]=String.fromCharCode((e&15)<<12|(f&63)<<6|g&63)}return b.join("")};
goog.crypt.xorByteArray=function(a,b){goog.asserts.assert(a.length==b.length,"XOR array lengths must match");for(var c=[],d=0;d<a.length;d++)c.push(a[d]^b[d]);return c};goog.string={};goog.string.internal={};goog.string.internal.startsWith=function(a,b){return 0==a.lastIndexOf(b,0)};goog.string.internal.endsWith=function(a,b){var c=a.length-b.length;return 0<=c&&a.indexOf(b,c)==c};goog.string.internal.caseInsensitiveStartsWith=function(a,b){return 0==goog.string.internal.caseInsensitiveCompare(b,a.substr(0,b.length))};goog.string.internal.caseInsensitiveEndsWith=function(a,b){return 0==goog.string.internal.caseInsensitiveCompare(b,a.substr(a.length-b.length,b.length))};
goog.string.internal.caseInsensitiveEquals=function(a,b){return a.toLowerCase()==b.toLowerCase()};goog.string.internal.isEmptyOrWhitespace=function(a){return/^[\s\xa0]*$/.test(a)};goog.string.internal.trim=goog.TRUSTED_SITE&&String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};goog.string.internal.caseInsensitiveCompare=function(a,b){a=String(a).toLowerCase();b=String(b).toLowerCase();return a<b?-1:a==b?0:1};
goog.string.internal.newLineToBr=function(a,b){return a.replace(/(\r\n|\r|\n)/g,b?"<br />":"<br>")};
goog.string.internal.htmlEscape=function(a,b){if(b)a=a.replace(goog.string.internal.AMP_RE_,"&amp;").replace(goog.string.internal.LT_RE_,"&lt;").replace(goog.string.internal.GT_RE_,"&gt;").replace(goog.string.internal.QUOT_RE_,"&quot;").replace(goog.string.internal.SINGLE_QUOTE_RE_,"&#39;").replace(goog.string.internal.NULL_RE_,"&#0;");else{if(!goog.string.internal.ALL_RE_.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(goog.string.internal.AMP_RE_,"&amp;"));-1!=a.indexOf("<")&&(a=a.replace(goog.string.internal.LT_RE_,
"&lt;"));-1!=a.indexOf(">")&&(a=a.replace(goog.string.internal.GT_RE_,"&gt;"));-1!=a.indexOf('"')&&(a=a.replace(goog.string.internal.QUOT_RE_,"&quot;"));-1!=a.indexOf("'")&&(a=a.replace(goog.string.internal.SINGLE_QUOTE_RE_,"&#39;"));-1!=a.indexOf("\x00")&&(a=a.replace(goog.string.internal.NULL_RE_,"&#0;"))}return a};goog.string.internal.AMP_RE_=/&/g;goog.string.internal.LT_RE_=/</g;goog.string.internal.GT_RE_=/>/g;goog.string.internal.QUOT_RE_=/"/g;goog.string.internal.SINGLE_QUOTE_RE_=/'/g;
goog.string.internal.NULL_RE_=/\x00/g;goog.string.internal.ALL_RE_=/[\x00&<>"']/;goog.string.internal.whitespaceEscape=function(a,b){return goog.string.internal.newLineToBr(a.replace(/ /g," &#160;"),b)};goog.string.internal.contains=function(a,b){return-1!=a.indexOf(b)};goog.string.internal.caseInsensitiveContains=function(a,b){return goog.string.internal.contains(a.toLowerCase(),b.toLowerCase())};
goog.string.internal.compareVersions=function(a,b){var c=0;a=goog.string.internal.trim(String(a)).split(".");b=goog.string.internal.trim(String(b)).split(".");for(var d=Math.max(a.length,b.length),e=0;0==c&&e<d;e++){var f=a[e]||"",g=b[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;c=0==f[1].length?0:parseInt(f[1],10);var h=0==g[1].length?0:parseInt(g[1],10);c=goog.string.internal.compareElements_(c,h)||goog.string.internal.compareElements_(0==
f[2].length,0==g[2].length)||goog.string.internal.compareElements_(f[2],g[2]);f=f[3];g=g[3]}while(0==c)}return c};goog.string.internal.compareElements_=function(a,b){return a<b?-1:a>b?1:0};goog.string.TypedString=function(){};goog.string.Const=function(a,b){this.stringConstValueWithSecurityContract__googStringSecurityPrivate_=a===goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_&&b||"";this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_=goog.string.Const.TYPE_MARKER_};goog.string.Const.prototype.implementsGoogStringTypedString=!0;goog.string.Const.prototype.getTypedStringValue=function(){return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_};
goog.string.Const.prototype.toString=function(){return"Const{"+this.stringConstValueWithSecurityContract__googStringSecurityPrivate_+"}"};goog.string.Const.unwrap=function(a){if(a instanceof goog.string.Const&&a.constructor===goog.string.Const&&a.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_===goog.string.Const.TYPE_MARKER_)return a.stringConstValueWithSecurityContract__googStringSecurityPrivate_;goog.asserts.fail("expected object of type Const, got '"+a+"'");return"type_error:Const"};
goog.string.Const.from=function(a){return new goog.string.Const(goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_,a)};goog.string.Const.TYPE_MARKER_={};goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_={};goog.string.Const.EMPTY=goog.string.Const.from("");goog.fs={};goog.fs.url={};goog.fs.url.createObjectUrl=function(a){return goog.fs.url.getUrlObject_().createObjectURL(a)};goog.fs.url.revokeObjectUrl=function(a){goog.fs.url.getUrlObject_().revokeObjectURL(a)};goog.fs.url.getUrlObject_=function(){var a=goog.fs.url.findUrlObject_();if(null!=a)return a;throw Error("This browser doesn't seem to support blob URLs");};
goog.fs.url.findUrlObject_=function(){return goog.isDef(goog.global.URL)&&goog.isDef(goog.global.URL.createObjectURL)?goog.global.URL:goog.isDef(goog.global.webkitURL)&&goog.isDef(goog.global.webkitURL.createObjectURL)?goog.global.webkitURL:goog.isDef(goog.global.createObjectURL)?goog.global:null};goog.fs.url.browserSupportsObjectUrls=function(){return null!=goog.fs.url.findUrlObject_()};goog.html={};goog.html.trustedtypes={};goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY=goog.TRUSTED_TYPES_POLICY_NAME?goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME+"#html"):null;goog.i18n={};goog.i18n.bidi={};goog.i18n.bidi.FORCE_RTL=!1;
goog.i18n.bidi.IS_RTL=goog.i18n.bidi.FORCE_RTL||("ar"==goog.LOCALE.substring(0,2).toLowerCase()||"fa"==goog.LOCALE.substring(0,2).toLowerCase()||"he"==goog.LOCALE.substring(0,2).toLowerCase()||"iw"==goog.LOCALE.substring(0,2).toLowerCase()||"ps"==goog.LOCALE.substring(0,2).toLowerCase()||"sd"==goog.LOCALE.substring(0,2).toLowerCase()||"ug"==goog.LOCALE.substring(0,2).toLowerCase()||"ur"==goog.LOCALE.substring(0,2).toLowerCase()||"yi"==goog.LOCALE.substring(0,2).toLowerCase())&&(2==goog.LOCALE.length||
"-"==goog.LOCALE.substring(2,3)||"_"==goog.LOCALE.substring(2,3))||3<=goog.LOCALE.length&&"ckb"==goog.LOCALE.substring(0,3).toLowerCase()&&(3==goog.LOCALE.length||"-"==goog.LOCALE.substring(3,4)||"_"==goog.LOCALE.substring(3,4))||7<=goog.LOCALE.length&&("-"==goog.LOCALE.substring(2,3)||"_"==goog.LOCALE.substring(2,3))&&("adlm"==goog.LOCALE.substring(3,7).toLowerCase()||"arab"==goog.LOCALE.substring(3,7).toLowerCase()||"hebr"==goog.LOCALE.substring(3,7).toLowerCase()||"nkoo"==goog.LOCALE.substring(3,
7).toLowerCase()||"rohg"==goog.LOCALE.substring(3,7).toLowerCase()||"thaa"==goog.LOCALE.substring(3,7).toLowerCase())||8<=goog.LOCALE.length&&("-"==goog.LOCALE.substring(3,4)||"_"==goog.LOCALE.substring(3,4))&&("adlm"==goog.LOCALE.substring(4,8).toLowerCase()||"arab"==goog.LOCALE.substring(4,8).toLowerCase()||"hebr"==goog.LOCALE.substring(4,8).toLowerCase()||"nkoo"==goog.LOCALE.substring(4,8).toLowerCase()||"rohg"==goog.LOCALE.substring(4,8).toLowerCase()||"thaa"==goog.LOCALE.substring(4,8).toLowerCase());
goog.i18n.bidi.Format={LRE:"\u202a",RLE:"\u202b",PDF:"\u202c",LRM:"\u200e",RLM:"\u200f"};goog.i18n.bidi.Dir={LTR:1,RTL:-1,NEUTRAL:0};goog.i18n.bidi.RIGHT="right";goog.i18n.bidi.LEFT="left";goog.i18n.bidi.I18N_RIGHT=goog.i18n.bidi.IS_RTL?goog.i18n.bidi.LEFT:goog.i18n.bidi.RIGHT;goog.i18n.bidi.I18N_LEFT=goog.i18n.bidi.IS_RTL?goog.i18n.bidi.RIGHT:goog.i18n.bidi.LEFT;
goog.i18n.bidi.toDir=function(a,b){return"number"==typeof a?0<a?goog.i18n.bidi.Dir.LTR:0>a?goog.i18n.bidi.Dir.RTL:b?null:goog.i18n.bidi.Dir.NEUTRAL:null==a?null:a?goog.i18n.bidi.Dir.RTL:goog.i18n.bidi.Dir.LTR};goog.i18n.bidi.ltrChars_="A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0900-\u1fff\u200e\u2c00-\ud801\ud804-\ud839\ud83c-\udbff\uf900-\ufb1c\ufe00-\ufe6f\ufefd-\uffff";goog.i18n.bidi.rtlChars_="\u0591-\u06ef\u06fa-\u08ff\u200f\ud802-\ud803\ud83a-\ud83b\ufb1d-\ufdff\ufe70-\ufefc";
goog.i18n.bidi.htmlSkipReg_=/<[^>]*>|&[^;]+;/g;goog.i18n.bidi.stripHtmlIfNeeded_=function(a,b){return b?a.replace(goog.i18n.bidi.htmlSkipReg_,""):a};goog.i18n.bidi.rtlCharReg_=new RegExp("["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.ltrCharReg_=new RegExp("["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.hasAnyRtl=function(a,b){return goog.i18n.bidi.rtlCharReg_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.hasRtlChar=goog.i18n.bidi.hasAnyRtl;
goog.i18n.bidi.hasAnyLtr=function(a,b){return goog.i18n.bidi.ltrCharReg_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.ltrRe_=new RegExp("^["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.rtlRe_=new RegExp("^["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.isRtlChar=function(a){return goog.i18n.bidi.rtlRe_.test(a)};goog.i18n.bidi.isLtrChar=function(a){return goog.i18n.bidi.ltrRe_.test(a)};goog.i18n.bidi.isNeutralChar=function(a){return!goog.i18n.bidi.isLtrChar(a)&&!goog.i18n.bidi.isRtlChar(a)};
goog.i18n.bidi.ltrDirCheckRe_=new RegExp("^[^"+goog.i18n.bidi.rtlChars_+"]*["+goog.i18n.bidi.ltrChars_+"]");goog.i18n.bidi.rtlDirCheckRe_=new RegExp("^[^"+goog.i18n.bidi.ltrChars_+"]*["+goog.i18n.bidi.rtlChars_+"]");goog.i18n.bidi.startsWithRtl=function(a,b){return goog.i18n.bidi.rtlDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlText=goog.i18n.bidi.startsWithRtl;
goog.i18n.bidi.startsWithLtr=function(a,b){return goog.i18n.bidi.ltrDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isLtrText=goog.i18n.bidi.startsWithLtr;goog.i18n.bidi.isRequiredLtrRe_=/^http:\/\/.*/;goog.i18n.bidi.isNeutralText=function(a,b){a=goog.i18n.bidi.stripHtmlIfNeeded_(a,b);return goog.i18n.bidi.isRequiredLtrRe_.test(a)||!goog.i18n.bidi.hasAnyLtr(a)&&!goog.i18n.bidi.hasAnyRtl(a)};
goog.i18n.bidi.ltrExitDirCheckRe_=new RegExp("["+goog.i18n.bidi.ltrChars_+"][^"+goog.i18n.bidi.rtlChars_+"]*$");goog.i18n.bidi.rtlExitDirCheckRe_=new RegExp("["+goog.i18n.bidi.rtlChars_+"][^"+goog.i18n.bidi.ltrChars_+"]*$");goog.i18n.bidi.endsWithLtr=function(a,b){return goog.i18n.bidi.ltrExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isLtrExitText=goog.i18n.bidi.endsWithLtr;
goog.i18n.bidi.endsWithRtl=function(a,b){return goog.i18n.bidi.rtlExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a,b))};goog.i18n.bidi.isRtlExitText=goog.i18n.bidi.endsWithRtl;goog.i18n.bidi.rtlLocalesRe_=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;goog.i18n.bidi.isRtlLanguage=function(a){return goog.i18n.bidi.rtlLocalesRe_.test(a)};goog.i18n.bidi.bracketGuardTextRe_=/(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g;
goog.i18n.bidi.guardBracketInText=function(a,b){b=(void 0===b?goog.i18n.bidi.hasAnyRtl(a):b)?goog.i18n.bidi.Format.RLM:goog.i18n.bidi.Format.LRM;return a.replace(goog.i18n.bidi.bracketGuardTextRe_,b+"$&"+b)};goog.i18n.bidi.enforceRtlInHtml=function(a){return"<"==a.charAt(0)?a.replace(/<\w+/,"$& dir=rtl"):"\n<span dir=rtl>"+a+"</span>"};goog.i18n.bidi.enforceRtlInText=function(a){return goog.i18n.bidi.Format.RLE+a+goog.i18n.bidi.Format.PDF};
goog.i18n.bidi.enforceLtrInHtml=function(a){return"<"==a.charAt(0)?a.replace(/<\w+/,"$& dir=ltr"):"\n<span dir=ltr>"+a+"</span>"};goog.i18n.bidi.enforceLtrInText=function(a){return goog.i18n.bidi.Format.LRE+a+goog.i18n.bidi.Format.PDF};goog.i18n.bidi.dimensionsRe_=/:\s*([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)/g;goog.i18n.bidi.leftRe_=/left/gi;goog.i18n.bidi.rightRe_=/right/gi;goog.i18n.bidi.tempRe_=/%%%%/g;
goog.i18n.bidi.mirrorCSS=function(a){return a.replace(goog.i18n.bidi.dimensionsRe_,":$1 $4 $3 $2").replace(goog.i18n.bidi.leftRe_,"%%%%").replace(goog.i18n.bidi.rightRe_,goog.i18n.bidi.LEFT).replace(goog.i18n.bidi.tempRe_,goog.i18n.bidi.RIGHT)};goog.i18n.bidi.doubleQuoteSubstituteRe_=/([\u0591-\u05f2])"/g;goog.i18n.bidi.singleQuoteSubstituteRe_=/([\u0591-\u05f2])'/g;
goog.i18n.bidi.normalizeHebrewQuote=function(a){return a.replace(goog.i18n.bidi.doubleQuoteSubstituteRe_,"$1\u05f4").replace(goog.i18n.bidi.singleQuoteSubstituteRe_,"$1\u05f3")};goog.i18n.bidi.wordSeparatorRe_=/\s+/;goog.i18n.bidi.hasNumeralsRe_=/[\d\u06f0-\u06f9]/;goog.i18n.bidi.rtlDetectionThreshold_=.4;
goog.i18n.bidi.estimateDirection=function(a,b){var c=0,d=0,e=!1;a=goog.i18n.bidi.stripHtmlIfNeeded_(a,b).split(goog.i18n.bidi.wordSeparatorRe_);for(b=0;b<a.length;b++){var f=a[b];goog.i18n.bidi.startsWithRtl(f)?(c++,d++):goog.i18n.bidi.isRequiredLtrRe_.test(f)?e=!0:goog.i18n.bidi.hasAnyLtr(f)?d++:goog.i18n.bidi.hasNumeralsRe_.test(f)&&(e=!0)}return 0==d?e?goog.i18n.bidi.Dir.LTR:goog.i18n.bidi.Dir.NEUTRAL:c/d>goog.i18n.bidi.rtlDetectionThreshold_?goog.i18n.bidi.Dir.RTL:goog.i18n.bidi.Dir.LTR};
goog.i18n.bidi.detectRtlDirectionality=function(a,b){return goog.i18n.bidi.estimateDirection(a,b)==goog.i18n.bidi.Dir.RTL};goog.i18n.bidi.setElementDirAndAlign=function(a,b){a&&(b=goog.i18n.bidi.toDir(b))&&(a.style.textAlign=b==goog.i18n.bidi.Dir.RTL?goog.i18n.bidi.RIGHT:goog.i18n.bidi.LEFT,a.dir=b==goog.i18n.bidi.Dir.RTL?"rtl":"ltr")};
goog.i18n.bidi.setElementDirByTextDirectionality=function(a,b){switch(goog.i18n.bidi.estimateDirection(b)){case goog.i18n.bidi.Dir.LTR:a.dir="ltr";break;case goog.i18n.bidi.Dir.RTL:a.dir="rtl";break;default:a.removeAttribute("dir")}};goog.i18n.bidi.DirectionalString=function(){};goog.html.TrustedResourceUrl=function(){this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_="";this.trustedURL_=null;this.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.TrustedResourceUrl.prototype.implementsGoogStringTypedString=!0;goog.html.TrustedResourceUrl.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_.toString()};
goog.html.TrustedResourceUrl.prototype.implementsGoogI18nBidiDirectionalString=!0;goog.html.TrustedResourceUrl.prototype.getDirection=function(){return goog.i18n.bidi.Dir.LTR};
goog.html.TrustedResourceUrl.prototype.cloneWithParams=function(a,b){var c=goog.html.TrustedResourceUrl.unwrap(this);c=goog.html.TrustedResourceUrl.URL_PARAM_PARSER_.exec(c);var d=c[3]||"";return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(c[1]+goog.html.TrustedResourceUrl.stringifyParams_("?",c[2]||"",a)+goog.html.TrustedResourceUrl.stringifyParams_("#",d,b))};
goog.DEBUG&&(goog.html.TrustedResourceUrl.prototype.toString=function(){return"TrustedResourceUrl{"+this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_+"}"});goog.html.TrustedResourceUrl.unwrap=function(a){return goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(a).toString()};
goog.html.TrustedResourceUrl.unwrapTrustedScriptURL=function(a){if(a instanceof goog.html.TrustedResourceUrl&&a.constructor===goog.html.TrustedResourceUrl&&a.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;goog.asserts.fail("expected object of type TrustedResourceUrl, got '"+a+"' of type "+goog.typeOf(a));return"type_error:TrustedResourceUrl"};
goog.html.TrustedResourceUrl.unwrapTrustedURL=function(a){return a.trustedURL_?a.trustedURL_:goog.html.TrustedResourceUrl.unwrap(a)};
goog.html.TrustedResourceUrl.format=function(a,b){var c=goog.string.Const.unwrap(a);if(!goog.html.TrustedResourceUrl.BASE_URL_.test(c))throw Error("Invalid TrustedResourceUrl format: "+c);a=c.replace(goog.html.TrustedResourceUrl.FORMAT_MARKER_,function(a,e){if(!Object.prototype.hasOwnProperty.call(b,e))throw Error('Found marker, "'+e+'", in format string, "'+c+'", but no valid label mapping found in args: '+JSON.stringify(b));a=b[e];return a instanceof goog.string.Const?goog.string.Const.unwrap(a):
encodeURIComponent(String(a))});return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.TrustedResourceUrl.FORMAT_MARKER_=/%{(\w+)}/g;goog.html.TrustedResourceUrl.BASE_URL_=/^((https:)?\/\/[0-9a-z.:[\]-]+\/|\/[^/\\]|[^:/\\%]+\/|[^:/\\%]*[?#]|about:blank#)/i;goog.html.TrustedResourceUrl.URL_PARAM_PARSER_=/^([^?#]*)(\?[^#]*)?(#[\s\S]*)?/;
goog.html.TrustedResourceUrl.formatWithParams=function(a,b,c,d){return goog.html.TrustedResourceUrl.format(a,b).cloneWithParams(c,d)};goog.html.TrustedResourceUrl.fromConstant=function(a){return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))};goog.html.TrustedResourceUrl.fromConstants=function(a){for(var b="",c=0;c<a.length;c++)b+=goog.string.Const.unwrap(a[c]);return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(b)};
goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};
goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse=function(a){var b=new goog.html.TrustedResourceUrl;b.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY?goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createScriptURL(a):a;goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY&&(b.trustedURL_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createURL(a));return b};
goog.html.TrustedResourceUrl.stringifyParams_=function(a,b,c){if(null==c)return b;if(goog.isString(c))return c?a+encodeURIComponent(c):"";for(var d in c){var e=c[d];e=goog.isArray(e)?e:[e];for(var f=0;f<e.length;f++){var g=e[f];null!=g&&(b||(b=a),b+=(b.length>a.length?"&":"")+encodeURIComponent(d)+"="+encodeURIComponent(String(g)))}}return b};goog.html.SafeUrl=function(){this.privateDoNotAccessOrElseSafeUrlWrappedValue_="";this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeUrl.INNOCUOUS_STRING="about:invalid#zClosurez";goog.html.SafeUrl.prototype.implementsGoogStringTypedString=!0;goog.html.SafeUrl.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeUrlWrappedValue_.toString()};
goog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString=!0;goog.html.SafeUrl.prototype.getDirection=function(){return goog.i18n.bidi.Dir.LTR};goog.DEBUG&&(goog.html.SafeUrl.prototype.toString=function(){return"SafeUrl{"+this.privateDoNotAccessOrElseSafeUrlWrappedValue_+"}"});goog.html.SafeUrl.unwrap=function(a){return goog.html.SafeUrl.unwrapTrustedURL(a).toString()};
goog.html.SafeUrl.unwrapTrustedURL=function(a){if(a instanceof goog.html.SafeUrl&&a.constructor===goog.html.SafeUrl&&a.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeUrlWrappedValue_;goog.asserts.fail("expected object of type SafeUrl, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeUrl"};goog.html.SafeUrl.fromConstant=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))};
goog.html.SAFE_MIME_TYPE_PATTERN_=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-wav|wav|webm)|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime))(?:;\w+=(?:\w+|"[\w;=]+"))*$/i;goog.html.SafeUrl.isSafeMimeType=function(a){return goog.html.SAFE_MIME_TYPE_PATTERN_.test(a)};goog.html.SafeUrl.fromBlob=function(a){a=goog.html.SAFE_MIME_TYPE_PATTERN_.test(a.type)?goog.fs.url.createObjectUrl(a):goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
goog.html.DATA_URL_PATTERN_=/^data:([^,]*);base64,[a-z0-9+\/]+=*$/i;goog.html.SafeUrl.fromDataUrl=function(a){a=a.replace(/(%0A|%0D)/g,"");var b=a.match(goog.html.DATA_URL_PATTERN_);b=b&&goog.html.SAFE_MIME_TYPE_PATTERN_.test(b[1]);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b?a:goog.html.SafeUrl.INNOCUOUS_STRING)};goog.html.SafeUrl.fromTelUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"tel:")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
goog.html.SIP_URL_PATTERN_=/^sip[s]?:[+a-z0-9_.!$%&'*\/=^`{|}~-]+@([a-z0-9-]+\.)+[a-z0-9]{2,63}$/i;goog.html.SafeUrl.fromSipUrl=function(a){goog.html.SIP_URL_PATTERN_.test(decodeURIComponent(a))||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.fromFacebookMessengerUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"fb-messenger://share")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
goog.html.SafeUrl.fromWhatsAppUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"whatsapp://send")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.fromSmsUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"sms:")&&goog.html.SafeUrl.isSmsUrlBodyValid_(a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
goog.html.SafeUrl.isSmsUrlBodyValid_=function(a){var b=a.indexOf("#");0<b&&(a=a.substring(0,b));b=a.match(/[?&]body=/gi);if(!b)return!0;if(1<b.length)return!1;a=a.match(/[?&]body=([^&]*)/)[1];if(!a)return!0;try{decodeURIComponent(a)}catch(c){return!1}return/^(?:[a-z0-9\-_.~]|%[0-9a-f]{2})+$/i.test(a)};goog.html.SafeUrl.fromSshUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"ssh://")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
goog.html.SafeUrl.sanitizeChromeExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^chrome-extension:\/\/([^\/]+)\//,a,b)};goog.html.SafeUrl.sanitizeFirefoxExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^moz-extension:\/\/([^\/]+)\//,a,b)};goog.html.SafeUrl.sanitizeEdgeExtensionUrl=function(a,b){return goog.html.SafeUrl.sanitizeExtensionUrl_(/^ms-browser-extension:\/\/([^\/]+)\//,a,b)};
goog.html.SafeUrl.sanitizeExtensionUrl_=function(a,b,c){(a=a.exec(b))?(a=a[1],-1==(c instanceof goog.string.Const?[goog.string.Const.unwrap(c)]:c.map(function(a){return goog.string.Const.unwrap(a)})).indexOf(a)&&(b=goog.html.SafeUrl.INNOCUOUS_STRING)):b=goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)};goog.html.SafeUrl.fromTrustedResourceUrl=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.html.TrustedResourceUrl.unwrap(a))};
goog.html.SAFE_URL_PATTERN_=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;goog.html.SafeUrl.SAFE_URL_PATTERN=goog.html.SAFE_URL_PATTERN_;goog.html.SafeUrl.sanitize=function(a){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);goog.html.SAFE_URL_PATTERN_.test(a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
goog.html.SafeUrl.sanitizeAssertUnchanged=function(a,b){if(a instanceof goog.html.SafeUrl)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);if(b&&/^data:/i.test(a)&&(b=goog.html.SafeUrl.fromDataUrl(a),b.getTypedStringValue()==a))return b;goog.asserts.assert(goog.html.SAFE_URL_PATTERN_.test(a),"%s does not match the safe URL pattern",a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};
goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse=function(a){var b=new goog.html.SafeUrl;b.privateDoNotAccessOrElseSafeUrlWrappedValue_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY?goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createURL(a):a;return b};goog.html.SafeUrl.ABOUT_BLANK=goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse("about:blank");goog.html.SafeStyle=function(){this.privateDoNotAccessOrElseSafeStyleWrappedValue_="";this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeStyle.prototype.implementsGoogStringTypedString=!0;goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};
goog.html.SafeStyle.fromConstant=function(a){a=goog.string.Const.unwrap(a);if(0===a.length)return goog.html.SafeStyle.EMPTY;goog.asserts.assert(goog.string.internal.endsWith(a,";"),"Last character of style string is not ';': "+a);goog.asserts.assert(goog.string.internal.contains(a,":"),"Style string must contain at least one ':', to specify a \"name: value\" pair: "+a);return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(a)};
goog.html.SafeStyle.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeStyleWrappedValue_};goog.DEBUG&&(goog.html.SafeStyle.prototype.toString=function(){return"SafeStyle{"+this.privateDoNotAccessOrElseSafeStyleWrappedValue_+"}"});
goog.html.SafeStyle.unwrap=function(a){if(a instanceof goog.html.SafeStyle&&a.constructor===goog.html.SafeStyle&&a.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeStyleWrappedValue_;goog.asserts.fail("expected object of type SafeStyle, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeStyle"};goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse=function(a){return(new goog.html.SafeStyle).initSecurityPrivateDoNotAccessOrElse_(a)};
goog.html.SafeStyle.prototype.initSecurityPrivateDoNotAccessOrElse_=function(a){this.privateDoNotAccessOrElseSafeStyleWrappedValue_=a;return this};goog.html.SafeStyle.EMPTY=goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse("");goog.html.SafeStyle.INNOCUOUS_STRING="zClosurez";
goog.html.SafeStyle.create=function(a){var b="",c;for(c in a){if(!/^[-_a-zA-Z0-9]+$/.test(c))throw Error("Name allows only [-_a-zA-Z0-9], got: "+c);var d=a[c];null!=d&&(d=goog.isArray(d)?goog.array.map(d,goog.html.SafeStyle.sanitizePropertyValue_).join(" "):goog.html.SafeStyle.sanitizePropertyValue_(d),b+=c+":"+d+";")}return b?goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b):goog.html.SafeStyle.EMPTY};
goog.html.SafeStyle.sanitizePropertyValue_=function(a){if(a instanceof goog.html.SafeUrl)return'url("'+goog.html.SafeUrl.unwrap(a).replace(/</g,"%3c").replace(/[\\"]/g,"\\$&")+'")';a=a instanceof goog.string.Const?goog.string.Const.unwrap(a):goog.html.SafeStyle.sanitizePropertyValueString_(String(a));if(/[{;}]/.test(a))throw new goog.asserts.AssertionError("Value does not allow [{;}], got: %s.",[a]);return a};
goog.html.SafeStyle.sanitizePropertyValueString_=function(a){var b=a.replace(goog.html.SafeStyle.FUNCTIONS_RE_,"$1").replace(goog.html.SafeStyle.FUNCTIONS_RE_,"$1").replace(goog.html.SafeStyle.URL_RE_,"url");if(goog.html.SafeStyle.VALUE_RE_.test(b)){if(goog.html.SafeStyle.COMMENT_RE_.test(a))return goog.asserts.fail("String value disallows comments, got: "+a),goog.html.SafeStyle.INNOCUOUS_STRING;if(!goog.html.SafeStyle.hasBalancedQuotes_(a))return goog.asserts.fail("String value requires balanced quotes, got: "+
a),goog.html.SafeStyle.INNOCUOUS_STRING;if(!goog.html.SafeStyle.hasBalancedSquareBrackets_(a))return goog.asserts.fail("String value requires balanced square brackets and one identifier per pair of brackets, got: "+a),goog.html.SafeStyle.INNOCUOUS_STRING}else return goog.asserts.fail("String value allows only "+goog.html.SafeStyle.VALUE_ALLOWED_CHARS_+" and simple functions, got: "+a),goog.html.SafeStyle.INNOCUOUS_STRING;return goog.html.SafeStyle.sanitizeUrl_(a)};
goog.html.SafeStyle.hasBalancedQuotes_=function(a){for(var b=!0,c=!0,d=0;d<a.length;d++){var e=a.charAt(d);"'"==e&&c?b=!b:'"'==e&&b&&(c=!c)}return b&&c};goog.html.SafeStyle.hasBalancedSquareBrackets_=function(a){for(var b=!0,c=/^[-_a-zA-Z0-9]$/,d=0;d<a.length;d++){var e=a.charAt(d);if("]"==e){if(b)return!1;b=!0}else if("["==e){if(!b)return!1;b=!1}else if(!b&&!c.test(e))return!1}return b};goog.html.SafeStyle.VALUE_ALLOWED_CHARS_="[-,.\"'%_!# a-zA-Z0-9\\[\\]]";
goog.html.SafeStyle.VALUE_RE_=new RegExp("^"+goog.html.SafeStyle.VALUE_ALLOWED_CHARS_+"+$");goog.html.SafeStyle.URL_RE_=/\b(url\([ \t\n]*)('[ -&(-\[\]-~]*'|"[ !#-\[\]-~]*"|[!#-&*-\[\]-~]*)([ \t\n]*\))/g;goog.html.SafeStyle.FUNCTIONS_RE_=/\b(hsl|hsla|rgb|rgba|matrix|calc|minmax|fit-content|repeat|(rotate|scale|translate)(X|Y|Z|3d)?)\([-+*/0-9a-z.%\[\], ]+\)/g;goog.html.SafeStyle.COMMENT_RE_=/\/\*/;
goog.html.SafeStyle.sanitizeUrl_=function(a){return a.replace(goog.html.SafeStyle.URL_RE_,function(a,c,d,e){var b="";d=d.replace(/^(['"])(.*)\1$/,function(a,c,d){b=c;return d});a=goog.html.SafeUrl.sanitize(d).getTypedStringValue();return c+b+a+b+e})};goog.html.SafeStyle.concat=function(a){var b="",c=function(a){goog.isArray(a)?goog.array.forEach(a,c):b+=goog.html.SafeStyle.unwrap(a)};goog.array.forEach(arguments,c);return b?goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b):goog.html.SafeStyle.EMPTY};goog.html.SafeScript=function(){this.privateDoNotAccessOrElseSafeScriptWrappedValue_="";this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeScript.prototype.implementsGoogStringTypedString=!0;goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};goog.html.SafeScript.fromConstant=function(a){a=goog.string.Const.unwrap(a);return 0===a.length?goog.html.SafeScript.EMPTY:goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(a)};
goog.html.SafeScript.fromConstantAndArgs=function(a,b){for(var c=[],d=1;d<arguments.length;d++)c.push(goog.html.SafeScript.stringify_(arguments[d]));return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse("("+goog.string.Const.unwrap(a)+")("+c.join(", ")+");")};goog.html.SafeScript.fromJson=function(a){return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(goog.html.SafeScript.stringify_(a))};goog.html.SafeScript.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeScriptWrappedValue_.toString()};
goog.DEBUG&&(goog.html.SafeScript.prototype.toString=function(){return"SafeScript{"+this.privateDoNotAccessOrElseSafeScriptWrappedValue_+"}"});goog.html.SafeScript.unwrap=function(a){return goog.html.SafeScript.unwrapTrustedScript(a).toString()};
goog.html.SafeScript.unwrapTrustedScript=function(a){if(a instanceof goog.html.SafeScript&&a.constructor===goog.html.SafeScript&&a.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeScriptWrappedValue_;goog.asserts.fail("expected object of type SafeScript, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeScript"};
goog.html.SafeScript.stringify_=function(a){return JSON.stringify(a).replace(/</g,"\\x3c")};goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse=function(a){return(new goog.html.SafeScript).initSecurityPrivateDoNotAccessOrElse_(a)};
goog.html.SafeScript.prototype.initSecurityPrivateDoNotAccessOrElse_=function(a){this.privateDoNotAccessOrElseSafeScriptWrappedValue_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY?goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createScript(a):a;return this};goog.html.SafeScript.EMPTY=goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse("");goog.object={};goog.object.is=function(a,b){return a===b?0!==a||1/a===1/b:a!==a&&b!==b};goog.object.forEach=function(a,b,c){for(var d in a)b.call(c,a[d],d,a)};goog.object.filter=function(a,b,c){var d={},e;for(e in a)b.call(c,a[e],e,a)&&(d[e]=a[e]);return d};goog.object.map=function(a,b,c){var d={},e;for(e in a)d[e]=b.call(c,a[e],e,a);return d};goog.object.some=function(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return!0;return!1};
goog.object.every=function(a,b,c){for(var d in a)if(!b.call(c,a[d],d,a))return!1;return!0};goog.object.getCount=function(a){var b=0,c;for(c in a)b++;return b};goog.object.getAnyKey=function(a){for(var b in a)return b};goog.object.getAnyValue=function(a){for(var b in a)return a[b]};goog.object.contains=function(a,b){return goog.object.containsValue(a,b)};goog.object.getValues=function(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b};
goog.object.getKeys=function(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b};goog.object.getValueByKeys=function(a,b){var c=goog.isArrayLike(b),d=c?b:arguments;for(c=c?0:1;c<d.length;c++){if(null==a)return;a=a[d[c]]}return a};goog.object.containsKey=function(a,b){return null!==a&&b in a};goog.object.containsValue=function(a,b){for(var c in a)if(a[c]==b)return!0;return!1};goog.object.findKey=function(a,b,c){for(var d in a)if(b.call(c,a[d],d,a))return d};
goog.object.findValue=function(a,b,c){return(b=goog.object.findKey(a,b,c))&&a[b]};goog.object.isEmpty=function(a){for(var b in a)return!1;return!0};goog.object.clear=function(a){for(var b in a)delete a[b]};goog.object.remove=function(a,b){var c;(c=b in a)&&delete a[b];return c};goog.object.add=function(a,b,c){if(null!==a&&b in a)throw Error('The object already contains the key "'+b+'"');goog.object.set(a,b,c)};goog.object.get=function(a,b,c){return null!==a&&b in a?a[b]:c};
goog.object.set=function(a,b,c){a[b]=c};goog.object.setIfUndefined=function(a,b,c){return b in a?a[b]:a[b]=c};goog.object.setWithReturnValueIfNotSet=function(a,b,c){if(b in a)return a[b];c=c();return a[b]=c};goog.object.equals=function(a,b){for(var c in a)if(!(c in b)||a[c]!==b[c])return!1;for(var d in b)if(!(d in a))return!1;return!0};goog.object.clone=function(a){var b={},c;for(c in a)b[c]=a[c];return b};
goog.object.unsafeClone=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if(goog.isFunction(a.clone))return a.clone();b="array"==b?[]:{};for(var c in a)b[c]=goog.object.unsafeClone(a[c]);return b}return a};goog.object.transpose=function(a){var b={},c;for(c in a)b[a[c]]=c;return b};goog.object.PROTOTYPE_FIELDS_="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");
goog.object.extend=function(a,b){for(var c,d,e=1;e<arguments.length;e++){d=arguments[e];for(c in d)a[c]=d[c];for(var f=0;f<goog.object.PROTOTYPE_FIELDS_.length;f++)c=goog.object.PROTOTYPE_FIELDS_[f],Object.prototype.hasOwnProperty.call(d,c)&&(a[c]=d[c])}};
goog.object.create=function(a){var b=arguments.length;if(1==b&&goog.isArray(arguments[0]))return goog.object.create.apply(null,arguments[0]);if(b%2)throw Error("Uneven number of arguments");for(var c={},d=0;d<b;d+=2)c[arguments[d]]=arguments[d+1];return c};goog.object.createSet=function(a){var b=arguments.length;if(1==b&&goog.isArray(arguments[0]))return goog.object.createSet.apply(null,arguments[0]);for(var c={},d=0;d<b;d++)c[arguments[d]]=!0;return c};
goog.object.createImmutableView=function(a){var b=a;Object.isFrozen&&!Object.isFrozen(a)&&(b=Object.create(a),Object.freeze(b));return b};goog.object.isImmutableView=function(a){return!!Object.isFrozen&&Object.isFrozen(a)};
goog.object.getAllPropertyNames=function(a,b,c){if(!a)return[];if(!Object.getOwnPropertyNames||!Object.getPrototypeOf)return goog.object.getKeys(a);for(var d={};a&&(a!==Object.prototype||b)&&(a!==Function.prototype||c);){for(var e=Object.getOwnPropertyNames(a),f=0;f<e.length;f++)d[e[f]]=!0;a=Object.getPrototypeOf(a)}return goog.object.getKeys(d)};goog.object.getSuperClass=function(a){return(a=Object.getPrototypeOf(a.prototype))&&a.constructor};goog.html.SafeStyleSheet=function(){this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_="";this.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_};goog.html.SafeStyleSheet.prototype.implementsGoogStringTypedString=!0;goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};
goog.html.SafeStyleSheet.createRule=function(a,b){if(goog.string.internal.contains(a,"<"))throw Error("Selector does not allow '<', got: "+a);var c=a.replace(/('|")((?!\1)[^\r\n\f\\]|\\[\s\S])*\1/g,"");if(!/^[-_a-zA-Z0-9#.:* ,>+~[\]()=^$|]+$/.test(c))throw Error("Selector allows only [-_a-zA-Z0-9#.:* ,>+~[\\]()=^$|] and strings, got: "+a);if(!goog.html.SafeStyleSheet.hasBalancedBrackets_(c))throw Error("() and [] in selector must be balanced, got: "+a);b instanceof goog.html.SafeStyle||(b=goog.html.SafeStyle.create(b));
a=a+"{"+goog.html.SafeStyle.unwrap(b).replace(/</g,"\\3C ")+"}";return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeStyleSheet.hasBalancedBrackets_=function(a){for(var b={"(":")","[":"]"},c=[],d=0;d<a.length;d++){var e=a[d];if(b[e])c.push(b[e]);else if(goog.object.contains(b,e)&&c.pop()!=e)return!1}return 0==c.length};
goog.html.SafeStyleSheet.concat=function(a){var b="",c=function(a){goog.isArray(a)?goog.array.forEach(a,c):b+=goog.html.SafeStyleSheet.unwrap(a)};goog.array.forEach(arguments,c);return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(b)};
goog.html.SafeStyleSheet.fromConstant=function(a){a=goog.string.Const.unwrap(a);if(0===a.length)return goog.html.SafeStyleSheet.EMPTY;goog.asserts.assert(!goog.string.internal.contains(a,"<"),"Forbidden '<' character in style sheet string: "+a);return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeStyleSheet.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_};
goog.DEBUG&&(goog.html.SafeStyleSheet.prototype.toString=function(){return"SafeStyleSheet{"+this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_+"}"});
goog.html.SafeStyleSheet.unwrap=function(a){if(a instanceof goog.html.SafeStyleSheet&&a.constructor===goog.html.SafeStyleSheet&&a.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;goog.asserts.fail("expected object of type SafeStyleSheet, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeStyleSheet"};
goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse=function(a){return(new goog.html.SafeStyleSheet).initSecurityPrivateDoNotAccessOrElse_(a)};goog.html.SafeStyleSheet.prototype.initSecurityPrivateDoNotAccessOrElse_=function(a){this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_=a;return this};goog.html.SafeStyleSheet.EMPTY=goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse("");goog.dom.tags={};goog.dom.tags.VOID_TAGS_={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0};goog.dom.tags.isVoidTag=function(a){return!0===goog.dom.tags.VOID_TAGS_[a]};goog.dom.HtmlElement=function(){};goog.dom.TagName=function(a){this.tagName_=a};goog.dom.TagName.prototype.toString=function(){return this.tagName_};goog.dom.TagName.A=new goog.dom.TagName("A");goog.dom.TagName.ABBR=new goog.dom.TagName("ABBR");goog.dom.TagName.ACRONYM=new goog.dom.TagName("ACRONYM");goog.dom.TagName.ADDRESS=new goog.dom.TagName("ADDRESS");goog.dom.TagName.APPLET=new goog.dom.TagName("APPLET");goog.dom.TagName.AREA=new goog.dom.TagName("AREA");goog.dom.TagName.ARTICLE=new goog.dom.TagName("ARTICLE");
goog.dom.TagName.ASIDE=new goog.dom.TagName("ASIDE");goog.dom.TagName.AUDIO=new goog.dom.TagName("AUDIO");goog.dom.TagName.B=new goog.dom.TagName("B");goog.dom.TagName.BASE=new goog.dom.TagName("BASE");goog.dom.TagName.BASEFONT=new goog.dom.TagName("BASEFONT");goog.dom.TagName.BDI=new goog.dom.TagName("BDI");goog.dom.TagName.BDO=new goog.dom.TagName("BDO");goog.dom.TagName.BIG=new goog.dom.TagName("BIG");goog.dom.TagName.BLOCKQUOTE=new goog.dom.TagName("BLOCKQUOTE");goog.dom.TagName.BODY=new goog.dom.TagName("BODY");
goog.dom.TagName.BR=new goog.dom.TagName("BR");goog.dom.TagName.BUTTON=new goog.dom.TagName("BUTTON");goog.dom.TagName.CANVAS=new goog.dom.TagName("CANVAS");goog.dom.TagName.CAPTION=new goog.dom.TagName("CAPTION");goog.dom.TagName.CENTER=new goog.dom.TagName("CENTER");goog.dom.TagName.CITE=new goog.dom.TagName("CITE");goog.dom.TagName.CODE=new goog.dom.TagName("CODE");goog.dom.TagName.COL=new goog.dom.TagName("COL");goog.dom.TagName.COLGROUP=new goog.dom.TagName("COLGROUP");
goog.dom.TagName.COMMAND=new goog.dom.TagName("COMMAND");goog.dom.TagName.DATA=new goog.dom.TagName("DATA");goog.dom.TagName.DATALIST=new goog.dom.TagName("DATALIST");goog.dom.TagName.DD=new goog.dom.TagName("DD");goog.dom.TagName.DEL=new goog.dom.TagName("DEL");goog.dom.TagName.DETAILS=new goog.dom.TagName("DETAILS");goog.dom.TagName.DFN=new goog.dom.TagName("DFN");goog.dom.TagName.DIALOG=new goog.dom.TagName("DIALOG");goog.dom.TagName.DIR=new goog.dom.TagName("DIR");goog.dom.TagName.DIV=new goog.dom.TagName("DIV");
goog.dom.TagName.DL=new goog.dom.TagName("DL");goog.dom.TagName.DT=new goog.dom.TagName("DT");goog.dom.TagName.EM=new goog.dom.TagName("EM");goog.dom.TagName.EMBED=new goog.dom.TagName("EMBED");goog.dom.TagName.FIELDSET=new goog.dom.TagName("FIELDSET");goog.dom.TagName.FIGCAPTION=new goog.dom.TagName("FIGCAPTION");goog.dom.TagName.FIGURE=new goog.dom.TagName("FIGURE");goog.dom.TagName.FONT=new goog.dom.TagName("FONT");goog.dom.TagName.FOOTER=new goog.dom.TagName("FOOTER");goog.dom.TagName.FORM=new goog.dom.TagName("FORM");
goog.dom.TagName.FRAME=new goog.dom.TagName("FRAME");goog.dom.TagName.FRAMESET=new goog.dom.TagName("FRAMESET");goog.dom.TagName.H1=new goog.dom.TagName("H1");goog.dom.TagName.H2=new goog.dom.TagName("H2");goog.dom.TagName.H3=new goog.dom.TagName("H3");goog.dom.TagName.H4=new goog.dom.TagName("H4");goog.dom.TagName.H5=new goog.dom.TagName("H5");goog.dom.TagName.H6=new goog.dom.TagName("H6");goog.dom.TagName.HEAD=new goog.dom.TagName("HEAD");goog.dom.TagName.HEADER=new goog.dom.TagName("HEADER");
goog.dom.TagName.HGROUP=new goog.dom.TagName("HGROUP");goog.dom.TagName.HR=new goog.dom.TagName("HR");goog.dom.TagName.HTML=new goog.dom.TagName("HTML");goog.dom.TagName.I=new goog.dom.TagName("I");goog.dom.TagName.IFRAME=new goog.dom.TagName("IFRAME");goog.dom.TagName.IMG=new goog.dom.TagName("IMG");goog.dom.TagName.INPUT=new goog.dom.TagName("INPUT");goog.dom.TagName.INS=new goog.dom.TagName("INS");goog.dom.TagName.ISINDEX=new goog.dom.TagName("ISINDEX");goog.dom.TagName.KBD=new goog.dom.TagName("KBD");
goog.dom.TagName.KEYGEN=new goog.dom.TagName("KEYGEN");goog.dom.TagName.LABEL=new goog.dom.TagName("LABEL");goog.dom.TagName.LEGEND=new goog.dom.TagName("LEGEND");goog.dom.TagName.LI=new goog.dom.TagName("LI");goog.dom.TagName.LINK=new goog.dom.TagName("LINK");goog.dom.TagName.MAIN=new goog.dom.TagName("MAIN");goog.dom.TagName.MAP=new goog.dom.TagName("MAP");goog.dom.TagName.MARK=new goog.dom.TagName("MARK");goog.dom.TagName.MATH=new goog.dom.TagName("MATH");goog.dom.TagName.MENU=new goog.dom.TagName("MENU");
goog.dom.TagName.MENUITEM=new goog.dom.TagName("MENUITEM");goog.dom.TagName.META=new goog.dom.TagName("META");goog.dom.TagName.METER=new goog.dom.TagName("METER");goog.dom.TagName.NAV=new goog.dom.TagName("NAV");goog.dom.TagName.NOFRAMES=new goog.dom.TagName("NOFRAMES");goog.dom.TagName.NOSCRIPT=new goog.dom.TagName("NOSCRIPT");goog.dom.TagName.OBJECT=new goog.dom.TagName("OBJECT");goog.dom.TagName.OL=new goog.dom.TagName("OL");goog.dom.TagName.OPTGROUP=new goog.dom.TagName("OPTGROUP");
goog.dom.TagName.OPTION=new goog.dom.TagName("OPTION");goog.dom.TagName.OUTPUT=new goog.dom.TagName("OUTPUT");goog.dom.TagName.P=new goog.dom.TagName("P");goog.dom.TagName.PARAM=new goog.dom.TagName("PARAM");goog.dom.TagName.PICTURE=new goog.dom.TagName("PICTURE");goog.dom.TagName.PRE=new goog.dom.TagName("PRE");goog.dom.TagName.PROGRESS=new goog.dom.TagName("PROGRESS");goog.dom.TagName.Q=new goog.dom.TagName("Q");goog.dom.TagName.RP=new goog.dom.TagName("RP");goog.dom.TagName.RT=new goog.dom.TagName("RT");
goog.dom.TagName.RTC=new goog.dom.TagName("RTC");goog.dom.TagName.RUBY=new goog.dom.TagName("RUBY");goog.dom.TagName.S=new goog.dom.TagName("S");goog.dom.TagName.SAMP=new goog.dom.TagName("SAMP");goog.dom.TagName.SCRIPT=new goog.dom.TagName("SCRIPT");goog.dom.TagName.SECTION=new goog.dom.TagName("SECTION");goog.dom.TagName.SELECT=new goog.dom.TagName("SELECT");goog.dom.TagName.SMALL=new goog.dom.TagName("SMALL");goog.dom.TagName.SOURCE=new goog.dom.TagName("SOURCE");goog.dom.TagName.SPAN=new goog.dom.TagName("SPAN");
goog.dom.TagName.STRIKE=new goog.dom.TagName("STRIKE");goog.dom.TagName.STRONG=new goog.dom.TagName("STRONG");goog.dom.TagName.STYLE=new goog.dom.TagName("STYLE");goog.dom.TagName.SUB=new goog.dom.TagName("SUB");goog.dom.TagName.SUMMARY=new goog.dom.TagName("SUMMARY");goog.dom.TagName.SUP=new goog.dom.TagName("SUP");goog.dom.TagName.SVG=new goog.dom.TagName("SVG");goog.dom.TagName.TABLE=new goog.dom.TagName("TABLE");goog.dom.TagName.TBODY=new goog.dom.TagName("TBODY");goog.dom.TagName.TD=new goog.dom.TagName("TD");
goog.dom.TagName.TEMPLATE=new goog.dom.TagName("TEMPLATE");goog.dom.TagName.TEXTAREA=new goog.dom.TagName("TEXTAREA");goog.dom.TagName.TFOOT=new goog.dom.TagName("TFOOT");goog.dom.TagName.TH=new goog.dom.TagName("TH");goog.dom.TagName.THEAD=new goog.dom.TagName("THEAD");goog.dom.TagName.TIME=new goog.dom.TagName("TIME");goog.dom.TagName.TITLE=new goog.dom.TagName("TITLE");goog.dom.TagName.TR=new goog.dom.TagName("TR");goog.dom.TagName.TRACK=new goog.dom.TagName("TRACK");goog.dom.TagName.TT=new goog.dom.TagName("TT");
goog.dom.TagName.U=new goog.dom.TagName("U");goog.dom.TagName.UL=new goog.dom.TagName("UL");goog.dom.TagName.VAR=new goog.dom.TagName("VAR");goog.dom.TagName.VIDEO=new goog.dom.TagName("VIDEO");goog.dom.TagName.WBR=new goog.dom.TagName("WBR");goog.labs={};goog.labs.userAgent={};goog.labs.userAgent.util={};goog.labs.userAgent.util.getNativeUserAgentString_=function(){var a=goog.labs.userAgent.util.getNavigator_();return a&&(a=a.userAgent)?a:""};goog.labs.userAgent.util.getNavigator_=function(){return goog.global.navigator};goog.labs.userAgent.util.userAgent_=goog.labs.userAgent.util.getNativeUserAgentString_();goog.labs.userAgent.util.setUserAgent=function(a){goog.labs.userAgent.util.userAgent_=a||goog.labs.userAgent.util.getNativeUserAgentString_()};
goog.labs.userAgent.util.getUserAgent=function(){return goog.labs.userAgent.util.userAgent_};goog.labs.userAgent.util.matchUserAgent=function(a){var b=goog.labs.userAgent.util.getUserAgent();return goog.string.internal.contains(b,a)};goog.labs.userAgent.util.matchUserAgentIgnoreCase=function(a){var b=goog.labs.userAgent.util.getUserAgent();return goog.string.internal.caseInsensitiveContains(b,a)};
goog.labs.userAgent.util.extractVersionTuples=function(a){for(var b=/(\w[\w ]+)\/([^\s]+)\s*(?:\((.*?)\))?/g,c=[],d;d=b.exec(a);)c.push([d[1],d[2],d[3]||void 0]);return c};goog.labs.userAgent.browser={};goog.labs.userAgent.browser.matchOpera_=function(){return goog.labs.userAgent.util.matchUserAgent("Opera")};goog.labs.userAgent.browser.matchIE_=function(){return goog.labs.userAgent.util.matchUserAgent("Trident")||goog.labs.userAgent.util.matchUserAgent("MSIE")};goog.labs.userAgent.browser.matchEdgeHtml_=function(){return goog.labs.userAgent.util.matchUserAgent("Edge")};goog.labs.userAgent.browser.matchEdgeChromium_=function(){return goog.labs.userAgent.util.matchUserAgent("Edg/")};
goog.labs.userAgent.browser.matchOperaChromium_=function(){return goog.labs.userAgent.util.matchUserAgent("OPR")};goog.labs.userAgent.browser.matchFirefox_=function(){return goog.labs.userAgent.util.matchUserAgent("Firefox")||goog.labs.userAgent.util.matchUserAgent("FxiOS")};
goog.labs.userAgent.browser.matchSafari_=function(){return goog.labs.userAgent.util.matchUserAgent("Safari")&&!(goog.labs.userAgent.browser.matchChrome_()||goog.labs.userAgent.browser.matchCoast_()||goog.labs.userAgent.browser.matchOpera_()||goog.labs.userAgent.browser.matchEdgeHtml_()||goog.labs.userAgent.browser.matchEdgeChromium_()||goog.labs.userAgent.browser.matchOperaChromium_()||goog.labs.userAgent.browser.matchFirefox_()||goog.labs.userAgent.browser.isSilk()||goog.labs.userAgent.util.matchUserAgent("Android"))};
goog.labs.userAgent.browser.matchCoast_=function(){return goog.labs.userAgent.util.matchUserAgent("Coast")};goog.labs.userAgent.browser.matchIosWebview_=function(){return(goog.labs.userAgent.util.matchUserAgent("iPad")||goog.labs.userAgent.util.matchUserAgent("iPhone"))&&!goog.labs.userAgent.browser.matchSafari_()&&!goog.labs.userAgent.browser.matchChrome_()&&!goog.labs.userAgent.browser.matchCoast_()&&!goog.labs.userAgent.browser.matchFirefox_()&&goog.labs.userAgent.util.matchUserAgent("AppleWebKit")};
goog.labs.userAgent.browser.matchChrome_=function(){return(goog.labs.userAgent.util.matchUserAgent("Chrome")||goog.labs.userAgent.util.matchUserAgent("CriOS"))&&!goog.labs.userAgent.browser.matchEdgeHtml_()};goog.labs.userAgent.browser.matchAndroidBrowser_=function(){return goog.labs.userAgent.util.matchUserAgent("Android")&&!(goog.labs.userAgent.browser.isChrome()||goog.labs.userAgent.browser.isFirefox()||goog.labs.userAgent.browser.isOpera()||goog.labs.userAgent.browser.isSilk())};
goog.labs.userAgent.browser.isOpera=goog.labs.userAgent.browser.matchOpera_;goog.labs.userAgent.browser.isIE=goog.labs.userAgent.browser.matchIE_;goog.labs.userAgent.browser.isEdge=goog.labs.userAgent.browser.matchEdgeHtml_;goog.labs.userAgent.browser.isEdgeChromium=goog.labs.userAgent.browser.matchEdgeChromium_;goog.labs.userAgent.browser.isOperaChromium=goog.labs.userAgent.browser.matchOperaChromium_;goog.labs.userAgent.browser.isFirefox=goog.labs.userAgent.browser.matchFirefox_;
goog.labs.userAgent.browser.isSafari=goog.labs.userAgent.browser.matchSafari_;goog.labs.userAgent.browser.isCoast=goog.labs.userAgent.browser.matchCoast_;goog.labs.userAgent.browser.isIosWebview=goog.labs.userAgent.browser.matchIosWebview_;goog.labs.userAgent.browser.isChrome=goog.labs.userAgent.browser.matchChrome_;goog.labs.userAgent.browser.isAndroidBrowser=goog.labs.userAgent.browser.matchAndroidBrowser_;goog.labs.userAgent.browser.isSilk=function(){return goog.labs.userAgent.util.matchUserAgent("Silk")};
goog.labs.userAgent.browser.getVersion=function(){function a(a){a=goog.array.find(a,d);return c[a]||""}var b=goog.labs.userAgent.util.getUserAgent();if(goog.labs.userAgent.browser.isIE())return goog.labs.userAgent.browser.getIEVersion_(b);b=goog.labs.userAgent.util.extractVersionTuples(b);var c={};goog.array.forEach(b,function(a){c[a[0]]=a[1]});var d=goog.partial(goog.object.containsKey,c);return goog.labs.userAgent.browser.isOpera()?a(["Version","Opera"]):goog.labs.userAgent.browser.isEdge()?a(["Edge"]):
goog.labs.userAgent.browser.isEdgeChromium()?a(["Edg"]):goog.labs.userAgent.browser.isChrome()?a(["Chrome","CriOS"]):(b=b[2])&&b[1]||""};goog.labs.userAgent.browser.isVersionOrHigher=function(a){return 0<=goog.string.internal.compareVersions(goog.labs.userAgent.browser.getVersion(),a)};
goog.labs.userAgent.browser.getIEVersion_=function(a){var b=/rv: *([\d\.]*)/.exec(a);if(b&&b[1])return b[1];b="";var c=/MSIE +([\d\.]+)/.exec(a);if(c&&c[1])if(a=/Trident\/(\d.\d)/.exec(a),"7.0"==c[1])if(a&&a[1])switch(a[1]){case "4.0":b="8.0";break;case "5.0":b="9.0";break;case "6.0":b="10.0";break;case "7.0":b="11.0"}else b="7.0";else b=c[1];return b};goog.html.SafeHtml=function(){this.privateDoNotAccessOrElseSafeHtmlWrappedValue_="";this.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_=goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;this.dir_=null};goog.html.SafeHtml.prototype.implementsGoogI18nBidiDirectionalString=!0;goog.html.SafeHtml.prototype.getDirection=function(){return this.dir_};goog.html.SafeHtml.prototype.implementsGoogStringTypedString=!0;goog.html.SafeHtml.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_.toString()};
goog.DEBUG&&(goog.html.SafeHtml.prototype.toString=function(){return"SafeHtml{"+this.privateDoNotAccessOrElseSafeHtmlWrappedValue_+"}"});goog.html.SafeHtml.unwrap=function(a){return goog.html.SafeHtml.unwrapTrustedHTML(a).toString()};
goog.html.SafeHtml.unwrapTrustedHTML=function(a){if(a instanceof goog.html.SafeHtml&&a.constructor===goog.html.SafeHtml&&a.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_===goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_)return a.privateDoNotAccessOrElseSafeHtmlWrappedValue_;goog.asserts.fail("expected object of type SafeHtml, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeHtml"};
goog.html.SafeHtml.htmlEscape=function(a){if(a instanceof goog.html.SafeHtml)return a;var b="object"==typeof a,c=null;b&&a.implementsGoogI18nBidiDirectionalString&&(c=a.getDirection());a=b&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.htmlEscape(a),c)};
goog.html.SafeHtml.htmlEscapePreservingNewlines=function(a){if(a instanceof goog.html.SafeHtml)return a;a=goog.html.SafeHtml.htmlEscape(a);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.newLineToBr(goog.html.SafeHtml.unwrap(a)),a.getDirection())};
goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces=function(a){if(a instanceof goog.html.SafeHtml)return a;a=goog.html.SafeHtml.htmlEscape(a);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.whitespaceEscape(goog.html.SafeHtml.unwrap(a)),a.getDirection())};goog.html.SafeHtml.from=goog.html.SafeHtml.htmlEscape;goog.html.SafeHtml.VALID_NAMES_IN_TAG_=/^[a-zA-Z0-9-]+$/;
goog.html.SafeHtml.URL_ATTRIBUTES_={action:!0,cite:!0,data:!0,formaction:!0,href:!0,manifest:!0,poster:!0,src:!0};goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_={APPLET:!0,BASE:!0,EMBED:!0,IFRAME:!0,LINK:!0,MATH:!0,META:!0,OBJECT:!0,SCRIPT:!0,STYLE:!0,SVG:!0,TEMPLATE:!0};goog.html.SafeHtml.create=function(a,b,c){goog.html.SafeHtml.verifyTagName(String(a));return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(String(a),b,c)};
goog.html.SafeHtml.verifyTagName=function(a){if(!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(a))throw Error("Invalid tag name <"+a+">.");if(a.toUpperCase()in goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_)throw Error("Tag name <"+a+"> is not allowed for SafeHtml.");};
goog.html.SafeHtml.createIframe=function(a,b,c,d){a&&goog.html.TrustedResourceUrl.unwrap(a);var e={};e.src=a||null;e.srcdoc=b&&goog.html.SafeHtml.unwrap(b);a=goog.html.SafeHtml.combineAttributes(e,{sandbox:""},c);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("iframe",a,d)};
goog.html.SafeHtml.createSandboxIframe=function(a,b,c,d){if(!goog.html.SafeHtml.canUseSandboxIframe())throw Error("The browser does not support sandboxed iframes.");var e={};e.src=a?goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(a)):null;e.srcdoc=b||null;e.sandbox="";a=goog.html.SafeHtml.combineAttributes(e,{},c);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("iframe",a,d)};
goog.html.SafeHtml.canUseSandboxIframe=function(){return goog.global.HTMLIFrameElement&&"sandbox"in goog.global.HTMLIFrameElement.prototype};goog.html.SafeHtml.createScriptSrc=function(a,b){goog.html.TrustedResourceUrl.unwrap(a);a=goog.html.SafeHtml.combineAttributes({src:a},{},b);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("script",a)};
goog.html.SafeHtml.createScript=function(a,b){for(var c in b){var d=c.toLowerCase();if("language"==d||"src"==d||"text"==d||"type"==d)throw Error('Cannot set "'+d+'" attribute');}c="";a=goog.array.concat(a);for(d=0;d<a.length;d++)c+=goog.html.SafeScript.unwrap(a[d]);a=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(c,goog.i18n.bidi.Dir.NEUTRAL);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("script",b,a)};
goog.html.SafeHtml.createStyle=function(a,b){b=goog.html.SafeHtml.combineAttributes({type:"text/css"},{},b);var c="";a=goog.array.concat(a);for(var d=0;d<a.length;d++)c+=goog.html.SafeStyleSheet.unwrap(a[d]);a=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(c,goog.i18n.bidi.Dir.NEUTRAL);return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("style",b,a)};
goog.html.SafeHtml.createMetaRefresh=function(a,b){a=goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(a));(goog.labs.userAgent.browser.isIE()||goog.labs.userAgent.browser.isEdge())&&goog.string.internal.contains(a,";")&&(a="'"+a.replace(/'/g,"%27")+"'");return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("meta",{"http-equiv":"refresh",content:(b||0)+"; url="+a})};
goog.html.SafeHtml.getAttrNameAndValue_=function(a,b,c){if(c instanceof goog.string.Const)c=goog.string.Const.unwrap(c);else if("style"==b.toLowerCase())c=goog.html.SafeHtml.getStyleValue_(c);else{if(/^on/i.test(b))throw Error('Attribute "'+b+'" requires goog.string.Const value, "'+c+'" given.');if(b.toLowerCase()in goog.html.SafeHtml.URL_ATTRIBUTES_)if(c instanceof goog.html.TrustedResourceUrl)c=goog.html.TrustedResourceUrl.unwrap(c);else if(c instanceof goog.html.SafeUrl)c=goog.html.SafeUrl.unwrap(c);
else if(goog.isString(c))c=goog.html.SafeUrl.sanitize(c).getTypedStringValue();else throw Error('Attribute "'+b+'" on tag "'+a+'" requires goog.html.SafeUrl, goog.string.Const, or string, value "'+c+'" given.');}c.implementsGoogStringTypedString&&(c=c.getTypedStringValue());goog.asserts.assert(goog.isString(c)||goog.isNumber(c),"String or number value expected, got "+typeof c+" with value: "+c);return b+'="'+goog.string.internal.htmlEscape(String(c))+'"'};
goog.html.SafeHtml.getStyleValue_=function(a){if(!goog.isObject(a))throw Error('The "style" attribute requires goog.html.SafeStyle or map of style properties, '+typeof a+" given: "+a);a instanceof goog.html.SafeStyle||(a=goog.html.SafeStyle.create(a));return goog.html.SafeStyle.unwrap(a)};goog.html.SafeHtml.createWithDir=function(a,b,c,d){b=goog.html.SafeHtml.create(b,c,d);b.dir_=a;return b};
goog.html.SafeHtml.join=function(a,b){a=goog.html.SafeHtml.htmlEscape(a);var c=a.getDirection(),d=[],e=function(a){goog.isArray(a)?goog.array.forEach(a,e):(a=goog.html.SafeHtml.htmlEscape(a),d.push(goog.html.SafeHtml.unwrap(a)),a=a.getDirection(),c==goog.i18n.bidi.Dir.NEUTRAL?c=a:a!=goog.i18n.bidi.Dir.NEUTRAL&&c!=a&&(c=null))};goog.array.forEach(b,e);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(d.join(goog.html.SafeHtml.unwrap(a)),c)};
goog.html.SafeHtml.concat=function(a){return goog.html.SafeHtml.join(goog.html.SafeHtml.EMPTY,Array.prototype.slice.call(arguments))};goog.html.SafeHtml.concatWithDir=function(a,b){var c=goog.html.SafeHtml.concat(goog.array.slice(arguments,1));c.dir_=a;return c};goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_={};goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse=function(a,b){return(new goog.html.SafeHtml).initSecurityPrivateDoNotAccessOrElse_(a,b)};
goog.html.SafeHtml.prototype.initSecurityPrivateDoNotAccessOrElse_=function(a,b){this.privateDoNotAccessOrElseSafeHtmlWrappedValue_=goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY?goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createHTML(a):a;this.dir_=b;return this};
goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse=function(a,b,c){var d=null;var e="<"+a+goog.html.SafeHtml.stringifyAttributes(a,b);goog.isDefAndNotNull(c)?goog.isArray(c)||(c=[c]):c=[];goog.dom.tags.isVoidTag(a.toLowerCase())?(goog.asserts.assert(!c.length,"Void tag <"+a+"> does not allow content."),e+=">"):(d=goog.html.SafeHtml.concat(c),e+=">"+goog.html.SafeHtml.unwrap(d)+"</"+a+">",d=d.getDirection());(a=b&&b.dir)&&(d=/^(ltr|rtl|auto)$/i.test(a)?goog.i18n.bidi.Dir.NEUTRAL:
null);return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(e,d)};goog.html.SafeHtml.stringifyAttributes=function(a,b){var c="";if(b)for(var d in b){if(!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(d))throw Error('Invalid attribute name "'+d+'".');var e=b[d];goog.isDefAndNotNull(e)&&(c+=" "+goog.html.SafeHtml.getAttrNameAndValue_(a,d,e))}return c};
goog.html.SafeHtml.combineAttributes=function(a,b,c){var d={},e;for(e in a)goog.asserts.assert(e.toLowerCase()==e,"Must be lower case"),d[e]=a[e];for(e in b)goog.asserts.assert(e.toLowerCase()==e,"Must be lower case"),d[e]=b[e];for(e in c){var f=e.toLowerCase();if(f in a)throw Error('Cannot override "'+f+'" attribute, got "'+e+'" with value "'+c[e]+'"');f in b&&delete d[f];d[e]=c[e]}return d};
goog.html.SafeHtml.DOCTYPE_HTML=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("<!DOCTYPE html>",goog.i18n.bidi.Dir.NEUTRAL);goog.html.SafeHtml.EMPTY=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("",goog.i18n.bidi.Dir.NEUTRAL);goog.html.SafeHtml.BR=goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("<br>",goog.i18n.bidi.Dir.NEUTRAL);goog.html.uncheckedconversions={};goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract=function(a,b,c){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(b,c||null)};
goog.html.uncheckedconversions.safeScriptFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(b)};
goog.html.uncheckedconversions.safeStyleFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b)};
goog.html.uncheckedconversions.safeStyleSheetFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(b)};
goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)};
goog.html.uncheckedconversions.trustedResourceUrlFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(b)};goog.dom.asserts={};goog.dom.asserts.assertIsLocation=function(a){if(goog.asserts.ENABLE_ASSERTS){var b=goog.dom.asserts.getWindow_(a);b&&(!a||!(a instanceof b.Location)&&a instanceof b.Element)&&goog.asserts.fail("Argument is not a Location (or a non-Element mock); got: %s",goog.dom.asserts.debugStringForType_(a))}return a};
goog.dom.asserts.assertIsElementType_=function(a,b){if(goog.asserts.ENABLE_ASSERTS){var c=goog.dom.asserts.getWindow_(a);c&&"undefined"!=typeof c[b]&&(a&&(a instanceof c[b]||!(a instanceof c.Location||a instanceof c.Element))||goog.asserts.fail("Argument is not a %s (or a non-Element, non-Location mock); got: %s",b,goog.dom.asserts.debugStringForType_(a)))}return a};goog.dom.asserts.assertIsHTMLAnchorElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLAnchorElement")};
goog.dom.asserts.assertIsHTMLButtonElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLButtonElement")};goog.dom.asserts.assertIsHTMLLinkElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLLinkElement")};goog.dom.asserts.assertIsHTMLImageElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLImageElement")};goog.dom.asserts.assertIsHTMLAudioElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLAudioElement")};
goog.dom.asserts.assertIsHTMLVideoElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLVideoElement")};goog.dom.asserts.assertIsHTMLInputElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLInputElement")};goog.dom.asserts.assertIsHTMLTextAreaElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLTextAreaElement")};goog.dom.asserts.assertIsHTMLCanvasElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLCanvasElement")};
goog.dom.asserts.assertIsHTMLEmbedElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLEmbedElement")};goog.dom.asserts.assertIsHTMLFormElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLFormElement")};goog.dom.asserts.assertIsHTMLFrameElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLFrameElement")};goog.dom.asserts.assertIsHTMLIFrameElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLIFrameElement")};
goog.dom.asserts.assertIsHTMLObjectElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLObjectElement")};goog.dom.asserts.assertIsHTMLScriptElement=function(a){return goog.dom.asserts.assertIsElementType_(a,"HTMLScriptElement")};
goog.dom.asserts.debugStringForType_=function(a){if(goog.isObject(a))try{return a.constructor.displayName||a.constructor.name||Object.prototype.toString.call(a)}catch(b){return"<object could not be stringified>"}else return void 0===a?"undefined":null===a?"null":typeof a};goog.dom.asserts.getWindow_=function(a){try{var b=a&&a.ownerDocument,c=b&&(b.defaultView||b.parentWindow);c=c||goog.global;if(c.Element&&c.Location)return c}catch(d){}return null};goog.functions={};goog.functions.constant=function(a){return function(){return a}};goog.functions.FALSE=function(){return!1};goog.functions.TRUE=function(){return!0};goog.functions.NULL=function(){return null};goog.functions.identity=function(a,b){return a};goog.functions.error=function(a){return function(){throw Error(a);}};goog.functions.fail=function(a){return function(){throw a;}};
goog.functions.lock=function(a,b){b=b||0;return function(){return a.apply(this,Array.prototype.slice.call(arguments,0,b))}};goog.functions.nth=function(a){return function(){return arguments[a]}};goog.functions.partialRight=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=Array.prototype.slice.call(arguments);b.push.apply(b,c);return a.apply(this,b)}};goog.functions.withReturnValue=function(a,b){return goog.functions.sequence(a,goog.functions.constant(b))};
goog.functions.equalTo=function(a,b){return function(c){return b?a==c:a===c}};goog.functions.compose=function(a,b){var c=arguments,d=c.length;return function(){var a;d&&(a=c[d-1].apply(this,arguments));for(var b=d-2;0<=b;b--)a=c[b].call(this,a);return a}};goog.functions.sequence=function(a){var b=arguments,c=b.length;return function(){for(var a,e=0;e<c;e++)a=b[e].apply(this,arguments);return a}};
goog.functions.and=function(a){var b=arguments,c=b.length;return function(){for(var a=0;a<c;a++)if(!b[a].apply(this,arguments))return!1;return!0}};goog.functions.or=function(a){var b=arguments,c=b.length;return function(){for(var a=0;a<c;a++)if(b[a].apply(this,arguments))return!0;return!1}};goog.functions.not=function(a){return function(){return!a.apply(this,arguments)}};
goog.functions.create=function(a,b){var c=function(){};c.prototype=a.prototype;c=new c;a.apply(c,Array.prototype.slice.call(arguments,1));return c};goog.functions.CACHE_RETURN_VALUE=!0;goog.functions.cacheReturnValue=function(a){var b=!1,c;return function(){if(!goog.functions.CACHE_RETURN_VALUE)return a();b||(c=a(),b=!0);return c}};goog.functions.once=function(a){var b=a;return function(){if(b){var a=b;b=null;a()}}};
goog.functions.debounce=function(a,b,c){var d=0;return function(e){goog.global.clearTimeout(d);var f=arguments;d=goog.global.setTimeout(function(){a.apply(c,f)},b)}};goog.functions.throttle=function(a,b,c){var d=0,e=!1,f=[],g=function(){d=0;e&&(e=!1,h())},h=function(){d=goog.global.setTimeout(g,b);a.apply(c,f)};return function(a){f=arguments;d?e=!0:h()}};goog.functions.rateLimit=function(a,b,c){var d=0,e=function(){d=0};return function(f){d||(d=goog.global.setTimeout(e,b),a.apply(c,arguments))}};goog.dom.safe={};goog.dom.safe.InsertAdjacentHtmlPosition={AFTERBEGIN:"afterbegin",AFTEREND:"afterend",BEFOREBEGIN:"beforebegin",BEFOREEND:"beforeend"};goog.dom.safe.insertAdjacentHtml=function(a,b,c){a.insertAdjacentHTML(b,goog.html.SafeHtml.unwrapTrustedHTML(c))};goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_={MATH:!0,SCRIPT:!0,STYLE:!0,SVG:!0,TEMPLATE:!0};
goog.dom.safe.isInnerHtmlCleanupRecursive_=goog.functions.cacheReturnValue(function(){if(goog.DEBUG&&"undefined"===typeof document)return!1;var a=document.createElement("div"),b=document.createElement("div");b.appendChild(document.createElement("div"));a.appendChild(b);if(goog.DEBUG&&!a.firstChild)return!1;b=a.firstChild.firstChild;a.innerHTML=goog.html.SafeHtml.unwrapTrustedHTML(goog.html.SafeHtml.EMPTY);return!b.parentElement});
goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse=function(a,b){if(goog.dom.safe.isInnerHtmlCleanupRecursive_())for(;a.lastChild;)a.removeChild(a.lastChild);a.innerHTML=goog.html.SafeHtml.unwrapTrustedHTML(b)};
goog.dom.safe.setInnerHtml=function(a,b){if(goog.asserts.ENABLE_ASSERTS){var c=a.tagName.toUpperCase();if(goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_[c])throw Error("goog.dom.safe.setInnerHtml cannot be used to set content of "+a.tagName+".");}goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse(a,b)};goog.dom.safe.setOuterHtml=function(a,b){a.outerHTML=goog.html.SafeHtml.unwrapTrustedHTML(b)};
goog.dom.safe.setFormElementAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLFormElement(a).action=goog.html.SafeUrl.unwrapTrustedURL(b)};goog.dom.safe.setButtonFormAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLButtonElement(a).formAction=goog.html.SafeUrl.unwrapTrustedURL(b)};
goog.dom.safe.setInputFormAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLInputElement(a).formAction=goog.html.SafeUrl.unwrapTrustedURL(b)};goog.dom.safe.setStyle=function(a,b){a.style.cssText=goog.html.SafeStyle.unwrap(b)};goog.dom.safe.documentWrite=function(a,b){a.write(goog.html.SafeHtml.unwrapTrustedHTML(b))};
goog.dom.safe.setAnchorHref=function(a,b){goog.dom.asserts.assertIsHTMLAnchorElement(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.href=goog.html.SafeUrl.unwrapTrustedURL(b)};goog.dom.safe.setImageSrc=function(a,b){goog.dom.asserts.assertIsHTMLImageElement(a);if(!(b instanceof goog.html.SafeUrl)){var c=/^data:image\//i.test(b);b=goog.html.SafeUrl.sanitizeAssertUnchanged(b,c)}a.src=goog.html.SafeUrl.unwrapTrustedURL(b)};
goog.dom.safe.setAudioSrc=function(a,b){goog.dom.asserts.assertIsHTMLAudioElement(a);if(!(b instanceof goog.html.SafeUrl)){var c=/^data:audio\//i.test(b);b=goog.html.SafeUrl.sanitizeAssertUnchanged(b,c)}a.src=goog.html.SafeUrl.unwrapTrustedURL(b)};goog.dom.safe.setVideoSrc=function(a,b){goog.dom.asserts.assertIsHTMLVideoElement(a);if(!(b instanceof goog.html.SafeUrl)){var c=/^data:video\//i.test(b);b=goog.html.SafeUrl.sanitizeAssertUnchanged(b,c)}a.src=goog.html.SafeUrl.unwrapTrustedURL(b)};
goog.dom.safe.setEmbedSrc=function(a,b){goog.dom.asserts.assertIsHTMLEmbedElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b)};goog.dom.safe.setFrameSrc=function(a,b){goog.dom.asserts.assertIsHTMLFrameElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedURL(b)};goog.dom.safe.setIframeSrc=function(a,b){goog.dom.asserts.assertIsHTMLIFrameElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedURL(b)};
goog.dom.safe.setIframeSrcdoc=function(a,b){goog.dom.asserts.assertIsHTMLIFrameElement(a);a.srcdoc=goog.html.SafeHtml.unwrapTrustedHTML(b)};
goog.dom.safe.setLinkHrefAndRel=function(a,b,c){goog.dom.asserts.assertIsHTMLLinkElement(a);a.rel=c;goog.string.internal.caseInsensitiveContains(c,"stylesheet")?(goog.asserts.assert(b instanceof goog.html.TrustedResourceUrl,'URL must be TrustedResourceUrl because "rel" contains "stylesheet"'),a.href=goog.html.TrustedResourceUrl.unwrapTrustedURL(b)):a.href=b instanceof goog.html.TrustedResourceUrl?goog.html.TrustedResourceUrl.unwrapTrustedURL(b):b instanceof goog.html.SafeUrl?goog.html.SafeUrl.unwrapTrustedURL(b):
goog.html.SafeUrl.unwrapTrustedURL(goog.html.SafeUrl.sanitizeAssertUnchanged(b))};goog.dom.safe.setObjectData=function(a,b){goog.dom.asserts.assertIsHTMLObjectElement(a);a.data=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b)};goog.dom.safe.setScriptSrc=function(a,b){goog.dom.asserts.assertIsHTMLScriptElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b);(b=goog.getScriptNonce())&&a.setAttribute("nonce",b)};
goog.dom.safe.setScriptContent=function(a,b){goog.dom.asserts.assertIsHTMLScriptElement(a);a.text=goog.html.SafeScript.unwrapTrustedScript(b);(b=goog.getScriptNonce())&&a.setAttribute("nonce",b)};goog.dom.safe.setLocationHref=function(a,b){goog.dom.asserts.assertIsLocation(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.href=goog.html.SafeUrl.unwrapTrustedURL(b)};
goog.dom.safe.assignLocation=function(a,b){goog.dom.asserts.assertIsLocation(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.assign(goog.html.SafeUrl.unwrapTrustedURL(b))};goog.dom.safe.replaceLocation=function(a,b){goog.dom.asserts.assertIsLocation(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.replace(goog.html.SafeUrl.unwrapTrustedURL(b))};
goog.dom.safe.openInWindow=function(a,b,c,d,e){a=a instanceof goog.html.SafeUrl?a:goog.html.SafeUrl.sanitizeAssertUnchanged(a);return(b||goog.global).open(goog.html.SafeUrl.unwrapTrustedURL(a),c?goog.string.Const.unwrap(c):"",d,e)};goog.dom.safe.parseFromStringHtml=function(a,b){return goog.dom.safe.parseFromString(a,b,"text/html")};goog.dom.safe.parseFromString=function(a,b,c){return a.parseFromString(goog.html.SafeHtml.unwrapTrustedHTML(b),c)};
goog.dom.safe.createImageFromBlob=function(a){if(!/^image\/.*/g.test(a.type))throw Error("goog.dom.safe.createImageFromBlob only accepts MIME type image/.*.");var b=goog.global.URL.createObjectURL(a);a=new goog.global.Image;a.onload=function(){goog.global.URL.revokeObjectURL(b)};goog.dom.safe.setImageSrc(a,goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract(goog.string.Const.from("Image blob URL."),b));return a};goog.string.DETECT_DOUBLE_ESCAPING=!1;goog.string.FORCE_NON_DOM_HTML_UNESCAPING=!1;goog.string.Unicode={NBSP:"\u00a0"};goog.string.startsWith=goog.string.internal.startsWith;goog.string.endsWith=goog.string.internal.endsWith;goog.string.caseInsensitiveStartsWith=goog.string.internal.caseInsensitiveStartsWith;goog.string.caseInsensitiveEndsWith=goog.string.internal.caseInsensitiveEndsWith;goog.string.caseInsensitiveEquals=goog.string.internal.caseInsensitiveEquals;
goog.string.subs=function(a,b){for(var c=a.split("%s"),d="",e=Array.prototype.slice.call(arguments,1);e.length&&1<c.length;)d+=c.shift()+e.shift();return d+c.join("%s")};goog.string.collapseWhitespace=function(a){return a.replace(/[\s\xa0]+/g," ").replace(/^\s+|\s+$/g,"")};goog.string.isEmptyOrWhitespace=goog.string.internal.isEmptyOrWhitespace;goog.string.isEmptyString=function(a){return 0==a.length};goog.string.isEmpty=goog.string.isEmptyOrWhitespace;goog.string.isEmptyOrWhitespaceSafe=function(a){return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(a))};
goog.string.isEmptySafe=goog.string.isEmptyOrWhitespaceSafe;goog.string.isBreakingWhitespace=function(a){return!/[^\t\n\r ]/.test(a)};goog.string.isAlpha=function(a){return!/[^a-zA-Z]/.test(a)};goog.string.isNumeric=function(a){return!/[^0-9]/.test(a)};goog.string.isAlphaNumeric=function(a){return!/[^a-zA-Z0-9]/.test(a)};goog.string.isSpace=function(a){return" "==a};goog.string.isUnicodeChar=function(a){return 1==a.length&&" "<=a&&"~">=a||"\u0080"<=a&&"\ufffd">=a};
goog.string.stripNewlines=function(a){return a.replace(/(\r\n|\r|\n)+/g," ")};goog.string.canonicalizeNewlines=function(a){return a.replace(/(\r\n|\r|\n)/g,"\n")};goog.string.normalizeWhitespace=function(a){return a.replace(/\xa0|\s/g," ")};goog.string.normalizeSpaces=function(a){return a.replace(/\xa0|[ \t]+/g," ")};goog.string.collapseBreakingSpaces=function(a){return a.replace(/[\t\r\n ]+/g," ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g,"")};goog.string.trim=goog.string.internal.trim;
goog.string.trimLeft=function(a){return a.replace(/^[\s\xa0]+/,"")};goog.string.trimRight=function(a){return a.replace(/[\s\xa0]+$/,"")};goog.string.caseInsensitiveCompare=goog.string.internal.caseInsensitiveCompare;
goog.string.numberAwareCompare_=function(a,b,c){if(a==b)return 0;if(!a)return-1;if(!b)return 1;for(var d=a.toLowerCase().match(c),e=b.toLowerCase().match(c),f=Math.min(d.length,e.length),g=0;g<f;g++){c=d[g];var h=e[g];if(c!=h)return a=parseInt(c,10),!isNaN(a)&&(b=parseInt(h,10),!isNaN(b)&&a-b)?a-b:c<h?-1:1}return d.length!=e.length?d.length-e.length:a<b?-1:1};goog.string.intAwareCompare=function(a,b){return goog.string.numberAwareCompare_(a,b,/\d+|\D+/g)};
goog.string.floatAwareCompare=function(a,b){return goog.string.numberAwareCompare_(a,b,/\d+|\.\d+|\D+/g)};goog.string.numerateCompare=goog.string.floatAwareCompare;goog.string.urlEncode=function(a){return encodeURIComponent(String(a))};goog.string.urlDecode=function(a){return decodeURIComponent(a.replace(/\+/g," "))};goog.string.newLineToBr=goog.string.internal.newLineToBr;
goog.string.htmlEscape=function(a,b){a=goog.string.internal.htmlEscape(a,b);goog.string.DETECT_DOUBLE_ESCAPING&&(a=a.replace(goog.string.E_RE_,"&#101;"));return a};goog.string.E_RE_=/e/g;goog.string.unescapeEntities=function(a){return goog.string.contains(a,"&")?!goog.string.FORCE_NON_DOM_HTML_UNESCAPING&&"document"in goog.global?goog.string.unescapeEntitiesUsingDom_(a):goog.string.unescapePureXmlEntities_(a):a};
goog.string.unescapeEntitiesWithDocument=function(a,b){return goog.string.contains(a,"&")?goog.string.unescapeEntitiesUsingDom_(a,b):a};
goog.string.unescapeEntitiesUsingDom_=function(a,b){var c={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"'};var d=b?b.createElement("div"):goog.global.document.createElement("div");return a.replace(goog.string.HTML_ENTITY_PATTERN_,function(a,b){var e=c[a];if(e)return e;"#"==b.charAt(0)&&(b=Number("0"+b.substr(1)),isNaN(b)||(e=String.fromCharCode(b)));e||(goog.dom.safe.setInnerHtml(d,goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract(goog.string.Const.from("Single HTML entity."),
a+" ")),e=d.firstChild.nodeValue.slice(0,-1));return c[a]=e})};goog.string.unescapePureXmlEntities_=function(a){return a.replace(/&([^;]+);/g,function(a,c){switch(c){case "amp":return"&";case "lt":return"<";case "gt":return">";case "quot":return'"';default:return"#"!=c.charAt(0)||(c=Number("0"+c.substr(1)),isNaN(c))?a:String.fromCharCode(c)}})};goog.string.HTML_ENTITY_PATTERN_=/&([^;\s<&]+);?/g;goog.string.whitespaceEscape=function(a,b){return goog.string.newLineToBr(a.replace(/ /g," &#160;"),b)};
goog.string.preserveSpaces=function(a){return a.replace(/(^|[\n ]) /g,"$1"+goog.string.Unicode.NBSP)};goog.string.stripQuotes=function(a,b){for(var c=b.length,d=0;d<c;d++){var e=1==c?b:b.charAt(d);if(a.charAt(0)==e&&a.charAt(a.length-1)==e)return a.substring(1,a.length-1)}return a};goog.string.truncate=function(a,b,c){c&&(a=goog.string.unescapeEntities(a));a.length>b&&(a=a.substring(0,b-3)+"...");c&&(a=goog.string.htmlEscape(a));return a};
goog.string.truncateMiddle=function(a,b,c,d){c&&(a=goog.string.unescapeEntities(a));if(d&&a.length>b){d>b&&(d=b);var e=a.length-d;a=a.substring(0,b-d)+"..."+a.substring(e)}else a.length>b&&(d=Math.floor(b/2),e=a.length-d,a=a.substring(0,d+b%2)+"..."+a.substring(e));c&&(a=goog.string.htmlEscape(a));return a};goog.string.specialEscapeChars_={"\x00":"\\0","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\x0B":"\\x0B",'"':'\\"',"\\":"\\\\","<":"\\u003C"};goog.string.jsEscapeCache_={"'":"\\'"};
goog.string.quote=function(a){a=String(a);for(var b=['"'],c=0;c<a.length;c++){var d=a.charAt(c),e=d.charCodeAt(0);b[c+1]=goog.string.specialEscapeChars_[d]||(31<e&&127>e?d:goog.string.escapeChar(d))}b.push('"');return b.join("")};goog.string.escapeString=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=goog.string.escapeChar(a.charAt(c));return b.join("")};
goog.string.escapeChar=function(a){if(a in goog.string.jsEscapeCache_)return goog.string.jsEscapeCache_[a];if(a in goog.string.specialEscapeChars_)return goog.string.jsEscapeCache_[a]=goog.string.specialEscapeChars_[a];var b=a.charCodeAt(0);if(31<b&&127>b)var c=a;else{if(256>b){if(c="\\x",16>b||256<b)c+="0"}else c="\\u",4096>b&&(c+="0");c+=b.toString(16).toUpperCase()}return goog.string.jsEscapeCache_[a]=c};goog.string.contains=goog.string.internal.contains;goog.string.caseInsensitiveContains=goog.string.internal.caseInsensitiveContains;
goog.string.countOf=function(a,b){return a&&b?a.split(b).length-1:0};goog.string.removeAt=function(a,b,c){var d=a;0<=b&&b<a.length&&0<c&&(d=a.substr(0,b)+a.substr(b+c,a.length-b-c));return d};goog.string.remove=function(a,b){return a.replace(b,"")};goog.string.removeAll=function(a,b){b=new RegExp(goog.string.regExpEscape(b),"g");return a.replace(b,"")};goog.string.replaceAll=function(a,b,c){b=new RegExp(goog.string.regExpEscape(b),"g");return a.replace(b,c.replace(/\$/g,"$$$$"))};
goog.string.regExpEscape=function(a){return String(a).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")};goog.string.repeat=String.prototype.repeat?function(a,b){return a.repeat(b)}:function(a,b){return Array(b+1).join(a)};goog.string.padNumber=function(a,b,c){a=goog.isDef(c)?a.toFixed(c):String(a);c=a.indexOf(".");-1==c&&(c=a.length);return goog.string.repeat("0",Math.max(0,b-c))+a};goog.string.makeSafe=function(a){return null==a?"":String(a)};
goog.string.buildString=function(a){return Array.prototype.join.call(arguments,"")};goog.string.getRandomString=function(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^goog.now()).toString(36)};goog.string.compareVersions=goog.string.internal.compareVersions;goog.string.hashCode=function(a){for(var b=0,c=0;c<a.length;++c)b=31*b+a.charCodeAt(c)>>>0;return b};goog.string.uniqueStringCounter_=2147483648*Math.random()|0;
goog.string.createUniqueString=function(){return"goog_"+goog.string.uniqueStringCounter_++};goog.string.toNumber=function(a){var b=Number(a);return 0==b&&goog.string.isEmptyOrWhitespace(a)?NaN:b};goog.string.isLowerCamelCase=function(a){return/^[a-z]+([A-Z][a-z]*)*$/.test(a)};goog.string.isUpperCamelCase=function(a){return/^([A-Z][a-z]*)+$/.test(a)};goog.string.toCamelCase=function(a){return String(a).replace(/\-([a-z])/g,function(a,c){return c.toUpperCase()})};
goog.string.toSelectorCase=function(a){return String(a).replace(/([A-Z])/g,"-$1").toLowerCase()};goog.string.toTitleCase=function(a,b){b=goog.isString(b)?goog.string.regExpEscape(b):"\\s";return a.replace(new RegExp("(^"+(b?"|["+b+"]+":"")+")([a-z])","g"),function(a,b,e){return b+e.toUpperCase()})};goog.string.capitalize=function(a){return String(a.charAt(0)).toUpperCase()+String(a.substr(1)).toLowerCase()};
goog.string.parseInt=function(a){isFinite(a)&&(a=String(a));return goog.isString(a)?/^\s*-?0x/i.test(a)?parseInt(a,16):parseInt(a,10):NaN};goog.string.splitLimit=function(a,b,c){a=a.split(b);for(var d=[];0<c&&a.length;)d.push(a.shift()),c--;a.length&&d.push(a.join(b));return d};goog.string.lastComponent=function(a,b){if(b)"string"==typeof b&&(b=[b]);else return a;for(var c=-1,d=0;d<b.length;d++)if(""!=b[d]){var e=a.lastIndexOf(b[d]);e>c&&(c=e)}return-1==c?a:a.slice(c+1)};
goog.string.editDistance=function(a,b){var c=[],d=[];if(a==b)return 0;if(!a.length||!b.length)return Math.max(a.length,b.length);for(var e=0;e<b.length+1;e++)c[e]=e;for(e=0;e<a.length;e++){d[0]=e+1;for(var f=0;f<b.length;f++)d[f+1]=Math.min(d[f]+1,c[f+1]+1,c[f]+Number(a[e]!=b[f]));for(f=0;f<c.length;f++)c[f]=d[f]}return d[b.length]};goog.labs.userAgent.platform={};goog.labs.userAgent.platform.isAndroid=function(){return goog.labs.userAgent.util.matchUserAgent("Android")};goog.labs.userAgent.platform.isIpod=function(){return goog.labs.userAgent.util.matchUserAgent("iPod")};goog.labs.userAgent.platform.isIphone=function(){return goog.labs.userAgent.util.matchUserAgent("iPhone")&&!goog.labs.userAgent.util.matchUserAgent("iPod")&&!goog.labs.userAgent.util.matchUserAgent("iPad")};goog.labs.userAgent.platform.isIpad=function(){return goog.labs.userAgent.util.matchUserAgent("iPad")};
goog.labs.userAgent.platform.isIos=function(){return goog.labs.userAgent.platform.isIphone()||goog.labs.userAgent.platform.isIpad()||goog.labs.userAgent.platform.isIpod()};goog.labs.userAgent.platform.isMacintosh=function(){return goog.labs.userAgent.util.matchUserAgent("Macintosh")};goog.labs.userAgent.platform.isLinux=function(){return goog.labs.userAgent.util.matchUserAgent("Linux")};goog.labs.userAgent.platform.isWindows=function(){return goog.labs.userAgent.util.matchUserAgent("Windows")};
goog.labs.userAgent.platform.isChromeOS=function(){return goog.labs.userAgent.util.matchUserAgent("CrOS")};goog.labs.userAgent.platform.isChromecast=function(){return goog.labs.userAgent.util.matchUserAgent("CrKey")};goog.labs.userAgent.platform.isKaiOS=function(){return goog.labs.userAgent.util.matchUserAgentIgnoreCase("KaiOS")};goog.labs.userAgent.platform.isGo2Phone=function(){return goog.labs.userAgent.util.matchUserAgentIgnoreCase("GAFP")};
goog.labs.userAgent.platform.getVersion=function(){var a=goog.labs.userAgent.util.getUserAgent(),b="";goog.labs.userAgent.platform.isWindows()?(b=/Windows (?:NT|Phone) ([0-9.]+)/,b=(a=b.exec(a))?a[1]:"0.0"):goog.labs.userAgent.platform.isIos()?(b=/(?:iPhone|iPod|iPad|CPU)\s+OS\s+(\S+)/,b=(a=b.exec(a))&&a[1].replace(/_/g,".")):goog.labs.userAgent.platform.isMacintosh()?(b=/Mac OS X ([0-9_.]+)/,b=(a=b.exec(a))?a[1].replace(/_/g,"."):"10"):goog.labs.userAgent.platform.isKaiOS()?(b=/(?:KaiOS)\/(\S+)/i,
b=(a=b.exec(a))&&a[1]):goog.labs.userAgent.platform.isAndroid()?(b=/Android\s+([^\);]+)(\)|;)/,b=(a=b.exec(a))&&a[1]):goog.labs.userAgent.platform.isChromeOS()&&(b=/(?:CrOS\s+(?:i686|x86_64)\s+([0-9.]+))/,b=(a=b.exec(a))&&a[1]);return b||""};goog.labs.userAgent.platform.isVersionOrHigher=function(a){return 0<=goog.string.compareVersions(goog.labs.userAgent.platform.getVersion(),a)};goog.reflect={};goog.reflect.object=function(a,b){return b};goog.reflect.objectProperty=function(a,b){return a};goog.reflect.sinkValue=function(a){goog.reflect.sinkValue[" "](a);return a};goog.reflect.sinkValue[" "]=goog.nullFunction;goog.reflect.canAccessProperty=function(a,b){try{return goog.reflect.sinkValue(a[b]),!0}catch(c){}return!1};goog.reflect.cache=function(a,b,c,d){d=d?d(b):b;return Object.prototype.hasOwnProperty.call(a,d)?a[d]:a[d]=c(b)};goog.labs.userAgent.engine={};goog.labs.userAgent.engine.isPresto=function(){return goog.labs.userAgent.util.matchUserAgent("Presto")};goog.labs.userAgent.engine.isTrident=function(){return goog.labs.userAgent.util.matchUserAgent("Trident")||goog.labs.userAgent.util.matchUserAgent("MSIE")};goog.labs.userAgent.engine.isEdge=function(){return goog.labs.userAgent.util.matchUserAgent("Edge")};
goog.labs.userAgent.engine.isWebKit=function(){return goog.labs.userAgent.util.matchUserAgentIgnoreCase("WebKit")&&!goog.labs.userAgent.engine.isEdge()};goog.labs.userAgent.engine.isGecko=function(){return goog.labs.userAgent.util.matchUserAgent("Gecko")&&!goog.labs.userAgent.engine.isWebKit()&&!goog.labs.userAgent.engine.isTrident()&&!goog.labs.userAgent.engine.isEdge()};
goog.labs.userAgent.engine.getVersion=function(){var a=goog.labs.userAgent.util.getUserAgent();if(a){a=goog.labs.userAgent.util.extractVersionTuples(a);var b=goog.labs.userAgent.engine.getEngineTuple_(a);if(b)return"Gecko"==b[0]?goog.labs.userAgent.engine.getVersionForKey_(a,"Firefox"):b[1];a=a[0];var c;if(a&&(c=a[2])&&(c=/Trident\/([^\s;]+)/.exec(c)))return c[1]}return""};
goog.labs.userAgent.engine.getEngineTuple_=function(a){if(!goog.labs.userAgent.engine.isEdge())return a[1];for(var b=0;b<a.length;b++){var c=a[b];if("Edge"==c[0])return c}};goog.labs.userAgent.engine.isVersionOrHigher=function(a){return 0<=goog.string.compareVersions(goog.labs.userAgent.engine.getVersion(),a)};goog.labs.userAgent.engine.getVersionForKey_=function(a,b){return(a=goog.array.find(a,function(a){return b==a[0]}))&&a[1]||""};goog.userAgent={};goog.userAgent.ASSUME_IE=!1;goog.userAgent.ASSUME_EDGE=!1;goog.userAgent.ASSUME_GECKO=!1;goog.userAgent.ASSUME_WEBKIT=!1;goog.userAgent.ASSUME_MOBILE_WEBKIT=!1;goog.userAgent.ASSUME_OPERA=!1;goog.userAgent.ASSUME_ANY_VERSION=!1;goog.userAgent.BROWSER_KNOWN_=goog.userAgent.ASSUME_IE||goog.userAgent.ASSUME_EDGE||goog.userAgent.ASSUME_GECKO||goog.userAgent.ASSUME_MOBILE_WEBKIT||goog.userAgent.ASSUME_WEBKIT||goog.userAgent.ASSUME_OPERA;goog.userAgent.getUserAgentString=function(){return goog.labs.userAgent.util.getUserAgent()};
goog.userAgent.getNavigatorTyped=function(){return goog.global.navigator||null};goog.userAgent.getNavigator=function(){return goog.userAgent.getNavigatorTyped()};goog.userAgent.OPERA=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_OPERA:goog.labs.userAgent.browser.isOpera();goog.userAgent.IE=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_IE:goog.labs.userAgent.browser.isIE();goog.userAgent.EDGE=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_EDGE:goog.labs.userAgent.engine.isEdge();
goog.userAgent.EDGE_OR_IE=goog.userAgent.EDGE||goog.userAgent.IE;goog.userAgent.GECKO=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_GECKO:goog.labs.userAgent.engine.isGecko();goog.userAgent.WEBKIT=goog.userAgent.BROWSER_KNOWN_?goog.userAgent.ASSUME_WEBKIT||goog.userAgent.ASSUME_MOBILE_WEBKIT:goog.labs.userAgent.engine.isWebKit();goog.userAgent.isMobile_=function(){return goog.userAgent.WEBKIT&&goog.labs.userAgent.util.matchUserAgent("Mobile")};
goog.userAgent.MOBILE=goog.userAgent.ASSUME_MOBILE_WEBKIT||goog.userAgent.isMobile_();goog.userAgent.SAFARI=goog.userAgent.WEBKIT;goog.userAgent.determinePlatform_=function(){var a=goog.userAgent.getNavigatorTyped();return a&&a.platform||""};goog.userAgent.PLATFORM=goog.userAgent.determinePlatform_();goog.userAgent.ASSUME_MAC=!1;goog.userAgent.ASSUME_WINDOWS=!1;goog.userAgent.ASSUME_LINUX=!1;goog.userAgent.ASSUME_X11=!1;goog.userAgent.ASSUME_ANDROID=!1;goog.userAgent.ASSUME_IPHONE=!1;
goog.userAgent.ASSUME_IPAD=!1;goog.userAgent.ASSUME_IPOD=!1;goog.userAgent.ASSUME_KAIOS=!1;goog.userAgent.ASSUME_GO2PHONE=!1;goog.userAgent.PLATFORM_KNOWN_=goog.userAgent.ASSUME_MAC||goog.userAgent.ASSUME_WINDOWS||goog.userAgent.ASSUME_LINUX||goog.userAgent.ASSUME_X11||goog.userAgent.ASSUME_ANDROID||goog.userAgent.ASSUME_IPHONE||goog.userAgent.ASSUME_IPAD||goog.userAgent.ASSUME_IPOD;goog.userAgent.MAC=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_MAC:goog.labs.userAgent.platform.isMacintosh();
goog.userAgent.WINDOWS=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_WINDOWS:goog.labs.userAgent.platform.isWindows();goog.userAgent.isLegacyLinux_=function(){return goog.labs.userAgent.platform.isLinux()||goog.labs.userAgent.platform.isChromeOS()};goog.userAgent.LINUX=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_LINUX:goog.userAgent.isLegacyLinux_();goog.userAgent.isX11_=function(){var a=goog.userAgent.getNavigatorTyped();return!!a&&goog.string.contains(a.appVersion||"","X11")};
goog.userAgent.X11=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_X11:goog.userAgent.isX11_();goog.userAgent.ANDROID=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_ANDROID:goog.labs.userAgent.platform.isAndroid();goog.userAgent.IPHONE=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_IPHONE:goog.labs.userAgent.platform.isIphone();goog.userAgent.IPAD=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_IPAD:goog.labs.userAgent.platform.isIpad();
goog.userAgent.IPOD=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_IPOD:goog.labs.userAgent.platform.isIpod();goog.userAgent.IOS=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_IPHONE||goog.userAgent.ASSUME_IPAD||goog.userAgent.ASSUME_IPOD:goog.labs.userAgent.platform.isIos();goog.userAgent.KAIOS=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_KAIOS:goog.labs.userAgent.platform.isKaiOS();goog.userAgent.GO2PHONE=goog.userAgent.PLATFORM_KNOWN_?goog.userAgent.ASSUME_GO2PHONE:goog.labs.userAgent.platform.isGo2Phone();
goog.userAgent.determineVersion_=function(){var a="",b=goog.userAgent.getVersionRegexResult_();b&&(a=b?b[1]:"");return goog.userAgent.IE&&(b=goog.userAgent.getDocumentMode_(),null!=b&&b>parseFloat(a))?String(b):a};
goog.userAgent.getVersionRegexResult_=function(){var a=goog.userAgent.getUserAgentString();if(goog.userAgent.GECKO)return/rv:([^\);]+)(\)|;)/.exec(a);if(goog.userAgent.EDGE)return/Edge\/([\d\.]+)/.exec(a);if(goog.userAgent.IE)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(goog.userAgent.WEBKIT)return/WebKit\/(\S+)/.exec(a);if(goog.userAgent.OPERA)return/(?:Version)[ \/]?(\S+)/.exec(a)};goog.userAgent.getDocumentMode_=function(){var a=goog.global.document;return a?a.documentMode:void 0};
goog.userAgent.VERSION=goog.userAgent.determineVersion_();goog.userAgent.compare=function(a,b){return goog.string.compareVersions(a,b)};goog.userAgent.isVersionOrHigherCache_={};goog.userAgent.isVersionOrHigher=function(a){return goog.userAgent.ASSUME_ANY_VERSION||goog.reflect.cache(goog.userAgent.isVersionOrHigherCache_,a,function(){return 0<=goog.string.compareVersions(goog.userAgent.VERSION,a)})};goog.userAgent.isVersion=goog.userAgent.isVersionOrHigher;
goog.userAgent.isDocumentModeOrHigher=function(a){return Number(goog.userAgent.DOCUMENT_MODE)>=a};goog.userAgent.isDocumentMode=goog.userAgent.isDocumentModeOrHigher;goog.userAgent.DOCUMENT_MODE=function(){if(goog.global.document&&goog.userAgent.IE)return goog.userAgent.getDocumentMode_()}();goog.userAgent.product={};goog.userAgent.product.ASSUME_FIREFOX=!1;goog.userAgent.product.ASSUME_IPHONE=!1;goog.userAgent.product.ASSUME_IPAD=!1;goog.userAgent.product.ASSUME_ANDROID=!1;goog.userAgent.product.ASSUME_CHROME=!1;goog.userAgent.product.ASSUME_SAFARI=!1;
goog.userAgent.product.PRODUCT_KNOWN_=goog.userAgent.ASSUME_IE||goog.userAgent.ASSUME_EDGE||goog.userAgent.ASSUME_OPERA||goog.userAgent.product.ASSUME_FIREFOX||goog.userAgent.product.ASSUME_IPHONE||goog.userAgent.product.ASSUME_IPAD||goog.userAgent.product.ASSUME_ANDROID||goog.userAgent.product.ASSUME_CHROME||goog.userAgent.product.ASSUME_SAFARI;goog.userAgent.product.OPERA=goog.userAgent.OPERA;goog.userAgent.product.IE=goog.userAgent.IE;goog.userAgent.product.EDGE=goog.userAgent.EDGE;
goog.userAgent.product.FIREFOX=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_FIREFOX:goog.labs.userAgent.browser.isFirefox();goog.userAgent.product.isIphoneOrIpod_=function(){return goog.labs.userAgent.platform.isIphone()||goog.labs.userAgent.platform.isIpod()};goog.userAgent.product.IPHONE=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_IPHONE:goog.userAgent.product.isIphoneOrIpod_();
goog.userAgent.product.IPAD=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_IPAD:goog.labs.userAgent.platform.isIpad();goog.userAgent.product.ANDROID=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_ANDROID:goog.labs.userAgent.browser.isAndroidBrowser();goog.userAgent.product.CHROME=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_CHROME:goog.labs.userAgent.browser.isChrome();
goog.userAgent.product.isSafariDesktop_=function(){return goog.labs.userAgent.browser.isSafari()&&!goog.labs.userAgent.platform.isIos()};goog.userAgent.product.SAFARI=goog.userAgent.product.PRODUCT_KNOWN_?goog.userAgent.product.ASSUME_SAFARI:goog.userAgent.product.isSafariDesktop_();goog.crypt.base64={};goog.crypt.base64.DEFAULT_ALPHABET_COMMON_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";goog.crypt.base64.ENCODED_VALS=goog.crypt.base64.DEFAULT_ALPHABET_COMMON_+"+/=";goog.crypt.base64.ENCODED_VALS_WEBSAFE=goog.crypt.base64.DEFAULT_ALPHABET_COMMON_+"-_.";goog.crypt.base64.Alphabet={DEFAULT:0,NO_PADDING:1,WEBSAFE:2,WEBSAFE_DOT_PADDING:3,WEBSAFE_NO_PADDING:4};goog.crypt.base64.paddingChars_="=.";
goog.crypt.base64.isPadding_=function(a){return goog.string.contains(goog.crypt.base64.paddingChars_,a)};goog.crypt.base64.byteToCharMaps_={};goog.crypt.base64.charToByteMap_=null;goog.crypt.base64.ASSUME_NATIVE_SUPPORT_=goog.userAgent.GECKO||goog.userAgent.WEBKIT&&!goog.userAgent.product.SAFARI||goog.userAgent.OPERA;goog.crypt.base64.HAS_NATIVE_ENCODE_=goog.crypt.base64.ASSUME_NATIVE_SUPPORT_||"function"==typeof goog.global.btoa;
goog.crypt.base64.HAS_NATIVE_DECODE_=goog.crypt.base64.ASSUME_NATIVE_SUPPORT_||!goog.userAgent.product.SAFARI&&!goog.userAgent.IE&&"function"==typeof goog.global.atob;
goog.crypt.base64.encodeByteArray=function(a,b){goog.asserts.assert(goog.isArrayLike(a),"encodeByteArray takes an array as a parameter");void 0===b&&(b=goog.crypt.base64.Alphabet.DEFAULT);goog.crypt.base64.init_();b=goog.crypt.base64.byteToCharMaps_[b];for(var c=[],d=0;d<a.length;d+=3){var e=a[d],f=d+1<a.length,g=f?a[d+1]:0,h=d+2<a.length,k=h?a[d+2]:0,l=e>>2;e=(e&3)<<4|g>>4;g=(g&15)<<2|k>>6;k&=63;h||(k=64,f||(g=64));c.push(b[l],b[e],b[g]||"",b[k]||"")}return c.join("")};
goog.crypt.base64.encodeString=function(a,b){return goog.crypt.base64.HAS_NATIVE_ENCODE_&&!b?goog.global.btoa(a):goog.crypt.base64.encodeByteArray(goog.crypt.stringToByteArray(a),b)};goog.crypt.base64.decodeString=function(a,b){if(goog.crypt.base64.HAS_NATIVE_DECODE_&&!b)return goog.global.atob(a);var c="";goog.crypt.base64.decodeStringInternal_(a,function(a){c+=String.fromCharCode(a)});return c};
goog.crypt.base64.decodeStringToByteArray=function(a,b){var c=[];goog.crypt.base64.decodeStringInternal_(a,function(a){c.push(a)});return c};
goog.crypt.base64.decodeStringToUint8Array=function(a){goog.asserts.assert(!goog.userAgent.IE||goog.userAgent.isVersionOrHigher("10"),"Browser does not support typed arrays");var b=a.length,c=3*b/4;c%3?c=Math.floor(c):goog.crypt.base64.isPadding_(a[b-1])&&(c=goog.crypt.base64.isPadding_(a[b-2])?c-2:c-1);var d=new Uint8Array(c),e=0;goog.crypt.base64.decodeStringInternal_(a,function(a){d[e++]=a});return d.subarray(0,e)};
goog.crypt.base64.decodeStringInternal_=function(a,b){function c(b){for(;d<a.length;){var c=a.charAt(d++),e=goog.crypt.base64.charToByteMap_[c];if(null!=e)return e;if(!goog.string.isEmptyOrWhitespace(c))throw Error("Unknown base64 encoding at char: "+c);}return b}goog.crypt.base64.init_();for(var d=0;;){var e=c(-1),f=c(0),g=c(64),h=c(64);if(64===h&&-1===e)break;b(e<<2|f>>4);64!=g&&(b(f<<4&240|g>>2),64!=h&&b(g<<6&192|h))}};
goog.crypt.base64.init_=function(){if(!goog.crypt.base64.charToByteMap_){goog.crypt.base64.charToByteMap_={};for(var a=goog.crypt.base64.DEFAULT_ALPHABET_COMMON_.split(""),b=["+/=","+/","-_=","-_.","-_"],c=0;5>c;c++){var d=a.concat(b[c].split(""));goog.crypt.base64.byteToCharMaps_[c]=d;for(var e=0;e<d.length;e++){var f=d[e],g=goog.crypt.base64.charToByteMap_[f];void 0===g?goog.crypt.base64.charToByteMap_[f]=e:goog.asserts.assert(g===e)}}}};jspb.utils={};jspb.utils.split64Low=0;jspb.utils.split64High=0;jspb.utils.splitUint64=function(a){var b=a>>>0;a=Math.floor((a-b)/jspb.BinaryConstants.TWO_TO_32)>>>0;jspb.utils.split64Low=b;jspb.utils.split64High=a};jspb.utils.splitInt64=function(a){var b=0>a;a=Math.abs(a);var c=a>>>0;a=Math.floor((a-c)/jspb.BinaryConstants.TWO_TO_32);a>>>=0;b&&(a=~a>>>0,c=(~c>>>0)+1,4294967295<c&&(c=0,a++,4294967295<a&&(a=0)));jspb.utils.split64Low=c;jspb.utils.split64High=a};
jspb.utils.splitZigzag64=function(a){var b=0>a;a=2*Math.abs(a);jspb.utils.splitUint64(a);a=jspb.utils.split64Low;var c=jspb.utils.split64High;b&&(0==a?0==c?c=a=4294967295:(c--,a=4294967295):a--);jspb.utils.split64Low=a;jspb.utils.split64High=c};
jspb.utils.splitFloat32=function(a){var b=0>a?1:0;a=b?-a:a;if(0===a)0<1/a?(jspb.utils.split64High=0,jspb.utils.split64Low=0):(jspb.utils.split64High=0,jspb.utils.split64Low=2147483648);else if(isNaN(a))jspb.utils.split64High=0,jspb.utils.split64Low=2147483647;else if(a>jspb.BinaryConstants.FLOAT32_MAX)jspb.utils.split64High=0,jspb.utils.split64Low=(b<<31|2139095040)>>>0;else if(a<jspb.BinaryConstants.FLOAT32_MIN)a=Math.round(a/Math.pow(2,-149)),jspb.utils.split64High=0,jspb.utils.split64Low=(b<<31|
a)>>>0;else{var c=Math.floor(Math.log(a)/Math.LN2);a*=Math.pow(2,-c);a=Math.round(a*jspb.BinaryConstants.TWO_TO_23)&8388607;jspb.utils.split64High=0;jspb.utils.split64Low=(b<<31|c+127<<23|a)>>>0}};
jspb.utils.splitFloat64=function(a){var b=0>a?1:0;a=b?-a:a;if(0===a)jspb.utils.split64High=0<1/a?0:2147483648,jspb.utils.split64Low=0;else if(isNaN(a))jspb.utils.split64High=2147483647,jspb.utils.split64Low=4294967295;else if(a>jspb.BinaryConstants.FLOAT64_MAX)jspb.utils.split64High=(b<<31|2146435072)>>>0,jspb.utils.split64Low=0;else if(a<jspb.BinaryConstants.FLOAT64_MIN){var c=a/Math.pow(2,-1074);a=c/jspb.BinaryConstants.TWO_TO_32;jspb.utils.split64High=(b<<31|a)>>>0;jspb.utils.split64Low=c>>>0}else{c=
a;var d=0;if(2<=c)for(;2<=c&&1023>d;)d++,c/=2;else for(;1>c&&-1022<d;)c*=2,d--;c=a*Math.pow(2,-d);a=c*jspb.BinaryConstants.TWO_TO_20&1048575;c=c*jspb.BinaryConstants.TWO_TO_52>>>0;jspb.utils.split64High=(b<<31|d+1023<<20|a)>>>0;jspb.utils.split64Low=c}};
jspb.utils.splitHash64=function(a){var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=a.charCodeAt(4),g=a.charCodeAt(5),h=a.charCodeAt(6);a=a.charCodeAt(7);jspb.utils.split64Low=b+(c<<8)+(d<<16)+(e<<24)>>>0;jspb.utils.split64High=f+(g<<8)+(h<<16)+(a<<24)>>>0};jspb.utils.joinUint64=function(a,b){return b*jspb.BinaryConstants.TWO_TO_32+(a>>>0)};
jspb.utils.joinInt64=function(a,b){var c=b&2147483648;c&&(a=~a+1>>>0,b=~b>>>0,0==a&&(b=b+1>>>0));a=jspb.utils.joinUint64(a,b);return c?-a:a};jspb.utils.toZigzag64=function(a,b,c){var d=b>>31;return c(a<<1^d,(b<<1|a>>>31)^d)};jspb.utils.joinZigzag64=function(a,b){return jspb.utils.fromZigzag64(a,b,jspb.utils.joinInt64)};jspb.utils.fromZigzag64=function(a,b,c){var d=-(a&1);return c((a>>>1|b<<31)^d,b>>>1^d)};
jspb.utils.joinFloat32=function(a,b){b=2*(a>>31)+1;var c=a>>>23&255;a&=8388607;return 255==c?a?NaN:Infinity*b:0==c?b*Math.pow(2,-149)*a:b*Math.pow(2,c-150)*(a+Math.pow(2,23))};jspb.utils.joinFloat64=function(a,b){var c=2*(b>>31)+1,d=b>>>20&2047;a=jspb.BinaryConstants.TWO_TO_32*(b&1048575)+a;return 2047==d?a?NaN:Infinity*c:0==d?c*Math.pow(2,-1074)*a:c*Math.pow(2,d-1075)*(a+jspb.BinaryConstants.TWO_TO_52)};
jspb.utils.joinHash64=function(a,b){return String.fromCharCode(a>>>0&255,a>>>8&255,a>>>16&255,a>>>24&255,b>>>0&255,b>>>8&255,b>>>16&255,b>>>24&255)};jspb.utils.DIGITS="0123456789abcdef".split("");jspb.utils.ZERO_CHAR_CODE_=48;jspb.utils.A_CHAR_CODE_=97;
jspb.utils.joinUnsignedDecimalString=function(a,b){function c(a,b){a=a?String(a):"";return b?"0000000".slice(a.length)+a:a}if(2097151>=b)return""+jspb.utils.joinUint64(a,b);var d=(a>>>24|b<<8)>>>0&16777215;b=b>>16&65535;a=(a&16777215)+6777216*d+6710656*b;d+=8147497*b;b*=2;1E7<=a&&(d+=Math.floor(a/1E7),a%=1E7);1E7<=d&&(b+=Math.floor(d/1E7),d%=1E7);return c(b,0)+c(d,b)+c(a,1)};
jspb.utils.joinSignedDecimalString=function(a,b){var c=b&2147483648;c&&(a=~a+1>>>0,b=~b+(0==a?1:0)>>>0);a=jspb.utils.joinUnsignedDecimalString(a,b);return c?"-"+a:a};jspb.utils.hash64ToDecimalString=function(a,b){jspb.utils.splitHash64(a);a=jspb.utils.split64Low;var c=jspb.utils.split64High;return b?jspb.utils.joinSignedDecimalString(a,c):jspb.utils.joinUnsignedDecimalString(a,c)};
jspb.utils.hash64ArrayToDecimalStrings=function(a,b){for(var c=Array(a.length),d=0;d<a.length;d++)c[d]=jspb.utils.hash64ToDecimalString(a[d],b);return c};
jspb.utils.decimalStringToHash64=function(a){function b(a,b){for(var c=0;8>c&&(1!==a||0<b);c++)b=a*e[c]+b,e[c]=b&255,b>>>=8}function c(){for(var a=0;8>a;a++)e[a]=~e[a]&255}goog.asserts.assert(0<a.length);var d=!1;"-"===a[0]&&(d=!0,a=a.slice(1));for(var e=[0,0,0,0,0,0,0,0],f=0;f<a.length;f++)b(10,a.charCodeAt(f)-jspb.utils.ZERO_CHAR_CODE_);d&&(c(),b(1,1));return goog.crypt.byteArrayToString(e)};jspb.utils.splitDecimalString=function(a){jspb.utils.splitHash64(jspb.utils.decimalStringToHash64(a))};
jspb.utils.toHexDigit_=function(a){return String.fromCharCode(10>a?jspb.utils.ZERO_CHAR_CODE_+a:jspb.utils.A_CHAR_CODE_-10+a)};jspb.utils.fromHexCharCode_=function(a){return a>=jspb.utils.A_CHAR_CODE_?a-jspb.utils.A_CHAR_CODE_+10:a-jspb.utils.ZERO_CHAR_CODE_};jspb.utils.hash64ToHexString=function(a){var b=Array(18);b[0]="0";b[1]="x";for(var c=0;8>c;c++){var d=a.charCodeAt(7-c);b[2*c+2]=jspb.utils.toHexDigit_(d>>4);b[2*c+3]=jspb.utils.toHexDigit_(d&15)}return b.join("")};
jspb.utils.hexStringToHash64=function(a){a=a.toLowerCase();goog.asserts.assert(18==a.length);goog.asserts.assert("0"==a[0]);goog.asserts.assert("x"==a[1]);for(var b="",c=0;8>c;c++){var d=jspb.utils.fromHexCharCode_(a.charCodeAt(2*c+2)),e=jspb.utils.fromHexCharCode_(a.charCodeAt(2*c+3));b=String.fromCharCode(16*d+e)+b}return b};
jspb.utils.hash64ToNumber=function(a,b){jspb.utils.splitHash64(a);a=jspb.utils.split64Low;var c=jspb.utils.split64High;return b?jspb.utils.joinInt64(a,c):jspb.utils.joinUint64(a,c)};jspb.utils.numberToHash64=function(a){jspb.utils.splitInt64(a);return jspb.utils.joinHash64(jspb.utils.split64Low,jspb.utils.split64High)};jspb.utils.countVarints=function(a,b,c){for(var d=0,e=b;e<c;e++)d+=a[e]>>7;return c-b-d};
jspb.utils.countVarintFields=function(a,b,c,d){var e=0;d=8*d+jspb.BinaryConstants.WireType.VARINT;if(128>d)for(;b<c&&a[b++]==d;)for(e++;;){var f=a[b++];if(0==(f&128))break}else for(;b<c;){for(f=d;128<f;){if(a[b]!=(f&127|128))return e;b++;f>>=7}if(a[b++]!=f)break;for(e++;f=a[b++],0!=(f&128););}return e};jspb.utils.countFixedFields_=function(a,b,c,d,e){var f=0;if(128>d)for(;b<c&&a[b++]==d;)f++,b+=e;else for(;b<c;){for(var g=d;128<g;){if(a[b++]!=(g&127|128))return f;g>>=7}if(a[b++]!=g)break;f++;b+=e}return f};
jspb.utils.countFixed32Fields=function(a,b,c,d){return jspb.utils.countFixedFields_(a,b,c,8*d+jspb.BinaryConstants.WireType.FIXED32,4)};jspb.utils.countFixed64Fields=function(a,b,c,d){return jspb.utils.countFixedFields_(a,b,c,8*d+jspb.BinaryConstants.WireType.FIXED64,8)};
jspb.utils.countDelimitedFields=function(a,b,c,d){var e=0;for(d=8*d+jspb.BinaryConstants.WireType.DELIMITED;b<c;){for(var f=d;128<f;){if(a[b++]!=(f&127|128))return e;f>>=7}if(a[b++]!=f)break;e++;for(var g=0,h=1;f=a[b++],g+=(f&127)*h,h*=128,0!=(f&128););b+=g}return e};jspb.utils.debugBytesToTextFormat=function(a){var b='"';if(a){a=jspb.utils.byteSourceToUint8Array(a);for(var c=0;c<a.length;c++)b+="\\x",16>a[c]&&(b+="0"),b+=a[c].toString(16)}return b+'"'};
jspb.utils.debugScalarToTextFormat=function(a){return"string"===typeof a?goog.string.quote(a):a.toString()};jspb.utils.stringToByteArray=function(a){for(var b=new Uint8Array(a.length),c=0;c<a.length;c++){var d=a.charCodeAt(c);if(255<d)throw Error("Conversion error: string contains codepoint outside of byte range");b[c]=d}return b};
jspb.utils.byteSourceToUint8Array=function(a){if(a.constructor===Uint8Array)return a;if(a.constructor===ArrayBuffer||"undefined"!=typeof Buffer&&a.constructor===Buffer||a.constructor===Array)return new Uint8Array(a);if(a.constructor===String)return goog.crypt.base64.decodeStringToUint8Array(a);goog.asserts.fail("Type not convertible to Uint8Array.");return new Uint8Array(0)};jspb.BinaryDecoder=function(a,b,c){this.bytes_=null;this.cursor_=this.end_=this.start_=0;this.error_=!1;a&&this.setBlock(a,b,c)};jspb.BinaryDecoder.instanceCache_=[];jspb.BinaryDecoder.alloc=function(a,b,c){if(jspb.BinaryDecoder.instanceCache_.length){var d=jspb.BinaryDecoder.instanceCache_.pop();a&&d.setBlock(a,b,c);return d}return new jspb.BinaryDecoder(a,b,c)};jspb.BinaryDecoder.prototype.free=function(){this.clear();100>jspb.BinaryDecoder.instanceCache_.length&&jspb.BinaryDecoder.instanceCache_.push(this)};
jspb.BinaryDecoder.prototype.clone=function(){return jspb.BinaryDecoder.alloc(this.bytes_,this.start_,this.end_-this.start_)};jspb.BinaryDecoder.prototype.clear=function(){this.bytes_=null;this.cursor_=this.end_=this.start_=0;this.error_=!1};jspb.BinaryDecoder.prototype.getBuffer=function(){return this.bytes_};
jspb.BinaryDecoder.prototype.setBlock=function(a,b,c){this.bytes_=jspb.utils.byteSourceToUint8Array(a);this.start_=void 0!==b?b:0;this.end_=void 0!==c?this.start_+c:this.bytes_.length;this.cursor_=this.start_};jspb.BinaryDecoder.prototype.getEnd=function(){return this.end_};jspb.BinaryDecoder.prototype.setEnd=function(a){this.end_=a};jspb.BinaryDecoder.prototype.reset=function(){this.cursor_=this.start_};jspb.BinaryDecoder.prototype.getCursor=function(){return this.cursor_};
jspb.BinaryDecoder.prototype.setCursor=function(a){this.cursor_=a};jspb.BinaryDecoder.prototype.advance=function(a){this.cursor_+=a;goog.asserts.assert(this.cursor_<=this.end_)};jspb.BinaryDecoder.prototype.atEnd=function(){return this.cursor_==this.end_};jspb.BinaryDecoder.prototype.pastEnd=function(){return this.cursor_>this.end_};jspb.BinaryDecoder.prototype.getError=function(){return this.error_||0>this.cursor_||this.cursor_>this.end_};
jspb.BinaryDecoder.prototype.readSplitVarint64=function(a){for(var b=128,c=0,d=0,e=0;4>e&&128<=b;e++)b=this.bytes_[this.cursor_++],c|=(b&127)<<7*e;128<=b&&(b=this.bytes_[this.cursor_++],c|=(b&127)<<28,d|=(b&127)>>4);if(128<=b)for(e=0;5>e&&128<=b;e++)b=this.bytes_[this.cursor_++],d|=(b&127)<<7*e+3;if(128>b)return a(c>>>0,d>>>0);goog.asserts.fail("Failed to read varint, encoding is invalid.");this.error_=!0};
jspb.BinaryDecoder.prototype.readSplitZigzagVarint64=function(a){return this.readSplitVarint64(function(b,c){return jspb.utils.fromZigzag64(b,c,a)})};jspb.BinaryDecoder.prototype.readSplitFixed64=function(a){var b=this.bytes_,c=this.cursor_;this.cursor_+=8;for(var d=0,e=0,f=c+7;f>=c;f--)d=d<<8|b[f],e=e<<8|b[f+4];return a(d,e)};jspb.BinaryDecoder.prototype.skipVarint=function(){for(;this.bytes_[this.cursor_]&128;)this.cursor_++;this.cursor_++};
jspb.BinaryDecoder.prototype.unskipVarint=function(a){for(;128<a;)this.cursor_--,a>>>=7;this.cursor_--};
jspb.BinaryDecoder.prototype.readUnsignedVarint32=function(){var a=this.bytes_;var b=a[this.cursor_+0];var c=b&127;if(128>b)return this.cursor_+=1,goog.asserts.assert(this.cursor_<=this.end_),c;b=a[this.cursor_+1];c|=(b&127)<<7;if(128>b)return this.cursor_+=2,goog.asserts.assert(this.cursor_<=this.end_),c;b=a[this.cursor_+2];c|=(b&127)<<14;if(128>b)return this.cursor_+=3,goog.asserts.assert(this.cursor_<=this.end_),c;b=a[this.cursor_+3];c|=(b&127)<<21;if(128>b)return this.cursor_+=4,goog.asserts.assert(this.cursor_<=
this.end_),c;b=a[this.cursor_+4];c|=(b&15)<<28;if(128>b)return this.cursor_+=5,goog.asserts.assert(this.cursor_<=this.end_),c>>>0;this.cursor_+=5;128<=a[this.cursor_++]&&128<=a[this.cursor_++]&&128<=a[this.cursor_++]&&128<=a[this.cursor_++]&&128<=a[this.cursor_++]&&goog.asserts.assert(!1);goog.asserts.assert(this.cursor_<=this.end_);return c};jspb.BinaryDecoder.prototype.readSignedVarint32=jspb.BinaryDecoder.prototype.readUnsignedVarint32;jspb.BinaryDecoder.prototype.readUnsignedVarint32String=function(){return this.readUnsignedVarint32().toString()};
jspb.BinaryDecoder.prototype.readSignedVarint32String=function(){return this.readSignedVarint32().toString()};jspb.BinaryDecoder.prototype.readZigzagVarint32=function(){var a=this.readUnsignedVarint32();return a>>>1^-(a&1)};jspb.BinaryDecoder.prototype.readUnsignedVarint64=function(){return this.readSplitVarint64(jspb.utils.joinUint64)};jspb.BinaryDecoder.prototype.readUnsignedVarint64String=function(){return this.readSplitVarint64(jspb.utils.joinUnsignedDecimalString)};
jspb.BinaryDecoder.prototype.readSignedVarint64=function(){return this.readSplitVarint64(jspb.utils.joinInt64)};jspb.BinaryDecoder.prototype.readSignedVarint64String=function(){return this.readSplitVarint64(jspb.utils.joinSignedDecimalString)};jspb.BinaryDecoder.prototype.readZigzagVarint64=function(){return this.readSplitVarint64(jspb.utils.joinZigzag64)};jspb.BinaryDecoder.prototype.readZigzagVarintHash64=function(){return this.readSplitZigzagVarint64(jspb.utils.joinHash64)};
jspb.BinaryDecoder.prototype.readZigzagVarint64String=function(){return this.readSplitZigzagVarint64(jspb.utils.joinSignedDecimalString)};jspb.BinaryDecoder.prototype.readUint8=function(){var a=this.bytes_[this.cursor_+0];this.cursor_+=1;goog.asserts.assert(this.cursor_<=this.end_);return a};jspb.BinaryDecoder.prototype.readUint16=function(){var a=this.bytes_[this.cursor_+0],b=this.bytes_[this.cursor_+1];this.cursor_+=2;goog.asserts.assert(this.cursor_<=this.end_);return a<<0|b<<8};
jspb.BinaryDecoder.prototype.readUint32=function(){var a=this.bytes_[this.cursor_+0],b=this.bytes_[this.cursor_+1],c=this.bytes_[this.cursor_+2],d=this.bytes_[this.cursor_+3];this.cursor_+=4;goog.asserts.assert(this.cursor_<=this.end_);return(a<<0|b<<8|c<<16|d<<24)>>>0};jspb.BinaryDecoder.prototype.readUint64=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinUint64(a,b)};
jspb.BinaryDecoder.prototype.readUint64String=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinUnsignedDecimalString(a,b)};jspb.BinaryDecoder.prototype.readInt8=function(){var a=this.bytes_[this.cursor_+0];this.cursor_+=1;goog.asserts.assert(this.cursor_<=this.end_);return a<<24>>24};
jspb.BinaryDecoder.prototype.readInt16=function(){var a=this.bytes_[this.cursor_+0],b=this.bytes_[this.cursor_+1];this.cursor_+=2;goog.asserts.assert(this.cursor_<=this.end_);return(a<<0|b<<8)<<16>>16};jspb.BinaryDecoder.prototype.readInt32=function(){var a=this.bytes_[this.cursor_+0],b=this.bytes_[this.cursor_+1],c=this.bytes_[this.cursor_+2],d=this.bytes_[this.cursor_+3];this.cursor_+=4;goog.asserts.assert(this.cursor_<=this.end_);return a<<0|b<<8|c<<16|d<<24};
jspb.BinaryDecoder.prototype.readInt64=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinInt64(a,b)};jspb.BinaryDecoder.prototype.readInt64String=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinSignedDecimalString(a,b)};jspb.BinaryDecoder.prototype.readFloat=function(){var a=this.readUint32();return jspb.utils.joinFloat32(a,0)};
jspb.BinaryDecoder.prototype.readDouble=function(){var a=this.readUint32(),b=this.readUint32();return jspb.utils.joinFloat64(a,b)};jspb.BinaryDecoder.prototype.readBool=function(){return!!this.bytes_[this.cursor_++]};jspb.BinaryDecoder.prototype.readEnum=function(){return this.readSignedVarint32()};
jspb.BinaryDecoder.prototype.readString=function(a){var b=this.bytes_,c=this.cursor_;a=c+a;for(var d=[],e="";c<a;){var f=b[c++];if(128>f)d.push(f);else if(192>f)continue;else if(224>f){var g=b[c++];d.push((f&31)<<6|g&63)}else if(240>f){g=b[c++];var h=b[c++];d.push((f&15)<<12|(g&63)<<6|h&63)}else if(248>f){g=b[c++];h=b[c++];var k=b[c++];f=(f&7)<<18|(g&63)<<12|(h&63)<<6|k&63;f-=65536;d.push((f>>10&1023)+55296,(f&1023)+56320)}8192<=d.length&&(e+=String.fromCharCode.apply(null,d),d.length=0)}e+=goog.crypt.byteArrayToString(d);
this.cursor_=c;return e};jspb.BinaryDecoder.prototype.readStringWithLength=function(){var a=this.readUnsignedVarint32();return this.readString(a)};jspb.BinaryDecoder.prototype.readBytes=function(a){if(0>a||this.cursor_+a>this.bytes_.length)return this.error_=!0,goog.asserts.fail("Invalid byte length!"),new Uint8Array(0);var b=this.bytes_.subarray(this.cursor_,this.cursor_+a);this.cursor_+=a;goog.asserts.assert(this.cursor_<=this.end_);return b};jspb.BinaryDecoder.prototype.readVarintHash64=function(){return this.readSplitVarint64(jspb.utils.joinHash64)};
jspb.BinaryDecoder.prototype.readFixedHash64=function(){var a=this.bytes_,b=this.cursor_,c=a[b+0],d=a[b+1],e=a[b+2],f=a[b+3],g=a[b+4],h=a[b+5],k=a[b+6];a=a[b+7];this.cursor_+=8;return String.fromCharCode(c,d,e,f,g,h,k,a)};jspb.BinaryReader=function(a,b,c){this.decoder_=jspb.BinaryDecoder.alloc(a,b,c);this.fieldCursor_=this.decoder_.getCursor();this.nextField_=jspb.BinaryConstants.INVALID_FIELD_NUMBER;this.nextWireType_=jspb.BinaryConstants.WireType.INVALID;this.error_=!1;this.readCallbacks_=null};jspb.BinaryReader.instanceCache_=[];
jspb.BinaryReader.alloc=function(a,b,c){if(jspb.BinaryReader.instanceCache_.length){var d=jspb.BinaryReader.instanceCache_.pop();a&&d.decoder_.setBlock(a,b,c);return d}return new jspb.BinaryReader(a,b,c)};jspb.BinaryReader.prototype.alloc=jspb.BinaryReader.alloc;
jspb.BinaryReader.prototype.free=function(){this.decoder_.clear();this.nextField_=jspb.BinaryConstants.INVALID_FIELD_NUMBER;this.nextWireType_=jspb.BinaryConstants.WireType.INVALID;this.error_=!1;this.readCallbacks_=null;100>jspb.BinaryReader.instanceCache_.length&&jspb.BinaryReader.instanceCache_.push(this)};jspb.BinaryReader.prototype.getFieldCursor=function(){return this.fieldCursor_};jspb.BinaryReader.prototype.getCursor=function(){return this.decoder_.getCursor()};
jspb.BinaryReader.prototype.getBuffer=function(){return this.decoder_.getBuffer()};jspb.BinaryReader.prototype.getFieldNumber=function(){return this.nextField_};jspb.BinaryReader.prototype.getWireType=function(){return this.nextWireType_};jspb.BinaryReader.prototype.isDelimited=function(){return this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED};jspb.BinaryReader.prototype.isEndGroup=function(){return this.nextWireType_==jspb.BinaryConstants.WireType.END_GROUP};
jspb.BinaryReader.prototype.getError=function(){return this.error_||this.decoder_.getError()};jspb.BinaryReader.prototype.setBlock=function(a,b,c){this.decoder_.setBlock(a,b,c);this.nextField_=jspb.BinaryConstants.INVALID_FIELD_NUMBER;this.nextWireType_=jspb.BinaryConstants.WireType.INVALID};jspb.BinaryReader.prototype.reset=function(){this.decoder_.reset();this.nextField_=jspb.BinaryConstants.INVALID_FIELD_NUMBER;this.nextWireType_=jspb.BinaryConstants.WireType.INVALID};
jspb.BinaryReader.prototype.advance=function(a){this.decoder_.advance(a)};
jspb.BinaryReader.prototype.nextField=function(){if(this.decoder_.atEnd())return!1;if(this.getError())return goog.asserts.fail("Decoder hit an error"),!1;this.fieldCursor_=this.decoder_.getCursor();var a=this.decoder_.readUnsignedVarint32(),b=a>>>3;a&=7;if(a!=jspb.BinaryConstants.WireType.VARINT&&a!=jspb.BinaryConstants.WireType.FIXED32&&a!=jspb.BinaryConstants.WireType.FIXED64&&a!=jspb.BinaryConstants.WireType.DELIMITED&&a!=jspb.BinaryConstants.WireType.START_GROUP&&a!=jspb.BinaryConstants.WireType.END_GROUP)return goog.asserts.fail("Invalid wire type: %s (at position %s)",
a,this.fieldCursor_),this.error_=!0,!1;this.nextField_=b;this.nextWireType_=a;return!0};jspb.BinaryReader.prototype.unskipHeader=function(){this.decoder_.unskipVarint(this.nextField_<<3|this.nextWireType_)};jspb.BinaryReader.prototype.skipMatchingFields=function(){var a=this.nextField_;for(this.unskipHeader();this.nextField()&&this.getFieldNumber()==a;)this.skipField();this.decoder_.atEnd()||this.unskipHeader()};
jspb.BinaryReader.prototype.skipVarintField=function(){this.nextWireType_!=jspb.BinaryConstants.WireType.VARINT?(goog.asserts.fail("Invalid wire type for skipVarintField"),this.skipField()):this.decoder_.skipVarint()};jspb.BinaryReader.prototype.skipDelimitedField=function(){if(this.nextWireType_!=jspb.BinaryConstants.WireType.DELIMITED)goog.asserts.fail("Invalid wire type for skipDelimitedField"),this.skipField();else{var a=this.decoder_.readUnsignedVarint32();this.decoder_.advance(a)}};
jspb.BinaryReader.prototype.skipFixed32Field=function(){this.nextWireType_!=jspb.BinaryConstants.WireType.FIXED32?(goog.asserts.fail("Invalid wire type for skipFixed32Field"),this.skipField()):this.decoder_.advance(4)};jspb.BinaryReader.prototype.skipFixed64Field=function(){this.nextWireType_!=jspb.BinaryConstants.WireType.FIXED64?(goog.asserts.fail("Invalid wire type for skipFixed64Field"),this.skipField()):this.decoder_.advance(8)};
jspb.BinaryReader.prototype.skipGroup=function(){var a=this.nextField_;do{if(!this.nextField()){goog.asserts.fail("Unmatched start-group tag: stream EOF");this.error_=!0;break}if(this.nextWireType_==jspb.BinaryConstants.WireType.END_GROUP){this.nextField_!=a&&(goog.asserts.fail("Unmatched end-group tag"),this.error_=!0);break}this.skipField()}while(1)};
jspb.BinaryReader.prototype.skipField=function(){switch(this.nextWireType_){case jspb.BinaryConstants.WireType.VARINT:this.skipVarintField();break;case jspb.BinaryConstants.WireType.FIXED64:this.skipFixed64Field();break;case jspb.BinaryConstants.WireType.DELIMITED:this.skipDelimitedField();break;case jspb.BinaryConstants.WireType.FIXED32:this.skipFixed32Field();break;case jspb.BinaryConstants.WireType.START_GROUP:this.skipGroup();break;default:goog.asserts.fail("Invalid wire encoding for field.")}};
jspb.BinaryReader.prototype.registerReadCallback=function(a,b){null===this.readCallbacks_&&(this.readCallbacks_={});goog.asserts.assert(!this.readCallbacks_[a]);this.readCallbacks_[a]=b};jspb.BinaryReader.prototype.runReadCallback=function(a){goog.asserts.assert(null!==this.readCallbacks_);a=this.readCallbacks_[a];goog.asserts.assert(a);return a(this)};
jspb.BinaryReader.prototype.readAny=function(a){this.nextWireType_=jspb.BinaryConstants.FieldTypeToWireType(a);var b=jspb.BinaryConstants.FieldType;switch(a){case b.DOUBLE:return this.readDouble();case b.FLOAT:return this.readFloat();case b.INT64:return this.readInt64();case b.UINT64:return this.readUint64();case b.INT32:return this.readInt32();case b.FIXED64:return this.readFixed64();case b.FIXED32:return this.readFixed32();case b.BOOL:return this.readBool();case b.STRING:return this.readString();
case b.GROUP:goog.asserts.fail("Group field type not supported in readAny()");case b.MESSAGE:goog.asserts.fail("Message field type not supported in readAny()");case b.BYTES:return this.readBytes();case b.UINT32:return this.readUint32();case b.ENUM:return this.readEnum();case b.SFIXED32:return this.readSfixed32();case b.SFIXED64:return this.readSfixed64();case b.SINT32:return this.readSint32();case b.SINT64:return this.readSint64();case b.FHASH64:return this.readFixedHash64();case b.VHASH64:return this.readVarintHash64();
default:goog.asserts.fail("Invalid field type in readAny()")}return 0};jspb.BinaryReader.prototype.readMessage=function(a,b){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var c=this.decoder_.getEnd(),d=this.decoder_.readUnsignedVarint32();d=this.decoder_.getCursor()+d;this.decoder_.setEnd(d);b(a,this);this.decoder_.setCursor(d);this.decoder_.setEnd(c)};
jspb.BinaryReader.prototype.readGroup=function(a,b,c){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.START_GROUP);goog.asserts.assert(this.nextField_==a);c(b,this);this.error_||this.nextWireType_==jspb.BinaryConstants.WireType.END_GROUP||(goog.asserts.fail("Group submessage did not end with an END_GROUP tag"),this.error_=!0)};
jspb.BinaryReader.prototype.getFieldDecoder=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var a=this.decoder_.readUnsignedVarint32(),b=this.decoder_.getCursor(),c=b+a;a=jspb.BinaryDecoder.alloc(this.decoder_.getBuffer(),b,a);this.decoder_.setCursor(c);return a};jspb.BinaryReader.prototype.readInt32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint32()};
jspb.BinaryReader.prototype.readInt32String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint32String()};jspb.BinaryReader.prototype.readInt64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint64()};jspb.BinaryReader.prototype.readInt64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint64String()};
jspb.BinaryReader.prototype.readUint32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readUnsignedVarint32()};jspb.BinaryReader.prototype.readUint32String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readUnsignedVarint32String()};jspb.BinaryReader.prototype.readUint64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readUnsignedVarint64()};
jspb.BinaryReader.prototype.readUint64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readUnsignedVarint64String()};jspb.BinaryReader.prototype.readSint32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readZigzagVarint32()};jspb.BinaryReader.prototype.readSint64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readZigzagVarint64()};
jspb.BinaryReader.prototype.readSint64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readZigzagVarint64String()};jspb.BinaryReader.prototype.readFixed32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED32);return this.decoder_.readUint32()};jspb.BinaryReader.prototype.readFixed64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readUint64()};
jspb.BinaryReader.prototype.readFixed64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readUint64String()};jspb.BinaryReader.prototype.readSfixed32=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED32);return this.decoder_.readInt32()};jspb.BinaryReader.prototype.readSfixed32String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED32);return this.decoder_.readInt32().toString()};
jspb.BinaryReader.prototype.readSfixed64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readInt64()};jspb.BinaryReader.prototype.readSfixed64String=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readInt64String()};jspb.BinaryReader.prototype.readFloat=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED32);return this.decoder_.readFloat()};
jspb.BinaryReader.prototype.readDouble=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readDouble()};jspb.BinaryReader.prototype.readBool=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return!!this.decoder_.readUnsignedVarint32()};jspb.BinaryReader.prototype.readEnum=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSignedVarint64()};
jspb.BinaryReader.prototype.readString=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var a=this.decoder_.readUnsignedVarint32();return this.decoder_.readString(a)};jspb.BinaryReader.prototype.readBytes=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var a=this.decoder_.readUnsignedVarint32();return this.decoder_.readBytes(a)};
jspb.BinaryReader.prototype.readVarintHash64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readVarintHash64()};jspb.BinaryReader.prototype.readSintHash64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readZigzagVarintHash64()};jspb.BinaryReader.prototype.readSplitVarint64=function(a){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSplitVarint64(a)};
jspb.BinaryReader.prototype.readSplitZigzagVarint64=function(a){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.VARINT);return this.decoder_.readSplitVarint64(function(b,c){return jspb.utils.fromZigzag64(b,c,a)})};jspb.BinaryReader.prototype.readFixedHash64=function(){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readFixedHash64()};
jspb.BinaryReader.prototype.readSplitFixed64=function(a){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.FIXED64);return this.decoder_.readSplitFixed64(a)};jspb.BinaryReader.prototype.readPackedField_=function(a){goog.asserts.assert(this.nextWireType_==jspb.BinaryConstants.WireType.DELIMITED);var b=this.decoder_.readUnsignedVarint32();b=this.decoder_.getCursor()+b;for(var c=[];this.decoder_.getCursor()<b;)c.push(a.call(this.decoder_));return c};
jspb.BinaryReader.prototype.readPackedInt32=function(){return this.readPackedField_(this.decoder_.readSignedVarint32)};jspb.BinaryReader.prototype.readPackedInt32String=function(){return this.readPackedField_(this.decoder_.readSignedVarint32String)};jspb.BinaryReader.prototype.readPackedInt64=function(){return this.readPackedField_(this.decoder_.readSignedVarint64)};jspb.BinaryReader.prototype.readPackedInt64String=function(){return this.readPackedField_(this.decoder_.readSignedVarint64String)};
jspb.BinaryReader.prototype.readPackedUint32=function(){return this.readPackedField_(this.decoder_.readUnsignedVarint32)};jspb.BinaryReader.prototype.readPackedUint32String=function(){return this.readPackedField_(this.decoder_.readUnsignedVarint32String)};jspb.BinaryReader.prototype.readPackedUint64=function(){return this.readPackedField_(this.decoder_.readUnsignedVarint64)};jspb.BinaryReader.prototype.readPackedUint64String=function(){return this.readPackedField_(this.decoder_.readUnsignedVarint64String)};
jspb.BinaryReader.prototype.readPackedSint32=function(){return this.readPackedField_(this.decoder_.readZigzagVarint32)};jspb.BinaryReader.prototype.readPackedSint64=function(){return this.readPackedField_(this.decoder_.readZigzagVarint64)};jspb.BinaryReader.prototype.readPackedSint64String=function(){return this.readPackedField_(this.decoder_.readZigzagVarint64String)};jspb.BinaryReader.prototype.readPackedFixed32=function(){return this.readPackedField_(this.decoder_.readUint32)};
jspb.BinaryReader.prototype.readPackedFixed64=function(){return this.readPackedField_(this.decoder_.readUint64)};jspb.BinaryReader.prototype.readPackedFixed64String=function(){return this.readPackedField_(this.decoder_.readUint64String)};jspb.BinaryReader.prototype.readPackedSfixed32=function(){return this.readPackedField_(this.decoder_.readInt32)};jspb.BinaryReader.prototype.readPackedSfixed64=function(){return this.readPackedField_(this.decoder_.readInt64)};
jspb.BinaryReader.prototype.readPackedSfixed64String=function(){return this.readPackedField_(this.decoder_.readInt64String)};jspb.BinaryReader.prototype.readPackedFloat=function(){return this.readPackedField_(this.decoder_.readFloat)};jspb.BinaryReader.prototype.readPackedDouble=function(){return this.readPackedField_(this.decoder_.readDouble)};jspb.BinaryReader.prototype.readPackedBool=function(){return this.readPackedField_(this.decoder_.readBool)};jspb.BinaryReader.prototype.readPackedEnum=function(){return this.readPackedField_(this.decoder_.readEnum)};
jspb.BinaryReader.prototype.readPackedVarintHash64=function(){return this.readPackedField_(this.decoder_.readVarintHash64)};jspb.BinaryReader.prototype.readPackedFixedHash64=function(){return this.readPackedField_(this.decoder_.readFixedHash64)};jspb.Map=function(a,b){this.arr_=a;this.valueCtor_=b;this.map_={};this.arrClean=!0;0<this.arr_.length&&this.loadFromArray_()};jspb.Map.prototype.loadFromArray_=function(){for(var a=0;a<this.arr_.length;a++){var b=this.arr_[a],c=b[0];this.map_[c.toString()]=new jspb.Map.Entry_(c,b[1])}this.arrClean=!0};
jspb.Map.prototype.toArray=function(){if(this.arrClean){if(this.valueCtor_){var a=this.map_,b;for(b in a)if(Object.prototype.hasOwnProperty.call(a,b)){var c=a[b].valueWrapper;c&&c.toArray()}}}else{this.arr_.length=0;a=this.stringKeys_();a.sort();for(b=0;b<a.length;b++){var d=this.map_[a[b]];(c=d.valueWrapper)&&c.toArray();this.arr_.push([d.key,d.value])}this.arrClean=!0}return this.arr_};
jspb.Map.prototype.toObject=function(a,b){for(var c=this.toArray(),d=[],e=0;e<c.length;e++){var f=this.map_[c[e][0].toString()];this.wrapEntry_(f);var g=f.valueWrapper;g?(goog.asserts.assert(b),d.push([f.key,b(a,g)])):d.push([f.key,f.value])}return d};jspb.Map.fromObject=function(a,b,c){b=new jspb.Map([],b);for(var d=0;d<a.length;d++){var e=a[d][0],f=c(a[d][1]);b.set(e,f)}return b};jspb.Map.ArrayIteratorIterable_=function(a){this.idx_=0;this.arr_=a};
jspb.Map.ArrayIteratorIterable_.prototype.next=function(){return this.idx_<this.arr_.length?{done:!1,value:this.arr_[this.idx_++]}:{done:!0,value:void 0}};"undefined"!=typeof Symbol&&(jspb.Map.ArrayIteratorIterable_.prototype[Symbol.iterator]=function(){return this});jspb.Map.prototype.getLength=function(){return this.stringKeys_().length};jspb.Map.prototype.clear=function(){this.map_={};this.arrClean=!1};
jspb.Map.prototype.del=function(a){a=a.toString();var b=this.map_.hasOwnProperty(a);delete this.map_[a];this.arrClean=!1;return b};jspb.Map.prototype.getEntryList=function(){var a=[],b=this.stringKeys_();b.sort();for(var c=0;c<b.length;c++){var d=this.map_[b[c]];a.push([d.key,d.value])}return a};jspb.Map.prototype.entries=function(){var a=[],b=this.stringKeys_();b.sort();for(var c=0;c<b.length;c++){var d=this.map_[b[c]];a.push([d.key,this.wrapEntry_(d)])}return new jspb.Map.ArrayIteratorIterable_(a)};
jspb.Map.prototype.keys=function(){var a=[],b=this.stringKeys_();b.sort();for(var c=0;c<b.length;c++)a.push(this.map_[b[c]].key);return new jspb.Map.ArrayIteratorIterable_(a)};jspb.Map.prototype.values=function(){var a=[],b=this.stringKeys_();b.sort();for(var c=0;c<b.length;c++)a.push(this.wrapEntry_(this.map_[b[c]]));return new jspb.Map.ArrayIteratorIterable_(a)};
jspb.Map.prototype.forEach=function(a,b){var c=this.stringKeys_();c.sort();for(var d=0;d<c.length;d++){var e=this.map_[c[d]];a.call(b,this.wrapEntry_(e),e.key,this)}};jspb.Map.prototype.set=function(a,b){var c=new jspb.Map.Entry_(a);this.valueCtor_?(c.valueWrapper=b,c.value=b.toArray()):c.value=b;this.map_[a.toString()]=c;this.arrClean=!1;return this};jspb.Map.prototype.wrapEntry_=function(a){return this.valueCtor_?(a.valueWrapper||(a.valueWrapper=new this.valueCtor_(a.value)),a.valueWrapper):a.value};
jspb.Map.prototype.get=function(a){if(a=this.map_[a.toString()])return this.wrapEntry_(a)};jspb.Map.prototype.has=function(a){return a.toString()in this.map_};jspb.Map.prototype.serializeBinary=function(a,b,c,d,e){var f=this.stringKeys_();f.sort();for(var g=0;g<f.length;g++){var h=this.map_[f[g]];b.beginSubMessage(a);c.call(b,1,h.key);this.valueCtor_?d.call(b,2,this.wrapEntry_(h),e):d.call(b,2,h.value);b.endSubMessage()}};
jspb.Map.deserializeBinary=function(a,b,c,d,e,f,g){for(;b.nextField()&&!b.isEndGroup();){var h=b.getFieldNumber();1==h?f=c.call(b):2==h&&(a.valueCtor_?(goog.asserts.assert(e),g||(g=new a.valueCtor_),d.call(b,g,e)):g=d.call(b))}goog.asserts.assert(void 0!=f);goog.asserts.assert(void 0!=g);a.set(f,g)};jspb.Map.prototype.stringKeys_=function(){var a=this.map_,b=[],c;for(c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b};
jspb.Map.Entry_=function(a,b){this.key=a;this.value=b;this.valueWrapper=void 0};jspb.ExtensionFieldInfo=function(a,b,c,d,e){this.fieldIndex=a;this.fieldName=b;this.ctor=c;this.toObjectFn=d;this.isRepeated=e};jspb.ExtensionFieldBinaryInfo=function(a,b,c,d,e,f){this.fieldInfo=a;this.binaryReaderFn=b;this.binaryWriterFn=c;this.binaryMessageSerializeFn=d;this.binaryMessageDeserializeFn=e;this.isPacked=f};jspb.ExtensionFieldInfo.prototype.isMessageType=function(){return!!this.ctor};jspb.Message=function(){};jspb.Message.GENERATE_TO_OBJECT=!0;jspb.Message.GENERATE_FROM_OBJECT=!goog.DISALLOW_TEST_ONLY_CODE;
jspb.Message.GENERATE_TO_STRING=!0;jspb.Message.ASSUME_LOCAL_ARRAYS=!1;jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS=!0;jspb.Message.SUPPORTS_UINT8ARRAY_="function"==typeof Uint8Array;jspb.Message.prototype.getJsPbMessageId=function(){return this.messageId_};jspb.Message.getIndex_=function(a,b){return b+a.arrayIndexOffset_};jspb.Message.hiddenES6Property_=function(){};jspb.Message.getFieldNumber_=function(a,b){return b-a.arrayIndexOffset_};
jspb.Message.initialize=function(a,b,c,d,e,f){a.wrappers_=null;b||(b=c?[c]:[]);a.messageId_=c?String(c):void 0;a.arrayIndexOffset_=0===c?-1:0;a.array=b;jspb.Message.initPivotAndExtensionObject_(a,d);a.convertedPrimitiveFields_={};jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS||(a.repeatedFields=e);if(e)for(b=0;b<e.length;b++)c=e[b],c<a.pivot_?(c=jspb.Message.getIndex_(a,c),a.array[c]=a.array[c]||jspb.Message.EMPTY_LIST_SENTINEL_):(jspb.Message.maybeInitEmptyExtensionObject_(a),a.extensionObject_[c]=
a.extensionObject_[c]||jspb.Message.EMPTY_LIST_SENTINEL_);if(f&&f.length)for(b=0;b<f.length;b++)jspb.Message.computeOneofCase(a,f[b])};jspb.Message.EMPTY_LIST_SENTINEL_=goog.DEBUG&&Object.freeze?Object.freeze([]):[];jspb.Message.isArray_=function(a){return jspb.Message.ASSUME_LOCAL_ARRAYS?a instanceof Array:Array.isArray(a)};jspb.Message.isExtensionObject_=function(a){return null!==a&&"object"==typeof a&&!jspb.Message.isArray_(a)&&!(jspb.Message.SUPPORTS_UINT8ARRAY_&&a instanceof Uint8Array)};
jspb.Message.initPivotAndExtensionObject_=function(a,b){var c=a.array.length,d=-1;if(c&&(d=c-1,c=a.array[d],jspb.Message.isExtensionObject_(c))){a.pivot_=jspb.Message.getFieldNumber_(a,d);a.extensionObject_=c;return}-1<b?(a.pivot_=Math.max(b,jspb.Message.getFieldNumber_(a,d+1)),a.extensionObject_=null):a.pivot_=Number.MAX_VALUE};jspb.Message.maybeInitEmptyExtensionObject_=function(a){var b=jspb.Message.getIndex_(a,a.pivot_);a.array[b]||(a.extensionObject_=a.array[b]={})};
jspb.Message.toObjectList=function(a,b,c){for(var d=[],e=0;e<a.length;e++)d[e]=b.call(a[e],c,a[e]);return d};jspb.Message.toObjectExtension=function(a,b,c,d,e){for(var f in c){var g=c[f],h=d.call(a,g);if(null!=h){for(var k in g.fieldName)if(g.fieldName.hasOwnProperty(k))break;b[k]=g.toObjectFn?g.isRepeated?jspb.Message.toObjectList(h,g.toObjectFn,e):g.toObjectFn(e,h):h}}};
jspb.Message.serializeBinaryExtensions=function(a,b,c,d){for(var e in c){var f=c[e],g=f.fieldInfo;if(!f.binaryWriterFn)throw Error("Message extension present that was generated without binary serialization support");var h=d.call(a,g);if(null!=h)if(g.isMessageType())if(f.binaryMessageSerializeFn)f.binaryWriterFn.call(b,g.fieldIndex,h,f.binaryMessageSerializeFn);else throw Error("Message extension present holding submessage without binary support enabled, and message is being serialized to binary format");
else f.binaryWriterFn.call(b,g.fieldIndex,h)}};jspb.Message.readBinaryExtension=function(a,b,c,d,e){var f=c[b.getFieldNumber()];if(f){c=f.fieldInfo;if(!f.binaryReaderFn)throw Error("Deserializing extension whose generated code does not support binary format");if(c.isMessageType()){var g=new c.ctor;f.binaryReaderFn.call(b,g,f.binaryMessageDeserializeFn)}else g=f.binaryReaderFn.call(b);c.isRepeated&&!f.isPacked?(b=d.call(a,c))?b.push(g):e.call(a,c,[g]):e.call(a,c,g)}else b.skipField()};
jspb.Message.getField=function(a,b){if(b<a.pivot_){b=jspb.Message.getIndex_(a,b);var c=a.array[b];return c===jspb.Message.EMPTY_LIST_SENTINEL_?a.array[b]=[]:c}if(a.extensionObject_)return c=a.extensionObject_[b],c===jspb.Message.EMPTY_LIST_SENTINEL_?a.extensionObject_[b]=[]:c};jspb.Message.getRepeatedField=function(a,b){return jspb.Message.getField(a,b)};jspb.Message.getOptionalFloatingPointField=function(a,b){a=jspb.Message.getField(a,b);return null==a?a:+a};
jspb.Message.getBooleanField=function(a,b){a=jspb.Message.getField(a,b);return null==a?a:!!a};jspb.Message.getRepeatedFloatingPointField=function(a,b){var c=jspb.Message.getRepeatedField(a,b);a.convertedPrimitiveFields_||(a.convertedPrimitiveFields_={});if(!a.convertedPrimitiveFields_[b]){for(var d=0;d<c.length;d++)c[d]=+c[d];a.convertedPrimitiveFields_[b]=!0}return c};
jspb.Message.getRepeatedBooleanField=function(a,b){var c=jspb.Message.getRepeatedField(a,b);a.convertedPrimitiveFields_||(a.convertedPrimitiveFields_={});if(!a.convertedPrimitiveFields_[b]){for(var d=0;d<c.length;d++)c[d]=!!c[d];a.convertedPrimitiveFields_[b]=!0}return c};
jspb.Message.bytesAsB64=function(a){if(null==a||"string"===typeof a)return a;if(jspb.Message.SUPPORTS_UINT8ARRAY_&&a instanceof Uint8Array)return goog.crypt.base64.encodeByteArray(a);goog.asserts.fail("Cannot coerce to b64 string: "+goog.typeOf(a));return null};jspb.Message.bytesAsU8=function(a){if(null==a||a instanceof Uint8Array)return a;if("string"===typeof a)return goog.crypt.base64.decodeStringToUint8Array(a);goog.asserts.fail("Cannot coerce to Uint8Array: "+goog.typeOf(a));return null};
jspb.Message.bytesListAsB64=function(a){jspb.Message.assertConsistentTypes_(a);return a.length&&"string"!==typeof a[0]?goog.array.map(a,jspb.Message.bytesAsB64):a};jspb.Message.bytesListAsU8=function(a){jspb.Message.assertConsistentTypes_(a);return!a.length||a[0]instanceof Uint8Array?a:goog.array.map(a,jspb.Message.bytesAsU8)};
jspb.Message.assertConsistentTypes_=function(a){if(goog.DEBUG&&a&&1<a.length){var b=goog.typeOf(a[0]);goog.array.forEach(a,function(a){goog.typeOf(a)!=b&&goog.asserts.fail("Inconsistent type in JSPB repeated field array. Got "+goog.typeOf(a)+" expected "+b)})}};jspb.Message.getFieldWithDefault=function(a,b,c){a=jspb.Message.getField(a,b);return null==a?c:a};jspb.Message.getBooleanFieldWithDefault=function(a,b,c){a=jspb.Message.getBooleanField(a,b);return null==a?c:a};
jspb.Message.getFloatingPointFieldWithDefault=function(a,b,c){a=jspb.Message.getOptionalFloatingPointField(a,b);return null==a?c:a};jspb.Message.getFieldProto3=jspb.Message.getFieldWithDefault;jspb.Message.getMapField=function(a,b,c,d){a.wrappers_||(a.wrappers_={});if(b in a.wrappers_)return a.wrappers_[b];var e=jspb.Message.getField(a,b);if(!e){if(c)return;e=[];jspb.Message.setField(a,b,e)}return a.wrappers_[b]=new jspb.Map(e,d)};
jspb.Message.setField=function(a,b,c){goog.asserts.assertInstanceof(a,jspb.Message);b<a.pivot_?a.array[jspb.Message.getIndex_(a,b)]=c:(jspb.Message.maybeInitEmptyExtensionObject_(a),a.extensionObject_[b]=c);return a};jspb.Message.setProto3IntField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,0)};jspb.Message.setProto3FloatField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,0)};
jspb.Message.setProto3BooleanField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,!1)};jspb.Message.setProto3StringField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,"")};jspb.Message.setProto3BytesField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,"")};jspb.Message.setProto3EnumField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,0)};
jspb.Message.setProto3StringIntField=function(a,b,c){return jspb.Message.setFieldIgnoringDefault_(a,b,c,"0")};jspb.Message.setFieldIgnoringDefault_=function(a,b,c,d){goog.asserts.assertInstanceof(a,jspb.Message);c!==d?jspb.Message.setField(a,b,c):b<a.pivot_?a.array[jspb.Message.getIndex_(a,b)]=null:(jspb.Message.maybeInitEmptyExtensionObject_(a),delete a.extensionObject_[b]);return a};
jspb.Message.addToRepeatedField=function(a,b,c,d){goog.asserts.assertInstanceof(a,jspb.Message);b=jspb.Message.getRepeatedField(a,b);void 0!=d?b.splice(d,0,c):b.push(c);return a};jspb.Message.setOneofField=function(a,b,c,d){goog.asserts.assertInstanceof(a,jspb.Message);(c=jspb.Message.computeOneofCase(a,c))&&c!==b&&void 0!==d&&(a.wrappers_&&c in a.wrappers_&&(a.wrappers_[c]=void 0),jspb.Message.setField(a,c,void 0));return jspb.Message.setField(a,b,d)};
jspb.Message.computeOneofCase=function(a,b){for(var c,d,e=0;e<b.length;e++){var f=b[e],g=jspb.Message.getField(a,f);null!=g&&(c=f,d=g,jspb.Message.setField(a,f,void 0))}return c?(jspb.Message.setField(a,c,d),c):0};jspb.Message.getWrapperField=function(a,b,c,d){a.wrappers_||(a.wrappers_={});if(!a.wrappers_[c]){var e=jspb.Message.getField(a,c);if(d||e)a.wrappers_[c]=new b(e)}return a.wrappers_[c]};
jspb.Message.getRepeatedWrapperField=function(a,b,c){jspb.Message.wrapRepeatedField_(a,b,c);b=a.wrappers_[c];b==jspb.Message.EMPTY_LIST_SENTINEL_&&(b=a.wrappers_[c]=[]);return b};jspb.Message.wrapRepeatedField_=function(a,b,c){a.wrappers_||(a.wrappers_={});if(!a.wrappers_[c]){for(var d=jspb.Message.getRepeatedField(a,c),e=[],f=0;f<d.length;f++)e[f]=new b(d[f]);a.wrappers_[c]=e}};
jspb.Message.setWrapperField=function(a,b,c){goog.asserts.assertInstanceof(a,jspb.Message);a.wrappers_||(a.wrappers_={});var d=c?c.toArray():c;a.wrappers_[b]=c;return jspb.Message.setField(a,b,d)};jspb.Message.setOneofWrapperField=function(a,b,c,d){goog.asserts.assertInstanceof(a,jspb.Message);a.wrappers_||(a.wrappers_={});var e=d?d.toArray():d;a.wrappers_[b]=d;return jspb.Message.setOneofField(a,b,c,e)};
jspb.Message.setRepeatedWrapperField=function(a,b,c){goog.asserts.assertInstanceof(a,jspb.Message);a.wrappers_||(a.wrappers_={});c=c||[];for(var d=[],e=0;e<c.length;e++)d[e]=c[e].toArray();a.wrappers_[b]=c;return jspb.Message.setField(a,b,d)};
jspb.Message.addToRepeatedWrapperField=function(a,b,c,d,e){jspb.Message.wrapRepeatedField_(a,d,b);var f=a.wrappers_[b];f||(f=a.wrappers_[b]=[]);c=c?c:new d;a=jspb.Message.getRepeatedField(a,b);void 0!=e?(f.splice(e,0,c),a.splice(e,0,c.toArray())):(f.push(c),a.push(c.toArray()));return c};jspb.Message.toMap=function(a,b,c,d){for(var e={},f=0;f<a.length;f++)e[b.call(a[f])]=c?c.call(a[f],d,a[f]):a[f];return e};
jspb.Message.prototype.syncMapFields_=function(){if(this.wrappers_)for(var a in this.wrappers_){var b=this.wrappers_[a];if(Array.isArray(b))for(var c=0;c<b.length;c++)b[c]&&b[c].toArray();else b&&b.toArray()}};jspb.Message.prototype.toArray=function(){this.syncMapFields_();return this.array};jspb.Message.GENERATE_TO_STRING&&(jspb.Message.prototype.toString=function(){this.syncMapFields_();return this.array.toString()});
jspb.Message.prototype.getExtension=function(a){if(this.extensionObject_){this.wrappers_||(this.wrappers_={});var b=a.fieldIndex;if(a.isRepeated){if(a.isMessageType())return this.wrappers_[b]||(this.wrappers_[b]=goog.array.map(this.extensionObject_[b]||[],function(b){return new a.ctor(b)})),this.wrappers_[b]}else if(a.isMessageType())return!this.wrappers_[b]&&this.extensionObject_[b]&&(this.wrappers_[b]=new a.ctor(this.extensionObject_[b])),this.wrappers_[b];return this.extensionObject_[b]}};
jspb.Message.prototype.setExtension=function(a,b){this.wrappers_||(this.wrappers_={});jspb.Message.maybeInitEmptyExtensionObject_(this);var c=a.fieldIndex;a.isRepeated?(b=b||[],a.isMessageType()?(this.wrappers_[c]=b,this.extensionObject_[c]=goog.array.map(b,function(a){return a.toArray()})):this.extensionObject_[c]=b):a.isMessageType()?(this.wrappers_[c]=b,this.extensionObject_[c]=b?b.toArray():b):this.extensionObject_[c]=b;return this};
jspb.Message.difference=function(a,b){if(!(a instanceof b.constructor))throw Error("Messages have different types.");var c=a.toArray();b=b.toArray();var d=[],e=0,f=c.length>b.length?c.length:b.length;a.getJsPbMessageId()&&(d[0]=a.getJsPbMessageId(),e=1);for(;e<f;e++)jspb.Message.compareFields(c[e],b[e])||(d[e]=b[e]);return new a.constructor(d)};jspb.Message.equals=function(a,b){return a==b||!(!a||!b)&&a instanceof b.constructor&&jspb.Message.compareFields(a.toArray(),b.toArray())};
jspb.Message.compareExtensions=function(a,b){a=a||{};b=b||{};var c={},d;for(d in a)c[d]=0;for(d in b)c[d]=0;for(d in c)if(!jspb.Message.compareFields(a[d],b[d]))return!1;return!0};
jspb.Message.compareFields=function(a,b){if(a==b)return!0;if(!goog.isObject(a)||!goog.isObject(b))return"number"===typeof a&&isNaN(a)||"number"===typeof b&&isNaN(b)?String(a)==String(b):!1;if(a.constructor!=b.constructor)return!1;if(jspb.Message.SUPPORTS_UINT8ARRAY_&&a.constructor===Uint8Array){if(a.length!=b.length)return!1;for(var c=0;c<a.length;c++)if(a[c]!=b[c])return!1;return!0}if(a.constructor===Array){var d=void 0,e=void 0,f=Math.max(a.length,b.length);for(c=0;c<f;c++){var g=a[c],h=b[c];g&&
g.constructor==Object&&(goog.asserts.assert(void 0===d),goog.asserts.assert(c===a.length-1),d=g,g=void 0);h&&h.constructor==Object&&(goog.asserts.assert(void 0===e),goog.asserts.assert(c===b.length-1),e=h,h=void 0);if(!jspb.Message.compareFields(g,h))return!1}return d||e?(d=d||{},e=e||{},jspb.Message.compareExtensions(d,e)):!0}if(a.constructor===Object)return jspb.Message.compareExtensions(a,b);throw Error("Invalid type in JSPB array");};jspb.Message.prototype.cloneMessage=function(){return jspb.Message.cloneMessage(this)};
jspb.Message.prototype.clone=function(){return jspb.Message.cloneMessage(this)};jspb.Message.clone=function(a){return jspb.Message.cloneMessage(a)};jspb.Message.cloneMessage=function(a){return new a.constructor(jspb.Message.clone_(a.toArray()))};
jspb.Message.copyInto=function(a,b){goog.asserts.assertInstanceof(a,jspb.Message);goog.asserts.assertInstanceof(b,jspb.Message);goog.asserts.assert(a.constructor==b.constructor,"Copy source and target message should have the same type.");a=jspb.Message.clone(a);for(var c=b.toArray(),d=a.toArray(),e=c.length=0;e<d.length;e++)c[e]=d[e];b.wrappers_=a.wrappers_;b.extensionObject_=a.extensionObject_};
jspb.Message.clone_=function(a){if(Array.isArray(a)){for(var b=Array(a.length),c=0;c<a.length;c++){var d=a[c];null!=d&&(b[c]="object"==typeof d?jspb.Message.clone_(goog.asserts.assert(d)):d)}return b}if(jspb.Message.SUPPORTS_UINT8ARRAY_&&a instanceof Uint8Array)return new Uint8Array(a);b={};for(c in a)d=a[c],null!=d&&(b[c]="object"==typeof d?jspb.Message.clone_(goog.asserts.assert(d)):d);return b};jspb.Message.registerMessageType=function(a,b){b.messageId=a};jspb.Message.messageSetExtensions={};
jspb.Message.messageSetExtensionsBinary={};jspb.arith={};jspb.arith.UInt64=function(a,b){this.lo=a;this.hi=b};jspb.arith.UInt64.prototype.cmp=function(a){return this.hi<a.hi||this.hi==a.hi&&this.lo<a.lo?-1:this.hi==a.hi&&this.lo==a.lo?0:1};jspb.arith.UInt64.prototype.rightShift=function(){return new jspb.arith.UInt64((this.lo>>>1|(this.hi&1)<<31)>>>0,this.hi>>>1>>>0)};jspb.arith.UInt64.prototype.leftShift=function(){return new jspb.arith.UInt64(this.lo<<1>>>0,(this.hi<<1|this.lo>>>31)>>>0)};
jspb.arith.UInt64.prototype.msb=function(){return!!(this.hi&2147483648)};jspb.arith.UInt64.prototype.lsb=function(){return!!(this.lo&1)};jspb.arith.UInt64.prototype.zero=function(){return 0==this.lo&&0==this.hi};jspb.arith.UInt64.prototype.add=function(a){return new jspb.arith.UInt64((this.lo+a.lo&4294967295)>>>0>>>0,((this.hi+a.hi&4294967295)>>>0)+(4294967296<=this.lo+a.lo?1:0)>>>0)};
jspb.arith.UInt64.prototype.sub=function(a){return new jspb.arith.UInt64((this.lo-a.lo&4294967295)>>>0>>>0,((this.hi-a.hi&4294967295)>>>0)-(0>this.lo-a.lo?1:0)>>>0)};jspb.arith.UInt64.mul32x32=function(a,b){var c=a&65535;a>>>=16;var d=b&65535,e=b>>>16;b=c*d+65536*(c*e&65535)+65536*(a*d&65535);for(c=a*e+(c*e>>>16)+(a*d>>>16);4294967296<=b;)b-=4294967296,c+=1;return new jspb.arith.UInt64(b>>>0,c>>>0)};
jspb.arith.UInt64.prototype.mul=function(a){var b=jspb.arith.UInt64.mul32x32(this.lo,a);a=jspb.arith.UInt64.mul32x32(this.hi,a);a.hi=a.lo;a.lo=0;return b.add(a)};
jspb.arith.UInt64.prototype.div=function(a){if(0==a)return[];var b=new jspb.arith.UInt64(0,0),c=new jspb.arith.UInt64(this.lo,this.hi);a=new jspb.arith.UInt64(a,0);for(var d=new jspb.arith.UInt64(1,0);!a.msb();)a=a.leftShift(),d=d.leftShift();for(;!d.zero();)0>=a.cmp(c)&&(b=b.add(d),c=c.sub(a)),a=a.rightShift(),d=d.rightShift();return[b,c]};jspb.arith.UInt64.prototype.toString=function(){for(var a="",b=this;!b.zero();){b=b.div(10);var c=b[0];a=b[1].lo+a;b=c}""==a&&(a="0");return a};
jspb.arith.UInt64.fromString=function(a){for(var b=new jspb.arith.UInt64(0,0),c=new jspb.arith.UInt64(0,0),d=0;d<a.length;d++){if("0">a[d]||"9"<a[d])return null;var e=parseInt(a[d],10);c.lo=e;b=b.mul(10).add(c)}return b};jspb.arith.UInt64.prototype.clone=function(){return new jspb.arith.UInt64(this.lo,this.hi)};jspb.arith.Int64=function(a,b){this.lo=a;this.hi=b};
jspb.arith.Int64.prototype.add=function(a){return new jspb.arith.Int64((this.lo+a.lo&4294967295)>>>0>>>0,((this.hi+a.hi&4294967295)>>>0)+(4294967296<=this.lo+a.lo?1:0)>>>0)};jspb.arith.Int64.prototype.sub=function(a){return new jspb.arith.Int64((this.lo-a.lo&4294967295)>>>0>>>0,((this.hi-a.hi&4294967295)>>>0)-(0>this.lo-a.lo?1:0)>>>0)};jspb.arith.Int64.prototype.clone=function(){return new jspb.arith.Int64(this.lo,this.hi)};
jspb.arith.Int64.prototype.toString=function(){var a=0!=(this.hi&2147483648),b=new jspb.arith.UInt64(this.lo,this.hi);a&&(b=(new jspb.arith.UInt64(0,0)).sub(b));return(a?"-":"")+b.toString()};jspb.arith.Int64.fromString=function(a){var b=0<a.length&&"-"==a[0];b&&(a=a.substring(1));a=jspb.arith.UInt64.fromString(a);if(null===a)return null;b&&(a=(new jspb.arith.UInt64(0,0)).sub(a));return new jspb.arith.Int64(a.lo,a.hi)};jspb.BinaryEncoder=function(){this.buffer_=[]};jspb.BinaryEncoder.prototype.length=function(){return this.buffer_.length};jspb.BinaryEncoder.prototype.end=function(){var a=this.buffer_;this.buffer_=[];return a};
jspb.BinaryEncoder.prototype.writeSplitVarint64=function(a,b){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(b==Math.floor(b));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_32);for(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32);0<b||127<a;)this.buffer_.push(a&127|128),a=(a>>>7|b<<25)>>>0,b>>>=7;this.buffer_.push(a)};
jspb.BinaryEncoder.prototype.writeSplitFixed64=function(a,b){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(b==Math.floor(b));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_32);goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32);this.writeUint32(a);this.writeUint32(b)};
jspb.BinaryEncoder.prototype.writeUnsignedVarint32=function(a){goog.asserts.assert(a==Math.floor(a));for(goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_32);127<a;)this.buffer_.push(a&127|128),a>>>=7;this.buffer_.push(a)};
jspb.BinaryEncoder.prototype.writeSignedVarint32=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_31&&a<jspb.BinaryConstants.TWO_TO_31);if(0<=a)this.writeUnsignedVarint32(a);else{for(var b=0;9>b;b++)this.buffer_.push(a&127|128),a>>=7;this.buffer_.push(1)}};
jspb.BinaryEncoder.prototype.writeUnsignedVarint64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_64);jspb.utils.splitInt64(a);this.writeSplitVarint64(jspb.utils.split64Low,jspb.utils.split64High)};
jspb.BinaryEncoder.prototype.writeSignedVarint64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_63&&a<jspb.BinaryConstants.TWO_TO_63);jspb.utils.splitInt64(a);this.writeSplitVarint64(jspb.utils.split64Low,jspb.utils.split64High)};
jspb.BinaryEncoder.prototype.writeZigzagVarint32=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_31&&a<jspb.BinaryConstants.TWO_TO_31);this.writeUnsignedVarint32((a<<1^a>>31)>>>0)};jspb.BinaryEncoder.prototype.writeZigzagVarint64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_63&&a<jspb.BinaryConstants.TWO_TO_63);jspb.utils.splitZigzag64(a);this.writeSplitVarint64(jspb.utils.split64Low,jspb.utils.split64High)};
jspb.BinaryEncoder.prototype.writeZigzagVarint64String=function(a){this.writeZigzagVarintHash64(jspb.utils.decimalStringToHash64(a))};jspb.BinaryEncoder.prototype.writeZigzagVarintHash64=function(a){var b=this;jspb.utils.splitHash64(a);jspb.utils.toZigzag64(jspb.utils.split64Low,jspb.utils.split64High,function(a,d){b.writeSplitVarint64(a>>>0,d>>>0)})};
jspb.BinaryEncoder.prototype.writeUint8=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&256>a);this.buffer_.push(a>>>0&255)};jspb.BinaryEncoder.prototype.writeUint16=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&65536>a);this.buffer_.push(a>>>0&255);this.buffer_.push(a>>>8&255)};
jspb.BinaryEncoder.prototype.writeUint32=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_32);this.buffer_.push(a>>>0&255);this.buffer_.push(a>>>8&255);this.buffer_.push(a>>>16&255);this.buffer_.push(a>>>24&255)};jspb.BinaryEncoder.prototype.writeUint64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(0<=a&&a<jspb.BinaryConstants.TWO_TO_64);jspb.utils.splitUint64(a);this.writeUint32(jspb.utils.split64Low);this.writeUint32(jspb.utils.split64High)};
jspb.BinaryEncoder.prototype.writeInt8=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(-128<=a&&128>a);this.buffer_.push(a>>>0&255)};jspb.BinaryEncoder.prototype.writeInt16=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(-32768<=a&&32768>a);this.buffer_.push(a>>>0&255);this.buffer_.push(a>>>8&255)};
jspb.BinaryEncoder.prototype.writeInt32=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_31&&a<jspb.BinaryConstants.TWO_TO_31);this.buffer_.push(a>>>0&255);this.buffer_.push(a>>>8&255);this.buffer_.push(a>>>16&255);this.buffer_.push(a>>>24&255)};
jspb.BinaryEncoder.prototype.writeInt64=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_63&&a<jspb.BinaryConstants.TWO_TO_63);jspb.utils.splitInt64(a);this.writeSplitFixed64(jspb.utils.split64Low,jspb.utils.split64High)};
jspb.BinaryEncoder.prototype.writeInt64String=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(+a>=-jspb.BinaryConstants.TWO_TO_63&&+a<jspb.BinaryConstants.TWO_TO_63);jspb.utils.splitHash64(jspb.utils.decimalStringToHash64(a));this.writeSplitFixed64(jspb.utils.split64Low,jspb.utils.split64High)};
jspb.BinaryEncoder.prototype.writeFloat=function(a){goog.asserts.assert(Infinity===a||-Infinity===a||isNaN(a)||a>=-jspb.BinaryConstants.FLOAT32_MAX&&a<=jspb.BinaryConstants.FLOAT32_MAX);jspb.utils.splitFloat32(a);this.writeUint32(jspb.utils.split64Low)};
jspb.BinaryEncoder.prototype.writeDouble=function(a){goog.asserts.assert(Infinity===a||-Infinity===a||isNaN(a)||a>=-jspb.BinaryConstants.FLOAT64_MAX&&a<=jspb.BinaryConstants.FLOAT64_MAX);jspb.utils.splitFloat64(a);this.writeUint32(jspb.utils.split64Low);this.writeUint32(jspb.utils.split64High)};jspb.BinaryEncoder.prototype.writeBool=function(a){goog.asserts.assert("boolean"===typeof a||"number"===typeof a);this.buffer_.push(a?1:0)};
jspb.BinaryEncoder.prototype.writeEnum=function(a){goog.asserts.assert(a==Math.floor(a));goog.asserts.assert(a>=-jspb.BinaryConstants.TWO_TO_31&&a<jspb.BinaryConstants.TWO_TO_31);this.writeSignedVarint32(a)};jspb.BinaryEncoder.prototype.writeBytes=function(a){this.buffer_.push.apply(this.buffer_,a)};jspb.BinaryEncoder.prototype.writeVarintHash64=function(a){jspb.utils.splitHash64(a);this.writeSplitVarint64(jspb.utils.split64Low,jspb.utils.split64High)};
jspb.BinaryEncoder.prototype.writeFixedHash64=function(a){jspb.utils.splitHash64(a);this.writeUint32(jspb.utils.split64Low);this.writeUint32(jspb.utils.split64High)};
jspb.BinaryEncoder.prototype.writeString=function(a){for(var b=this.buffer_.length,c=0;c<a.length;c++){var d=a.charCodeAt(c);if(128>d)this.buffer_.push(d);else if(2048>d)this.buffer_.push(d>>6|192),this.buffer_.push(d&63|128);else if(65536>d)if(55296<=d&&56319>=d&&c+1<a.length){var e=a.charCodeAt(c+1);56320<=e&&57343>=e&&(d=1024*(d-55296)+e-56320+65536,this.buffer_.push(d>>18|240),this.buffer_.push(d>>12&63|128),this.buffer_.push(d>>6&63|128),this.buffer_.push(d&63|128),c++)}else this.buffer_.push(d>>
12|224),this.buffer_.push(d>>6&63|128),this.buffer_.push(d&63|128)}return this.buffer_.length-b};jspb.BinaryWriter=function(){this.blocks_=[];this.totalLength_=0;this.encoder_=new jspb.BinaryEncoder;this.bookmarks_=[]};jspb.BinaryWriter.prototype.appendUint8Array_=function(a){var b=this.encoder_.end();this.blocks_.push(b);this.blocks_.push(a);this.totalLength_+=b.length+a.length};
jspb.BinaryWriter.prototype.beginDelimited_=function(a){this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED);a=this.encoder_.end();this.blocks_.push(a);this.totalLength_+=a.length;a.push(this.totalLength_);return a};jspb.BinaryWriter.prototype.endDelimited_=function(a){var b=a.pop();b=this.totalLength_+this.encoder_.length()-b;for(goog.asserts.assert(0<=b);127<b;)a.push(b&127|128),b>>>=7,this.totalLength_++;a.push(b);this.totalLength_++};
jspb.BinaryWriter.prototype.writeSerializedMessage=function(a,b,c){this.appendUint8Array_(a.subarray(b,c))};jspb.BinaryWriter.prototype.maybeWriteSerializedMessage=function(a,b,c){null!=a&&null!=b&&null!=c&&this.writeSerializedMessage(a,b,c)};jspb.BinaryWriter.prototype.reset=function(){this.blocks_=[];this.encoder_.end();this.totalLength_=0;this.bookmarks_=[]};
jspb.BinaryWriter.prototype.getResultBuffer=function(){goog.asserts.assert(0==this.bookmarks_.length);for(var a=new Uint8Array(this.totalLength_+this.encoder_.length()),b=this.blocks_,c=b.length,d=0,e=0;e<c;e++){var f=b[e];a.set(f,d);d+=f.length}b=this.encoder_.end();a.set(b,d);d+=b.length;goog.asserts.assert(d==a.length);this.blocks_=[a];return a};jspb.BinaryWriter.prototype.getResultBase64String=function(a){return goog.crypt.base64.encodeByteArray(this.getResultBuffer(),a)};
jspb.BinaryWriter.prototype.beginSubMessage=function(a){this.bookmarks_.push(this.beginDelimited_(a))};jspb.BinaryWriter.prototype.endSubMessage=function(){goog.asserts.assert(0<=this.bookmarks_.length);this.endDelimited_(this.bookmarks_.pop())};jspb.BinaryWriter.prototype.writeFieldHeader_=function(a,b){goog.asserts.assert(1<=a&&a==Math.floor(a));this.encoder_.writeUnsignedVarint32(8*a+b)};
jspb.BinaryWriter.prototype.writeAny=function(a,b,c){var d=jspb.BinaryConstants.FieldType;switch(a){case d.DOUBLE:this.writeDouble(b,c);break;case d.FLOAT:this.writeFloat(b,c);break;case d.INT64:this.writeInt64(b,c);break;case d.UINT64:this.writeUint64(b,c);break;case d.INT32:this.writeInt32(b,c);break;case d.FIXED64:this.writeFixed64(b,c);break;case d.FIXED32:this.writeFixed32(b,c);break;case d.BOOL:this.writeBool(b,c);break;case d.STRING:this.writeString(b,c);break;case d.GROUP:goog.asserts.fail("Group field type not supported in writeAny()");
break;case d.MESSAGE:goog.asserts.fail("Message field type not supported in writeAny()");break;case d.BYTES:this.writeBytes(b,c);break;case d.UINT32:this.writeUint32(b,c);break;case d.ENUM:this.writeEnum(b,c);break;case d.SFIXED32:this.writeSfixed32(b,c);break;case d.SFIXED64:this.writeSfixed64(b,c);break;case d.SINT32:this.writeSint32(b,c);break;case d.SINT64:this.writeSint64(b,c);break;case d.FHASH64:this.writeFixedHash64(b,c);break;case d.VHASH64:this.writeVarintHash64(b,c);break;default:goog.asserts.fail("Invalid field type in writeAny()")}};
jspb.BinaryWriter.prototype.writeUnsignedVarint32_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeUnsignedVarint32(b))};jspb.BinaryWriter.prototype.writeSignedVarint32_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSignedVarint32(b))};jspb.BinaryWriter.prototype.writeUnsignedVarint64_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeUnsignedVarint64(b))};
jspb.BinaryWriter.prototype.writeSignedVarint64_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSignedVarint64(b))};jspb.BinaryWriter.prototype.writeZigzagVarint32_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeZigzagVarint32(b))};jspb.BinaryWriter.prototype.writeZigzagVarint64_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeZigzagVarint64(b))};
jspb.BinaryWriter.prototype.writeZigzagVarint64String_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeZigzagVarint64String(b))};jspb.BinaryWriter.prototype.writeZigzagVarintHash64_=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeZigzagVarintHash64(b))};
jspb.BinaryWriter.prototype.writeInt32=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeSignedVarint32_(a,b))};jspb.BinaryWriter.prototype.writeInt32String=function(a,b){null!=b&&(b=parseInt(b,10),goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeSignedVarint32_(a,b))};
jspb.BinaryWriter.prototype.writeInt64=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_63&&b<jspb.BinaryConstants.TWO_TO_63),this.writeSignedVarint64_(a,b))};jspb.BinaryWriter.prototype.writeInt64String=function(a,b){null!=b&&(b=jspb.arith.Int64.fromString(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSplitVarint64(b.lo,b.hi))};
jspb.BinaryWriter.prototype.writeUint32=function(a,b){null!=b&&(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32),this.writeUnsignedVarint32_(a,b))};jspb.BinaryWriter.prototype.writeUint32String=function(a,b){null!=b&&(b=parseInt(b,10),goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32),this.writeUnsignedVarint32_(a,b))};jspb.BinaryWriter.prototype.writeUint64=function(a,b){null!=b&&(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_64),this.writeUnsignedVarint64_(a,b))};
jspb.BinaryWriter.prototype.writeUint64String=function(a,b){null!=b&&(b=jspb.arith.UInt64.fromString(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSplitVarint64(b.lo,b.hi))};jspb.BinaryWriter.prototype.writeSint32=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeZigzagVarint32_(a,b))};
jspb.BinaryWriter.prototype.writeSint64=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_63&&b<jspb.BinaryConstants.TWO_TO_63),this.writeZigzagVarint64_(a,b))};jspb.BinaryWriter.prototype.writeSintHash64=function(a,b){null!=b&&this.writeZigzagVarintHash64_(a,b)};jspb.BinaryWriter.prototype.writeSint64String=function(a,b){null!=b&&this.writeZigzagVarint64String_(a,b)};
jspb.BinaryWriter.prototype.writeFixed32=function(a,b){null!=b&&(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_32),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED32),this.encoder_.writeUint32(b))};jspb.BinaryWriter.prototype.writeFixed64=function(a,b){null!=b&&(goog.asserts.assert(0<=b&&b<jspb.BinaryConstants.TWO_TO_64),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeUint64(b))};
jspb.BinaryWriter.prototype.writeFixed64String=function(a,b){null!=b&&(b=jspb.arith.UInt64.fromString(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeSplitFixed64(b.lo,b.hi))};jspb.BinaryWriter.prototype.writeSfixed32=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED32),this.encoder_.writeInt32(b))};
jspb.BinaryWriter.prototype.writeSfixed64=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_63&&b<jspb.BinaryConstants.TWO_TO_63),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeInt64(b))};jspb.BinaryWriter.prototype.writeSfixed64String=function(a,b){null!=b&&(b=jspb.arith.Int64.fromString(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeSplitFixed64(b.lo,b.hi))};
jspb.BinaryWriter.prototype.writeFloat=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED32),this.encoder_.writeFloat(b))};jspb.BinaryWriter.prototype.writeDouble=function(a,b){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeDouble(b))};
jspb.BinaryWriter.prototype.writeBool=function(a,b){null!=b&&(goog.asserts.assert("boolean"===typeof b||"number"===typeof b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeBool(b))};jspb.BinaryWriter.prototype.writeEnum=function(a,b){null!=b&&(goog.asserts.assert(b>=-jspb.BinaryConstants.TWO_TO_31&&b<jspb.BinaryConstants.TWO_TO_31),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSignedVarint32(b))};
jspb.BinaryWriter.prototype.writeString=function(a,b){null!=b&&(a=this.beginDelimited_(a),this.encoder_.writeString(b),this.endDelimited_(a))};jspb.BinaryWriter.prototype.writeBytes=function(a,b){null!=b&&(b=jspb.utils.byteSourceToUint8Array(b),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(b.length),this.appendUint8Array_(b))};jspb.BinaryWriter.prototype.writeMessage=function(a,b,c){null!=b&&(a=this.beginDelimited_(a),c(b,this),this.endDelimited_(a))};
jspb.BinaryWriter.prototype.writeMessageSet=function(a,b,c){null!=b&&(this.writeFieldHeader_(1,jspb.BinaryConstants.WireType.START_GROUP),this.writeFieldHeader_(2,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeSignedVarint32(a),a=this.beginDelimited_(3),c(b,this),this.endDelimited_(a),this.writeFieldHeader_(1,jspb.BinaryConstants.WireType.END_GROUP))};
jspb.BinaryWriter.prototype.writeGroup=function(a,b,c){null!=b&&(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.START_GROUP),c(b,this),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.END_GROUP))};jspb.BinaryWriter.prototype.writeFixedHash64=function(a,b){null!=b&&(goog.asserts.assert(8==b.length),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64),this.encoder_.writeFixedHash64(b))};
jspb.BinaryWriter.prototype.writeVarintHash64=function(a,b){null!=b&&(goog.asserts.assert(8==b.length),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT),this.encoder_.writeVarintHash64(b))};jspb.BinaryWriter.prototype.writeSplitFixed64=function(a,b,c){this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.FIXED64);this.encoder_.writeSplitFixed64(b,c)};
jspb.BinaryWriter.prototype.writeSplitVarint64=function(a,b,c){this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT);this.encoder_.writeSplitVarint64(b,c)};jspb.BinaryWriter.prototype.writeSplitZigzagVarint64=function(a,b,c){this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.VARINT);var d=this.encoder_;jspb.utils.toZigzag64(b,c,function(a,b){d.writeSplitVarint64(a>>>0,b>>>0)})};
jspb.BinaryWriter.prototype.writeRepeatedInt32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSignedVarint32_(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedInt32String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeInt32String(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedInt64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSignedVarint64_(a,b[c])};
jspb.BinaryWriter.prototype.writeRepeatedSplitFixed64=function(a,b,c,d){if(null!=b)for(var e=0;e<b.length;e++)this.writeSplitFixed64(a,c(b[e]),d(b[e]))};jspb.BinaryWriter.prototype.writeRepeatedSplitVarint64=function(a,b,c,d){if(null!=b)for(var e=0;e<b.length;e++)this.writeSplitVarint64(a,c(b[e]),d(b[e]))};jspb.BinaryWriter.prototype.writeRepeatedSplitZigzagVarint64=function(a,b,c,d){if(null!=b)for(var e=0;e<b.length;e++)this.writeSplitZigzagVarint64(a,c(b[e]),d(b[e]))};
jspb.BinaryWriter.prototype.writeRepeatedInt64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeInt64String(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedUint32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeUnsignedVarint32_(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedUint32String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeUint32String(a,b[c])};
jspb.BinaryWriter.prototype.writeRepeatedUint64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeUnsignedVarint64_(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedUint64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeUint64String(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedSint32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeZigzagVarint32_(a,b[c])};
jspb.BinaryWriter.prototype.writeRepeatedSint64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeZigzagVarint64_(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedSint64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeZigzagVarint64String_(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedSintHash64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeZigzagVarintHash64_(a,b[c])};
jspb.BinaryWriter.prototype.writeRepeatedFixed32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFixed32(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedFixed64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFixed64(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedFixed64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFixed64String(a,b[c])};
jspb.BinaryWriter.prototype.writeRepeatedSfixed32=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSfixed32(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedSfixed64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSfixed64(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedSfixed64String=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeSfixed64String(a,b[c])};
jspb.BinaryWriter.prototype.writeRepeatedFloat=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFloat(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedDouble=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeDouble(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedBool=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeBool(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedEnum=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeEnum(a,b[c])};
jspb.BinaryWriter.prototype.writeRepeatedString=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeString(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedBytes=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeBytes(a,b[c])};jspb.BinaryWriter.prototype.writeRepeatedMessage=function(a,b,c){if(null!=b)for(var d=0;d<b.length;d++){var e=this.beginDelimited_(a);c(b[d],this);this.endDelimited_(e)}};
jspb.BinaryWriter.prototype.writeRepeatedGroup=function(a,b,c){if(null!=b)for(var d=0;d<b.length;d++)this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.START_GROUP),c(b[d],this),this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.END_GROUP)};jspb.BinaryWriter.prototype.writeRepeatedFixedHash64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeFixedHash64(a,b[c])};
jspb.BinaryWriter.prototype.writeRepeatedVarintHash64=function(a,b){if(null!=b)for(var c=0;c<b.length;c++)this.writeVarintHash64(a,b[c])};jspb.BinaryWriter.prototype.writePackedInt32=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeSignedVarint32(b[c]);this.endDelimited_(a)}};
jspb.BinaryWriter.prototype.writePackedInt32String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeSignedVarint32(parseInt(b[c],10));this.endDelimited_(a)}};jspb.BinaryWriter.prototype.writePackedInt64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeSignedVarint64(b[c]);this.endDelimited_(a)}};
jspb.BinaryWriter.prototype.writePackedSplitFixed64=function(a,b,c,d){if(null!=b){a=this.beginDelimited_(a);for(var e=0;e<b.length;e++)this.encoder_.writeSplitFixed64(c(b[e]),d(b[e]));this.endDelimited_(a)}};jspb.BinaryWriter.prototype.writePackedSplitVarint64=function(a,b,c,d){if(null!=b){a=this.beginDelimited_(a);for(var e=0;e<b.length;e++)this.encoder_.writeSplitVarint64(c(b[e]),d(b[e]));this.endDelimited_(a)}};
jspb.BinaryWriter.prototype.writePackedSplitZigzagVarint64=function(a,b,c,d){if(null!=b){a=this.beginDelimited_(a);for(var e=this.encoder_,f=0;f<b.length;f++)jspb.utils.toZigzag64(c(b[f]),d(b[f]),function(a,b){e.writeSplitVarint64(a>>>0,b>>>0)});this.endDelimited_(a)}};jspb.BinaryWriter.prototype.writePackedInt64String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++){var d=jspb.arith.Int64.fromString(b[c]);this.encoder_.writeSplitVarint64(d.lo,d.hi)}this.endDelimited_(a)}};
jspb.BinaryWriter.prototype.writePackedUint32=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeUnsignedVarint32(b[c]);this.endDelimited_(a)}};jspb.BinaryWriter.prototype.writePackedUint32String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeUnsignedVarint32(parseInt(b[c],10));this.endDelimited_(a)}};
jspb.BinaryWriter.prototype.writePackedUint64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeUnsignedVarint64(b[c]);this.endDelimited_(a)}};jspb.BinaryWriter.prototype.writePackedUint64String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++){var d=jspb.arith.UInt64.fromString(b[c]);this.encoder_.writeSplitVarint64(d.lo,d.hi)}this.endDelimited_(a)}};
jspb.BinaryWriter.prototype.writePackedSint32=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeZigzagVarint32(b[c]);this.endDelimited_(a)}};jspb.BinaryWriter.prototype.writePackedSint64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeZigzagVarint64(b[c]);this.endDelimited_(a)}};
jspb.BinaryWriter.prototype.writePackedSint64String=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeZigzagVarintHash64(jspb.utils.decimalStringToHash64(b[c]));this.endDelimited_(a)}};jspb.BinaryWriter.prototype.writePackedSintHash64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeZigzagVarintHash64(b[c]);this.endDelimited_(a)}};
jspb.BinaryWriter.prototype.writePackedFixed32=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(4*b.length),a=0;a<b.length;a++)this.encoder_.writeUint32(b[a])};jspb.BinaryWriter.prototype.writePackedFixed64=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeUint64(b[a])};
jspb.BinaryWriter.prototype.writePackedFixed64String=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++){var c=jspb.arith.UInt64.fromString(b[a]);this.encoder_.writeSplitFixed64(c.lo,c.hi)}};
jspb.BinaryWriter.prototype.writePackedSfixed32=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(4*b.length),a=0;a<b.length;a++)this.encoder_.writeInt32(b[a])};jspb.BinaryWriter.prototype.writePackedSfixed64=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeInt64(b[a])};
jspb.BinaryWriter.prototype.writePackedSfixed64String=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeInt64String(b[a])};jspb.BinaryWriter.prototype.writePackedFloat=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(4*b.length),a=0;a<b.length;a++)this.encoder_.writeFloat(b[a])};
jspb.BinaryWriter.prototype.writePackedDouble=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeDouble(b[a])};jspb.BinaryWriter.prototype.writePackedBool=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(b.length),a=0;a<b.length;a++)this.encoder_.writeBool(b[a])};
jspb.BinaryWriter.prototype.writePackedEnum=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeEnum(b[c]);this.endDelimited_(a)}};jspb.BinaryWriter.prototype.writePackedFixedHash64=function(a,b){if(null!=b&&b.length)for(this.writeFieldHeader_(a,jspb.BinaryConstants.WireType.DELIMITED),this.encoder_.writeUnsignedVarint32(8*b.length),a=0;a<b.length;a++)this.encoder_.writeFixedHash64(b[a])};
jspb.BinaryWriter.prototype.writePackedVarintHash64=function(a,b){if(null!=b&&b.length){a=this.beginDelimited_(a);for(var c=0;c<b.length;c++)this.encoder_.writeVarintHash64(b[c]);this.endDelimited_(a)}};jspb.Export={};exports.Map=jspb.Map;exports.Message=jspb.Message;exports.BinaryReader=jspb.BinaryReader;exports.BinaryWriter=jspb.BinaryWriter;exports.ExtensionFieldInfo=jspb.ExtensionFieldInfo;exports.ExtensionFieldBinaryInfo=jspb.ExtensionFieldBinaryInfo;exports.exportSymbol=goog.exportSymbol;exports.inherits=goog.inherits;exports.object={extend:goog.object.extend};exports.typeOf=goog.typeOf;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/global */
/******/ (() => {
/******/ __webpack_require__.g = (function() {
/******/ if (typeof globalThis === 'object') return globalThis;
/******/ try {
/******/ return this || new Function('return this')();
/******/ } catch (e) {
/******/ if (typeof window === 'object') return window;
/******/ }
/******/ })();
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
"use strict";
/*!*******************!*\
!*** ./client.ts ***!
\*******************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _improbable_eng_grpc_web__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @improbable-eng/grpc-web */ "./node_modules/@improbable-eng/grpc-web/dist/grpc-web-client.umd.js");
/* harmony import */ var _improbable_eng_grpc_web__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_improbable_eng_grpc_web__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _proto_web_api_pb_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_proto/web-api_pb_service */ "./_proto/web-api_pb_service.js");
/* harmony import */ var _proto_web_api_pb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_proto/web-api_pb */ "./_proto/web-api_pb.js");
/* harmony import */ var _proto_web_api_pb__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_proto_web_api_pb__WEBPACK_IMPORTED_MODULE_2__);
// Import code-generated data structures.
const listRoomsRequest = new _proto_web_api_pb__WEBPACK_IMPORTED_MODULE_2__.UserIdRequest();
listRoomsRequest.setUserId("@projectmoon:agnos.is");
_improbable_eng_grpc_web__WEBPACK_IMPORTED_MODULE_0__.grpc.unary(_proto_web_api_pb_service__WEBPACK_IMPORTED_MODULE_1__.WebApi.ListRoom, {
request: listRoomsRequest,
host: "http://localhost:10000",
onEnd: res => {
const { status, statusMessage, headers, message, trailers } = res;
console.log(status, '-', statusMessage);
if (status === _improbable_eng_grpc_web__WEBPACK_IMPORTED_MODULE_0__.grpc.Code.OK && message) {
console.log("all ok. got rooms: ", message.toObject());
}
}
});
})();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ncnBjLXdlYi1zaW1wbGUtZXhhbXBsZS8uL19wcm90by93ZWItYXBpX3BiLmpzIiwid2VicGFjazovL2dycGMtd2ViLXNpbXBsZS1leGFtcGxlLy4vX3Byb3RvL3dlYi1hcGlfcGJfc2VydmljZS5qcyIsIndlYnBhY2s6Ly9ncnBjLXdlYi1zaW1wbGUtZXhhbXBsZS8uL25vZGVfbW9kdWxlcy9AaW1wcm9iYWJsZS1lbmcvZ3JwYy13ZWIvZGlzdC9ncnBjLXdlYi1jbGllbnQudW1kLmpzIiwid2VicGFjazovL2dycGMtd2ViLXNpbXBsZS1leGFtcGxlLy4vbm9kZV9tb2R1bGVzL2dvb2dsZS1wcm90b2J1Zi9nb29nbGUtcHJvdG9idWYuanMiLCJ3ZWJwYWNrOi8vZ3JwYy13ZWItc2ltcGxlLWV4YW1wbGUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZ3JwYy13ZWItc2ltcGxlLWV4YW1wbGUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vZ3JwYy13ZWItc2ltcGxlLWV4YW1wbGUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2dycGMtd2ViLXNpbXBsZS1leGFtcGxlL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vZ3JwYy13ZWItc2ltcGxlLWV4YW1wbGUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9ncnBjLXdlYi1zaW1wbGUtZXhhbXBsZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2dycGMtd2ViLXNpbXBsZS1leGFtcGxlLy4vY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxlQUFlO0FBQzdCLGNBQWMsbUJBQW1CO0FBQ2pDO0FB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QjtJQUM5QixLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDVCxNQUFNLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUNsRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDeEMsSUFBSSxNQUFNLEtBQUssa0VBQVksSUFBSSxPQUFPLEVBQUU7WUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7Q0FDSixDQUFDLENBQUMiLCJmaWxlIjoiYXBwLmJ1bmRsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNvdXJjZTogd2ViLWFwaS5wcm90b1xuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAZW5oYW5jZWFibGVcbiAqIEBzdXBwcmVzcyB7bWlzc2luZ1JlcXVpcmV9IHJlcG9ydHMgZXJyb3Igb24gaW1wbGljaXQgdHlwZSB1c2FnZXMuXG4gKiBAc3VwcHJlc3Mge21lc3NhZ2VDb252ZW50aW9uc30gSlMgQ29tcGlsZXIgcmVwb3J0cyBhbiBlcnJvciBpZiBhIHZhcmlhYmxlIG9yXG4gKiAgICAgZmllbGQgc3RhcnRzIHdpdGggJ01TR18nIGFuZCBpc24ndCBhIHRyYW5zbGF0YWJsZSBtZXNzYWdlLlxuICogQHB1YmxpY1xuICovXG4vLyBHRU5FUkFURUQgQ09ERSAtLSBETyBOT1QgRURJVCFcbi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuXG52YXIganNwYiA9IHJlcXVpcmUoJ2dvb2dsZS1wcm90b2J1ZicpO1xudmFyIGdvb2cgPSBqc3BiO1xudmFyIGdsb2JhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5JywgbnVsbCwgZ2xvYmFsKTtcbmdvb2cuZXhwb3J0U3ltYm9sKCdwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20nLCBudWxsLCBnbG9iYWwpO1xuZ29vZy5leHBvcnRTeW1ib2woJ3Byb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdCcsIG51bGwsIGdsb2JhbCk7XG4vKipcbiAqIEdlbmVyYXRlZCBieSBKc1BiQ29kZUdlbmVyYXRvci5cbiAqIEBwYXJhbSB7QXJyYXk9fSBvcHRfZGF0YSBPcHRpb25hbCBpbml0aWFsIGRhdGEgYXJyYXksIHR5cGljYWxseSBmcm9tIGFcbiAqIHNlcnZlciByZXNwb25zZSwgb3IgY29uc3RydWN0ZWQgZGlyZWN0bHkgaW4gSmF2YXNjcmlwdC4gVGhlIGFycmF5IGlzIHVzZWRcbiAqIGluIHBsYWNlIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIG9iamVjdC4gSXQgaXMgbm90IGNsb25lZC5cbiAqIElmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2lsbCBiZSBlbXB0eSwgYnV0IHN0aWxsXG4gKiB2YWxpZC5cbiAqIEBleHRlbmRzIHtqc3BiLk1lc3NhZ2V9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xucHJvdG8ud2ViX2FwaS5Vc2VySWRSZXF1ZXN0ID0gZnVuY3Rpb24ob3B0X2RhdGEpIHtcbiAganNwYi5NZXNzYWdlLmluaXRpYWxpemUodGhpcywgb3B0X2RhdGEsIDAsIC0xLCBudWxsLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdCwganNwYi5NZXNzYWdlKTtcbmlmIChnb29nLkRFQlVHICYmICFDT01QSUxFRCkge1xuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdC5kaXNwbGF5TmFtZSA9ICdwcm90by53ZWJfYXBpLlVzZXJJZFJlcXVlc3QnO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkgPSBmdW5jdGlvbihvcHRfZGF0YSkge1xuICBqc3BiLk1lc3NhZ2UuaW5pdGlhbGl6ZSh0aGlzLCBvcHRfZGF0YSwgMCwgLTEsIHByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkucmVwZWF0ZWRGaWVsZHNfLCBudWxsKTtcbn07XG5nb29nLmluaGVyaXRzKHByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHksIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LmRpc3BsYXlOYW1lID0gJ3Byb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHknO1xufVxuLyoqXG4gKiBHZW5lcmF0ZWQgYnkgSnNQYkNvZGVHZW5lcmF0b3IuXG4gKiBAcGFyYW0ge0FycmF5PX0gb3B0X2RhdGEgT3B0aW9uYWwgaW5pdGlhbCBkYXRhIGFycmF5LCB0eXBpY2FsbHkgZnJvbSBhXG4gKiBzZXJ2ZXIgcmVzcG9uc2UsIG9yIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGluIEphdmFzY3JpcHQuIFRoZSBhcnJheSBpcyB1c2VkXG4gKiBpbiBwbGFjZSBhbmQgYmVjb21lcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QuIEl0IGlzIG5vdCBjbG9uZWQuXG4gKiBJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHksIGJ1dCBzdGlsbFxuICogdmFsaWQuXG4gKiBAZXh0ZW5kcyB7anNwYi5NZXNzYWdlfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbSA9IGZ1bmN0aW9uKG9wdF9kYXRhKSB7XG4gIGpzcGIuTWVzc2FnZS5pbml0aWFsaXplKHRoaXMsIG9wdF9kYXRhLCAwLCAtMSwgbnVsbCwgbnVsbCk7XG59O1xuZ29vZy5pbmhlcml0cyhwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20sIGpzcGIuTWVzc2FnZSk7XG5pZiAoZ29vZy5ERUJVRyAmJiAhQ09NUElMRUQpIHtcbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20uZGlzcGxheU5hbWUgPSAncHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5Sb29tJztcbn1cblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ud2ViX2FwaS5Vc2VySWRSZXF1ZXN0LnByb3RvdHlwZS50b09iamVjdCA9IGZ1bmN0aW9uKG9wdF9pbmNsdWRlSW5zdGFuY2UpIHtcbiAgcmV0dXJuIHByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdC50b09iamVjdChvcHRfaW5jbHVkZUluc3RhbmNlLCB0aGlzKTtcbn07XG5cblxuLyoqXG4gKiBTdGF0aWMgdmVyc2lvbiBvZiB0aGUge0BzZWUgdG9PYmplY3R9IG1ldGhvZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbnx1bmRlZmluZWR9IGluY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiBXaGV0aGVyIHRvIGluY2x1ZGVcbiAqICAgICB0aGUgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEBwYXJhbSB7IXByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdH0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ud2ViX2FwaS5Vc2VySWRSZXF1ZXN0LnRvT2JqZWN0ID0gZnVuY3Rpb24oaW5jbHVkZUluc3RhbmNlLCBtc2cpIHtcbiAgdmFyIGYsIG9iaiA9IHtcbiAgICB1c2VySWQ6IGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KG1zZywgMSwgXCJcIilcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdH1cbiAqL1xucHJvdG8ud2ViX2FwaS5Vc2VySWRSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBqc3BiLkJpbmFyeVJlYWRlcihieXRlcyk7XG4gIHZhciBtc2cgPSBuZXcgcHJvdG8ud2ViX2FwaS5Vc2VySWRSZXF1ZXN0O1xuICByZXR1cm4gcHJvdG8ud2ViX2FwaS5Vc2VySWRSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihtc2csIHJlYWRlcik7XG59O1xuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkgZnJvbSB0aGVcbiAqIGdpdmVuIHJlYWRlciBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7IXByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdH0gbXNnIFRoZSBtZXNzYWdlIG9iamVjdCB0byBkZXNlcmlhbGl6ZSBpbnRvLlxuICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlciBUaGUgQmluYXJ5UmVhZGVyIHRvIHVzZS5cbiAqIEByZXR1cm4geyFwcm90by53ZWJfYXBpLlVzZXJJZFJlcXVlc3R9XG4gKi9cbnByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIgPSBmdW5jdGlvbihtc2csIHJlYWRlcikge1xuICB3aGlsZSAocmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgaWYgKHJlYWRlci5pc0VuZEdyb3VwKCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZmllbGQgPSByZWFkZXIuZ2V0RmllbGROdW1iZXIoKTtcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgY2FzZSAxOlxuICAgICAgdmFyIHZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgIG1zZy5zZXRVc2VySWQodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by53ZWJfYXBpLlVzZXJJZFJlcXVlc3QucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLndlYl9hcGkuVXNlcklkUmVxdWVzdH0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by53ZWJfYXBpLlVzZXJJZFJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldFVzZXJJZCgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG59O1xuXG5cbi8qKlxuICogb3B0aW9uYWwgc3RyaW5nIHVzZXJfaWQgPSAxO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by53ZWJfYXBpLlVzZXJJZFJlcXVlc3QucHJvdG90eXBlLmdldFVzZXJJZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdCh0aGlzLCAxLCBcIlwiKSk7XG59O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHshcHJvdG8ud2ViX2FwaS5Vc2VySWRSZXF1ZXN0fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ud2ViX2FwaS5Vc2VySWRSZXF1ZXN0LnByb3RvdHlwZS5zZXRVc2VySWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFByb3RvM1N0cmluZ0ZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuXG4vKipcbiAqIExpc3Qgb2YgcmVwZWF0ZWQgZmllbGRzIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZS5cbiAqIEBwcml2YXRlIHshQXJyYXk8bnVtYmVyPn1cbiAqIEBjb25zdFxuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LnJlcGVhdGVkRmllbGRzXyA9IFsxXTtcblxuXG5cbmlmIChqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUKSB7XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG8uXG4gKiBGaWVsZCBuYW1lcyB0aGF0IGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0IGFuZCB3aWxsIGJlIHJlbmFtZWQgdG8gcGJfbmFtZS5cbiAqIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IHdpbGwgYmUgc2V0IHRvIHVuZGVmaW5lZC5cbiAqIFRvIGFjY2VzcyBhIHJlc2VydmVkIGZpZWxkIHVzZSwgZm9vLnBiXzxuYW1lPiwgZWcsIGZvby5wYl9kZWZhdWx0LlxuICogRm9yIHRoZSBsaXN0IG9mIHJlc2VydmVkIG5hbWVzIHBsZWFzZSBzZWU6XG4gKiAgICAgbmV0L3Byb3RvMi9jb21waWxlci9qcy9pbnRlcm5hbC9nZW5lcmF0b3IuY2Mja0tleXdvcmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGVcbiAqICAgICBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHJldHVybiB7IU9iamVjdH1cbiAqL1xucHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LnRvT2JqZWN0KG9wdF9pbmNsdWRlSW5zdGFuY2UsIHRoaXMpO1xufTtcblxuXG4vKipcbiAqIFN0YXRpYyB2ZXJzaW9uIG9mIHRoZSB7QHNlZSB0b09iamVjdH0gbWV0aG9kLlxuICogQHBhcmFtIHtib29sZWFufHVuZGVmaW5lZH0gaW5jbHVkZUluc3RhbmNlIERlcHJlY2F0ZWQuIFdoZXRoZXIgdG8gaW5jbHVkZVxuICogICAgIHRoZSBKU1BCIGluc3RhbmNlIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6XG4gKiAgICAgaHR0cDovL2dvdG8vc295LXBhcmFtLW1pZ3JhdGlvblxuICogQHBhcmFtIHshcHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseX0gbXNnIFRoZSBtc2cgaW5zdGFuY2UgdG8gdHJhbnNmb3JtLlxuICogQHJldHVybiB7IU9iamVjdH1cbiAqIEBzdXBwcmVzcyB7dW51c2VkTG9jYWxWYXJpYWJsZXN9IGYgaXMgb25seSB1c2VkIGZvciBuZXN0ZWQgbWVzc2FnZXNcbiAqL1xucHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgcm9vbXNMaXN0OiBqc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0KG1zZy5nZXRSb29tc0xpc3QoKSxcbiAgICBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20udG9PYmplY3QsIGluY2x1ZGVJbnN0YW5jZSlcbiAgfTtcblxuICBpZiAoaW5jbHVkZUluc3RhbmNlKSB7XG4gICAgb2JqLiRqc3BiTWVzc2FnZUluc3RhbmNlID0gbXNnO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xufVxuXG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGJpbmFyeSBkYXRhIChpbiBwcm90b2J1ZiB3aXJlIGZvcm1hdCkuXG4gKiBAcGFyYW0ge2pzcGIuQnl0ZVNvdXJjZX0gYnl0ZXMgVGhlIGJ5dGVzIHRvIGRlc2VyaWFsaXplLlxuICogQHJldHVybiB7IXByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHl9XG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuZGVzZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbihieXRlcykge1xuICB2YXIgcmVhZGVyID0gbmV3IGpzcGIuQmluYXJ5UmVhZGVyKGJ5dGVzKTtcbiAgdmFyIG1zZyA9IG5ldyBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5O1xuICByZXR1cm4gcHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIobXNnLCByZWFkZXIpO1xufTtcblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpIGZyb20gdGhlXG4gKiBnaXZlbiByZWFkZXIgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuXG4gKiBAcGFyYW0geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5fSBtc2cgVGhlIG1lc3NhZ2Ugb2JqZWN0IHRvIGRlc2VyaWFsaXplIGludG8uXG4gKiBAcGFyYW0geyFqc3BiLkJpbmFyeVJlYWRlcn0gcmVhZGVyIFRoZSBCaW5hcnlSZWFkZXIgdG8gdXNlLlxuICogQHJldHVybiB7IXByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHl9XG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyID0gZnVuY3Rpb24obXNnLCByZWFkZXIpIHtcbiAgd2hpbGUgKHJlYWRlci5uZXh0RmllbGQoKSkge1xuICAgIGlmIChyZWFkZXIuaXNFbmRHcm91cCgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGZpZWxkID0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCk7XG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb207XG4gICAgICByZWFkZXIucmVhZE1lc3NhZ2UodmFsdWUscHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5Sb29tLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcik7XG4gICAgICBtc2cuYWRkUm9vbXModmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpO1xuICBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG59O1xuXG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZVxuICogZm9ybWF0KSwgd3JpdGluZyB0byB0aGUgZ2l2ZW4gQmluYXJ5V3JpdGVyLlxuICogQHBhcmFtIHshcHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseX0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyID0gZnVuY3Rpb24obWVzc2FnZSwgd3JpdGVyKSB7XG4gIHZhciBmID0gdW5kZWZpbmVkO1xuICBmID0gbWVzc2FnZS5nZXRSb29tc0xpc3QoKTtcbiAgaWYgKGYubGVuZ3RoID4gMCkge1xuICAgIHdyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgIDEsXG4gICAgICBmLFxuICAgICAgcHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5Sb29tLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgKTtcbiAgfVxufTtcblxuXG5cblxuXG5pZiAoanNwYi5NZXNzYWdlLkdFTkVSQVRFX1RPX09CSkVDVCkge1xuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLlxuICogRmllbGQgbmFtZXMgdGhhdCBhcmUgcmVzZXJ2ZWQgaW4gSmF2YVNjcmlwdCBhbmQgd2lsbCBiZSByZW5hbWVkIHRvIHBiX25hbWUuXG4gKiBPcHRpb25hbCBmaWVsZHMgdGhhdCBhcmUgbm90IHNldCB3aWxsIGJlIHNldCB0byB1bmRlZmluZWQuXG4gKiBUbyBhY2Nlc3MgYSByZXNlcnZlZCBmaWVsZCB1c2UsIGZvby5wYl88bmFtZT4sIGVnLCBmb28ucGJfZGVmYXVsdC5cbiAqIEZvciB0aGUgbGlzdCBvZiByZXNlcnZlZCBuYW1lcyBwbGVhc2Ugc2VlOlxuICogICAgIG5ldC9wcm90bzIvY29tcGlsZXIvanMvaW50ZXJuYWwvZ2VuZXJhdG9yLmNjI2tLZXl3b3JkLlxuICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBEZXByZWNhdGVkLiB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlXG4gKiAgICAgSlNQQiBpbnN0YW5jZSBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OlxuICogICAgIGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb25cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbS5wcm90b3R5cGUudG9PYmplY3QgPSBmdW5jdGlvbihvcHRfaW5jbHVkZUluc3RhbmNlKSB7XG4gIHJldHVybiBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20udG9PYmplY3Qob3B0X2luY2x1ZGVJbnN0YW5jZSwgdGhpcyk7XG59O1xuXG5cbi8qKlxuICogU3RhdGljIHZlcnNpb24gb2YgdGhlIHtAc2VlIHRvT2JqZWN0fSBtZXRob2QuXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBpbmNsdWRlSW5zdGFuY2UgRGVwcmVjYXRlZC4gV2hldGhlciB0byBpbmNsdWRlXG4gKiAgICAgdGhlIEpTUEIgaW5zdGFuY2UgZm9yIHRyYW5zaXRpb25hbCBzb3kgcHJvdG8gc3VwcG9ydDpcbiAqICAgICBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uXG4gKiBAcGFyYW0geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb219IG1zZyBUaGUgbXNnIGluc3RhbmNlIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4geyFPYmplY3R9XG4gKiBAc3VwcHJlc3Mge3VudXNlZExvY2FsVmFyaWFibGVzfSBmIGlzIG9ubHkgdXNlZCBmb3IgbmVzdGVkIG1lc3NhZ2VzXG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbS50b09iamVjdCA9IGZ1bmN0aW9uKGluY2x1ZGVJbnN0YW5jZSwgbXNnKSB7XG4gIHZhciBmLCBvYmogPSB7XG4gICAgcm9vbUlkOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDEsIFwiXCIpLFxuICAgIGRpc3BsYXlOYW1lOiBqc3BiLk1lc3NhZ2UuZ2V0RmllbGRXaXRoRGVmYXVsdChtc2csIDIsIFwiXCIpXG4gIH07XG5cbiAgaWYgKGluY2x1ZGVJbnN0YW5jZSkge1xuICAgIG9iai4kanNwYk1lc3NhZ2VJbnN0YW5jZSA9IG1zZztcbiAgfVxuICByZXR1cm4gb2JqO1xufTtcbn1cblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpLlxuICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2V9IGJ5dGVzIFRoZSBieXRlcyB0byBkZXNlcmlhbGl6ZS5cbiAqIEByZXR1cm4geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb219XG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbS5kZXNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcganNwYi5CaW5hcnlSZWFkZXIoYnl0ZXMpO1xuICB2YXIgbXNnID0gbmV3IHByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbTtcbiAgcmV0dXJuIHByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIobXNnLCByZWFkZXIpO1xufTtcblxuXG4vKipcbiAqIERlc2VyaWFsaXplcyBiaW5hcnkgZGF0YSAoaW4gcHJvdG9idWYgd2lyZSBmb3JtYXQpIGZyb20gdGhlXG4gKiBnaXZlbiByZWFkZXIgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QuXG4gKiBAcGFyYW0geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb219IG1zZyBUaGUgbWVzc2FnZSBvYmplY3QgdG8gZGVzZXJpYWxpemUgaW50by5cbiAqIEBwYXJhbSB7IWpzcGIuQmluYXJ5UmVhZGVyfSByZWFkZXIgVGhlIEJpbmFyeVJlYWRlciB0byB1c2UuXG4gKiBAcmV0dXJuIHshcHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5Sb29tfVxuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyID0gZnVuY3Rpb24obXNnLCByZWFkZXIpIHtcbiAgd2hpbGUgKHJlYWRlci5uZXh0RmllbGQoKSkge1xuICAgIGlmIChyZWFkZXIuaXNFbmRHcm91cCgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGZpZWxkID0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCk7XG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0Um9vbUlkKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIHZhciB2YWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICBtc2cuc2V0RGlzcGxheU5hbWUodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbXNnO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmUgZm9ybWF0KS5cbiAqIEByZXR1cm4geyFVaW50OEFycmF5fVxuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20ucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7XG4gIHByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xufTtcblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGEgKGluIHByb3RvYnVmIHdpcmVcbiAqIGZvcm1hdCksIHdyaXRpbmcgdG8gdGhlIGdpdmVuIEJpbmFyeVdyaXRlci5cbiAqIEBwYXJhbSB7IXByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbX0gbWVzc2FnZVxuICogQHBhcmFtIHshanNwYi5CaW5hcnlXcml0ZXJ9IHdyaXRlclxuICogQHN1cHByZXNzIHt1bnVzZWRMb2NhbFZhcmlhYmxlc30gZiBpcyBvbmx5IHVzZWQgZm9yIG5lc3RlZCBtZXNzYWdlc1xuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIgPSBmdW5jdGlvbihtZXNzYWdlLCB3cml0ZXIpIHtcbiAgdmFyIGYgPSB1bmRlZmluZWQ7XG4gIGYgPSBtZXNzYWdlLmdldFJvb21JZCgpO1xuICBpZiAoZi5sZW5ndGggPiAwKSB7XG4gICAgd3JpdGVyLndyaXRlU3RyaW5nKFxuICAgICAgMSxcbiAgICAgIGZcbiAgICApO1xuICB9XG4gIGYgPSBtZXNzYWdlLmdldERpc3BsYXlOYW1lKCk7XG4gIGlmIChmLmxlbmd0aCA+IDApIHtcbiAgICB3cml0ZXIud3JpdGVTdHJpbmcoXG4gICAgICAyLFxuICAgICAgZlxuICAgICk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBvcHRpb25hbCBzdHJpbmcgcm9vbV9pZCA9IDE7XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbS5wcm90b3R5cGUuZ2V0Um9vbUlkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDEsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb219IHJldHVybnMgdGhpc1xuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20ucHJvdG90eXBlLnNldFJvb21JZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQodGhpcywgMSwgdmFsdWUpO1xufTtcblxuXG4vKipcbiAqIG9wdGlvbmFsIHN0cmluZyBkaXNwbGF5X25hbWUgPSAyO1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20ucHJvdG90eXBlLmdldERpc3BsYXlOYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZFdpdGhEZWZhdWx0KHRoaXMsIDIsIFwiXCIpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb219IHJldHVybnMgdGhpc1xuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20ucHJvdG90eXBlLnNldERpc3BsYXlOYW1lID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdGaWVsZCh0aGlzLCAyLCB2YWx1ZSk7XG59O1xuXG5cbi8qKlxuICogcmVwZWF0ZWQgUm9vbSByb29tcyA9IDE7XG4gKiBAcmV0dXJuIHshQXJyYXk8IXByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbT59XG4gKi9cbnByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkucHJvdG90eXBlLmdldFJvb21zTGlzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gLyoqIEB0eXBleyFBcnJheTwhcHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5Sb29tPn0gKi8gKFxuICAgIGpzcGIuTWVzc2FnZS5nZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCBwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb20sIDEpKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFBcnJheTwhcHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5Sb29tPn0gdmFsdWVcbiAqIEByZXR1cm4geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5fSByZXR1cm5zIHRoaXNcbiovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LnByb3RvdHlwZS5zZXRSb29tc0xpc3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4ganNwYi5NZXNzYWdlLnNldFJlcGVhdGVkV3JhcHBlckZpZWxkKHRoaXMsIDEsIHZhbHVlKTtcbn07XG5cblxuLyoqXG4gKiBAcGFyYW0geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LlJvb209fSBvcHRfdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2luZGV4XG4gKiBAcmV0dXJuIHshcHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5Sb29tfVxuICovXG5wcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5LnByb3RvdHlwZS5hZGRSb29tcyA9IGZ1bmN0aW9uKG9wdF92YWx1ZSwgb3B0X2luZGV4KSB7XG4gIHJldHVybiBqc3BiLk1lc3NhZ2UuYWRkVG9SZXBlYXRlZFdyYXBwZXJGaWVsZCh0aGlzLCAxLCBvcHRfdmFsdWUsIHByb3RvLndlYl9hcGkuUm9vbXNMaXN0UmVwbHkuUm9vbSwgb3B0X2luZGV4KTtcbn07XG5cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxpc3QgbWFraW5nIGl0IGVtcHR5IGJ1dCBub24tbnVsbC5cbiAqIEByZXR1cm4geyFwcm90by53ZWJfYXBpLlJvb21zTGlzdFJlcGx5fSByZXR1cm5zIHRoaXNcbiAqL1xucHJvdG8ud2ViX2FwaS5Sb29tc0xpc3RSZXBseS5wcm90b3R5cGUuY2xlYXJSb29tc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc2V0Um9vbXNMaXN0KFtdKTtcbn07XG5cblxuZ29vZy5vYmplY3QuZXh0ZW5kKGV4cG9ydHMsIHByb3RvLndlYl9hcGkpO1xuIiwiLy8gcGFja2FnZTogd2ViX2FwaVxuLy8gZmlsZTogd2ViLWFwaS5wcm90b1xuXG52YXIgd2ViX2FwaV9wYiA9IHJlcXVpcmUoXCIuL3dlYi1hcGlfcGJcIik7XG52YXIgZ3JwYyA9IHJlcXVpcmUoXCJAaW1wcm9iYWJsZS1lbmcvZ3JwYy13ZWJcIikuZ3JwYztcblxudmFyIFdlYkFwaSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFdlYkFwaSgpIHt9XG4gIFdlYkFwaS5zZXJ2aWNlTmFtZSA9IFwid2ViX2FwaS5XZWJBcGlcIjtcbiAgcmV0dXJuIFdlYkFwaTtcbn0oKSk7XG5cbldlYkFwaS5MaXN0Um9vbSA9IHtcbiAgbWV0aG9kTmFtZTogXCJMaXN0Um9vbVwiLFxuICBzZXJ2aWNlOiBXZWJBcGksXG4gIHJlcXVlc3RTdHJlYW06IGZhbHNlLFxuICByZXNwb25zZVN0cmVhbTogZmFsc2UsXG4gIHJlcXVlc3RUeXBlOiB3ZWJfYXBpX3BiLlVzZXJJZFJlcXVlc3QsXG4gIHJlc3BvbnNlVHlwZTogd2ViX2FwaV9wYi5Sb29tc0xpc3RSZXBseVxufTtcblxuZXhwb3J0cy5XZWJBcGkgPSBXZWJBcGk7XG5cbmZ1bmN0aW9uIFdlYkFwaUNsaWVudChzZXJ2aWNlSG9zdCwgb3B0aW9ucykge1xuICB0aGlzLnNlcnZpY2VIb3N0ID0gc2VydmljZUhvc3Q7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG59XG5cbldlYkFwaUNsaWVudC5wcm90b3R5cGUubGlzdFJvb20gPSBmdW5jdGlvbiBsaXN0Um9vbShyZXF1ZXN0TWVzc2FnZSwgbWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgY2FsbGJhY2sgPSBhcmd1bWVudHNbMV07XG4gIH1cbiAgdmFyIGNsaWVudCA9IGdycGMudW5hcnkoV2ViQXBpLkxpc3RSb29tLCB7XG4gICAgcmVxdWVzdDogcmVxdWVzdE1lc3NhZ2UsXG4gICAgaG9zdDogdGhpcy5zZXJ2aWNlSG9zdCxcbiAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgdHJhbnNwb3J0OiB0aGlzLm9wdGlvbnMudHJhbnNwb3J0LFxuICAgIGRlYnVnOiB0aGlzLm9wdGlvbnMuZGVidWcsXG4gICAgb25FbmQ6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IGdycGMuQ29kZS5PSykge1xuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSk7XG4gICAgICAgICAgZXJyLmNvZGUgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgZXJyLm1ldGFkYXRhID0gcmVzcG9uc2UudHJhaWxlcnM7XG4gICAgICAgICAgY2FsbGJhY2soZXJyLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayA9IG51bGw7XG4gICAgICBjbGllbnQuY2xvc2UoKTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnRzLldlYkFwaUNsaWVudCA9IFdlYkFwaUNsaWVudDtcblxuIiwiIWZ1bmN0aW9uKGUsdCl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9dCgpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSx0KTtlbHNle3ZhciByPXQoKTtmb3IodmFyIG4gaW4gcikoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0czplKVtuXT1yW25dfX0odGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD17fTtmdW5jdGlvbiByKG4pe2lmKHRbbl0pcmV0dXJuIHRbbl0uZXhwb3J0czt2YXIgbz10W25dPXtpOm4sbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtuXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxyKSxvLmw9ITAsby5leHBvcnRzfXJldHVybiByLm09ZSxyLmM9dCxyLmQ9ZnVuY3Rpb24oZSx0LG4pe3IubyhlLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGdldDpufSl9LHIucj1mdW5jdGlvbihlKXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSxyLnQ9ZnVuY3Rpb24oZSx0KXtpZigxJnQmJihlPXIoZSkpLDgmdClyZXR1cm4gZTtpZig0JnQmJlwib2JqZWN0XCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihyLnIobiksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pLDImdCYmXCJzdHJpbmdcIiE9dHlwZW9mIGUpZm9yKHZhciBvIGluIGUpci5kKG4sbyxmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0uYmluZChudWxsLG8pKTtyZXR1cm4gbn0sci5uPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiByLmQodCxcImFcIix0KSx0fSxyLm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LHIucD1cIlwiLHIoci5zPTEwKX0oW2Z1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1yKDMpO3QuTWV0YWRhdGE9bi5Ccm93c2VySGVhZGVyc30sZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuZGVidWc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07Y29uc29sZS5kZWJ1Zz9jb25zb2xlLmRlYnVnLmFwcGx5KG51bGwsZSk6Y29uc29sZS5sb2cuYXBwbHkobnVsbCxlKX19LGZ1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1yKDApLG89cig4KSxzPXIoOSksaT1yKDEpLGE9cig0KSx1PXIoMTQpO3QuY2xpZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBkKGUsdCl9O3ZhciBkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3RoaXMuc3RhcnRlZD0hMSx0aGlzLnNlbnRGaXJzdE1lc3NhZ2U9ITEsdGhpcy5jb21wbGV0ZWQ9ITEsdGhpcy5jbG9zZWQ9ITEsdGhpcy5maW5pc2hlZFNlbmRpbmc9ITEsdGhpcy5vbkhlYWRlcnNDYWxsYmFja3M9W10sdGhpcy5vbk1lc3NhZ2VDYWxsYmFja3M9W10sdGhpcy5vbkVuZENhbGxiYWNrcz1bXSx0aGlzLnBhcnNlcj1uZXcgby5DaHVua1BhcnNlcix0aGlzLm1ldGhvZERlZmluaXRpb249ZSx0aGlzLnByb3BzPXQsdGhpcy5jcmVhdGVUcmFuc3BvcnQoKX1yZXR1cm4gZS5wcm90b3R5cGUuY3JlYXRlVHJhbnNwb3J0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy5ob3N0K1wiL1wiK3RoaXMubWV0aG9kRGVmaW5pdGlvbi5zZXJ2aWNlLnNlcnZpY2VOYW1lK1wiL1wiK3RoaXMubWV0aG9kRGVmaW5pdGlvbi5tZXRob2ROYW1lLHQ9e21ldGhvZERlZmluaXRpb246dGhpcy5tZXRob2REZWZpbml0aW9uLGRlYnVnOnRoaXMucHJvcHMuZGVidWd8fCExLHVybDplLG9uSGVhZGVyczp0aGlzLm9uVHJhbnNwb3J0SGVhZGVycy5iaW5kKHRoaXMpLG9uQ2h1bms6dGhpcy5vblRyYW5zcG9ydENodW5rLmJpbmQodGhpcyksb25FbmQ6dGhpcy5vblRyYW5zcG9ydEVuZC5iaW5kKHRoaXMpfTt0aGlzLnByb3BzLnRyYW5zcG9ydD90aGlzLnRyYW5zcG9ydD10aGlzLnByb3BzLnRyYW5zcG9ydCh0KTp0aGlzLnRyYW5zcG9ydD1hLm1ha2VEZWZhdWx0VHJhbnNwb3J0KHQpfSxlLnByb3RvdHlwZS5vblRyYW5zcG9ydEhlYWRlcnM9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLnByb3BzLmRlYnVnJiZpLmRlYnVnKFwib25IZWFkZXJzXCIsZSx0KSx0aGlzLmNsb3NlZCl0aGlzLnByb3BzLmRlYnVnJiZpLmRlYnVnKFwiZ3JwYy5vbkhlYWRlcnMgcmVjZWl2ZWQgYWZ0ZXIgcmVxdWVzdCB3YXMgY2xvc2VkIC0gaWdub3JpbmdcIik7ZWxzZSBpZigwPT09dCk7ZWxzZXt0aGlzLnJlc3BvbnNlSGVhZGVycz1lLHRoaXMucHJvcHMuZGVidWcmJmkuZGVidWcoXCJvbkhlYWRlcnMucmVzcG9uc2VIZWFkZXJzXCIsSlNPTi5zdHJpbmdpZnkodGhpcy5yZXNwb25zZUhlYWRlcnMsbnVsbCwyKSk7dmFyIHI9YyhlKTt0aGlzLnByb3BzLmRlYnVnJiZpLmRlYnVnKFwib25IZWFkZXJzLmdSUENTdGF0dXNcIixyKTt2YXIgbj1yJiZyPj0wP3I6cy5odHRwU3RhdHVzVG9Db2RlKHQpO3RoaXMucHJvcHMuZGVidWcmJmkuZGVidWcoXCJvbkhlYWRlcnMuY29kZVwiLG4pO3ZhciBvPWUuZ2V0KFwiZ3JwYy1tZXNzYWdlXCIpfHxbXTtpZih0aGlzLnByb3BzLmRlYnVnJiZpLmRlYnVnKFwib25IZWFkZXJzLmdSUENNZXNzYWdlXCIsbyksdGhpcy5yYXdPbkhlYWRlcnMoZSksbiE9PXMuQ29kZS5PSyl7dmFyIGE9dGhpcy5kZWNvZGVHUlBDU3RhdHVzKG9bMF0pO3RoaXMucmF3T25FcnJvcihuLGEsZSl9fX0sZS5wcm90b3R5cGUub25UcmFuc3BvcnRDaHVuaz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuY2xvc2VkKXRoaXMucHJvcHMuZGVidWcmJmkuZGVidWcoXCJncnBjLm9uQ2h1bmsgcmVjZWl2ZWQgYWZ0ZXIgcmVxdWVzdCB3YXMgY2xvc2VkIC0gaWdub3JpbmdcIik7ZWxzZXt2YXIgcj1bXTt0cnl7cj10aGlzLnBhcnNlci5wYXJzZShlKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5wcm9wcy5kZWJ1ZyYmaS5kZWJ1ZyhcIm9uQ2h1bmsucGFyc2luZyBlcnJvclwiLGUsZS5tZXNzYWdlKSx2b2lkIHRoaXMucmF3T25FcnJvcihzLkNvZGUuSW50ZXJuYWwsXCJwYXJzaW5nIGVycm9yOiBcIitlLm1lc3NhZ2UpfXIuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLmNodW5rVHlwZT09PW8uQ2h1bmtUeXBlLk1FU1NBR0Upe3ZhciByPXQubWV0aG9kRGVmaW5pdGlvbi5yZXNwb25zZVR5cGUuZGVzZXJpYWxpemVCaW5hcnkoZS5kYXRhKTt0LnJhd09uTWVzc2FnZShyKX1lbHNlIGUuY2h1bmtUeXBlPT09by5DaHVua1R5cGUuVFJBSUxFUlMmJih0LnJlc3BvbnNlSGVhZGVycz8odC5yZXNwb25zZVRyYWlsZXJzPW5ldyBuLk1ldGFkYXRhKGUudHJhaWxlcnMpLHQucHJvcHMuZGVidWcmJmkuZGVidWcoXCJvbkNodW5rLnRyYWlsZXJzXCIsdC5yZXNwb25zZVRyYWlsZXJzKSk6KHQucmVzcG9uc2VIZWFkZXJzPW5ldyBuLk1ldGFkYXRhKGUudHJhaWxlcnMpLHQucmF3T25IZWFkZXJzKHQucmVzcG9uc2VIZWFkZXJzKSkpfSl9fSxlLnByb3RvdHlwZS5vblRyYW5zcG9ydEVuZD1mdW5jdGlvbigpe2lmKHRoaXMucHJvcHMuZGVidWcmJmkuZGVidWcoXCJncnBjLm9uRW5kXCIpLHRoaXMuY2xvc2VkKXRoaXMucHJvcHMuZGVidWcmJmkuZGVidWcoXCJncnBjLm9uRW5kIHJlY2VpdmVkIGFmdGVyIHJlcXVlc3Qgd2FzIGNsb3NlZCAtIGlnbm9yaW5nXCIpO2Vsc2UgaWYodm9pZCAwIT09dGhpcy5yZXNwb25zZVRyYWlsZXJzKXt2YXIgZT1jKHRoaXMucmVzcG9uc2VUcmFpbGVycyk7aWYobnVsbCE9PWUpe3ZhciB0PXRoaXMucmVzcG9uc2VUcmFpbGVycy5nZXQoXCJncnBjLW1lc3NhZ2VcIikscj10aGlzLmRlY29kZUdSUENTdGF0dXModFswXSk7dGhpcy5yYXdPbkVuZChlLHIsdGhpcy5yZXNwb25zZVRyYWlsZXJzKX1lbHNlIHRoaXMucmF3T25FcnJvcihzLkNvZGUuSW50ZXJuYWwsXCJSZXNwb25zZSBjbG9zZWQgd2l0aG91dCBncnBjLXN0YXR1cyAoVHJhaWxlcnMgcHJvdmlkZWQpXCIpfWVsc2V7aWYodm9pZCAwPT09dGhpcy5yZXNwb25zZUhlYWRlcnMpcmV0dXJuIHZvaWQgdGhpcy5yYXdPbkVycm9yKHMuQ29kZS5Vbmtub3duLFwiUmVzcG9uc2UgY2xvc2VkIHdpdGhvdXQgaGVhZGVyc1wiKTt2YXIgbj1jKHRoaXMucmVzcG9uc2VIZWFkZXJzKSxvPXRoaXMucmVzcG9uc2VIZWFkZXJzLmdldChcImdycGMtbWVzc2FnZVwiKTtpZih0aGlzLnByb3BzLmRlYnVnJiZpLmRlYnVnKFwiZ3JwYy5oZWFkZXJzIG9ubHkgcmVzcG9uc2UgXCIsbixvKSxudWxsPT09bilyZXR1cm4gdm9pZCB0aGlzLnJhd09uRW5kKHMuQ29kZS5Vbmtub3duLFwiUmVzcG9uc2UgY2xvc2VkIHdpdGhvdXQgZ3JwYy1zdGF0dXMgKEhlYWRlcnMgb25seSlcIix0aGlzLnJlc3BvbnNlSGVhZGVycyk7dmFyIGE9dGhpcy5kZWNvZGVHUlBDU3RhdHVzKG9bMF0pO3RoaXMucmF3T25FbmQobixhLHRoaXMucmVzcG9uc2VIZWFkZXJzKX19LGUucHJvdG90eXBlLmRlY29kZUdSUENTdGF0dXM9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuXCJcIjt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaCh0KXtyZXR1cm4gZX19LGUucHJvdG90eXBlLnJhd09uRW5kPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzO3RoaXMucHJvcHMuZGVidWcmJmkuZGVidWcoXCJyYXdPbkVuZFwiLGUsdCxyKSx0aGlzLmNvbXBsZXRlZHx8KHRoaXMuY29tcGxldGVkPSEwLHRoaXMub25FbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihvKXtpZighbi5jbG9zZWQpdHJ5e28oZSx0LHIpfWNhdGNoKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9fSkpfSxlLnByb3RvdHlwZS5yYXdPbkhlYWRlcnM9ZnVuY3Rpb24oZSl7dGhpcy5wcm9wcy5kZWJ1ZyYmaS5kZWJ1ZyhcInJhd09uSGVhZGVyc1wiLGUpLHRoaXMuY29tcGxldGVkfHx0aGlzLm9uSGVhZGVyc0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RyeXt0KGUpfWNhdGNoKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9fSl9LGUucHJvdG90eXBlLnJhd09uRXJyb3I9ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPXRoaXM7dm9pZCAwPT09ciYmKHI9bmV3IG4uTWV0YWRhdGEpLHRoaXMucHJvcHMuZGVidWcmJmkuZGVidWcoXCJyYXdPbkVycm9yXCIsZSx0KSx0aGlzLmNvbXBsZXRlZHx8KHRoaXMuY29tcGxldGVkPSEwLHRoaXMub25FbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihuKXtpZighby5jbG9zZWQpdHJ5e24oZSx0LHIpfWNhdGNoKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9fSkpfSxlLnByb3RvdHlwZS5yYXdPbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnByb3BzLmRlYnVnJiZpLmRlYnVnKFwicmF3T25NZXNzYWdlXCIsZS50b09iamVjdCgpKSx0aGlzLmNvbXBsZXRlZHx8dGhpcy5jbG9zZWR8fHRoaXMub25NZXNzYWdlQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24ocil7aWYoIXQuY2xvc2VkKXRyeXtyKGUpfWNhdGNoKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9fSl9LGUucHJvdG90eXBlLm9uSGVhZGVycz1mdW5jdGlvbihlKXt0aGlzLm9uSGVhZGVyc0NhbGxiYWNrcy5wdXNoKGUpfSxlLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5vbk1lc3NhZ2VDYWxsYmFja3MucHVzaChlKX0sZS5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7dGhpcy5vbkVuZENhbGxiYWNrcy5wdXNoKGUpfSxlLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXtpZih0aGlzLnN0YXJ0ZWQpdGhyb3cgbmV3IEVycm9yKFwiQ2xpZW50IGFscmVhZHkgc3RhcnRlZCAtIGNhbm5vdCAuc3RhcnQoKVwiKTt0aGlzLnN0YXJ0ZWQ9ITA7dmFyIHQ9bmV3IG4uTWV0YWRhdGEoZXx8e30pO3Quc2V0KFwiY29udGVudC10eXBlXCIsXCJhcHBsaWNhdGlvbi9ncnBjLXdlYitwcm90b1wiKSx0LnNldChcIngtZ3JwYy13ZWJcIixcIjFcIiksdGhpcy50cmFuc3BvcnQuc3RhcnQodCl9LGUucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc3RhcnRlZCl0aHJvdyBuZXcgRXJyb3IoXCJDbGllbnQgbm90IHN0YXJ0ZWQgLSAuc3RhcnQoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgLnNlbmQoKVwiKTtpZih0aGlzLmNsb3NlZCl0aHJvdyBuZXcgRXJyb3IoXCJDbGllbnQgYWxyZWFkeSBjbG9zZWQgLSBjYW5ub3QgLnNlbmQoKVwiKTtpZih0aGlzLmZpbmlzaGVkU2VuZGluZyl0aHJvdyBuZXcgRXJyb3IoXCJDbGllbnQgYWxyZWFkeSBmaW5pc2hlZCBzZW5kaW5nIC0gY2Fubm90IC5zZW5kKClcIik7aWYoIXRoaXMubWV0aG9kRGVmaW5pdGlvbi5yZXF1ZXN0U3RyZWFtJiZ0aGlzLnNlbnRGaXJzdE1lc3NhZ2UpdGhyb3cgbmV3IEVycm9yKFwiTWVzc2FnZSBhbHJlYWR5IHNlbnQgZm9yIG5vbi1jbGllbnQtc3RyZWFtaW5nIG1ldGhvZCAtIGNhbm5vdCAuc2VuZCgpXCIpO3RoaXMuc2VudEZpcnN0TWVzc2FnZT0hMDt2YXIgdD11LmZyYW1lUmVxdWVzdChlKTt0aGlzLnRyYW5zcG9ydC5zZW5kTWVzc2FnZSh0KX0sZS5wcm90b3R5cGUuZmluaXNoU2VuZD1mdW5jdGlvbigpe2lmKCF0aGlzLnN0YXJ0ZWQpdGhyb3cgbmV3IEVycm9yKFwiQ2xpZW50IG5vdCBzdGFydGVkIC0gLmZpbmlzaFNlbmQoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgLmNsb3NlKClcIik7aWYodGhpcy5jbG9zZWQpdGhyb3cgbmV3IEVycm9yKFwiQ2xpZW50IGFscmVhZHkgY2xvc2VkIC0gY2Fubm90IC5zZW5kKClcIik7aWYodGhpcy5maW5pc2hlZFNlbmRpbmcpdGhyb3cgbmV3IEVycm9yKFwiQ2xpZW50IGFscmVhZHkgZmluaXNoZWQgc2VuZGluZyAtIGNhbm5vdCAuZmluaXNoU2VuZCgpXCIpO3RoaXMuZmluaXNoZWRTZW5kaW5nPSEwLHRoaXMudHJhbnNwb3J0LmZpbmlzaFNlbmQoKX0sZS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtpZighdGhpcy5zdGFydGVkKXRocm93IG5ldyBFcnJvcihcIkNsaWVudCBub3Qgc3RhcnRlZCAtIC5zdGFydCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSAuY2xvc2UoKVwiKTtpZih0aGlzLmNsb3NlZCl0aHJvdyBuZXcgRXJyb3IoXCJDbGllbnQgYWxyZWFkeSBjbG9zZWQgLSBjYW5ub3QgLmNsb3NlKClcIik7dGhpcy5jbG9zZWQ9ITAsdGhpcy5wcm9wcy5kZWJ1ZyYmaS5kZWJ1ZyhcInJlcXVlc3QuYWJvcnQgYWJvcnRpbmcgcmVxdWVzdFwiKSx0aGlzLnRyYW5zcG9ydC5jYW5jZWwoKX0sZX0oKTtmdW5jdGlvbiBjKGUpe3ZhciB0PWUuZ2V0KFwiZ3JwYy1zdGF0dXNcIil8fFtdO2lmKHQubGVuZ3RoPjApdHJ5e3ZhciByPXRbMF07cmV0dXJuIHBhcnNlSW50KHIsMTApfWNhdGNoKGUpe3JldHVybiBudWxsfXJldHVybiBudWxsfX0sZnVuY3Rpb24oZSx0LHIpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gcihuKXtpZih0W25dKXJldHVybiB0W25dLmV4cG9ydHM7dmFyIG89dFtuXT17aTpuLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbbl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsciksby5sPSEwLG8uZXhwb3J0c31yZXR1cm4gci5tPWUsci5jPXQsci5pPWZ1bmN0aW9uKGUpe3JldHVybiBlfSxyLmQ9ZnVuY3Rpb24oZSx0LG4pe3IubyhlLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6bn0pfSxyLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHIuZCh0LFwiYVwiLHQpLHR9LHIubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sci5wPVwiXCIscihyLnM9MSl9KFtmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49cigzKTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt2b2lkIDA9PT1lJiYoZT17fSksdm9pZCAwPT09dCYmKHQ9e3NwbGl0VmFsdWVzOiExfSk7dmFyIHIsbz10aGlzO2lmKHRoaXMuaGVhZGVyc01hcD17fSxlKWlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBIZWFkZXJzJiZlIGluc3RhbmNlb2YgSGVhZGVycyluLmdldEhlYWRlcktleXMoZSkuZm9yRWFjaChmdW5jdGlvbihyKXtuLmdldEhlYWRlclZhbHVlcyhlLHIpLmZvckVhY2goZnVuY3Rpb24oZSl7dC5zcGxpdFZhbHVlcz9vLmFwcGVuZChyLG4uc3BsaXRIZWFkZXJWYWx1ZShlKSk6by5hcHBlbmQocixlKX0pfSk7ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2Yocj1lKSYmXCJvYmplY3RcIj09dHlwZW9mIHIuaGVhZGVyc01hcCYmXCJmdW5jdGlvblwiPT10eXBlb2Ygci5mb3JFYWNoKWUuZm9yRWFjaChmdW5jdGlvbihlLHQpe28uYXBwZW5kKGUsdCl9KTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBNYXAmJmUgaW5zdGFuY2VvZiBNYXApe2UuZm9yRWFjaChmdW5jdGlvbihlLHQpe28uYXBwZW5kKHQsZSl9KX1lbHNlXCJzdHJpbmdcIj09dHlwZW9mIGU/dGhpcy5hcHBlbmRGcm9tU3RyaW5nKGUpOlwib2JqZWN0XCI9PXR5cGVvZiBlJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPWVbdF07QXJyYXkuaXNBcnJheShyKT9yLmZvckVhY2goZnVuY3Rpb24oZSl7by5hcHBlbmQodCxlKX0pOm8uYXBwZW5kKHQscil9KX1yZXR1cm4gZS5wcm90b3R5cGUuYXBwZW5kRnJvbVN0cmluZz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5zcGxpdChcIlxcclxcblwiKSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPXRbcl0sbz1uLmluZGV4T2YoXCI6XCIpO2lmKG8+MCl7dmFyIHM9bi5zdWJzdHJpbmcoMCxvKS50cmltKCksaT1uLnN1YnN0cmluZyhvKzEpLnRyaW0oKTt0aGlzLmFwcGVuZChzLGkpfX19LGUucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihlLHQpe3ZhciByPW4ubm9ybWFsaXplTmFtZShlKTtpZih2b2lkIDA9PT10KWRlbGV0ZSB0aGlzLmhlYWRlcnNNYXBbcl07ZWxzZXt2YXIgbz10aGlzLmhlYWRlcnNNYXBbcl07aWYobyl7dmFyIHM9by5pbmRleE9mKHQpO3M+PTAmJm8uc3BsaWNlKHMsMSksMD09PW8ubGVuZ3RoJiZkZWxldGUgdGhpcy5oZWFkZXJzTWFwW3JdfX19LGUucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbz1uLm5vcm1hbGl6ZU5hbWUoZSk7QXJyYXkuaXNBcnJheSh0aGlzLmhlYWRlcnNNYXBbb10pfHwodGhpcy5oZWFkZXJzTWFwW29dPVtdKSxBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaChmdW5jdGlvbihlKXtyLmhlYWRlcnNNYXBbb10ucHVzaChuLm5vcm1hbGl6ZVZhbHVlKGUpKX0pOnRoaXMuaGVhZGVyc01hcFtvXS5wdXNoKG4ubm9ybWFsaXplVmFsdWUodCkpfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj1uLm5vcm1hbGl6ZU5hbWUoZSk7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG89W107dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe28ucHVzaChuLm5vcm1hbGl6ZVZhbHVlKGUpKX0pLHRoaXMuaGVhZGVyc01hcFtyXT1vfWVsc2UgdGhpcy5oZWFkZXJzTWFwW3JdPVtuLm5vcm1hbGl6ZVZhbHVlKHQpXX0sZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5oZWFkZXJzTWFwW24ubm9ybWFsaXplTmFtZShlKV07aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuITE7aWYodm9pZCAwIT09dCl7dmFyIG89bi5ub3JtYWxpemVWYWx1ZSh0KTtyZXR1cm4gci5pbmRleE9mKG8pPj0wfXJldHVybiEwfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5oZWFkZXJzTWFwW24ubm9ybWFsaXplTmFtZShlKV07cmV0dXJuIHZvaWQgMCE9PXQ/dC5jb25jYXQoKTpbXX0sZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuaGVhZGVyc01hcCkuZm9yRWFjaChmdW5jdGlvbihyKXtlKHIsdC5oZWFkZXJzTWFwW3JdKX0sdGhpcyl9LGUucHJvdG90eXBlLnRvSGVhZGVycz1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBIZWFkZXJzKXt2YXIgZT1uZXcgSGVhZGVycztyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQscil7ci5mb3JFYWNoKGZ1bmN0aW9uKHIpe2UuYXBwZW5kKHQscil9KX0pLGV9dGhyb3cgbmV3IEVycm9yKFwiSGVhZGVycyBjbGFzcyBpcyBub3QgZGVmaW5lZFwiKX0sZX0oKTt0LkJyb3dzZXJIZWFkZXJzPW99LGZ1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1yKDApO3QuQnJvd3NlckhlYWRlcnM9bi5Ccm93c2VySGVhZGVyc30sZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuaXRlcmF0ZUhlYWRlcnM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9ZVtTeW1ib2wuaXRlcmF0b3JdKCksbj1yLm5leHQoKTshbi5kb25lOyl0KG4udmFsdWVbMF0pLG49ci5uZXh0KCl9LHQuaXRlcmF0ZUhlYWRlcnNLZXlzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPWUua2V5cygpLG49ci5uZXh0KCk7IW4uZG9uZTspdChuLnZhbHVlKSxuPXIubmV4dCgpfX0sZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPXIoMik7ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZX10Lm5vcm1hbGl6ZU5hbWU9ZnVuY3Rpb24oZSl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUmJihlPVN0cmluZyhlKSksL1teYS16MC05XFwtIyQlJicqKy5cXF5fYHx+XS9pLnRlc3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lXCIpO3JldHVybiBlLnRvTG93ZXJDYXNlKCl9LHQubm9ybWFsaXplVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGUmJihlPVN0cmluZyhlKSksZX0sdC5nZXRIZWFkZXJWYWx1ZXM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1vKGUpO2lmKHIgaW5zdGFuY2VvZiBIZWFkZXJzJiZyLmdldEFsbClyZXR1cm4gci5nZXRBbGwodCk7dmFyIG49ci5nZXQodCk7cmV0dXJuIG4mJlwic3RyaW5nXCI9PXR5cGVvZiBuP1tuXTpufSx0LmdldEhlYWRlcktleXM9ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKSxyPXt9LHM9W107cmV0dXJuIHQua2V5cz9uLml0ZXJhdGVIZWFkZXJzS2V5cyh0LGZ1bmN0aW9uKGUpe3JbZV18fChyW2VdPSEwLHMucHVzaChlKSl9KTp0LmZvckVhY2g/dC5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7clt0XXx8KHJbdF09ITAscy5wdXNoKHQpKX0pOm4uaXRlcmF0ZUhlYWRlcnModCxmdW5jdGlvbihlKXt2YXIgdD1lWzBdO3JbdF18fChyW3RdPSEwLHMucHVzaCh0KSl9KSxzfSx0LnNwbGl0SGVhZGVyVmFsdWU9ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIGUuc3BsaXQoXCIsIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSl9KSx0fX1dKX0sZS5leHBvcnRzPW4oKX0sZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPXIoNSksbz1mdW5jdGlvbihlKXtyZXR1cm4gbi5Dcm9zc0Jyb3dzZXJIdHRwVHJhbnNwb3J0KHt3aXRoQ3JlZGVudGlhbHM6ITF9KShlKX07dC5zZXREZWZhdWx0VHJhbnNwb3J0RmFjdG9yeT1mdW5jdGlvbihlKXtvPWV9LHQubWFrZURlZmF1bHRUcmFuc3BvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSl9fSxmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49cig2KSxvPXIoNyk7dC5Dcm9zc0Jyb3dzZXJIdHRwVHJhbnNwb3J0PWZ1bmN0aW9uKGUpe2lmKG4uZGV0ZWN0RmV0Y2hTdXBwb3J0KCkpe3ZhciB0PXtjcmVkZW50aWFsczplLndpdGhDcmVkZW50aWFscz9cImluY2x1ZGVcIjpcInNhbWUtb3JpZ2luXCJ9O3JldHVybiBuLkZldGNoUmVhZGFibGVTdHJlYW1UcmFuc3BvcnQodCl9cmV0dXJuIG8uWGhyVHJhbnNwb3J0KHt3aXRoQ3JlZGVudGlhbHM6ZS53aXRoQ3JlZGVudGlhbHN9KX19LGZ1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbj10aGlzJiZ0aGlzLl9fYXNzaWdufHxmdW5jdGlvbigpe3JldHVybihuPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPTEsbj1hcmd1bWVudHMubGVuZ3RoO3I8bjtyKyspZm9yKHZhciBvIGluIHQ9YXJndW1lbnRzW3JdKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pJiYoZVtvXT10W29dKTtyZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG89cigwKSxzPXIoMSk7dC5GZXRjaFJlYWRhYmxlU3RyZWFtVHJhbnNwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5kZWJ1ZyYmcy5kZWJ1ZyhcImZldGNoUmVxdWVzdFwiLGUpLG5ldyBpKGUsdCl9KHQsZSl9fTt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt0aGlzLmNhbmNlbGxlZD0hMSx0aGlzLmNvbnRyb2xsZXI9c2VsZi5BYm9ydENvbnRyb2xsZXImJm5ldyBBYm9ydENvbnRyb2xsZXIsdGhpcy5vcHRpb25zPWUsdGhpcy5pbml0PXR9cmV0dXJuIGUucHJvdG90eXBlLnB1bXA9ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzO2lmKHRoaXMucmVhZGVyPWUsdGhpcy5jYW5jZWxsZWQpcmV0dXJuIHRoaXMub3B0aW9ucy5kZWJ1ZyYmcy5kZWJ1ZyhcIkZldGNoLnB1bXAuY2FuY2VsIGF0IGZpcnN0IHB1bXBcIiksdm9pZCB0aGlzLnJlYWRlci5jYW5jZWwoKTt0aGlzLnJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbihlKXtpZihlLmRvbmUpcmV0dXJuIHIub3B0aW9ucy5vbkVuZCgpLHQ7ci5vcHRpb25zLm9uQ2h1bmsoZS52YWx1ZSksci5wdW1wKHIucmVhZGVyLHQpfSkuY2F0Y2goZnVuY3Rpb24oZSl7ci5jYW5jZWxsZWQ/ci5vcHRpb25zLmRlYnVnJiZzLmRlYnVnKFwiRmV0Y2guY2F0Y2ggLSByZXF1ZXN0IGNhbmNlbGxlZFwiKTooci5jYW5jZWxsZWQ9ITAsci5vcHRpb25zLmRlYnVnJiZzLmRlYnVnKFwiRmV0Y2guY2F0Y2hcIixlLm1lc3NhZ2UpLHIub3B0aW9ucy5vbkVuZChlKSl9KX0sZS5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2ZldGNoKHRoaXMub3B0aW9ucy51cmwsbih7fSx0aGlzLmluaXQse2hlYWRlcnM6dGhpcy5tZXRhZGF0YS50b0hlYWRlcnMoKSxtZXRob2Q6XCJQT1NUXCIsYm9keTplLHNpZ25hbDp0aGlzLmNvbnRyb2xsZXImJnRoaXMuY29udHJvbGxlci5zaWduYWx9KSkudGhlbihmdW5jdGlvbihlKXtpZih0Lm9wdGlvbnMuZGVidWcmJnMuZGVidWcoXCJGZXRjaC5yZXNwb25zZVwiLGUpLHQub3B0aW9ucy5vbkhlYWRlcnMobmV3IG8uTWV0YWRhdGEoZS5oZWFkZXJzKSxlLnN0YXR1cyksIWUuYm9keSlyZXR1cm4gZTt0LnB1bXAoZS5ib2R5LmdldFJlYWRlcigpLGUpfSkuY2F0Y2goZnVuY3Rpb24oZSl7dC5jYW5jZWxsZWQ/dC5vcHRpb25zLmRlYnVnJiZzLmRlYnVnKFwiRmV0Y2guY2F0Y2ggLSByZXF1ZXN0IGNhbmNlbGxlZFwiKToodC5jYW5jZWxsZWQ9ITAsdC5vcHRpb25zLmRlYnVnJiZzLmRlYnVnKFwiRmV0Y2guY2F0Y2hcIixlLm1lc3NhZ2UpLHQub3B0aW9ucy5vbkVuZChlKSl9KX0sZS5wcm90b3R5cGUuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5zZW5kKGUpfSxlLnByb3RvdHlwZS5maW5pc2hTZW5kPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXt0aGlzLm1ldGFkYXRhPWV9LGUucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsbGVkP3RoaXMub3B0aW9ucy5kZWJ1ZyYmcy5kZWJ1ZyhcIkZldGNoLmFib3J0LmNhbmNlbCBhbHJlYWR5IGNhbmNlbGxlZFwiKToodGhpcy5jYW5jZWxsZWQ9ITAsdGhpcy5yZWFkZXI/KHRoaXMub3B0aW9ucy5kZWJ1ZyYmcy5kZWJ1ZyhcIkZldGNoLmFib3J0LmNhbmNlbFwiKSx0aGlzLnJlYWRlci5jYW5jZWwoKSk6dGhpcy5vcHRpb25zLmRlYnVnJiZzLmRlYnVnKFwiRmV0Y2guYWJvcnQuY2FuY2VsIGJlZm9yZSByZWFkZXJcIiksdGhpcy5jb250cm9sbGVyJiZ0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSl9LGV9KCk7dC5kZXRlY3RGZXRjaFN1cHBvcnQ9ZnVuY3Rpb24oKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgUmVzcG9uc2UmJlJlc3BvbnNlLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcImJvZHlcIikmJlwiZnVuY3Rpb25cIj09dHlwZW9mIEhlYWRlcnN9fSxmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG4sbz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8KG49ZnVuY3Rpb24oZSx0KXtyZXR1cm4obj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYoZVtyXT10W3JdKX0pKGUsdCl9LGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9ZX1uKGUsdCksZS5wcm90b3R5cGU9bnVsbD09PXQ/T2JqZWN0LmNyZWF0ZSh0KTooci5wcm90b3R5cGU9dC5wcm90b3R5cGUsbmV3IHIpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHM9cigwKSxpPXIoMSksYT1yKDExKTt0LlhoclRyYW5zcG9ydD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoYS5kZXRlY3RNb3pYSFJTdXBwb3J0KCkpcmV0dXJuIG5ldyBkKHQsZSk7aWYoYS5kZXRlY3RYSFJPdmVycmlkZU1pbWVUeXBlU3VwcG9ydCgpKXJldHVybiBuZXcgdSh0LGUpO3Rocm93IG5ldyBFcnJvcihcIlRoaXMgZW52aXJvbm1lbnQncyBYSFIgaW1wbGVtZW50YXRpb24gY2Fubm90IHN1cHBvcnQgYmluYXJ5IHRyYW5zZmVyLlwiKX19O3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3RoaXMub3B0aW9ucz1lLHRoaXMuaW5pdD10fXJldHVybiBlLnByb3RvdHlwZS5vblByb2dyZXNzRXZlbnQ9ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuZGVidWcmJmkuZGVidWcoXCJYSFIub25Qcm9ncmVzc0V2ZW50Lmxlbmd0aDogXCIsdGhpcy54aHIucmVzcG9uc2UubGVuZ3RoKTt2YXIgZT10aGlzLnhoci5yZXNwb25zZS5zdWJzdHIodGhpcy5pbmRleCk7dGhpcy5pbmRleD10aGlzLnhoci5yZXNwb25zZS5sZW5ndGg7dmFyIHQ9cChlKTt0aGlzLm9wdGlvbnMub25DaHVuayh0KX0sZS5wcm90b3R5cGUub25Mb2FkRXZlbnQ9ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuZGVidWcmJmkuZGVidWcoXCJYSFIub25Mb2FkRXZlbnRcIiksdGhpcy5vcHRpb25zLm9uRW5kKCl9LGUucHJvdG90eXBlLm9uU3RhdGVDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuZGVidWcmJmkuZGVidWcoXCJYSFIub25TdGF0ZUNoYW5nZVwiLHRoaXMueGhyLnJlYWR5U3RhdGUpLHRoaXMueGhyLnJlYWR5U3RhdGU9PT1YTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEJiZ0aGlzLm9wdGlvbnMub25IZWFkZXJzKG5ldyBzLk1ldGFkYXRhKHRoaXMueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSx0aGlzLnhoci5zdGF0dXMpfSxlLnByb3RvdHlwZS5zZW5kTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLnhoci5zZW5kKGUpfSxlLnByb3RvdHlwZS5maW5pc2hTZW5kPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMubWV0YWRhdGE9ZTt2YXIgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7dGhpcy54aHI9cixyLm9wZW4oXCJQT1NUXCIsdGhpcy5vcHRpb25zLnVybCksdGhpcy5jb25maWd1cmVYaHIoKSx0aGlzLm1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24oZSx0KXtyLnNldFJlcXVlc3RIZWFkZXIoZSx0LmpvaW4oXCIsIFwiKSl9KSxyLndpdGhDcmVkZW50aWFscz1Cb29sZWFuKHRoaXMuaW5pdC53aXRoQ3JlZGVudGlhbHMpLHIuYWRkRXZlbnRMaXN0ZW5lcihcInJlYWR5c3RhdGVjaGFuZ2VcIix0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSksci5hZGRFdmVudExpc3RlbmVyKFwicHJvZ3Jlc3NcIix0aGlzLm9uUHJvZ3Jlc3NFdmVudC5iaW5kKHRoaXMpKSxyLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkZW5kXCIsdGhpcy5vbkxvYWRFdmVudC5iaW5kKHRoaXMpKSxyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLGZ1bmN0aW9uKGUpe3Qub3B0aW9ucy5kZWJ1ZyYmaS5kZWJ1ZyhcIlhIUi5lcnJvclwiLGUpLHQub3B0aW9ucy5vbkVuZChlLmVycm9yKX0pfSxlLnByb3RvdHlwZS5jb25maWd1cmVYaHI9ZnVuY3Rpb24oKXt0aGlzLnhoci5yZXNwb25zZVR5cGU9XCJ0ZXh0XCIsdGhpcy54aHIub3ZlcnJpZGVNaW1lVHlwZShcInRleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWRcIil9LGUucHJvdG90eXBlLmNhbmNlbD1mdW5jdGlvbigpe3RoaXMub3B0aW9ucy5kZWJ1ZyYmaS5kZWJ1ZyhcIlhIUi5hYm9ydFwiKSx0aGlzLnhoci5hYm9ydCgpfSxlfSgpO3QuWEhSPXU7dmFyIGQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIG8odCxlKSx0LnByb3RvdHlwZS5jb25maWd1cmVYaHI9ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuZGVidWcmJmkuZGVidWcoXCJNb3pYSFIuY29uZmlndXJlWGhyOiBzZXR0aW5nIHJlc3BvbnNlVHlwZSB0byAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInXCIpLHRoaXMueGhyLnJlc3BvbnNlVHlwZT1cIm1vei1jaHVua2VkLWFycmF5YnVmZmVyXCJ9LHQucHJvdG90eXBlLm9uUHJvZ3Jlc3NFdmVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMueGhyLnJlc3BvbnNlO3RoaXMub3B0aW9ucy5kZWJ1ZyYmaS5kZWJ1ZyhcIk1velhIUi5vblByb2dyZXNzRXZlbnQ6IFwiLG5ldyBVaW50OEFycmF5KGUpKSx0aGlzLm9wdGlvbnMub25DaHVuayhuZXcgVWludDhBcnJheShlKSl9LHR9KHUpO2Z1bmN0aW9uIGMoZSx0KXt2YXIgcj1lLmNoYXJDb2RlQXQodCk7aWYocj49NTUyOTYmJnI8PTU2MzE5KXt2YXIgbj1lLmNoYXJDb2RlQXQodCsxKTtuPj01NjMyMCYmbjw9NTczNDMmJihyPTY1NTM2KyhyLTU1Mjk2PDwxMCkrKG4tNTYzMjApKX1yZXR1cm4gcn1mdW5jdGlvbiBwKGUpe2Zvcih2YXIgdD1uZXcgVWludDhBcnJheShlLmxlbmd0aCkscj0wLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89U3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdD9lLmNvZGVQb2ludEF0KG4pOmMoZSxuKTt0W3IrK109MjU1Jm99cmV0dXJuIHR9dC5Nb3pDaHVua2VkQXJyYXlCdWZmZXJYSFI9ZCx0LnN0cmluZ1RvQXJyYXlCdWZmZXI9cH0sZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuLG89cigwKSxzPWZ1bmN0aW9uKGUpe3JldHVybiA5PT09ZXx8MTA9PT1lfHwxMz09PWV9O2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHMoZSl8fGU+PTMyJiZlPD0xMjZ9ZnVuY3Rpb24gYShlKXtmb3IodmFyIHQ9MDt0IT09ZS5sZW5ndGg7Kyt0KWlmKCFpKGVbdF0pKXRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIGlzIG5vdCB2YWxpZCAocHJpbnRhYmxlKSBBU0NJSVwiKTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkpfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIDEyOD09KDEyOCZlLmdldFVpbnQ4KDApKX1mdW5jdGlvbiBkKGUpe3JldHVybiBlLmdldFVpbnQzMigxLCExKX1mdW5jdGlvbiBjKGUsdCxyKXtyZXR1cm4gZS5ieXRlTGVuZ3RoLXQ+PXJ9ZnVuY3Rpb24gcChlLHQscil7aWYoZS5zbGljZSlyZXR1cm4gZS5zbGljZSh0LHIpO3ZhciBuPWUubGVuZ3RoO3ZvaWQgMCE9PXImJihuPXIpO2Zvcih2YXIgbz1uZXcgVWludDhBcnJheShuLXQpLHM9MCxpPXQ7aTxuO2krKylvW3MrK109ZVtpXTtyZXR1cm4gb310LmRlY29kZUFTQ0lJPWEsdC5lbmNvZGVBU0NJST1mdW5jdGlvbihlKXtmb3IodmFyIHQ9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgpLHI9MDtyIT09ZS5sZW5ndGg7KytyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYoIWkobikpdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgY29udGFpbnMgaW52YWxpZCBBU0NJSVwiKTt0W3JdPW59cmV0dXJuIHR9LGZ1bmN0aW9uKGUpe2VbZS5NRVNTQUdFPTFdPVwiTUVTU0FHRVwiLGVbZS5UUkFJTEVSUz0yXT1cIlRSQUlMRVJTXCJ9KG49dC5DaHVua1R5cGV8fCh0LkNodW5rVHlwZT17fSkpO3ZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuYnVmZmVyPW51bGwsdGhpcy5wb3NpdGlvbj0wfXJldHVybiBlLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aCYmdClyZXR1cm5bXTt2YXIgcixzPVtdO2lmKG51bGw9PXRoaXMuYnVmZmVyKXRoaXMuYnVmZmVyPWUsdGhpcy5wb3NpdGlvbj0wO2Vsc2UgaWYodGhpcy5wb3NpdGlvbj09PXRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpdGhpcy5idWZmZXI9ZSx0aGlzLnBvc2l0aW9uPTA7ZWxzZXt2YXIgaT10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoLXRoaXMucG9zaXRpb24saD1uZXcgVWludDhBcnJheShpK2UuYnl0ZUxlbmd0aCksZj1wKHRoaXMuYnVmZmVyLHRoaXMucG9zaXRpb24pO2guc2V0KGYsMCk7dmFyIGw9bmV3IFVpbnQ4QXJyYXkoZSk7aC5zZXQobCxpKSx0aGlzLmJ1ZmZlcj1oLHRoaXMucG9zaXRpb249MH1mb3IoOzspe2lmKCFjKHRoaXMuYnVmZmVyLHRoaXMucG9zaXRpb24sNSkpcmV0dXJuIHM7dmFyIGc9cCh0aGlzLmJ1ZmZlcix0aGlzLnBvc2l0aW9uLHRoaXMucG9zaXRpb24rNSksYj1uZXcgRGF0YVZpZXcoZy5idWZmZXIsZy5ieXRlT2Zmc2V0LGcuYnl0ZUxlbmd0aCkseT1kKGIpO2lmKCFjKHRoaXMuYnVmZmVyLHRoaXMucG9zaXRpb24sNSt5KSlyZXR1cm4gczt2YXIgdj1wKHRoaXMuYnVmZmVyLHRoaXMucG9zaXRpb24rNSx0aGlzLnBvc2l0aW9uKzUreSk7aWYodGhpcy5wb3NpdGlvbis9NSt5LHUoYikpcmV0dXJuIHMucHVzaCh7Y2h1bmtUeXBlOm4uVFJBSUxFUlMsdHJhaWxlcnM6KHI9dixuZXcgby5NZXRhZGF0YShhKHIpKSl9KSxzO3MucHVzaCh7Y2h1bmtUeXBlOm4uTUVTU0FHRSxkYXRhOnZ9KX19LGV9KCk7dC5DaHVua1BhcnNlcj1ofSxmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dmFyIG47T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksZnVuY3Rpb24oZSl7ZVtlLk9LPTBdPVwiT0tcIixlW2UuQ2FuY2VsZWQ9MV09XCJDYW5jZWxlZFwiLGVbZS5Vbmtub3duPTJdPVwiVW5rbm93blwiLGVbZS5JbnZhbGlkQXJndW1lbnQ9M109XCJJbnZhbGlkQXJndW1lbnRcIixlW2UuRGVhZGxpbmVFeGNlZWRlZD00XT1cIkRlYWRsaW5lRXhjZWVkZWRcIixlW2UuTm90Rm91bmQ9NV09XCJOb3RGb3VuZFwiLGVbZS5BbHJlYWR5RXhpc3RzPTZdPVwiQWxyZWFkeUV4aXN0c1wiLGVbZS5QZXJtaXNzaW9uRGVuaWVkPTddPVwiUGVybWlzc2lvbkRlbmllZFwiLGVbZS5SZXNvdXJjZUV4aGF1c3RlZD04XT1cIlJlc291cmNlRXhoYXVzdGVkXCIsZVtlLkZhaWxlZFByZWNvbmRpdGlvbj05XT1cIkZhaWxlZFByZWNvbmRpdGlvblwiLGVbZS5BYm9ydGVkPTEwXT1cIkFib3J0ZWRcIixlW2UuT3V0T2ZSYW5nZT0xMV09XCJPdXRPZlJhbmdlXCIsZVtlLlVuaW1wbGVtZW50ZWQ9MTJdPVwiVW5pbXBsZW1lbnRlZFwiLGVbZS5JbnRlcm5hbD0xM109XCJJbnRlcm5hbFwiLGVbZS5VbmF2YWlsYWJsZT0xNF09XCJVbmF2YWlsYWJsZVwiLGVbZS5EYXRhTG9zcz0xNV09XCJEYXRhTG9zc1wiLGVbZS5VbmF1dGhlbnRpY2F0ZWQ9MTZdPVwiVW5hdXRoZW50aWNhdGVkXCJ9KG49dC5Db2RlfHwodC5Db2RlPXt9KSksdC5odHRwU3RhdHVzVG9Db2RlPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuIG4uSW50ZXJuYWw7Y2FzZSAyMDA6cmV0dXJuIG4uT0s7Y2FzZSA0MDA6cmV0dXJuIG4uSW52YWxpZEFyZ3VtZW50O2Nhc2UgNDAxOnJldHVybiBuLlVuYXV0aGVudGljYXRlZDtjYXNlIDQwMzpyZXR1cm4gbi5QZXJtaXNzaW9uRGVuaWVkO2Nhc2UgNDA0OnJldHVybiBuLk5vdEZvdW5kO2Nhc2UgNDA5OnJldHVybiBuLkFib3J0ZWQ7Y2FzZSA0MTI6cmV0dXJuIG4uRmFpbGVkUHJlY29uZGl0aW9uO2Nhc2UgNDI5OnJldHVybiBuLlJlc291cmNlRXhoYXVzdGVkO2Nhc2UgNDk5OnJldHVybiBuLkNhbmNlbGVkO2Nhc2UgNTAwOnJldHVybiBuLlVua25vd247Y2FzZSA1MDE6cmV0dXJuIG4uVW5pbXBsZW1lbnRlZDtjYXNlIDUwMzpyZXR1cm4gbi5VbmF2YWlsYWJsZTtjYXNlIDUwNDpyZXR1cm4gbi5EZWFkbGluZUV4Y2VlZGVkO2RlZmF1bHQ6cmV0dXJuIG4uVW5rbm93bn19fSxmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49cigzKSxvPXIoNCkscz1yKDYpLGk9cigxMiksYT1yKDcpLHU9cig1KSxkPXIoOSksYz1yKDEzKSxwPXIoMTUpLGg9cigyKTshZnVuY3Rpb24oZSl7ZS5zZXREZWZhdWx0VHJhbnNwb3J0PW8uc2V0RGVmYXVsdFRyYW5zcG9ydEZhY3RvcnksZS5Dcm9zc0Jyb3dzZXJIdHRwVHJhbnNwb3J0PXUuQ3Jvc3NCcm93c2VySHR0cFRyYW5zcG9ydCxlLkZldGNoUmVhZGFibGVTdHJlYW1UcmFuc3BvcnQ9cy5GZXRjaFJlYWRhYmxlU3RyZWFtVHJhbnNwb3J0LGUuWGhyVHJhbnNwb3J0PWEuWGhyVHJhbnNwb3J0LGUuV2Vic29ja2V0VHJhbnNwb3J0PWkuV2Vic29ja2V0VHJhbnNwb3J0LGUuQ29kZT1kLkNvZGUsZS5NZXRhZGF0YT1uLkJyb3dzZXJIZWFkZXJzLGUuY2xpZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGguY2xpZW50KGUsdCl9LGUuaW52b2tlPWMuaW52b2tlLGUudW5hcnk9cC51bmFyeX0odC5ncnBjfHwodC5ncnBjPXt9KSl9LGZ1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt2YXIgbjtmdW5jdGlvbiBvKCl7aWYodm9pZCAwIT09bilyZXR1cm4gbjtpZihYTUxIdHRwUmVxdWVzdCl7bj1uZXcgWE1MSHR0cFJlcXVlc3Q7dHJ5e24ub3BlbihcIkdFVFwiLFwiaHR0cHM6Ly9sb2NhbGhvc3RcIil9Y2F0Y2goZSl7fX1yZXR1cm4gbn1mdW5jdGlvbiBzKGUpe3ZhciB0PW8oKTtpZighdClyZXR1cm4hMTt0cnl7cmV0dXJuIHQucmVzcG9uc2VUeXBlPWUsdC5yZXNwb25zZVR5cGU9PT1lfWNhdGNoKGUpe31yZXR1cm4hMX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LnhoclN1cHBvcnRzUmVzcG9uc2VUeXBlPXMsdC5kZXRlY3RNb3pYSFJTdXBwb3J0PWZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0JiZzKFwibW96LWNodW5rZWQtYXJyYXlidWZmZXJcIil9LHQuZGV0ZWN0WEhST3ZlcnJpZGVNaW1lVHlwZVN1cHBvcnQ9ZnVuY3Rpb24oKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3QmJlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcIm92ZXJyaWRlTWltZVR5cGVcIil9fSxmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG4sbz1yKDEpLHM9cig4KTshZnVuY3Rpb24oZSl7ZVtlLkZJTklTSF9TRU5EPTFdPVwiRklOSVNIX1NFTkRcIn0obnx8KG49e30pKTt2YXIgaT1uZXcgVWludDhBcnJheShbMV0pO3QuV2Vic29ja2V0VHJhbnNwb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtlLmRlYnVnJiZvLmRlYnVnKFwid2Vic29ja2V0UmVxdWVzdFwiLGUpO3ZhciB0LHI9ZnVuY3Rpb24oZSl7aWYoXCJodHRwczovL1wiPT09ZS5zdWJzdHIoMCw4KSlyZXR1cm5cIndzczovL1wiK2Uuc3Vic3RyKDgpO2lmKFwiaHR0cDovL1wiPT09ZS5zdWJzdHIoMCw3KSlyZXR1cm5cIndzOi8vXCIrZS5zdWJzdHIoNyk7dGhyb3cgbmV3IEVycm9yKFwiV2Vic29ja2V0IHRyYW5zcG9ydCBjb25zdHJ1Y3RlZCB3aXRoIG5vbi1odHRwczovLyBvciBodHRwOi8vIGhvc3QuXCIpfShlLnVybCksYT1bXTtmdW5jdGlvbiB1KGUpe2lmKGU9PT1uLkZJTklTSF9TRU5EKXQuc2VuZChpKTtlbHNle3ZhciByPWUsbz1uZXcgSW50OEFycmF5KHIuYnl0ZUxlbmd0aCsxKTtvLnNldChuZXcgVWludDhBcnJheShbMF0pKSxvLnNldChyLDEpLHQuc2VuZChvKX19cmV0dXJue3NlbmRNZXNzYWdlOmZ1bmN0aW9uKGUpe3QmJnQucmVhZHlTdGF0ZSE9PXQuQ09OTkVDVElORz91KGUpOmEucHVzaChlKX0sZmluaXNoU2VuZDpmdW5jdGlvbigpe3QmJnQucmVhZHlTdGF0ZSE9PXQuQ09OTkVDVElORz91KG4uRklOSVNIX1NFTkQpOmEucHVzaChuLkZJTklTSF9TRU5EKX0sc3RhcnQ6ZnVuY3Rpb24obil7KHQ9bmV3IFdlYlNvY2tldChyLFtcImdycGMtd2Vic29ja2V0c1wiXSkpLmJpbmFyeVR5cGU9XCJhcnJheWJ1ZmZlclwiLHQub25vcGVuPWZ1bmN0aW9uKCl7dmFyIHI7ZS5kZWJ1ZyYmby5kZWJ1ZyhcIndlYnNvY2tldFJlcXVlc3Qub25vcGVuXCIpLHQuc2VuZCgocj1cIlwiLG4uZm9yRWFjaChmdW5jdGlvbihlLHQpe3IrPWUrXCI6IFwiK3Quam9pbihcIiwgXCIpK1wiXFxyXFxuXCJ9KSxzLmVuY29kZUFTQ0lJKHIpKSksYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UoZSl9KX0sdC5vbmNsb3NlPWZ1bmN0aW9uKHQpe2UuZGVidWcmJm8uZGVidWcoXCJ3ZWJzb2NrZXRSZXF1ZXN0Lm9uY2xvc2VcIix0KSxlLm9uRW5kKCl9LHQub25lcnJvcj1mdW5jdGlvbih0KXtlLmRlYnVnJiZvLmRlYnVnKFwid2Vic29ja2V0UmVxdWVzdC5vbmVycm9yXCIsdCl9LHQub25tZXNzYWdlPWZ1bmN0aW9uKHQpe2Uub25DaHVuayhuZXcgVWludDhBcnJheSh0LmRhdGEpKX19LGNhbmNlbDpmdW5jdGlvbigpe2UuZGVidWcmJm8uZGVidWcoXCJ3ZWJzb2NrZXQuYWJvcnRcIiksdC5jbG9zZSgpfX19KGUpfX19LGZ1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1yKDIpO3QuaW52b2tlPWZ1bmN0aW9uKGUsdCl7aWYoZS5yZXF1ZXN0U3RyZWFtKXRocm93IG5ldyBFcnJvcihcIi5pbnZva2UgY2Fubm90IGJlIHVzZWQgd2l0aCBjbGllbnQtc3RyZWFtaW5nIG1ldGhvZHMuIFVzZSAuY2xpZW50IGluc3RlYWQuXCIpO3ZhciByPW4uY2xpZW50KGUse2hvc3Q6dC5ob3N0LHRyYW5zcG9ydDp0LnRyYW5zcG9ydCxkZWJ1Zzp0LmRlYnVnfSk7cmV0dXJuIHQub25IZWFkZXJzJiZyLm9uSGVhZGVycyh0Lm9uSGVhZGVycyksdC5vbk1lc3NhZ2UmJnIub25NZXNzYWdlKHQub25NZXNzYWdlKSx0Lm9uRW5kJiZyLm9uRW5kKHQub25FbmQpLHIuc3RhcnQodC5tZXRhZGF0YSksci5zZW5kKHQucmVxdWVzdCksci5maW5pc2hTZW5kKCkse2Nsb3NlOmZ1bmN0aW9uKCl7ci5jbG9zZSgpfX19fSxmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5mcmFtZVJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJpYWxpemVCaW5hcnkoKSxyPW5ldyBBcnJheUJ1ZmZlcih0LmJ5dGVMZW5ndGgrNSk7cmV0dXJuIG5ldyBEYXRhVmlldyhyLDEsNCkuc2V0VWludDMyKDAsdC5sZW5ndGgsITEpLG5ldyBVaW50OEFycmF5KHIsNSkuc2V0KHQpLG5ldyBVaW50OEFycmF5KHIpfX0sZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPXIoMCksbz1yKDIpO3QudW5hcnk9ZnVuY3Rpb24oZSx0KXtpZihlLnJlc3BvbnNlU3RyZWFtKXRocm93IG5ldyBFcnJvcihcIi51bmFyeSBjYW5ub3QgYmUgdXNlZCB3aXRoIHNlcnZlci1zdHJlYW1pbmcgbWV0aG9kcy4gVXNlIC5pbnZva2Ugb3IgLmNsaWVudCBpbnN0ZWFkLlwiKTtpZihlLnJlcXVlc3RTdHJlYW0pdGhyb3cgbmV3IEVycm9yKFwiLnVuYXJ5IGNhbm5vdCBiZSB1c2VkIHdpdGggY2xpZW50LXN0cmVhbWluZyBtZXRob2RzLiBVc2UgLmNsaWVudCBpbnN0ZWFkLlwiKTt2YXIgcj1udWxsLHM9bnVsbCxpPW8uY2xpZW50KGUse2hvc3Q6dC5ob3N0LHRyYW5zcG9ydDp0LnRyYW5zcG9ydCxkZWJ1Zzp0LmRlYnVnfSk7cmV0dXJuIGkub25IZWFkZXJzKGZ1bmN0aW9uKGUpe3I9ZX0pLGkub25NZXNzYWdlKGZ1bmN0aW9uKGUpe3M9ZX0pLGkub25FbmQoZnVuY3Rpb24oZSxvLGkpe3Qub25FbmQoe3N0YXR1czplLHN0YXR1c01lc3NhZ2U6byxoZWFkZXJzOnJ8fG5ldyBuLk1ldGFkYXRhLG1lc3NhZ2U6cyx0cmFpbGVyczppfSl9KSxpLnN0YXJ0KHQubWV0YWRhdGEpLGkuc2VuZCh0LnJlcXVlc3QpLGkuZmluaXNoU2VuZCgpLHtjbG9zZTpmdW5jdGlvbigpe2kuY2xvc2UoKX19fX1dKX0pOyIsInZhciAkanNjb21wPSRqc2NvbXB8fHt9OyRqc2NvbXAuc2NvcGU9e307JGpzY29tcC5maW5kSW50ZXJuYWw9ZnVuY3Rpb24oYSxiLGMpe2EgaW5zdGFuY2VvZiBTdHJpbmcmJihhPVN0cmluZyhhKSk7Zm9yKHZhciBkPWEubGVuZ3RoLGU9MDtlPGQ7ZSsrKXt2YXIgZj1hW2VdO2lmKGIuY2FsbChjLGYsZSxhKSlyZXR1cm57aTplLHY6Zn19cmV0dXJue2k6LTEsdjp2b2lkIDB9fTskanNjb21wLkFTU1VNRV9FUzU9ITE7JGpzY29tcC5BU1NVTUVfTk9fTkFUSVZFX01BUD0hMTskanNjb21wLkFTU1VNRV9OT19OQVRJVkVfU0VUPSExOyRqc2NvbXAuU0lNUExFX0ZST1VORF9QT0xZRklMTD0hMTtcbiRqc2NvbXAuZGVmaW5lUHJvcGVydHk9JGpzY29tcC5BU1NVTUVfRVM1fHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYSxiLGMpe2EhPUFycmF5LnByb3RvdHlwZSYmYSE9T2JqZWN0LnByb3RvdHlwZSYmKGFbYl09Yy52YWx1ZSl9OyRqc2NvbXAuZ2V0R2xvYmFsPWZ1bmN0aW9uKGEpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PWE/YTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmF9OyRqc2NvbXAuZ2xvYmFsPSRqc2NvbXAuZ2V0R2xvYmFsKHRoaXMpO1xuJGpzY29tcC5wb2x5ZmlsbD1mdW5jdGlvbihhLGIsYyxkKXtpZihiKXtjPSRqc2NvbXAuZ2xvYmFsO2E9YS5zcGxpdChcIi5cIik7Zm9yKGQ9MDtkPGEubGVuZ3RoLTE7ZCsrKXt2YXIgZT1hW2RdO2UgaW4gY3x8KGNbZV09e30pO2M9Y1tlXX1hPWFbYS5sZW5ndGgtMV07ZD1jW2FdO2I9YihkKTtiIT1kJiZudWxsIT1iJiYkanNjb21wLmRlZmluZVByb3BlcnR5KGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUuZmluZEluZGV4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihhLGMpe3JldHVybiAkanNjb21wLmZpbmRJbnRlcm5hbCh0aGlzLGEsYykuaX19LFwiZXM2XCIsXCJlczNcIik7XG4kanNjb21wLmNoZWNrU3RyaW5nQXJncz1mdW5jdGlvbihhLGIsYyl7aWYobnVsbD09YSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlICd0aGlzJyB2YWx1ZSBmb3IgU3RyaW5nLnByb3RvdHlwZS5cIitjK1wiIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkXCIpO2lmKGIgaW5zdGFuY2VvZiBSZWdFeHApdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuXCIrYytcIiBtdXN0IG5vdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvblwiKTtyZXR1cm4gYStcIlwifTtcbiRqc2NvbXAucG9seWZpbGwoXCJTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihhLGMpe3ZhciBiPSRqc2NvbXAuY2hlY2tTdHJpbmdBcmdzKHRoaXMsYSxcImVuZHNXaXRoXCIpO2ErPVwiXCI7dm9pZCAwPT09YyYmKGM9Yi5sZW5ndGgpO2M9TWF0aC5tYXgoMCxNYXRoLm1pbihjfDAsYi5sZW5ndGgpKTtmb3IodmFyIGU9YS5sZW5ndGg7MDxlJiYwPGM7KWlmKGJbLS1jXSE9YVstLWVdKXJldHVybiExO3JldHVybiAwPj1lfX0sXCJlczZcIixcImVzM1wiKTskanNjb21wLnBvbHlmaWxsKFwiQXJyYXkucHJvdG90eXBlLmZpbmRcIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKGEsYyl7cmV0dXJuICRqc2NvbXAuZmluZEludGVybmFsKHRoaXMsYSxjKS52fX0sXCJlczZcIixcImVzM1wiKTtcbiRqc2NvbXAucG9seWZpbGwoXCJTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGhcIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKGEsYyl7dmFyIGI9JGpzY29tcC5jaGVja1N0cmluZ0FyZ3ModGhpcyxhLFwic3RhcnRzV2l0aFwiKTthKz1cIlwiO3ZhciBlPWIubGVuZ3RoLGY9YS5sZW5ndGg7Yz1NYXRoLm1heCgwLE1hdGgubWluKGN8MCxiLmxlbmd0aCkpO2Zvcih2YXIgZz0wO2c8ZiYmYzxlOylpZihiW2MrK10hPWFbZysrXSlyZXR1cm4hMTtyZXR1cm4gZz49Zn19LFwiZXM2XCIsXCJlczNcIik7XG4kanNjb21wLnBvbHlmaWxsKFwiU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKGEpe3ZhciBiPSRqc2NvbXAuY2hlY2tTdHJpbmdBcmdzKHRoaXMsbnVsbCxcInJlcGVhdFwiKTtpZigwPmF8fDEzNDIxNzcyNzk8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgY291bnQgdmFsdWVcIik7YXw9MDtmb3IodmFyIGQ9XCJcIjthOylpZihhJjEmJihkKz1iKSxhPj4+PTEpYis9YjtyZXR1cm4gZH19LFwiZXM2XCIsXCJlczNcIik7dmFyIENPTVBJTEVEPSEwLGdvb2c9Z29vZ3x8e307Z29vZy5nbG9iYWw9dGhpc3x8c2VsZjtnb29nLmlzRGVmPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDAhPT1hfTtnb29nLmlzU3RyaW5nPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBhfTtnb29nLmlzQm9vbGVhbj1mdW5jdGlvbihhKXtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIGF9O1xuZ29vZy5pc051bWJlcj1mdW5jdGlvbihhKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgYX07Z29vZy5leHBvcnRQYXRoXz1mdW5jdGlvbihhLGIsYyl7YT1hLnNwbGl0KFwiLlwiKTtjPWN8fGdvb2cuZ2xvYmFsO2FbMF1pbiBjfHxcInVuZGVmaW5lZFwiPT10eXBlb2YgYy5leGVjU2NyaXB0fHxjLmV4ZWNTY3JpcHQoXCJ2YXIgXCIrYVswXSk7Zm9yKHZhciBkO2EubGVuZ3RoJiYoZD1hLnNoaWZ0KCkpOykhYS5sZW5ndGgmJmdvb2cuaXNEZWYoYik/Y1tkXT1iOmM9Y1tkXSYmY1tkXSE9PU9iamVjdC5wcm90b3R5cGVbZF0/Y1tkXTpjW2RdPXt9fTtcbmdvb2cuZGVmaW5lPWZ1bmN0aW9uKGEsYil7aWYoIUNPTVBJTEVEKXt2YXIgYz1nb29nLmdsb2JhbC5DTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyxkPWdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUztjJiZ2b2lkIDA9PT1jLm5vZGVUeXBlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYyxhKT9iPWNbYV06ZCYmdm9pZCAwPT09ZC5ub2RlVHlwZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGQsYSkmJihiPWRbYV0pfXJldHVybiBifTtnb29nLkZFQVRVUkVTRVRfWUVBUj0yMDEyO2dvb2cuREVCVUc9ITA7Z29vZy5MT0NBTEU9XCJlblwiO2dvb2cuVFJVU1RFRF9TSVRFPSEwO2dvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRT0hMTtnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFPUNPTVBJTEVEJiYhZ29vZy5ERUJVRztnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkc9ITE7XG5nb29nLnByb3ZpZGU9ZnVuY3Rpb24oYSl7aWYoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKXRocm93IEVycm9yKFwiZ29vZy5wcm92aWRlIGNhbm5vdCBiZSB1c2VkIHdpdGhpbiBhIG1vZHVsZS5cIik7aWYoIUNPTVBJTEVEJiZnb29nLmlzUHJvdmlkZWRfKGEpKXRocm93IEVycm9yKCdOYW1lc3BhY2UgXCInK2ErJ1wiIGFscmVhZHkgZGVjbGFyZWQuJyk7Z29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKGEpfTtnb29nLmNvbnN0cnVjdE5hbWVzcGFjZV89ZnVuY3Rpb24oYSxiKXtpZighQ09NUElMRUQpe2RlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bYV07Zm9yKHZhciBjPWE7KGM9Yy5zdWJzdHJpbmcoMCxjLmxhc3RJbmRleE9mKFwiLlwiKSkpJiYhZ29vZy5nZXRPYmplY3RCeU5hbWUoYyk7KWdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tjXT0hMH1nb29nLmV4cG9ydFBhdGhfKGEsYil9O1xuZ29vZy5nZXRTY3JpcHROb25jZT1mdW5jdGlvbihhKXtpZihhJiZhIT1nb29nLmdsb2JhbClyZXR1cm4gZ29vZy5nZXRTY3JpcHROb25jZV8oYS5kb2N1bWVudCk7bnVsbD09PWdvb2cuY3NwTm9uY2VfJiYoZ29vZy5jc3BOb25jZV89Z29vZy5nZXRTY3JpcHROb25jZV8oZ29vZy5nbG9iYWwuZG9jdW1lbnQpKTtyZXR1cm4gZ29vZy5jc3BOb25jZV99O2dvb2cuTk9OQ0VfUEFUVEVSTl89L15bXFx3Ky9fLV0rWz1dezAsMn0kLztnb29nLmNzcE5vbmNlXz1udWxsO2dvb2cuZ2V0U2NyaXB0Tm9uY2VfPWZ1bmN0aW9uKGEpe3JldHVybihhPWEucXVlcnlTZWxlY3RvciYmYS5xdWVyeVNlbGVjdG9yKFwic2NyaXB0W25vbmNlXVwiKSkmJihhPWEubm9uY2V8fGEuZ2V0QXR0cmlidXRlKFwibm9uY2VcIikpJiZnb29nLk5PTkNFX1BBVFRFUk5fLnRlc3QoYSk/YTpcIlwifTtnb29nLlZBTElEX01PRFVMRV9SRV89L15bYS16QS1aXyRdW2EtekEtWjAtOS5fJF0qJC87XG5nb29nLm1vZHVsZT1mdW5jdGlvbihhKXtpZighZ29vZy5pc1N0cmluZyhhKXx8IWF8fC0xPT1hLnNlYXJjaChnb29nLlZBTElEX01PRFVMRV9SRV8pKXRocm93IEVycm9yKFwiSW52YWxpZCBtb2R1bGUgaWRlbnRpZmllclwiKTtpZighZ29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl8oKSl0aHJvdyBFcnJvcihcIk1vZHVsZSBcIithK1wiIGhhcyBiZWVuIGxvYWRlZCBpbmNvcnJlY3RseS4gTm90ZSwgbW9kdWxlcyBjYW5ub3QgYmUgbG9hZGVkIGFzIG5vcm1hbCBzY3JpcHRzLiBUaGV5IHJlcXVpcmUgc29tZSBraW5kIG9mIHByZS1wcm9jZXNzaW5nIHN0ZXAuIFlvdSdyZSBsaWtlbHkgdHJ5aW5nIHRvIGxvYWQgYSBtb2R1bGUgdmlhIGEgc2NyaXB0IHRhZyBvciBhcyBhIHBhcnQgb2YgYSBjb25jYXRlbmF0ZWQgYnVuZGxlIHdpdGhvdXQgcmV3cml0aW5nIHRoZSBtb2R1bGUuIEZvciBtb3JlIGluZm8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS93aWtpL2dvb2cubW9kdWxlOi1hbi1FUzYtbW9kdWxlLWxpa2UtYWx0ZXJuYXRpdmUtdG8tZ29vZy5wcm92aWRlLlwiKTtcbmlmKGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpdGhyb3cgRXJyb3IoXCJnb29nLm1vZHVsZSBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlLlwiKTtnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lPWE7aWYoIUNPTVBJTEVEKXtpZihnb29nLmlzUHJvdmlkZWRfKGEpKXRocm93IEVycm9yKCdOYW1lc3BhY2UgXCInK2ErJ1wiIGFscmVhZHkgZGVjbGFyZWQuJyk7ZGVsZXRlIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1thXX19O2dvb2cubW9kdWxlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKGEpfTtcbmdvb2cubW9kdWxlLmdldEludGVybmFsXz1mdW5jdGlvbihhKXtpZighQ09NUElMRUQpe2lmKGEgaW4gZ29vZy5sb2FkZWRNb2R1bGVzXylyZXR1cm4gZ29vZy5sb2FkZWRNb2R1bGVzX1thXS5leHBvcnRzO2lmKCFnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bYV0pcmV0dXJuIGE9Z29vZy5nZXRPYmplY3RCeU5hbWUoYSksbnVsbCE9YT9hOm51bGx9cmV0dXJuIG51bGx9O2dvb2cuTW9kdWxlVHlwZT17RVM2OlwiZXM2XCIsR09PRzpcImdvb2dcIn07Z29vZy5tb2R1bGVMb2FkZXJTdGF0ZV89bnVsbDtnb29nLmlzSW5Nb2R1bGVMb2FkZXJfPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cuaXNJbkdvb2dNb2R1bGVMb2FkZXJfKCl8fGdvb2cuaXNJbkVzNk1vZHVsZUxvYWRlcl8oKX07Z29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl89ZnVuY3Rpb24oKXtyZXR1cm4hIWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfJiZnb29nLm1vZHVsZUxvYWRlclN0YXRlXy50eXBlPT1nb29nLk1vZHVsZVR5cGUuR09PR307XG5nb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfPWZ1bmN0aW9uKCl7aWYoZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8mJmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGU9PWdvb2cuTW9kdWxlVHlwZS5FUzYpcmV0dXJuITA7dmFyIGE9Z29vZy5nbG9iYWwuJGpzY29tcDtyZXR1cm4gYT9cImZ1bmN0aW9uXCIhPXR5cGVvZiBhLmdldEN1cnJlbnRNb2R1bGVQYXRoPyExOiEhYS5nZXRDdXJyZW50TW9kdWxlUGF0aCgpOiExfTtcbmdvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2U9ZnVuY3Rpb24oKXtpZighQ09NUElMRUQmJiFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKXRocm93IEVycm9yKFwiZ29vZy5tb2R1bGUuZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZSBtdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGdvb2cubW9kdWxlXCIpO2lmKCFDT01QSUxFRCYmIWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpdGhyb3cgRXJyb3IoXCJnb29nLm1vZHVsZSBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlLlwiKTtnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlPSEwfTtcbmdvb2cuZGVjbGFyZU1vZHVsZUlkPWZ1bmN0aW9uKGEpe2lmKCFDT01QSUxFRCl7aWYoIWdvb2cuaXNJbkVzNk1vZHVsZUxvYWRlcl8oKSl0aHJvdyBFcnJvcihcImdvb2cuZGVjbGFyZU1vZHVsZUlkIG1heSBvbmx5IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBFUzYgbW9kdWxlXCIpO2lmKGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfJiZnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKXRocm93IEVycm9yKFwiZ29vZy5kZWNsYXJlTW9kdWxlSWQgbWF5IG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIG1vZHVsZS5cIik7aWYoYSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKXRocm93IEVycm9yKCdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgXCInK2ErJ1wiIGFscmVhZHkgZXhpc3RzLicpO31pZihnb29nLm1vZHVsZUxvYWRlclN0YXRlXylnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lPWE7ZWxzZXt2YXIgYj1nb29nLmdsb2JhbC4kanNjb21wO2lmKCFifHxcImZ1bmN0aW9uXCIhPXR5cGVvZiBiLmdldEN1cnJlbnRNb2R1bGVQYXRoKXRocm93IEVycm9yKCdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgXCInK1xuYSsnXCIgaGFzIGJlZW4gbG9hZGVkIGluY29ycmVjdGx5LicpO2I9Yi5yZXF1aXJlKGIuZ2V0Q3VycmVudE1vZHVsZVBhdGgoKSk7Z29vZy5sb2FkZWRNb2R1bGVzX1thXT17ZXhwb3J0czpiLHR5cGU6Z29vZy5Nb2R1bGVUeXBlLkVTNixtb2R1bGVJZDphfX19O2dvb2cuc2V0VGVzdE9ubHk9ZnVuY3Rpb24oYSl7aWYoZ29vZy5ESVNBTExPV19URVNUX09OTFlfQ09ERSl0aHJvdyBhPWF8fFwiXCIsRXJyb3IoXCJJbXBvcnRpbmcgdGVzdC1vbmx5IGNvZGUgaW50byBub24tZGVidWcgZW52aXJvbm1lbnRcIisoYT9cIjogXCIrYTpcIi5cIikpO307Z29vZy5mb3J3YXJkRGVjbGFyZT1mdW5jdGlvbihhKXt9O1xuQ09NUElMRUR8fChnb29nLmlzUHJvdmlkZWRfPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluIGdvb2cubG9hZGVkTW9kdWxlc198fCFnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bYV0mJmdvb2cuaXNEZWZBbmROb3ROdWxsKGdvb2cuZ2V0T2JqZWN0QnlOYW1lKGEpKX0sZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfPXtcImdvb2cubW9kdWxlXCI6ITB9KTtnb29nLmdldE9iamVjdEJ5TmFtZT1mdW5jdGlvbihhLGIpe2E9YS5zcGxpdChcIi5cIik7Yj1ifHxnb29nLmdsb2JhbDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZihiPWJbYVtjXV0sIWdvb2cuaXNEZWZBbmROb3ROdWxsKGIpKXJldHVybiBudWxsO3JldHVybiBifTtnb29nLmdsb2JhbGl6ZT1mdW5jdGlvbihhLGIpe2I9Ynx8Z29vZy5nbG9iYWw7Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdfTtcbmdvb2cuYWRkRGVwZW5kZW5jeT1mdW5jdGlvbihhLGIsYyxkKXshQ09NUElMRUQmJmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQmJmdvb2cuZGVidWdMb2FkZXJfLmFkZERlcGVuZGVuY3koYSxiLGMsZCl9O2dvb2cuRU5BQkxFX0RFQlVHX0xPQURFUj0hMDtnb29nLmxvZ1RvQ29uc29sZV89ZnVuY3Rpb24oYSl7Z29vZy5nbG9iYWwuY29uc29sZSYmZ29vZy5nbG9iYWwuY29uc29sZS5lcnJvcihhKX07XG5nb29nLnJlcXVpcmU9ZnVuY3Rpb24oYSl7aWYoIUNPTVBJTEVEKXtnb29nLkVOQUJMRV9ERUJVR19MT0FERVImJmdvb2cuZGVidWdMb2FkZXJfLnJlcXVlc3RlZChhKTtpZihnb29nLmlzUHJvdmlkZWRfKGEpKXtpZihnb29nLmlzSW5Nb2R1bGVMb2FkZXJfKCkpcmV0dXJuIGdvb2cubW9kdWxlLmdldEludGVybmFsXyhhKX1lbHNlIGlmKGdvb2cuRU5BQkxFX0RFQlVHX0xPQURFUil7dmFyIGI9Z29vZy5tb2R1bGVMb2FkZXJTdGF0ZV87Z29vZy5tb2R1bGVMb2FkZXJTdGF0ZV89bnVsbDt0cnl7Z29vZy5kZWJ1Z0xvYWRlcl8ubG9hZF8oYSl9ZmluYWxseXtnb29nLm1vZHVsZUxvYWRlclN0YXRlXz1ifX1yZXR1cm4gbnVsbH19O2dvb2cucmVxdWlyZVR5cGU9ZnVuY3Rpb24oYSl7cmV0dXJue319O2dvb2cuYmFzZVBhdGg9XCJcIjtnb29nLm51bGxGdW5jdGlvbj1mdW5jdGlvbigpe307XG5nb29nLmFic3RyYWN0TWV0aG9kPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoXCJ1bmltcGxlbWVudGVkIGFic3RyYWN0IG1ldGhvZFwiKTt9O2dvb2cuYWRkU2luZ2xldG9uR2V0dGVyPWZ1bmN0aW9uKGEpe2EuaW5zdGFuY2VfPXZvaWQgMDthLmdldEluc3RhbmNlPWZ1bmN0aW9uKCl7aWYoYS5pbnN0YW5jZV8pcmV0dXJuIGEuaW5zdGFuY2VfO2dvb2cuREVCVUcmJihnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfW2dvb2cuaW5zdGFudGlhdGVkU2luZ2xldG9uc18ubGVuZ3RoXT1hKTtyZXR1cm4gYS5pbnN0YW5jZV89bmV3IGF9fTtnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfPVtdO2dvb2cuTE9BRF9NT0RVTEVfVVNJTkdfRVZBTD0hMDtnb29nLlNFQUxfTU9EVUxFX0VYUE9SVFM9Z29vZy5ERUJVRztnb29nLmxvYWRlZE1vZHVsZXNfPXt9O2dvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQ9IUNPTVBJTEVEJiZnb29nLkVOQUJMRV9ERUJVR19MT0FERVI7Z29vZy5UUkFOU1BJTEU9XCJkZXRlY3RcIjtcbmdvb2cuQVNTVU1FX0VTX01PRFVMRVNfVFJBTlNQSUxFRD0hMTtnb29nLlRSQU5TUElMRV9UT19MQU5HVUFHRT1cIlwiO2dvb2cuVFJBTlNQSUxFUj1cInRyYW5zcGlsZS5qc1wiO2dvb2cuaGFzQmFkTGV0U2NvcGluZz1udWxsO2dvb2cudXNlU2FmYXJpMTBXb3JrYXJvdW5kPWZ1bmN0aW9uKCl7aWYobnVsbD09Z29vZy5oYXNCYWRMZXRTY29waW5nKXt0cnl7dmFyIGE9IWV2YWwoJ1widXNlIHN0cmljdFwiO2xldCB4ID0gMTsgZnVuY3Rpb24gZigpIHsgcmV0dXJuIHR5cGVvZiB4OyB9O2YoKSA9PSBcIm51bWJlclwiOycpfWNhdGNoKGIpe2E9ITF9Z29vZy5oYXNCYWRMZXRTY29waW5nPWF9cmV0dXJuIGdvb2cuaGFzQmFkTGV0U2NvcGluZ307Z29vZy53b3JrYXJvdW5kU2FmYXJpMTBFdmFsQnVnPWZ1bmN0aW9uKGEpe3JldHVyblwiKGZ1bmN0aW9uKCl7XCIrYStcIlxcbjt9KSgpO1xcblwifTtcbmdvb2cubG9hZE1vZHVsZT1mdW5jdGlvbihhKXt2YXIgYj1nb29nLm1vZHVsZUxvYWRlclN0YXRlXzt0cnl7Z29vZy5tb2R1bGVMb2FkZXJTdGF0ZV89e21vZHVsZU5hbWU6XCJcIixkZWNsYXJlTGVnYWN5TmFtZXNwYWNlOiExLHR5cGU6Z29vZy5Nb2R1bGVUeXBlLkdPT0d9O2lmKGdvb2cuaXNGdW5jdGlvbihhKSl2YXIgYz1hLmNhbGwodm9pZCAwLHt9KTtlbHNlIGlmKGdvb2cuaXNTdHJpbmcoYSkpZ29vZy51c2VTYWZhcmkxMFdvcmthcm91bmQoKSYmKGE9Z29vZy53b3JrYXJvdW5kU2FmYXJpMTBFdmFsQnVnKGEpKSxjPWdvb2cubG9hZE1vZHVsZUZyb21Tb3VyY2VfLmNhbGwodm9pZCAwLGEpO2Vsc2UgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIG1vZHVsZSBkZWZpbml0aW9uXCIpO3ZhciBkPWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWU7aWYoZ29vZy5pc1N0cmluZyhkKSYmZClnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlP2dvb2cuY29uc3RydWN0TmFtZXNwYWNlXyhkLFxuYyk6Z29vZy5TRUFMX01PRFVMRV9FWFBPUlRTJiZPYmplY3Quc2VhbCYmXCJvYmplY3RcIj09dHlwZW9mIGMmJm51bGwhPWMmJk9iamVjdC5zZWFsKGMpLGdvb2cubG9hZGVkTW9kdWxlc19bZF09e2V4cG9ydHM6Yyx0eXBlOmdvb2cuTW9kdWxlVHlwZS5HT09HLG1vZHVsZUlkOmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWV9O2Vsc2UgdGhyb3cgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIG5hbWUgXCInK2QrJ1wiJyk7fWZpbmFsbHl7Z29vZy5tb2R1bGVMb2FkZXJTdGF0ZV89Yn19O2dvb2cubG9hZE1vZHVsZUZyb21Tb3VyY2VfPWZ1bmN0aW9uKGEpe2V2YWwoYSk7cmV0dXJue319O2dvb2cubm9ybWFsaXplUGF0aF89ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KFwiL1wiKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoOylcIi5cIj09YVtiXT9hLnNwbGljZShiLDEpOmImJlwiLi5cIj09YVtiXSYmYVtiLTFdJiZcIi4uXCIhPWFbYi0xXT9hLnNwbGljZSgtLWIsMik6YisrO3JldHVybiBhLmpvaW4oXCIvXCIpfTtcbmdvb2cubG9hZEZpbGVTeW5jXz1mdW5jdGlvbihhKXtpZihnb29nLmdsb2JhbC5DTE9TVVJFX0xPQURfRklMRV9TWU5DKXJldHVybiBnb29nLmdsb2JhbC5DTE9TVVJFX0xPQURfRklMRV9TWU5DKGEpO3RyeXt2YXIgYj1uZXcgZ29vZy5nbG9iYWwuWE1MSHR0cFJlcXVlc3Q7Yi5vcGVuKFwiZ2V0XCIsYSwhMSk7Yi5zZW5kKCk7cmV0dXJuIDA9PWIuc3RhdHVzfHwyMDA9PWIuc3RhdHVzP2IucmVzcG9uc2VUZXh0Om51bGx9Y2F0Y2goYyl7cmV0dXJuIG51bGx9fTtcbmdvb2cudHJhbnNwaWxlXz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9Z29vZy5nbG9iYWwuJGpzY29tcDtkfHwoZ29vZy5nbG9iYWwuJGpzY29tcD1kPXt9KTt2YXIgZT1kLnRyYW5zcGlsZTtpZighZSl7dmFyIGY9Z29vZy5iYXNlUGF0aCtnb29nLlRSQU5TUElMRVIsZz1nb29nLmxvYWRGaWxlU3luY18oZik7aWYoZyl7KGZ1bmN0aW9uKCl7KDAsZXZhbCkoZytcIlxcbi8vIyBzb3VyY2VVUkw9XCIrZil9KS5jYWxsKGdvb2cuZ2xvYmFsKTtpZihnb29nLmdsb2JhbC4kZ3d0RXhwb3J0JiZnb29nLmdsb2JhbC4kZ3d0RXhwb3J0LiRqc2NvbXAmJiFnb29nLmdsb2JhbC4kZ3d0RXhwb3J0LiRqc2NvbXAudHJhbnNwaWxlKXRocm93IEVycm9yKCdUaGUgdHJhbnNwaWxlciBkaWQgbm90IHByb3Blcmx5IGV4cG9ydCB0aGUgXCJ0cmFuc3BpbGVcIiBtZXRob2QuICRnd3RFeHBvcnQ6ICcrSlNPTi5zdHJpbmdpZnkoZ29vZy5nbG9iYWwuJGd3dEV4cG9ydCkpO2dvb2cuZ2xvYmFsLiRqc2NvbXAudHJhbnNwaWxlPVxuZ29vZy5nbG9iYWwuJGd3dEV4cG9ydC4kanNjb21wLnRyYW5zcGlsZTtkPWdvb2cuZ2xvYmFsLiRqc2NvbXA7ZT1kLnRyYW5zcGlsZX19ZXx8KGU9ZC50cmFuc3BpbGU9ZnVuY3Rpb24oYSxiKXtnb29nLmxvZ1RvQ29uc29sZV8oYitcIiByZXF1aXJlcyB0cmFuc3BpbGF0aW9uIGJ1dCBubyB0cmFuc3BpbGVyIHdhcyBmb3VuZC5cIik7cmV0dXJuIGF9KTtyZXR1cm4gZShhLGIsYyl9O1xuZ29vZy50eXBlT2Y9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7aWYoXCJvYmplY3RcIj09YilpZihhKXtpZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuXCJhcnJheVwiO2lmKGEgaW5zdGFuY2VvZiBPYmplY3QpcmV0dXJuIGI7dmFyIGM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpO2lmKFwiW29iamVjdCBXaW5kb3ddXCI9PWMpcmV0dXJuXCJvYmplY3RcIjtpZihcIltvYmplY3QgQXJyYXldXCI9PWN8fFwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aCYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGEuc3BsaWNlJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoXCJzcGxpY2VcIikpcmV0dXJuXCJhcnJheVwiO2lmKFwiW29iamVjdCBGdW5jdGlvbl1cIj09Y3x8XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGEuY2FsbCYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGEucHJvcGVydHlJc0VudW1lcmFibGUmJiFhLnByb3BlcnR5SXNFbnVtZXJhYmxlKFwiY2FsbFwiKSlyZXR1cm5cImZ1bmN0aW9uXCJ9ZWxzZSByZXR1cm5cIm51bGxcIjtcbmVsc2UgaWYoXCJmdW5jdGlvblwiPT1iJiZcInVuZGVmaW5lZFwiPT10eXBlb2YgYS5jYWxsKXJldHVyblwib2JqZWN0XCI7cmV0dXJuIGJ9O2dvb2cuaXNOdWxsPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YX07Z29vZy5pc0RlZkFuZE5vdE51bGw9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWF9O2dvb2cuaXNBcnJheT1mdW5jdGlvbihhKXtyZXR1cm5cImFycmF5XCI9PWdvb2cudHlwZU9mKGEpfTtnb29nLmlzQXJyYXlMaWtlPWZ1bmN0aW9uKGEpe3ZhciBiPWdvb2cudHlwZU9mKGEpO3JldHVyblwiYXJyYXlcIj09Ynx8XCJvYmplY3RcIj09YiYmXCJudW1iZXJcIj09dHlwZW9mIGEubGVuZ3RofTtnb29nLmlzRGF0ZUxpa2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuaXNPYmplY3QoYSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuZ2V0RnVsbFllYXJ9O2dvb2cuaXNGdW5jdGlvbj1mdW5jdGlvbihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PWdvb2cudHlwZU9mKGEpfTtcbmdvb2cuaXNPYmplY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuXCJvYmplY3RcIj09YiYmbnVsbCE9YXx8XCJmdW5jdGlvblwiPT1ifTtnb29nLmdldFVpZD1mdW5jdGlvbihhKXtyZXR1cm4gYVtnb29nLlVJRF9QUk9QRVJUWV9dfHwoYVtnb29nLlVJRF9QUk9QRVJUWV9dPSsrZ29vZy51aWRDb3VudGVyXyl9O2dvb2cuaGFzVWlkPWZ1bmN0aW9uKGEpe3JldHVybiEhYVtnb29nLlVJRF9QUk9QRVJUWV9dfTtnb29nLnJlbW92ZVVpZD1mdW5jdGlvbihhKXtudWxsIT09YSYmXCJyZW1vdmVBdHRyaWJ1dGVcImluIGEmJmEucmVtb3ZlQXR0cmlidXRlKGdvb2cuVUlEX1BST1BFUlRZXyk7dHJ5e2RlbGV0ZSBhW2dvb2cuVUlEX1BST1BFUlRZX119Y2F0Y2goYil7fX07Z29vZy5VSURfUFJPUEVSVFlfPVwiY2xvc3VyZV91aWRfXCIrKDFFOSpNYXRoLnJhbmRvbSgpPj4+MCk7Z29vZy51aWRDb3VudGVyXz0wO2dvb2cuZ2V0SGFzaENvZGU9Z29vZy5nZXRVaWQ7XG5nb29nLnJlbW92ZUhhc2hDb2RlPWdvb2cucmVtb3ZlVWlkO2dvb2cuY2xvbmVPYmplY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9Z29vZy50eXBlT2YoYSk7aWYoXCJvYmplY3RcIj09Ynx8XCJhcnJheVwiPT1iKXtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYS5jbG9uZSlyZXR1cm4gYS5jbG9uZSgpO2I9XCJhcnJheVwiPT1iP1tdOnt9O2Zvcih2YXIgYyBpbiBhKWJbY109Z29vZy5jbG9uZU9iamVjdChhW2NdKTtyZXR1cm4gYn1yZXR1cm4gYX07Z29vZy5iaW5kTmF0aXZlXz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuY2FsbC5hcHBseShhLmJpbmQsYXJndW1lbnRzKX07XG5nb29nLmJpbmRKc189ZnVuY3Rpb24oYSxiLGMpe2lmKCFhKXRocm93IEVycm9yKCk7aWYoMjxhcmd1bWVudHMubGVuZ3RoKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShjLGQpO3JldHVybiBhLmFwcGx5KGIsYyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19O2dvb2cuYmluZD1mdW5jdGlvbihhLGIsYyl7RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQmJi0xIT1GdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoXCJuYXRpdmUgY29kZVwiKT9nb29nLmJpbmQ9Z29vZy5iaW5kTmF0aXZlXzpnb29nLmJpbmQ9Z29vZy5iaW5kSnNfO3JldHVybiBnb29nLmJpbmQuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtcbmdvb2cucGFydGlhbD1mdW5jdGlvbihhLGIpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYj1jLnNsaWNlKCk7Yi5wdXNoLmFwcGx5KGIsYXJndW1lbnRzKTtyZXR1cm4gYS5hcHBseSh0aGlzLGIpfX07Z29vZy5taXhpbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBiKWFbY109YltjXX07Z29vZy5ub3c9Z29vZy5UUlVTVEVEX1NJVEUmJkRhdGUubm93fHxmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX07XG5nb29nLmdsb2JhbEV2YWw9ZnVuY3Rpb24oYSl7aWYoZ29vZy5nbG9iYWwuZXhlY1NjcmlwdClnb29nLmdsb2JhbC5leGVjU2NyaXB0KGEsXCJKYXZhU2NyaXB0XCIpO2Vsc2UgaWYoZ29vZy5nbG9iYWwuZXZhbCl7aWYobnVsbD09Z29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyl7dHJ5e2dvb2cuZ2xvYmFsLmV2YWwoXCJ2YXIgX2V2YWxUZXN0XyA9IDE7XCIpfWNhdGNoKGQpe31pZihcInVuZGVmaW5lZFwiIT10eXBlb2YgZ29vZy5nbG9iYWwuX2V2YWxUZXN0Xyl7dHJ5e2RlbGV0ZSBnb29nLmdsb2JhbC5fZXZhbFRlc3RffWNhdGNoKGQpe31nb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfPSEwfWVsc2UgZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXz0hMX1pZihnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfKWdvb2cuZ2xvYmFsLmV2YWwoYSk7ZWxzZXt2YXIgYj1nb29nLmdsb2JhbC5kb2N1bWVudCxjPWIuY3JlYXRlRWxlbWVudChcIlNDUklQVFwiKTtjLnR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIjtjLmRlZmVyPVxuITE7Yy5hcHBlbmRDaGlsZChiLmNyZWF0ZVRleHROb2RlKGEpKTtiLmhlYWQuYXBwZW5kQ2hpbGQoYyk7Yi5oZWFkLnJlbW92ZUNoaWxkKGMpfX1lbHNlIHRocm93IEVycm9yKFwiZ29vZy5nbG9iYWxFdmFsIG5vdCBhdmFpbGFibGVcIik7fTtnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfPW51bGw7XG5nb29nLmdldENzc05hbWU9ZnVuY3Rpb24oYSxiKXtpZihcIi5cIj09U3RyaW5nKGEpLmNoYXJBdCgwKSl0aHJvdyBFcnJvcignY2xhc3NOYW1lIHBhc3NlZCBpbiBnb29nLmdldENzc05hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCBcIi5cIi4gWW91IHBhc3NlZDogJythKTt2YXIgYz1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5jc3NOYW1lTWFwcGluZ19bYV18fGF9LGQ9ZnVuY3Rpb24oYSl7YT1hLnNwbGl0KFwiLVwiKTtmb3IodmFyIGI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKWIucHVzaChjKGFbZF0pKTtyZXR1cm4gYi5qb2luKFwiLVwiKX07ZD1nb29nLmNzc05hbWVNYXBwaW5nXz9cIkJZX1dIT0xFXCI9PWdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV8/YzpkOmZ1bmN0aW9uKGEpe3JldHVybiBhfTthPWI/YStcIi1cIitkKGIpOmQoYSk7cmV0dXJuIGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQX0ZOP2dvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQX0ZOKGEpOmF9O1xuZ29vZy5zZXRDc3NOYW1lTWFwcGluZz1mdW5jdGlvbihhLGIpe2dvb2cuY3NzTmFtZU1hcHBpbmdfPWE7Z29vZy5jc3NOYW1lTWFwcGluZ1N0eWxlXz1ifTshQ09NUElMRUQmJmdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORyYmKGdvb2cuY3NzTmFtZU1hcHBpbmdfPWdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORyk7Z29vZy5nZXRNc2c9ZnVuY3Rpb24oYSxiLGMpe2MmJmMuaHRtbCYmKGE9YS5yZXBsYWNlKC88L2csXCImbHQ7XCIpKTtiJiYoYT1hLnJlcGxhY2UoL1xce1xcJChbXn1dKyl9L2csZnVuY3Rpb24oYSxjKXtyZXR1cm4gbnVsbCE9YiYmYyBpbiBiP2JbY106YX0pKTtyZXR1cm4gYX07Z29vZy5nZXRNc2dXaXRoRmFsbGJhY2s9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYX07Z29vZy5leHBvcnRTeW1ib2w9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuZXhwb3J0UGF0aF8oYSxiLGMpfTtcbmdvb2cuZXhwb3J0UHJvcGVydHk9ZnVuY3Rpb24oYSxiLGMpe2FbYl09Y307Z29vZy5pbmhlcml0cz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9Yi5wcm90b3R5cGU7YS5zdXBlckNsYXNzXz1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EuYmFzZT1mdW5jdGlvbihhLGMsZil7Zm9yKHZhciBkPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMiksZT0yO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspZFtlLTJdPWFyZ3VtZW50c1tlXTtyZXR1cm4gYi5wcm90b3R5cGVbY10uYXBwbHkoYSxkKX19O1xuZ29vZy5iYXNlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hcmd1bWVudHMuY2FsbGVlLmNhbGxlcjtpZihnb29nLlNUUklDVF9NT0RFX0NPTVBBVElCTEV8fGdvb2cuREVCVUcmJiFkKXRocm93IEVycm9yKFwiYXJndW1lbnRzLmNhbGxlciBub3QgZGVmaW5lZC4gIGdvb2cuYmFzZSgpIGNhbm5vdCBiZSB1c2VkIHdpdGggc3RyaWN0IG1vZGUgY29kZS4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy1DXCIpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgZC5zdXBlckNsYXNzXyl7Zm9yKHZhciBlPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZj0xO2Y8YXJndW1lbnRzLmxlbmd0aDtmKyspZVtmLTFdPWFyZ3VtZW50c1tmXTtyZXR1cm4gZC5zdXBlckNsYXNzXy5jb25zdHJ1Y3Rvci5hcHBseShhLGUpfWlmKFwic3RyaW5nXCIhPXR5cGVvZiBiJiZcInN5bWJvbFwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcIm1ldGhvZCBuYW1lcyBwcm92aWRlZCB0byBnb29nLmJhc2UgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbFwiKTtcbmU9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC0yKTtmb3IoZj0yO2Y8YXJndW1lbnRzLmxlbmd0aDtmKyspZVtmLTJdPWFyZ3VtZW50c1tmXTtmPSExO2Zvcih2YXIgZz1hLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtnO2c9T2JqZWN0LmdldFByb3RvdHlwZU9mKGcpKWlmKGdbYl09PT1kKWY9ITA7ZWxzZSBpZihmKXJldHVybiBnW2JdLmFwcGx5KGEsZSk7aWYoYVtiXT09PWQpcmV0dXJuIGEuY29uc3RydWN0b3IucHJvdG90eXBlW2JdLmFwcGx5KGEsZSk7dGhyb3cgRXJyb3IoXCJnb29nLmJhc2UgY2FsbGVkIGZyb20gYSBtZXRob2Qgb2Ygb25lIG5hbWUgdG8gYSBtZXRob2Qgb2YgYSBkaWZmZXJlbnQgbmFtZVwiKTt9O2dvb2cuc2NvcGU9ZnVuY3Rpb24oYSl7aWYoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKXRocm93IEVycm9yKFwiZ29vZy5zY29wZSBpcyBub3Qgc3VwcG9ydGVkIHdpdGhpbiBhIG1vZHVsZS5cIik7YS5jYWxsKGdvb2cuZ2xvYmFsKX07XG5DT01QSUxFRHx8KGdvb2cuZ2xvYmFsLkNPTVBJTEVEPUNPTVBJTEVEKTtnb29nLmRlZmluZUNsYXNzPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5jb25zdHJ1Y3RvcixkPWIuc3RhdGljcztjJiZjIT1PYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yfHwoYz1mdW5jdGlvbigpe3Rocm93IEVycm9yKFwiY2Fubm90IGluc3RhbnRpYXRlIGFuIGludGVyZmFjZSAobm8gY29uc3RydWN0b3IgZGVmaW5lZCkuXCIpO30pO2M9Z29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfKGMsYSk7YSYmZ29vZy5pbmhlcml0cyhjLGEpO2RlbGV0ZSBiLmNvbnN0cnVjdG9yO2RlbGV0ZSBiLnN0YXRpY3M7Z29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfKGMucHJvdG90eXBlLGIpO251bGwhPWQmJihkIGluc3RhbmNlb2YgRnVuY3Rpb24/ZChjKTpnb29nLmRlZmluZUNsYXNzLmFwcGx5UHJvcGVydGllc18oYyxkKSk7cmV0dXJuIGN9O1xuZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUz1nb29nLkRFQlVHO2dvb2cuZGVmaW5lQ2xhc3MuY3JlYXRlU2VhbGluZ0NvbnN0cnVjdG9yXz1mdW5jdGlvbihhLGIpe2lmKCFnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTKXJldHVybiBhO3ZhciBjPSFnb29nLmRlZmluZUNsYXNzLmlzVW5zZWFsYWJsZV8oYiksZD1mdW5jdGlvbigpe3ZhciBiPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO2JbZ29vZy5VSURfUFJPUEVSVFlfXT1iW2dvb2cuVUlEX1BST1BFUlRZX107dGhpcy5jb25zdHJ1Y3Rvcj09PWQmJmMmJk9iamVjdC5zZWFsIGluc3RhbmNlb2YgRnVuY3Rpb24mJk9iamVjdC5zZWFsKGIpO3JldHVybiBifTtyZXR1cm4gZH07Z29vZy5kZWZpbmVDbGFzcy5pc1Vuc2VhbGFibGVfPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLnByb3RvdHlwZSYmYS5wcm90b3R5cGVbZ29vZy5VTlNFQUxBQkxFX0NPTlNUUlVDVE9SX1BST1BFUlRZX119O1xuZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU189XCJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2ZcIi5zcGxpdChcIiBcIik7Z29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsYykmJihhW2NdPWJbY10pO2Zvcih2YXIgZD0wO2Q8Z29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoO2QrKyljPWdvb2cuZGVmaW5lQ2xhc3MuT0JKRUNUX1BST1RPVFlQRV9GSUVMRFNfW2RdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLGMpJiYoYVtjXT1iW2NdKX07XG5nb29nLnRhZ1Vuc2VhbGFibGVDbGFzcz1mdW5jdGlvbihhKXshQ09NUElMRUQmJmdvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMmJihhLnByb3RvdHlwZVtnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfXT0hMCl9O2dvb2cuVU5TRUFMQUJMRV9DT05TVFJVQ1RPUl9QUk9QRVJUWV89XCJnb29nX2RlZmluZUNsYXNzX2xlZ2FjeV91bnNlYWxhYmxlXCI7XG4hQ09NUElMRUQmJmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQmJihnb29nLmluSHRtbERvY3VtZW50Xz1mdW5jdGlvbigpe3ZhciBhPWdvb2cuZ2xvYmFsLmRvY3VtZW50O3JldHVybiBudWxsIT1hJiZcIndyaXRlXCJpbiBhfSxnb29nLmlzRG9jdW1lbnRMb2FkaW5nXz1mdW5jdGlvbigpe3ZhciBhPWdvb2cuZ2xvYmFsLmRvY3VtZW50O3JldHVybiBhLmF0dGFjaEV2ZW50P1wiY29tcGxldGVcIiE9YS5yZWFkeVN0YXRlOlwibG9hZGluZ1wiPT1hLnJlYWR5U3RhdGV9LGdvb2cuZmluZEJhc2VQYXRoXz1mdW5jdGlvbigpe2lmKGdvb2cuaXNEZWYoZ29vZy5nbG9iYWwuQ0xPU1VSRV9CQVNFX1BBVEgpJiZnb29nLmlzU3RyaW5nKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIKSlnb29nLmJhc2VQYXRoPWdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIO2Vsc2UgaWYoZ29vZy5pbkh0bWxEb2N1bWVudF8oKSl7dmFyIGE9Z29vZy5nbG9iYWwuZG9jdW1lbnQsYj1hLmN1cnJlbnRTY3JpcHQ7XG5hPWI/W2JdOmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJTQ1JJUFRcIik7Zm9yKGI9YS5sZW5ndGgtMTswPD1iOy0tYil7dmFyIGM9YVtiXS5zcmMsZD1jLmxhc3RJbmRleE9mKFwiP1wiKTtkPS0xPT1kP2MubGVuZ3RoOmQ7aWYoXCJiYXNlLmpzXCI9PWMuc3Vic3RyKGQtNyw3KSl7Z29vZy5iYXNlUGF0aD1jLnN1YnN0cigwLGQtNyk7YnJlYWt9fX19LGdvb2cuZmluZEJhc2VQYXRoXygpLGdvb2cuVHJhbnNwaWxlcj1mdW5jdGlvbigpe3RoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXz1udWxsO3RoaXMudHJhbnNwaWxhdGlvblRhcmdldF89Z29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0V9LGdvb2cuVHJhbnNwaWxlci5wcm90b3R5cGUuY3JlYXRlUmVxdWlyZXNUcmFuc3BpbGF0aW9uXz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtlP2RbYV09ITA6YigpPyhjPWEsZFthXT0hMSk6ZT1kW2FdPSEwfWZ1bmN0aW9uIGIoYSl7dHJ5e3JldHVybiEhZXZhbChhKX1jYXRjaChoKXtyZXR1cm4hMX19XG52YXIgYz1cImVzM1wiLGQ9e2VzMzohMX0sZT0hMSxmPWdvb2cuZ2xvYmFsLm5hdmlnYXRvciYmZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudD9nb29nLmdsb2JhbC5uYXZpZ2F0b3IudXNlckFnZW50OlwiXCI7YShcImVzNVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGIoXCJbMSxdLmxlbmd0aD09MVwiKX0pO2EoXCJlczZcIixmdW5jdGlvbigpe3JldHVybiBmLm1hdGNoKC9FZGdlXFwvKFxcZCspKFxcLlxcZCkqL2kpPyExOmIoJygoKT0+e1widXNlIHN0cmljdFwiO2NsYXNzIFh7Y29uc3RydWN0b3IoKXtpZihuZXcudGFyZ2V0IT1TdHJpbmcpdGhyb3cgMTt0aGlzLng9NDJ9fWxldCBxPVJlZmxlY3QuY29uc3RydWN0KFgsW10sU3RyaW5nKTtpZihxLnghPTQyfHwhKHEgaW5zdGFuY2VvZiBTdHJpbmcpKXRocm93IDE7Zm9yKGNvbnN0IGEgb2ZbMiwzXSl7aWYoYT09Miljb250aW51ZTtmdW5jdGlvbiBmKHo9e2F9KXtsZXQgYT0wO3JldHVybiB6LmF9e2Z1bmN0aW9uIGYoKXtyZXR1cm4gMDt9fXJldHVybiBmKCk9PTN9fSkoKScpfSk7XG5hKFwiZXM3XCIsZnVuY3Rpb24oKXtyZXR1cm4gYihcIjIgKiogMiA9PSA0XCIpfSk7YShcImVzOFwiLGZ1bmN0aW9uKCl7cmV0dXJuIGIoXCJhc3luYyAoKSA9PiAxLCB0cnVlXCIpfSk7YShcImVzOVwiLGZ1bmN0aW9uKCl7cmV0dXJuIGIoXCIoey4uLnJlc3R9ID0ge30pLCB0cnVlXCIpfSk7YShcImVzX25leHRcIixmdW5jdGlvbigpe3JldHVybiExfSk7cmV0dXJue3RhcmdldDpjLG1hcDpkfX0sZ29vZy5UcmFuc3BpbGVyLnByb3RvdHlwZS5uZWVkc1RyYW5zcGlsZT1mdW5jdGlvbihhLGIpe2lmKFwiYWx3YXlzXCI9PWdvb2cuVFJBTlNQSUxFKXJldHVybiEwO2lmKFwibmV2ZXJcIj09Z29vZy5UUkFOU1BJTEUpcmV0dXJuITE7aWYoIXRoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXyl7dmFyIGM9dGhpcy5jcmVhdGVSZXF1aXJlc1RyYW5zcGlsYXRpb25fKCk7dGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fPWMubWFwO3RoaXMudHJhbnNwaWxhdGlvblRhcmdldF89dGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0X3x8XG5jLnRhcmdldH1pZihhIGluIHRoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXylyZXR1cm4gdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fW2FdPyEwOiFnb29nLmluSHRtbERvY3VtZW50XygpfHxcImVzNlwiIT1ifHxcIm5vTW9kdWxlXCJpbiBnb29nLmdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpPyExOiEwO3Rocm93IEVycm9yKFwiVW5rbm93biBsYW5ndWFnZSBtb2RlOiBcIithKTt9LGdvb2cuVHJhbnNwaWxlci5wcm90b3R5cGUudHJhbnNwaWxlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cudHJhbnNwaWxlXyhhLGIsdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0Xyl9LGdvb2cudHJhbnNwaWxlcl89bmV3IGdvb2cuVHJhbnNwaWxlcixnb29nLnByb3RlY3RTY3JpcHRUYWdfPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoLzxcXC8oU0NSSVBUKS9pZyxcIlxcXFx4M2MvJDFcIil9LGdvb2cuRGVidWdMb2FkZXJfPWZ1bmN0aW9uKCl7dGhpcy5kZXBlbmRlbmNpZXNfPXt9O1xudGhpcy5pZFRvUGF0aF89e307dGhpcy53cml0dGVuXz17fTt0aGlzLmxvYWRpbmdEZXBzXz1bXTt0aGlzLmRlcHNUb0xvYWRfPVtdO3RoaXMucGF1c2VkXz0hMTt0aGlzLmZhY3RvcnlfPW5ldyBnb29nLkRlcGVuZGVuY3lGYWN0b3J5KGdvb2cudHJhbnNwaWxlcl8pO3RoaXMuZGVmZXJyZWRDYWxsYmFja3NfPXt9O3RoaXMuZGVmZXJyZWRRdWV1ZV89W119LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5ib290c3RyYXA9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7ZCYmKGdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoZCwwKSxkPW51bGwpfXZhciBkPWI7aWYoYS5sZW5ndGgpe2I9W107Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBmPXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhhW2VdKTtpZighZil0aHJvdyBFcnJvcihcIlVucmVnb25pemVkIG5hbWVzcGFjZTogXCIrYVtlXSk7Yi5wdXNoKHRoaXMuZGVwZW5kZW5jaWVzX1tmXSl9Zj1nb29nLnJlcXVpcmU7dmFyIGc9MDtmb3IoZT1cbjA7ZTxhLmxlbmd0aDtlKyspZihhW2VdKSxiW2VdLm9uTG9hZChmdW5jdGlvbigpeysrZz09YS5sZW5ndGgmJmMoKX0pfWVsc2UgYygpfSxnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZENsb3N1cmVEZXBzPWZ1bmN0aW9uKCl7dGhpcy5kZXBzVG9Mb2FkXy5wdXNoKHRoaXMuZmFjdG9yeV8uY3JlYXRlRGVwZW5kZW5jeShnb29nLm5vcm1hbGl6ZVBhdGhfKGdvb2cuYmFzZVBhdGgrXCJkZXBzLmpzXCIpLFwiZGVwcy5qc1wiLFtdLFtdLHt9LCExKSk7dGhpcy5sb2FkRGVwc18oKX0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnJlcXVlc3RlZD1mdW5jdGlvbihhLGIpeyhhPXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhhKSkmJihifHx0aGlzLmFyZURlcHNMb2FkZWRfKHRoaXMuZGVwZW5kZW5jaWVzX1thXS5yZXF1aXJlcykpJiYoYj10aGlzLmRlZmVycmVkQ2FsbGJhY2tzX1thXSkmJihkZWxldGUgdGhpcy5kZWZlcnJlZENhbGxiYWNrc19bYV0sYigpKX0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnNldERlcGVuZGVuY3lGYWN0b3J5PVxuZnVuY3Rpb24oYSl7dGhpcy5mYWN0b3J5Xz1hfSxnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZF89ZnVuY3Rpb24oYSl7aWYodGhpcy5nZXRQYXRoRnJvbURlcHNfKGEpKXt2YXIgYj10aGlzLGM9W10sZD1mdW5jdGlvbihhKXt2YXIgZT1iLmdldFBhdGhGcm9tRGVwc18oYSk7aWYoIWUpdGhyb3cgRXJyb3IoXCJCYWQgZGVwZW5kZW5jeSBwYXRoIG9yIHN5bWJvbDogXCIrYSk7aWYoIWIud3JpdHRlbl9bZV0pe2Iud3JpdHRlbl9bZV09ITA7YT1iLmRlcGVuZGVuY2llc19bZV07Zm9yKGU9MDtlPGEucmVxdWlyZXMubGVuZ3RoO2UrKylnb29nLmlzUHJvdmlkZWRfKGEucmVxdWlyZXNbZV0pfHxkKGEucmVxdWlyZXNbZV0pO2MucHVzaChhKX19O2QoYSk7YT0hIXRoaXMuZGVwc1RvTG9hZF8ubGVuZ3RoO3RoaXMuZGVwc1RvTG9hZF89dGhpcy5kZXBzVG9Mb2FkXy5jb25jYXQoYyk7dGhpcy5wYXVzZWRffHxhfHx0aGlzLmxvYWREZXBzXygpfWVsc2UgdGhyb3cgYT1cImdvb2cucmVxdWlyZSBjb3VsZCBub3QgZmluZDogXCIrXG5hLGdvb2cubG9nVG9Db25zb2xlXyhhKSxFcnJvcihhKTt9LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5sb2FkRGVwc189ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcyxiPXRoaXMucGF1c2VkXzt0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aCYmIWI7KShmdW5jdGlvbigpe3ZhciBjPSExLGQ9YS5kZXBzVG9Mb2FkXy5zaGlmdCgpLGU9ITE7YS5sb2FkaW5nXyhkKTt2YXIgZj17cGF1c2U6ZnVuY3Rpb24oKXtpZihjKXRocm93IEVycm9yKFwiQ2Fubm90IGNhbGwgcGF1c2UgYWZ0ZXIgdGhlIGNhbGwgdG8gbG9hZC5cIik7Yj0hMH0scmVzdW1lOmZ1bmN0aW9uKCl7Yz9hLnJlc3VtZV8oKTpiPSExfSxsb2FkZWQ6ZnVuY3Rpb24oKXtpZihlKXRocm93IEVycm9yKFwiRG91YmxlIGNhbGwgdG8gbG9hZGVkLlwiKTtlPSEwO2EubG9hZGVkXyhkKX0scGVuZGluZzpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLmxvYWRpbmdEZXBzXy5sZW5ndGg7YysrKWIucHVzaChhLmxvYWRpbmdEZXBzX1tjXSk7XG5yZXR1cm4gYn0sc2V0TW9kdWxlU3RhdGU6ZnVuY3Rpb24oYSl7Z29vZy5tb2R1bGVMb2FkZXJTdGF0ZV89e3R5cGU6YSxtb2R1bGVOYW1lOlwiXCIsZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTohMX19LHJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0czpmdW5jdGlvbihhLGIsYyl7YyYmKGdvb2cubG9hZGVkTW9kdWxlc19bY109e2V4cG9ydHM6Yix0eXBlOmdvb2cuTW9kdWxlVHlwZS5FUzYsbW9kdWxlSWQ6Y3x8XCJcIn0pfSxyZWdpc3Rlckdvb2dNb2R1bGVFeHBvcnRzOmZ1bmN0aW9uKGEsYil7Z29vZy5sb2FkZWRNb2R1bGVzX1thXT17ZXhwb3J0czpiLHR5cGU6Z29vZy5Nb2R1bGVUeXBlLkdPT0csbW9kdWxlSWQ6YX19LGNsZWFyTW9kdWxlU3RhdGU6ZnVuY3Rpb24oKXtnb29nLm1vZHVsZUxvYWRlclN0YXRlXz1udWxsfSxkZWZlcjpmdW5jdGlvbihiKXtpZihjKXRocm93IEVycm9yKFwiQ2Fubm90IHJlZ2lzdGVyIHdpdGggZGVmZXIgYWZ0ZXIgdGhlIGNhbGwgdG8gbG9hZC5cIik7YS5kZWZlcl8oZCxcbmIpfSxhcmVEZXBzTG9hZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIGEuYXJlRGVwc0xvYWRlZF8oZC5yZXF1aXJlcyl9fTt0cnl7ZC5sb2FkKGYpfWZpbmFsbHl7Yz0hMH19KSgpO2ImJnRoaXMucGF1c2VfKCl9LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5wYXVzZV89ZnVuY3Rpb24oKXt0aGlzLnBhdXNlZF89ITB9LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5yZXN1bWVfPWZ1bmN0aW9uKCl7dGhpcy5wYXVzZWRfJiYodGhpcy5wYXVzZWRfPSExLHRoaXMubG9hZERlcHNfKCkpfSxnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZGluZ189ZnVuY3Rpb24oYSl7dGhpcy5sb2FkaW5nRGVwc18ucHVzaChhKX0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRlZF89ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxvYWRpbmdEZXBzXy5sZW5ndGg7YisrKWlmKHRoaXMubG9hZGluZ0RlcHNfW2JdPT1hKXt0aGlzLmxvYWRpbmdEZXBzXy5zcGxpY2UoYiwxKTtcbmJyZWFrfWZvcihiPTA7Yjx0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDtiKyspaWYodGhpcy5kZWZlcnJlZFF1ZXVlX1tiXT09YS5wYXRoKXt0aGlzLmRlZmVycmVkUXVldWVfLnNwbGljZShiLDEpO2JyZWFrfWlmKHRoaXMubG9hZGluZ0RlcHNfLmxlbmd0aD09dGhpcy5kZWZlcnJlZFF1ZXVlXy5sZW5ndGgmJiF0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aClmb3IoO3RoaXMuZGVmZXJyZWRRdWV1ZV8ubGVuZ3RoOyl0aGlzLnJlcXVlc3RlZCh0aGlzLmRlZmVycmVkUXVldWVfLnNoaWZ0KCksITApO2EubG9hZGVkKCl9LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5hcmVEZXBzTG9hZGVkXz1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5nZXRQYXRoRnJvbURlcHNfKGFbYl0pO2lmKCFjfHwhKGMgaW4gdGhpcy5kZWZlcnJlZENhbGxiYWNrc198fGdvb2cuaXNQcm92aWRlZF8oYVtiXSkpKXJldHVybiExfXJldHVybiEwfSxnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuZ2V0UGF0aEZyb21EZXBzXz1cbmZ1bmN0aW9uKGEpe3JldHVybiBhIGluIHRoaXMuaWRUb1BhdGhfP3RoaXMuaWRUb1BhdGhfW2FdOmEgaW4gdGhpcy5kZXBlbmRlbmNpZXNfP2E6bnVsbH0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmRlZmVyXz1mdW5jdGlvbihhLGIpe3RoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2EucGF0aF09Yjt0aGlzLmRlZmVycmVkUXVldWVfLnB1c2goYS5wYXRoKX0sZ29vZy5Mb2FkQ29udHJvbGxlcj1mdW5jdGlvbigpe30sZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt9LGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe30sZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZGVkPWZ1bmN0aW9uKCl7fSxnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5wZW5kaW5nPWZ1bmN0aW9uKCl7fSxnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5yZWdpc3RlckVzNk1vZHVsZUV4cG9ydHM9ZnVuY3Rpb24oYSxcbmIsYyl7fSxnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5zZXRNb2R1bGVTdGF0ZT1mdW5jdGlvbihhKXt9LGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFyTW9kdWxlU3RhdGU9ZnVuY3Rpb24oKXt9LGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmRlZmVyPWZ1bmN0aW9uKGEpe30sZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuYXJlRGVwc0xvYWRlZD1mdW5jdGlvbigpe30sZ29vZy5EZXBlbmRlbmN5PWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5wYXRoPWE7dGhpcy5yZWxhdGl2ZVBhdGg9Yjt0aGlzLnByb3ZpZGVzPWM7dGhpcy5yZXF1aXJlcz1kO3RoaXMubG9hZEZsYWdzPWU7dGhpcy5sb2FkZWRfPSExO3RoaXMubG9hZENhbGxiYWNrc189W119LGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUuZ2V0UGF0aE5hbWU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhdGgsYj1hLmluZGV4T2YoXCI6Ly9cIik7MDw9YiYmKGE9YS5zdWJzdHJpbmcoYiszKSxiPVxuYS5pbmRleE9mKFwiL1wiKSwwPD1iJiYoYT1hLnN1YnN0cmluZyhiKzEpKSk7cmV0dXJuIGF9LGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUub25Mb2FkPWZ1bmN0aW9uKGEpe3RoaXMubG9hZGVkXz9hKCk6dGhpcy5sb2FkQ2FsbGJhY2tzXy5wdXNoKGEpfSxnb29nLkRlcGVuZGVuY3kucHJvdG90eXBlLmxvYWRlZD1mdW5jdGlvbigpe3RoaXMubG9hZGVkXz0hMDt2YXIgYT10aGlzLmxvYWRDYWxsYmFja3NfO3RoaXMubG9hZENhbGxiYWNrc189W107Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSgpfSxnb29nLkRlcGVuZGVuY3kuZGVmZXJfPSExLGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF89e30sZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfPWZ1bmN0aW9uKGEpe3ZhciBiPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzIpO2dvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9bYl09YTtyZXR1cm4gYn0sZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja189XG5mdW5jdGlvbihhKXtkZWxldGUgZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwX1thXX0sZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXz1mdW5jdGlvbihhLGIpe2lmKGEgaW4gZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwXyl7Zm9yKHZhciBjPWdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9bYV0sZD1bXSxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKylkLnB1c2goYXJndW1lbnRzW2VdKTtjLmFwcGx5KHZvaWQgMCxkKX1lbHNlIHRocm93IEVycm9yKFwiQ2FsbGJhY2sga2V5IFwiK2ErXCIgZG9lcyBub3QgZXhpc3QgKHdhcyBiYXNlLmpzIGxvYWRlZCBtb3JlIHRoYW4gb25jZT8pLlwiKTt9LGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbihhKXtpZihnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCk/YS5sb2FkZWQoKTphLnBhdXNlKCk7ZWxzZSBpZihnb29nLmluSHRtbERvY3VtZW50XygpKXt2YXIgYj1cbmdvb2cuZ2xvYmFsLmRvY3VtZW50O2lmKFwiY29tcGxldGVcIj09Yi5yZWFkeVN0YXRlJiYhZ29vZy5FTkFCTEVfQ0hST01FX0FQUF9TQUZFX1NDUklQVF9MT0FESU5HKXtpZigvXFxiZGVwcy5qcyQvLnRlc3QodGhpcy5wYXRoKSl7YS5sb2FkZWQoKTtyZXR1cm59dGhyb3cgRXJyb3IoJ0Nhbm5vdCB3cml0ZSBcIicrdGhpcy5wYXRoKydcIiBhZnRlciBkb2N1bWVudCBsb2FkJyk7fWlmKCFnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkcmJmdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkpe3ZhciBjPWdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihiKXtnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfJiZcImNvbXBsZXRlXCIhPWIucmVhZHlTdGF0ZXx8KGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGMpLGEubG9hZGVkKCkpfSksZD0hZ29vZy5EZWJ1Z0xvYWRlcl8uSVNfT0xEX0lFXyYmZ29vZy5nZXRTY3JpcHROb25jZSgpP1xuJyBub25jZT1cIicrZ29vZy5nZXRTY3JpcHROb25jZSgpKydcIic6XCJcIjtkPSc8c2NyaXB0IHNyYz1cIicrdGhpcy5wYXRoKydcIiAnKyhnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfP1wib25yZWFkeXN0YXRlY2hhbmdlXCI6XCJvbmxvYWRcIikrXCI9XFxcImdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18oJ1wiK2MrJ1xcJywgdGhpcylcIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgJysoZ29vZy5EZXBlbmRlbmN5LmRlZmVyXz9cImRlZmVyXCI6XCJcIikrZCtcIj5cXHgzYy9zY3JpcHQ+XCI7Yi53cml0ZShnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXz9nb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXy5jcmVhdGVIVE1MKGQpOmQpfWVsc2V7dmFyIGU9Yi5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO2UuZGVmZXI9Z29vZy5EZXBlbmRlbmN5LmRlZmVyXztlLmFzeW5jPSExO2UudHlwZT1cInRleHQvamF2YXNjcmlwdFwiOyhkPWdvb2cuZ2V0U2NyaXB0Tm9uY2UoKSkmJmUuc2V0QXR0cmlidXRlKFwibm9uY2VcIixkKTtnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfP1xuKGEucGF1c2UoKSxlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKFwibG9hZGVkXCI9PWUucmVhZHlTdGF0ZXx8XCJjb21wbGV0ZVwiPT1lLnJlYWR5U3RhdGUpYS5sb2FkZWQoKSxhLnJlc3VtZSgpfSk6ZS5vbmxvYWQ9ZnVuY3Rpb24oKXtlLm9ubG9hZD1udWxsO2EubG9hZGVkKCl9O2Uuc3JjPWdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfP2dvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTCh0aGlzLnBhdGgpOnRoaXMucGF0aDtiLmhlYWQuYXBwZW5kQ2hpbGQoZSl9fWVsc2UgZ29vZy5sb2dUb0NvbnNvbGVfKFwiQ2Fubm90IHVzZSBkZWZhdWx0IGRlYnVnIGxvYWRlciBvdXRzaWRlIG9mIEhUTUwgZG9jdW1lbnRzLlwiKSxcImRlcHMuanNcIj09dGhpcy5yZWxhdGl2ZVBhdGg/KGdvb2cubG9nVG9Db25zb2xlXyhcIkNvbnNpZGVyIHNldHRpbmcgQ0xPU1VSRV9JTVBPUlRfU0NSSVBUIGJlZm9yZSBsb2FkaW5nIGJhc2UuanMsIG9yIHNldHRpbmcgQ0xPU1VSRV9OT19ERVBTIHRvIHRydWUuXCIpLFxuYS5sb2FkZWQoKSk6YS5wYXVzZSgpfSxnb29nLkVzNk1vZHVsZURlcGVuZGVuY3k9ZnVuY3Rpb24oYSxiLGMsZCxlKXtnb29nLkRlcGVuZGVuY3kuY2FsbCh0aGlzLGEsYixjLGQsZSl9LGdvb2cuaW5oZXJpdHMoZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5LGdvb2cuRGVwZW5kZW5jeSksZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXthPWI/JzxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIGNyb3Nzb3JpZ2luPicrYitcIlxceDNjL3NjcmlwdD5cIjonPHNjcmlwdCB0eXBlPVwibW9kdWxlXCIgY3Jvc3NvcmlnaW4gc3JjPVwiJythKydcIj5cXHgzYy9zY3JpcHQ+JztkLndyaXRlKGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfP2dvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZUhUTUwoYSk6YSl9ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPWQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtjLmRlZmVyPSEwO2MuYXN5bmM9ITE7Yy50eXBlPVxuXCJtb2R1bGVcIjtjLnNldEF0dHJpYnV0ZShcImNyb3Nzb3JpZ2luXCIsITApO3ZhciBlPWdvb2cuZ2V0U2NyaXB0Tm9uY2UoKTtlJiZjLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsZSk7Yj9jLnRleHRDb250ZW50PWdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfP2dvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdChiKTpiOmMuc3JjPWdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfP2dvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTChhKTphO2QuaGVhZC5hcHBlbmRDaGlsZChjKX1pZihnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCk/YS5sb2FkZWQoKTphLnBhdXNlKCk7ZWxzZSBpZihnb29nLmluSHRtbERvY3VtZW50XygpKXt2YXIgZD1nb29nLmdsb2JhbC5kb2N1bWVudCxlPXRoaXM7aWYoZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSl7dmFyIGY9Yjtnb29nLkRlcGVuZGVuY3kuZGVmZXJfPVxuITB9ZWxzZSBmPWM7dmFyIGc9Z29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCl7Z29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18oZyk7YS5zZXRNb2R1bGVTdGF0ZShnb29nLk1vZHVsZVR5cGUuRVM2KX0pO2Yodm9pZCAwLCdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKFwiJytnKydcIiknKTtmKHRoaXMucGF0aCx2b2lkIDApO3ZhciBoPWdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihiKXtnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhoKTthLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyhlLnBhdGgsYixnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKX0pO2Yodm9pZCAwLCdpbXBvcnQgKiBhcyBtIGZyb20gXCInK3RoaXMucGF0aCsnXCI7IGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18oXCInK2grJ1wiLCBtKScpO3ZhciBrPWdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbigpe2dvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGspO1xuYS5jbGVhck1vZHVsZVN0YXRlKCk7YS5sb2FkZWQoKX0pO2Yodm9pZCAwLCdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKFwiJytrKydcIiknKX1lbHNlIGdvb2cubG9nVG9Db25zb2xlXyhcIkNhbm5vdCB1c2UgZGVmYXVsdCBkZWJ1ZyBsb2FkZXIgb3V0c2lkZSBvZiBIVE1MIGRvY3VtZW50cy5cIiksYS5wYXVzZSgpfSxnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeT1mdW5jdGlvbihhLGIsYyxkLGUpe2dvb2cuRGVwZW5kZW5jeS5jYWxsKHRoaXMsYSxiLGMsZCxlKTt0aGlzLmNvbnRlbnRzXz1udWxsO3RoaXMubGF6eUZldGNoXz0hZ29vZy5pbkh0bWxEb2N1bWVudF8oKXx8IShcIm5vTW9kdWxlXCJpbiBnb29nLmdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKX0sZ29vZy5pbmhlcml0cyhnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSxnb29nLkRlcGVuZGVuY3kpLGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtlLmNvbnRlbnRzXz1cbmdvb2cubG9hZEZpbGVTeW5jXyhlLnBhdGgpO2UuY29udGVudHNfJiYoZS5jb250ZW50c189ZS50cmFuc2Zvcm0oZS5jb250ZW50c18pLGUuY29udGVudHNfJiYoZS5jb250ZW50c18rPVwiXFxuLy8jIHNvdXJjZVVSTD1cIitlLnBhdGgpKX1mdW5jdGlvbiBjKCl7ZS5sYXp5RmV0Y2hfJiZiKCk7aWYoZS5jb250ZW50c18pe2YmJmEuc2V0TW9kdWxlU3RhdGUoZ29vZy5Nb2R1bGVUeXBlLkVTNik7dHJ5e3ZhciBjPWUuY29udGVudHNfO2UuY29udGVudHNfPW51bGw7Z29vZy5nbG9iYWxFdmFsKGMpO2lmKGYpdmFyIGQ9Z29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZX1maW5hbGx5e2YmJmEuY2xlYXJNb2R1bGVTdGF0ZSgpfWYmJmdvb2cuZ2xvYmFsLiRqc2NvbXAucmVxdWlyZS5lbnN1cmUoW2UuZ2V0UGF0aE5hbWUoKV0sZnVuY3Rpb24oKXthLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyhlLnBhdGgsZ29vZy5nbG9iYWwuJGpzY29tcC5yZXF1aXJlKGUuZ2V0UGF0aE5hbWUoKSksXG5kKX0pO2EubG9hZGVkKCl9fWZ1bmN0aW9uIGQoKXt2YXIgYT1nb29nLmdsb2JhbC5kb2N1bWVudCxiPWdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbigpe2dvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGIpO2MoKX0pLGQ9JzxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPicrZ29vZy5wcm90ZWN0U2NyaXB0VGFnXygnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXyhcIicrYisnXCIpOycpK1wiXFx4M2Mvc2NyaXB0PlwiO2Eud3JpdGUoZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8/Z29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChkKTpkKX12YXIgZT10aGlzO2lmKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCliKCksdGhpcy5jb250ZW50c18mJmdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVChcIlwiLHRoaXMuY29udGVudHNfKT8odGhpcy5jb250ZW50c189bnVsbCxhLmxvYWRlZCgpKTphLnBhdXNlKCk7XG5lbHNle3ZhciBmPXRoaXMubG9hZEZsYWdzLm1vZHVsZT09Z29vZy5Nb2R1bGVUeXBlLkVTNjt0aGlzLmxhenlGZXRjaF98fGIoKTt2YXIgZz0xPGEucGVuZGluZygpLmxlbmd0aCxoPWcmJmdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV87Zz1nb29nLkRlcGVuZGVuY3kuZGVmZXJfJiYoZ3x8Z29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSk7aWYoaHx8ZylhLmRlZmVyKGZ1bmN0aW9uKCl7YygpfSk7ZWxzZXt2YXIgaz1nb29nLmdsb2JhbC5kb2N1bWVudDtoPWdvb2cuaW5IdG1sRG9jdW1lbnRfKCkmJlwiQWN0aXZlWE9iamVjdFwiaW4gZ29vZy5nbG9iYWw7aWYoZiYmZ29vZy5pbkh0bWxEb2N1bWVudF8oKSYmZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSYmIWgpe2dvb2cuRGVwZW5kZW5jeS5kZWZlcl89ITA7YS5wYXVzZSgpO3ZhciBsPWsub25yZWFkeXN0YXRlY2hhbmdlO2sub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7XCJpbnRlcmFjdGl2ZVwiPT1rLnJlYWR5U3RhdGUmJihrLm9ucmVhZHlzdGF0ZWNoYW5nZT1cbmwsYygpLGEucmVzdW1lKCkpO2dvb2cuaXNGdW5jdGlvbihsKSYmbC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19ZWxzZSFnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfJiZnb29nLmluSHRtbERvY3VtZW50XygpJiZnb29nLmlzRG9jdW1lbnRMb2FkaW5nXygpP2QoKTpjKCl9fX0sZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbihhKXt9LGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3k9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2dvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LmNhbGwodGhpcyxhLGIsYyxkLGUpO3RoaXMudHJhbnNwaWxlcj1mfSxnb29nLmluaGVyaXRzKGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3ksZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kpLGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc3BpbGVyLnRyYW5zcGlsZShhLHRoaXMuZ2V0UGF0aE5hbWUoKSl9LFxuZ29vZy5QcmVUcmFuc3BpbGVkRXM2TW9kdWxlRGVwZW5kZW5jeT1mdW5jdGlvbihhLGIsYyxkLGUpe2dvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LmNhbGwodGhpcyxhLGIsYyxkLGUpfSxnb29nLmluaGVyaXRzKGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3ksZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kpLGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbihhKXtyZXR1cm4gYX0sZ29vZy5Hb29nTW9kdWxlRGVwZW5kZW5jeT1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeS5jYWxsKHRoaXMsYSxiLGMsZCxlKTt0aGlzLm5lZWRzVHJhbnNwaWxlXz1mO3RoaXMudHJhbnNwaWxlcl89Z30sZ29vZy5pbmhlcml0cyhnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KSxnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm09XG5mdW5jdGlvbihhKXt0aGlzLm5lZWRzVHJhbnNwaWxlXyYmKGE9dGhpcy50cmFuc3BpbGVyXy50cmFuc3BpbGUoYSx0aGlzLmdldFBhdGhOYW1lKCkpKTtyZXR1cm4gZ29vZy5MT0FEX01PRFVMRV9VU0lOR19FVkFMJiZnb29nLmlzRGVmKGdvb2cuZ2xvYmFsLkpTT04pP1wiZ29vZy5sb2FkTW9kdWxlKFwiK2dvb2cuZ2xvYmFsLkpTT04uc3RyaW5naWZ5KGErXCJcXG4vLyMgc291cmNlVVJMPVwiK3RoaXMucGF0aCtcIlxcblwiKStcIik7XCI6J2dvb2cubG9hZE1vZHVsZShmdW5jdGlvbihleHBvcnRzKSB7XCJ1c2Ugc3RyaWN0XCI7JythK1wiXFxuO3JldHVybiBleHBvcnRzfSk7XFxuLy8jIHNvdXJjZVVSTD1cIit0aGlzLnBhdGgrXCJcXG5cIn0sZ29vZy5EZWJ1Z0xvYWRlcl8uSVNfT0xEX0lFXz0hKGdvb2cuZ2xvYmFsLmF0b2J8fCFnb29nLmdsb2JhbC5kb2N1bWVudHx8IWdvb2cuZ2xvYmFsLmRvY3VtZW50LmFsbCksZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmFkZERlcGVuZGVuY3k9ZnVuY3Rpb24oYSxiLFxuYyxkKXtiPWJ8fFtdO2E9YS5yZXBsYWNlKC9cXFxcL2csXCIvXCIpO3ZhciBlPWdvb2cubm9ybWFsaXplUGF0aF8oZ29vZy5iYXNlUGF0aCthKTtkJiZcImJvb2xlYW5cIiE9PXR5cGVvZiBkfHwoZD1kP3ttb2R1bGU6Z29vZy5Nb2R1bGVUeXBlLkdPT0d9Ont9KTtjPXRoaXMuZmFjdG9yeV8uY3JlYXRlRGVwZW5kZW5jeShlLGEsYixjLGQsZ29vZy50cmFuc3BpbGVyXy5uZWVkc1RyYW5zcGlsZShkLmxhbmd8fFwiZXMzXCIsZC5tb2R1bGUpKTt0aGlzLmRlcGVuZGVuY2llc19bZV09Yztmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaWRUb1BhdGhfW2JbY11dPWU7dGhpcy5pZFRvUGF0aF9bYV09ZX0sZ29vZy5EZXBlbmRlbmN5RmFjdG9yeT1mdW5jdGlvbihhKXt0aGlzLnRyYW5zcGlsZXI9YX0sZ29vZy5EZXBlbmRlbmN5RmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlRGVwZW5kZW5jeT1mdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuIGUubW9kdWxlPT1nb29nLk1vZHVsZVR5cGUuR09PRz9uZXcgZ29vZy5Hb29nTW9kdWxlRGVwZW5kZW5jeShhLFxuYixjLGQsZSxmLHRoaXMudHJhbnNwaWxlcik6Zj9uZXcgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeShhLGIsYyxkLGUsdGhpcy50cmFuc3BpbGVyKTplLm1vZHVsZT09Z29vZy5Nb2R1bGVUeXBlLkVTNj9cIm5ldmVyXCI9PWdvb2cuVFJBTlNQSUxFJiZnb29nLkFTU1VNRV9FU19NT0RVTEVTX1RSQU5TUElMRUQ/bmV3IGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3koYSxiLGMsZCxlKTpuZXcgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5KGEsYixjLGQsZSk6bmV3IGdvb2cuRGVwZW5kZW5jeShhLGIsYyxkLGUpfSxnb29nLmRlYnVnTG9hZGVyXz1uZXcgZ29vZy5EZWJ1Z0xvYWRlcl8sZ29vZy5sb2FkQ2xvc3VyZURlcHM9ZnVuY3Rpb24oKXtnb29nLmRlYnVnTG9hZGVyXy5sb2FkQ2xvc3VyZURlcHMoKX0sZ29vZy5zZXREZXBlbmRlbmN5RmFjdG9yeT1mdW5jdGlvbihhKXtnb29nLmRlYnVnTG9hZGVyXy5zZXREZXBlbmRlbmN5RmFjdG9yeShhKX0sZ29vZy5nbG9iYWwuQ0xPU1VSRV9OT19ERVBTfHxcbmdvb2cuZGVidWdMb2FkZXJfLmxvYWRDbG9zdXJlRGVwcygpLGdvb2cuYm9vdHN0cmFwPWZ1bmN0aW9uKGEsYil7Z29vZy5kZWJ1Z0xvYWRlcl8uYm9vdHN0cmFwKGEsYil9KTtnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZX05BTUU9XCJcIjtnb29nLmlkZW50aXR5Xz1mdW5jdGlvbihhKXtyZXR1cm4gYX07Z29vZy5jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3k9ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIFRydXN0ZWRUeXBlc3x8IVRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kpcmV0dXJuIGI7dHJ5e2I9VHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeShhLHtjcmVhdGVIVE1MOmdvb2cuaWRlbnRpdHlfLGNyZWF0ZVNjcmlwdDpnb29nLmlkZW50aXR5XyxjcmVhdGVTY3JpcHRVUkw6Z29vZy5pZGVudGl0eV8sY3JlYXRlVVJMOmdvb2cuaWRlbnRpdHlffSl9Y2F0Y2goYyl7Z29vZy5sb2dUb0NvbnNvbGVfKGMubWVzc2FnZSl9cmV0dXJuIGJ9O1xuZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV89Z29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FP2dvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRStcIiNiYXNlXCIpOm51bGw7dmFyIGpzcGI9e0JpbmFyeUNvbnN0YW50czp7fSxDb25zdEJpbmFyeU1lc3NhZ2U6ZnVuY3Rpb24oKXt9LEJpbmFyeU1lc3NhZ2U6ZnVuY3Rpb24oKXt9fTtqc3BiLkJpbmFyeUNvbnN0YW50cy5GaWVsZFR5cGU9e0lOVkFMSUQ6LTEsRE9VQkxFOjEsRkxPQVQ6MixJTlQ2NDozLFVJTlQ2NDo0LElOVDMyOjUsRklYRUQ2NDo2LEZJWEVEMzI6NyxCT09MOjgsU1RSSU5HOjksR1JPVVA6MTAsTUVTU0FHRToxMSxCWVRFUzoxMixVSU5UMzI6MTMsRU5VTToxNCxTRklYRUQzMjoxNSxTRklYRUQ2NDoxNixTSU5UMzI6MTcsU0lOVDY0OjE4LEZIQVNINjQ6MzAsVkhBU0g2NDozMX07anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGU9e0lOVkFMSUQ6LTEsVkFSSU5UOjAsRklYRUQ2NDoxLERFTElNSVRFRDoyLFNUQVJUX0dST1VQOjMsRU5EX0dST1VQOjQsRklYRUQzMjo1fTtcbmpzcGIuQmluYXJ5Q29uc3RhbnRzLkZpZWxkVHlwZVRvV2lyZVR5cGU9ZnVuY3Rpb24oYSl7dmFyIGI9anNwYi5CaW5hcnlDb25zdGFudHMuRmllbGRUeXBlLGM9anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGU7c3dpdGNoKGEpe2Nhc2UgYi5JTlQzMjpjYXNlIGIuSU5UNjQ6Y2FzZSBiLlVJTlQzMjpjYXNlIGIuVUlOVDY0OmNhc2UgYi5TSU5UMzI6Y2FzZSBiLlNJTlQ2NDpjYXNlIGIuQk9PTDpjYXNlIGIuRU5VTTpjYXNlIGIuVkhBU0g2NDpyZXR1cm4gYy5WQVJJTlQ7Y2FzZSBiLkRPVUJMRTpjYXNlIGIuRklYRUQ2NDpjYXNlIGIuU0ZJWEVENjQ6Y2FzZSBiLkZIQVNINjQ6cmV0dXJuIGMuRklYRUQ2NDtjYXNlIGIuU1RSSU5HOmNhc2UgYi5NRVNTQUdFOmNhc2UgYi5CWVRFUzpyZXR1cm4gYy5ERUxJTUlURUQ7Y2FzZSBiLkZMT0FUOmNhc2UgYi5GSVhFRDMyOmNhc2UgYi5TRklYRUQzMjpyZXR1cm4gYy5GSVhFRDMyO2RlZmF1bHQ6cmV0dXJuIGMuSU5WQUxJRH19O1xuanNwYi5CaW5hcnlDb25zdGFudHMuSU5WQUxJRF9GSUVMRF9OVU1CRVI9LTE7anNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQzMl9FUFM9MS40MDEyOTg0NjQzMjQ4MTdFLTQ1O2pzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfTUlOPTEuMTc1NDk0MzUwODIyMjg3NUUtMzg7anNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQzMl9NQVg9My40MDI4MjM0NjYzODUyODg2RTM4O2pzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfRVBTPTQuOUUtMzI0O2pzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfTUlOPTIuMjI1MDczODU4NTA3MjAxNEUtMzA4O2pzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfTUFYPTEuNzk3NjkzMTM0ODYyMzE1N0UzMDg7anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzIwPTEwNDg1NzY7anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzIzPTgzODg2MDg7anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxPTIxNDc0ODM2NDg7XG5qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzI9NDI5NDk2NzI5Njtqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNTI9NDUwMzU5OTYyNzM3MDQ5Njtqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjM9MHg3ZmZmZmZmZmZmZmZmZmZmO2pzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182ND0xLjg0NDY3NDQwNzM3MDk1NTJFMTk7anNwYi5CaW5hcnlDb25zdGFudHMuWkVST19IQVNIPVwiXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFwiO2dvb2cuZG9tPXt9O2dvb2cuZG9tLk5vZGVUeXBlPXtFTEVNRU5UOjEsQVRUUklCVVRFOjIsVEVYVDozLENEQVRBX1NFQ1RJT046NCxFTlRJVFlfUkVGRVJFTkNFOjUsRU5USVRZOjYsUFJPQ0VTU0lOR19JTlNUUlVDVElPTjo3LENPTU1FTlQ6OCxET0NVTUVOVDo5LERPQ1VNRU5UX1RZUEU6MTAsRE9DVU1FTlRfRlJBR01FTlQ6MTEsTk9UQVRJT046MTJ9O2dvb2cuZGVidWc9e307Z29vZy5kZWJ1Zy5FcnJvcj1mdW5jdGlvbihhKXtpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLGdvb2cuZGVidWcuRXJyb3IpO2Vsc2V7dmFyIGI9RXJyb3IoKS5zdGFjaztiJiYodGhpcy5zdGFjaz1iKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7dGhpcy5yZXBvcnRFcnJvclRvU2VydmVyPSEwfTtnb29nLmluaGVyaXRzKGdvb2cuZGVidWcuRXJyb3IsRXJyb3IpO2dvb2cuZGVidWcuRXJyb3IucHJvdG90eXBlLm5hbWU9XCJDdXN0b21FcnJvclwiO2dvb2cuYXNzZXJ0cz17fTtnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFM9Z29vZy5ERUJVRztnb29nLmFzc2VydHMuQXNzZXJ0aW9uRXJyb3I9ZnVuY3Rpb24oYSxiKXtnb29nLmRlYnVnLkVycm9yLmNhbGwodGhpcyxnb29nLmFzc2VydHMuc3Vic18oYSxiKSk7dGhpcy5tZXNzYWdlUGF0dGVybj1hfTtnb29nLmluaGVyaXRzKGdvb2cuYXNzZXJ0cy5Bc3NlcnRpb25FcnJvcixnb29nLmRlYnVnLkVycm9yKTtnb29nLmFzc2VydHMuQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlLm5hbWU9XCJBc3NlcnRpb25FcnJvclwiO2dvb2cuYXNzZXJ0cy5ERUZBVUxUX0VSUk9SX0hBTkRMRVI9ZnVuY3Rpb24oYSl7dGhyb3cgYTt9O2dvb2cuYXNzZXJ0cy5lcnJvckhhbmRsZXJfPWdvb2cuYXNzZXJ0cy5ERUZBVUxUX0VSUk9SX0hBTkRMRVI7XG5nb29nLmFzc2VydHMuc3Vic189ZnVuY3Rpb24oYSxiKXthPWEuc3BsaXQoXCIlc1wiKTtmb3IodmFyIGM9XCJcIixkPWEubGVuZ3RoLTEsZT0wO2U8ZDtlKyspYys9YVtlXSsoZTxiLmxlbmd0aD9iW2VdOlwiJXNcIik7cmV0dXJuIGMrYVtkXX07Z29vZy5hc3NlcnRzLmRvQXNzZXJ0RmFpbHVyZV89ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9XCJBc3NlcnRpb24gZmFpbGVkXCI7aWYoYyl7ZSs9XCI6IFwiK2M7dmFyIGY9ZH1lbHNlIGEmJihlKz1cIjogXCIrYSxmPWIpO2E9bmV3IGdvb2cuYXNzZXJ0cy5Bc3NlcnRpb25FcnJvcihcIlwiK2UsZnx8W10pO2dvb2cuYXNzZXJ0cy5lcnJvckhhbmRsZXJfKGEpfTtnb29nLmFzc2VydHMuc2V0RXJyb3JIYW5kbGVyPWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmKGdvb2cuYXNzZXJ0cy5lcnJvckhhbmRsZXJfPWEpfTtcbmdvb2cuYXNzZXJ0cy5hc3NlcnQ9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmIWEmJmdvb2cuYXNzZXJ0cy5kb0Fzc2VydEZhaWx1cmVfKFwiXCIsbnVsbCxiLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSk7cmV0dXJuIGF9O2dvb2cuYXNzZXJ0cy5hc3NlcnRFeGlzdHM9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmbnVsbD09YSYmZ29vZy5hc3NlcnRzLmRvQXNzZXJ0RmFpbHVyZV8oXCJFeHBlY3RlZCB0byBleGlzdDogJXMuXCIsW2FdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX07XG5nb29nLmFzc2VydHMuZmFpbD1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmZ29vZy5hc3NlcnRzLmVycm9ySGFuZGxlcl8obmV3IGdvb2cuYXNzZXJ0cy5Bc3NlcnRpb25FcnJvcihcIkZhaWx1cmVcIisoYT9cIjogXCIrYTpcIlwiKSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpKX07Z29vZy5hc3NlcnRzLmFzc2VydE51bWJlcj1mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTJiYhZ29vZy5pc051bWJlcihhKSYmZ29vZy5hc3NlcnRzLmRvQXNzZXJ0RmFpbHVyZV8oXCJFeHBlY3RlZCBudW1iZXIgYnV0IGdvdCAlczogJXMuXCIsW2dvb2cudHlwZU9mKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX07XG5nb29nLmFzc2VydHMuYXNzZXJ0U3RyaW5nPWZ1bmN0aW9uKGEsYixjKXtnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMmJiFnb29nLmlzU3RyaW5nKGEpJiZnb29nLmFzc2VydHMuZG9Bc3NlcnRGYWlsdXJlXyhcIkV4cGVjdGVkIHN0cmluZyBidXQgZ290ICVzOiAlcy5cIixbZ29vZy50eXBlT2YoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfTtnb29nLmFzc2VydHMuYXNzZXJ0RnVuY3Rpb249ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmIWdvb2cuaXNGdW5jdGlvbihhKSYmZ29vZy5hc3NlcnRzLmRvQXNzZXJ0RmFpbHVyZV8oXCJFeHBlY3RlZCBmdW5jdGlvbiBidXQgZ290ICVzOiAlcy5cIixbZ29vZy50eXBlT2YoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfTtcbmdvb2cuYXNzZXJ0cy5hc3NlcnRPYmplY3Q9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmIWdvb2cuaXNPYmplY3QoYSkmJmdvb2cuYXNzZXJ0cy5kb0Fzc2VydEZhaWx1cmVfKFwiRXhwZWN0ZWQgb2JqZWN0IGJ1dCBnb3QgJXM6ICVzLlwiLFtnb29nLnR5cGVPZihhKSxhXSxiLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSk7cmV0dXJuIGF9O2dvb2cuYXNzZXJ0cy5hc3NlcnRBcnJheT1mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTJiYhZ29vZy5pc0FycmF5KGEpJiZnb29nLmFzc2VydHMuZG9Bc3NlcnRGYWlsdXJlXyhcIkV4cGVjdGVkIGFycmF5IGJ1dCBnb3QgJXM6ICVzLlwiLFtnb29nLnR5cGVPZihhKSxhXSxiLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSk7cmV0dXJuIGF9O1xuZ29vZy5hc3NlcnRzLmFzc2VydEJvb2xlYW49ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmIWdvb2cuaXNCb29sZWFuKGEpJiZnb29nLmFzc2VydHMuZG9Bc3NlcnRGYWlsdXJlXyhcIkV4cGVjdGVkIGJvb2xlYW4gYnV0IGdvdCAlczogJXMuXCIsW2dvb2cudHlwZU9mKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX07Z29vZy5hc3NlcnRzLmFzc2VydEVsZW1lbnQ9ZnVuY3Rpb24oYSxiLGMpeyFnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFN8fGdvb2cuaXNPYmplY3QoYSkmJmEubm9kZVR5cGU9PWdvb2cuZG9tLk5vZGVUeXBlLkVMRU1FTlR8fGdvb2cuYXNzZXJ0cy5kb0Fzc2VydEZhaWx1cmVfKFwiRXhwZWN0ZWQgRWxlbWVudCBidXQgZ290ICVzOiAlcy5cIixbZ29vZy50eXBlT2YoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfTtcbmdvb2cuYXNzZXJ0cy5hc3NlcnRJbnN0YW5jZW9mPWZ1bmN0aW9uKGEsYixjLGQpeyFnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFN8fGEgaW5zdGFuY2VvZiBifHxnb29nLmFzc2VydHMuZG9Bc3NlcnRGYWlsdXJlXyhcIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy5cIixbZ29vZy5hc3NlcnRzLmdldFR5cGVfKGIpLGdvb2cuYXNzZXJ0cy5nZXRUeXBlXyhhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpO3JldHVybiBhfTtnb29nLmFzc2VydHMuYXNzZXJ0RmluaXRlPWZ1bmN0aW9uKGEsYixjKXshZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTfHxcIm51bWJlclwiPT10eXBlb2YgYSYmaXNGaW5pdGUoYSl8fGdvb2cuYXNzZXJ0cy5kb0Fzc2VydEZhaWx1cmVfKFwiRXhwZWN0ZWQgJXMgdG8gYmUgYSBmaW5pdGUgbnVtYmVyIGJ1dCBpdCBpcyBub3QuXCIsW2FdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX07XG5nb29nLmFzc2VydHMuYXNzZXJ0T2JqZWN0UHJvdG90eXBlSXNJbnRhY3Q9ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gT2JqZWN0LnByb3RvdHlwZSlnb29nLmFzc2VydHMuZmFpbChhK1wiIHNob3VsZCBub3QgYmUgZW51bWVyYWJsZSBpbiBPYmplY3QucHJvdG90eXBlLlwiKX07Z29vZy5hc3NlcnRzLmdldFR5cGVfPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgRnVuY3Rpb24/YS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxcInVua25vd24gdHlwZSBuYW1lXCI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTpudWxsPT09YT9cIm51bGxcIjp0eXBlb2YgYX07Z29vZy5hcnJheT17fTtnb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTPWdvb2cuVFJVU1RFRF9TSVRFO2dvb2cuYXJyYXkuQVNTVU1FX05BVElWRV9GVU5DVElPTlM9MjAxMjxnb29nLkZFQVRVUkVTRVRfWUVBUjtnb29nLmFycmF5LnBlZWs9ZnVuY3Rpb24oYSl7cmV0dXJuIGFbYS5sZW5ndGgtMV19O2dvb2cuYXJyYXkubGFzdD1nb29nLmFycmF5LnBlZWs7XG5nb29nLmFycmF5LmluZGV4T2Y9Z29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyYmKGdvb2cuYXJyYXkuQVNTVU1FX05BVElWRV9GVU5DVElPTlN8fEFycmF5LnByb3RvdHlwZS5pbmRleE9mKT9mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydChudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYSxiLGMpfTpmdW5jdGlvbihhLGIsYyl7Yz1udWxsPT1jPzA6MD5jP01hdGgubWF4KDAsYS5sZW5ndGgrYyk6YztpZihnb29nLmlzU3RyaW5nKGEpKXJldHVybiBnb29nLmlzU3RyaW5nKGIpJiYxPT1iLmxlbmd0aD9hLmluZGV4T2YoYixjKTotMTtmb3IoO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9O1xuZ29vZy5hcnJheS5sYXN0SW5kZXhPZj1nb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTJiYoZ29vZy5hcnJheS5BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OU3x8QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKT9mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydChudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGEsYixudWxsPT1jP2EubGVuZ3RoLTE6Yyl9OmZ1bmN0aW9uKGEsYixjKXtjPW51bGw9PWM/YS5sZW5ndGgtMTpjOzA+YyYmKGM9TWF0aC5tYXgoMCxhLmxlbmd0aCtjKSk7aWYoZ29vZy5pc1N0cmluZyhhKSlyZXR1cm4gZ29vZy5pc1N0cmluZyhiKSYmMT09Yi5sZW5ndGg/YS5sYXN0SW5kZXhPZihiLGMpOi0xO2Zvcig7MDw9YztjLS0paWYoYyBpbiBhJiZhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX07XG5nb29nLmFycmF5LmZvckVhY2g9Z29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyYmKGdvb2cuYXJyYXkuQVNTVU1FX05BVElWRV9GVU5DVElPTlN8fEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKT9mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydChudWxsIT1hLmxlbmd0aCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZT1nb29nLmlzU3RyaW5nKGEpP2Euc3BsaXQoXCJcIik6YSxmPTA7ZjxkO2YrKylmIGluIGUmJmIuY2FsbChjLGVbZl0sZixhKX07Z29vZy5hcnJheS5mb3JFYWNoUmlnaHQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEubGVuZ3RoLGU9Z29vZy5pc1N0cmluZyhhKT9hLnNwbGl0KFwiXCIpOmE7Zm9yKC0tZDswPD1kOy0tZClkIGluIGUmJmIuY2FsbChjLGVbZF0sZCxhKX07XG5nb29nLmFycmF5LmZpbHRlcj1nb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTJiYoZ29vZy5hcnJheS5BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OU3x8QXJyYXkucHJvdG90eXBlLmZpbHRlcik/ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSxiLGMpfTpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWEubGVuZ3RoLGU9W10sZj0wLGc9Z29vZy5pc1N0cmluZyhhKT9hLnNwbGl0KFwiXCIpOmEsaD0wO2g8ZDtoKyspaWYoaCBpbiBnKXt2YXIgaz1nW2hdO2IuY2FsbChjLGssaCxhKSYmKGVbZisrXT1rKX1yZXR1cm4gZX07XG5nb29nLmFycmF5Lm1hcD1nb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTJiYoZ29vZy5hcnJheS5BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OU3x8QXJyYXkucHJvdG90eXBlLm1hcCk/ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYSxiLGMpfTpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWEubGVuZ3RoLGU9QXJyYXkoZCksZj1nb29nLmlzU3RyaW5nKGEpP2Euc3BsaXQoXCJcIik6YSxnPTA7ZzxkO2crKylnIGluIGYmJihlW2ddPWIuY2FsbChjLGZbZ10sZyxhKSk7cmV0dXJuIGV9O1xuZ29vZy5hcnJheS5yZWR1Y2U9Z29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyYmKGdvb2cuYXJyYXkuQVNTVU1FX05BVElWRV9GVU5DVElPTlN8fEFycmF5LnByb3RvdHlwZS5yZWR1Y2UpP2Z1bmN0aW9uKGEsYixjLGQpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO2QmJihiPWdvb2cuYmluZChiLGQpKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnJlZHVjZS5jYWxsKGEsYixjKX06ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Yztnb29nLmFycmF5LmZvckVhY2goYSxmdW5jdGlvbihjLGcpe2U9Yi5jYWxsKGQsZSxjLGcsYSl9KTtyZXR1cm4gZX07XG5nb29nLmFycmF5LnJlZHVjZVJpZ2h0PWdvb2cuTkFUSVZFX0FSUkFZX1BST1RPVFlQRVMmJihnb29nLmFycmF5LkFTU1VNRV9OQVRJVkVfRlVOQ1RJT05TfHxBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQpP2Z1bmN0aW9uKGEsYixjLGQpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9Yik7ZCYmKGI9Z29vZy5iaW5kKGIsZCkpO3JldHVybiBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQuY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWM7Z29vZy5hcnJheS5mb3JFYWNoUmlnaHQoYSxmdW5jdGlvbihjLGcpe2U9Yi5jYWxsKGQsZSxjLGcsYSl9KTtyZXR1cm4gZX07XG5nb29nLmFycmF5LnNvbWU9Z29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyYmKGdvb2cuYXJyYXkuQVNTVU1FX05BVElWRV9GVU5DVElPTlN8fEFycmF5LnByb3RvdHlwZS5zb21lKT9mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydChudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoYSxiLGMpfTpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWEubGVuZ3RoLGU9Z29vZy5pc1N0cmluZyhhKT9hLnNwbGl0KFwiXCIpOmEsZj0wO2Y8ZDtmKyspaWYoZiBpbiBlJiZiLmNhbGwoYyxlW2ZdLGYsYSkpcmV0dXJuITA7cmV0dXJuITF9O1xuZ29vZy5hcnJheS5ldmVyeT1nb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTJiYoZ29vZy5hcnJheS5BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OU3x8QXJyYXkucHJvdG90eXBlLmV2ZXJ5KT9mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydChudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5ldmVyeS5jYWxsKGEsYixjKX06ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1hLmxlbmd0aCxlPWdvb2cuaXNTdHJpbmcoYSk/YS5zcGxpdChcIlwiKTphLGY9MDtmPGQ7ZisrKWlmKGYgaW4gZSYmIWIuY2FsbChjLGVbZl0sZixhKSlyZXR1cm4hMTtyZXR1cm4hMH07Z29vZy5hcnJheS5jb3VudD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MDtnb29nLmFycmF5LmZvckVhY2goYSxmdW5jdGlvbihhLGYsZyl7Yi5jYWxsKGMsYSxmLGcpJiYrK2R9LGMpO3JldHVybiBkfTtcbmdvb2cuYXJyYXkuZmluZD1mdW5jdGlvbihhLGIsYyl7Yj1nb29nLmFycmF5LmZpbmRJbmRleChhLGIsYyk7cmV0dXJuIDA+Yj9udWxsOmdvb2cuaXNTdHJpbmcoYSk/YS5jaGFyQXQoYik6YVtiXX07Z29vZy5hcnJheS5maW5kSW5kZXg9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD1hLmxlbmd0aCxlPWdvb2cuaXNTdHJpbmcoYSk/YS5zcGxpdChcIlwiKTphLGY9MDtmPGQ7ZisrKWlmKGYgaW4gZSYmYi5jYWxsKGMsZVtmXSxmLGEpKXJldHVybiBmO3JldHVybi0xfTtnb29nLmFycmF5LmZpbmRSaWdodD1mdW5jdGlvbihhLGIsYyl7Yj1nb29nLmFycmF5LmZpbmRJbmRleFJpZ2h0KGEsYixjKTtyZXR1cm4gMD5iP251bGw6Z29vZy5pc1N0cmluZyhhKT9hLmNoYXJBdChiKTphW2JdfTtcbmdvb2cuYXJyYXkuZmluZEluZGV4UmlnaHQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEubGVuZ3RoLGU9Z29vZy5pc1N0cmluZyhhKT9hLnNwbGl0KFwiXCIpOmE7Zm9yKC0tZDswPD1kO2QtLSlpZihkIGluIGUmJmIuY2FsbChjLGVbZF0sZCxhKSlyZXR1cm4gZDtyZXR1cm4tMX07Z29vZy5hcnJheS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiAwPD1nb29nLmFycmF5LmluZGV4T2YoYSxiKX07Z29vZy5hcnJheS5pc0VtcHR5PWZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLmxlbmd0aH07Z29vZy5hcnJheS5jbGVhcj1mdW5jdGlvbihhKXtpZighZ29vZy5pc0FycmF5KGEpKWZvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKWRlbGV0ZSBhW2JdO2EubGVuZ3RoPTB9O2dvb2cuYXJyYXkuaW5zZXJ0PWZ1bmN0aW9uKGEsYil7Z29vZy5hcnJheS5jb250YWlucyhhLGIpfHxhLnB1c2goYil9O1xuZ29vZy5hcnJheS5pbnNlcnRBdD1mdW5jdGlvbihhLGIsYyl7Z29vZy5hcnJheS5zcGxpY2UoYSxjLDAsYil9O2dvb2cuYXJyYXkuaW5zZXJ0QXJyYXlBdD1mdW5jdGlvbihhLGIsYyl7Z29vZy5wYXJ0aWFsKGdvb2cuYXJyYXkuc3BsaWNlLGEsYywwKS5hcHBseShudWxsLGIpfTtnb29nLmFycmF5Lmluc2VydEJlZm9yZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7Mj09YXJndW1lbnRzLmxlbmd0aHx8MD4oZD1nb29nLmFycmF5LmluZGV4T2YoYSxjKSk/YS5wdXNoKGIpOmdvb2cuYXJyYXkuaW5zZXJ0QXQoYSxiLGQpfTtnb29nLmFycmF5LnJlbW92ZT1mdW5jdGlvbihhLGIpe2I9Z29vZy5hcnJheS5pbmRleE9mKGEsYik7dmFyIGM7KGM9MDw9YikmJmdvb2cuYXJyYXkucmVtb3ZlQXQoYSxiKTtyZXR1cm4gY307XG5nb29nLmFycmF5LnJlbW92ZUxhc3Q9ZnVuY3Rpb24oYSxiKXtiPWdvb2cuYXJyYXkubGFzdEluZGV4T2YoYSxiKTtyZXR1cm4gMDw9Yj8oZ29vZy5hcnJheS5yZW1vdmVBdChhLGIpLCEwKTohMX07Z29vZy5hcnJheS5yZW1vdmVBdD1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO3JldHVybiAxPT1BcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpLmxlbmd0aH07Z29vZy5hcnJheS5yZW1vdmVJZj1mdW5jdGlvbihhLGIsYyl7Yj1nb29nLmFycmF5LmZpbmRJbmRleChhLGIsYyk7cmV0dXJuIDA8PWI/KGdvb2cuYXJyYXkucmVtb3ZlQXQoYSxiKSwhMCk6ITF9O2dvb2cuYXJyYXkucmVtb3ZlQWxsSWY9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTA7Z29vZy5hcnJheS5mb3JFYWNoUmlnaHQoYSxmdW5jdGlvbihlLGYpe2IuY2FsbChjLGUsZixhKSYmZ29vZy5hcnJheS5yZW1vdmVBdChhLGYpJiZkKyt9KTtyZXR1cm4gZH07XG5nb29nLmFycmF5LmNvbmNhdD1mdW5jdGlvbihhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxhcmd1bWVudHMpfTtnb29nLmFycmF5LmpvaW49ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sYXJndW1lbnRzKX07Z29vZy5hcnJheS50b0FycmF5PWZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA8Yil7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX07Z29vZy5hcnJheS5jbG9uZT1nb29nLmFycmF5LnRvQXJyYXk7Z29vZy5hcnJheS5leHRlbmQ9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZD1hcmd1bWVudHNbY107aWYoZ29vZy5pc0FycmF5TGlrZShkKSl7dmFyIGU9YS5sZW5ndGh8fDAsZj1kLmxlbmd0aHx8MDthLmxlbmd0aD1lK2Y7Zm9yKHZhciBnPTA7ZzxmO2crKylhW2UrZ109ZFtnXX1lbHNlIGEucHVzaChkKX19O1xuZ29vZy5hcnJheS5zcGxpY2U9ZnVuY3Rpb24oYSxiLGMsZCl7Z29vZy5hc3NlcnRzLmFzc2VydChudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoYSxnb29nLmFycmF5LnNsaWNlKGFyZ3VtZW50cywxKSl9O2dvb2cuYXJyYXkuc2xpY2U9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO3JldHVybiAyPj1hcmd1bWVudHMubGVuZ3RoP0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYik6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiLGMpfTtcbmdvb2cuYXJyYXkucmVtb3ZlRHVwbGljYXRlcz1mdW5jdGlvbihhLGIsYyl7Yj1ifHxhO3ZhciBkPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmlzT2JqZWN0KGEpP1wib1wiK2dvb2cuZ2V0VWlkKGEpOih0eXBlb2YgYSkuY2hhckF0KDApK2F9O2M9Y3x8ZDtkPXt9O2Zvcih2YXIgZT0wLGY9MDtmPGEubGVuZ3RoOyl7dmFyIGc9YVtmKytdLGg9YyhnKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxoKXx8KGRbaF09ITAsYltlKytdPWcpfWIubGVuZ3RoPWV9O2dvb2cuYXJyYXkuYmluYXJ5U2VhcmNoPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZ29vZy5hcnJheS5iaW5hcnlTZWFyY2hfKGEsY3x8Z29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZSwhMSxiKX07Z29vZy5hcnJheS5iaW5hcnlTZWxlY3Q9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBnb29nLmFycmF5LmJpbmFyeVNlYXJjaF8oYSxiLCEwLHZvaWQgMCxjKX07XG5nb29nLmFycmF5LmJpbmFyeVNlYXJjaF89ZnVuY3Rpb24oYSxiLGMsZCxlKXtmb3IodmFyIGY9MCxnPWEubGVuZ3RoLGg7ZjxnOyl7dmFyIGs9ZitnPj4xO3ZhciBsPWM/Yi5jYWxsKGUsYVtrXSxrLGEpOmIoZCxhW2tdKTswPGw/Zj1rKzE6KGc9ayxoPSFsKX1yZXR1cm4gaD9mOn5mfTtnb29nLmFycmF5LnNvcnQ9ZnVuY3Rpb24oYSxiKXthLnNvcnQoYnx8Z29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZSl9O2dvb2cuYXJyYXkuc3RhYmxlU29ydD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1BcnJheShhLmxlbmd0aCksZD0wO2Q8YS5sZW5ndGg7ZCsrKWNbZF09e2luZGV4OmQsdmFsdWU6YVtkXX07dmFyIGU9Ynx8Z29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZTtnb29nLmFycmF5LnNvcnQoYyxmdW5jdGlvbihhLGIpe3JldHVybiBlKGEudmFsdWUsYi52YWx1ZSl8fGEuaW5kZXgtYi5pbmRleH0pO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspYVtkXT1jW2RdLnZhbHVlfTtcbmdvb2cuYXJyYXkuc29ydEJ5S2V5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jfHxnb29nLmFycmF5LmRlZmF1bHRDb21wYXJlO2dvb2cuYXJyYXkuc29ydChhLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGQoYihhKSxiKGMpKX0pfTtnb29nLmFycmF5LnNvcnRPYmplY3RzQnlLZXk9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXJyYXkuc29ydEJ5S2V5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGFbYl19LGMpfTtnb29nLmFycmF5LmlzU29ydGVkPWZ1bmN0aW9uKGEsYixjKXtiPWJ8fGdvb2cuYXJyYXkuZGVmYXVsdENvbXBhcmU7Zm9yKHZhciBkPTE7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWIoYVtkLTFdLGFbZF0pO2lmKDA8ZXx8MD09ZSYmYylyZXR1cm4hMX1yZXR1cm4hMH07XG5nb29nLmFycmF5LmVxdWFscz1mdW5jdGlvbihhLGIsYyl7aWYoIWdvb2cuaXNBcnJheUxpa2UoYSl8fCFnb29nLmlzQXJyYXlMaWtlKGIpfHxhLmxlbmd0aCE9Yi5sZW5ndGgpcmV0dXJuITE7dmFyIGQ9YS5sZW5ndGg7Yz1jfHxnb29nLmFycmF5LmRlZmF1bHRDb21wYXJlRXF1YWxpdHk7Zm9yKHZhciBlPTA7ZTxkO2UrKylpZighYyhhW2VdLGJbZV0pKXJldHVybiExO3JldHVybiEwfTtnb29nLmFycmF5LmNvbXBhcmUzPWZ1bmN0aW9uKGEsYixjKXtjPWN8fGdvb2cuYXJyYXkuZGVmYXVsdENvbXBhcmU7Zm9yKHZhciBkPU1hdGgubWluKGEubGVuZ3RoLGIubGVuZ3RoKSxlPTA7ZTxkO2UrKyl7dmFyIGY9YyhhW2VdLGJbZV0pO2lmKDAhPWYpcmV0dXJuIGZ9cmV0dXJuIGdvb2cuYXJyYXkuZGVmYXVsdENvbXBhcmUoYS5sZW5ndGgsYi5sZW5ndGgpfTtnb29nLmFycmF5LmRlZmF1bHRDb21wYXJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE+Yj8xOmE8Yj8tMTowfTtcbmdvb2cuYXJyYXkuaW52ZXJzZURlZmF1bHRDb21wYXJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuLWdvb2cuYXJyYXkuZGVmYXVsdENvbXBhcmUoYSxiKX07Z29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZUVxdWFsaXR5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1ifTtnb29nLmFycmF5LmJpbmFyeUluc2VydD1mdW5jdGlvbihhLGIsYyl7Yz1nb29nLmFycmF5LmJpbmFyeVNlYXJjaChhLGIsYyk7cmV0dXJuIDA+Yz8oZ29vZy5hcnJheS5pbnNlcnRBdChhLGIsLShjKzEpKSwhMCk6ITF9O2dvb2cuYXJyYXkuYmluYXJ5UmVtb3ZlPWZ1bmN0aW9uKGEsYixjKXtiPWdvb2cuYXJyYXkuYmluYXJ5U2VhcmNoKGEsYixjKTtyZXR1cm4gMDw9Yj9nb29nLmFycmF5LnJlbW92ZUF0KGEsYik6ITF9O1xuZ29vZy5hcnJheS5idWNrZXQ9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD17fSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBmPWFbZV0sZz1iLmNhbGwoYyxmLGUsYSk7Z29vZy5pc0RlZihnKSYmKGRbZ118fChkW2ddPVtdKSkucHVzaChmKX1yZXR1cm4gZH07Z29vZy5hcnJheS50b09iamVjdD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9e307Z29vZy5hcnJheS5mb3JFYWNoKGEsZnVuY3Rpb24oZSxmKXtkW2IuY2FsbChjLGUsZixhKV09ZX0pO3JldHVybiBkfTtnb29nLmFycmF5LnJhbmdlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPTAsZj1hO2M9Y3x8MTt2b2lkIDAhPT1iJiYoZT1hLGY9Yik7aWYoMD5jKihmLWUpKXJldHVybltdO2lmKDA8Yylmb3IoYT1lO2E8ZjthKz1jKWQucHVzaChhKTtlbHNlIGZvcihhPWU7YT5mO2ErPWMpZC5wdXNoKGEpO3JldHVybiBkfTtcbmdvb2cuYXJyYXkucmVwZWF0PWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLGQ9MDtkPGI7ZCsrKWNbZF09YTtyZXR1cm4gY307Z29vZy5hcnJheS5mbGF0dGVuPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl7dmFyIGQ9YXJndW1lbnRzW2NdO2lmKGdvb2cuaXNBcnJheShkKSlmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrPTgxOTIpe3ZhciBmPWdvb2cuYXJyYXkuc2xpY2UoZCxlLGUrODE5Mik7Zj1nb29nLmFycmF5LmZsYXR0ZW4uYXBwbHkobnVsbCxmKTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyliLnB1c2goZltnXSl9ZWxzZSBiLnB1c2goZCl9cmV0dXJuIGJ9O1xuZ29vZy5hcnJheS5yb3RhdGU9ZnVuY3Rpb24oYSxiKXtnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwhPWEubGVuZ3RoKTthLmxlbmd0aCYmKGIlPWEubGVuZ3RoLDA8Yj9BcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShhLGEuc3BsaWNlKC1iLGIpKTowPmImJkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGEsYS5zcGxpY2UoMCwtYikpKTtyZXR1cm4gYX07Z29vZy5hcnJheS5tb3ZlSXRlbT1mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydCgwPD1iJiZiPGEubGVuZ3RoKTtnb29nLmFzc2VydHMuYXNzZXJ0KDA8PWMmJmM8YS5sZW5ndGgpO2I9QXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGEsYiwxKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxjLDAsYlswXSl9O1xuZ29vZy5hcnJheS56aXA9ZnVuY3Rpb24oYSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107Zm9yKHZhciBiPVtdLGM9YXJndW1lbnRzWzBdLmxlbmd0aCxkPTE7ZDxhcmd1bWVudHMubGVuZ3RoO2QrKylhcmd1bWVudHNbZF0ubGVuZ3RoPGMmJihjPWFyZ3VtZW50c1tkXS5sZW5ndGgpO2ZvcihkPTA7ZDxjO2QrKyl7Zm9yKHZhciBlPVtdLGY9MDtmPGFyZ3VtZW50cy5sZW5ndGg7ZisrKWUucHVzaChhcmd1bWVudHNbZl1bZF0pO2IucHVzaChlKX1yZXR1cm4gYn07Z29vZy5hcnJheS5zaHVmZmxlPWZ1bmN0aW9uKGEsYil7Yj1ifHxNYXRoLnJhbmRvbTtmb3IodmFyIGM9YS5sZW5ndGgtMTswPGM7Yy0tKXt2YXIgZD1NYXRoLmZsb29yKGIoKSooYysxKSksZT1hW2NdO2FbY109YVtkXTthW2RdPWV9fTtnb29nLmFycmF5LmNvcHlCeUluZGV4PWZ1bmN0aW9uKGEsYil7dmFyIGM9W107Z29vZy5hcnJheS5mb3JFYWNoKGIsZnVuY3Rpb24oYil7Yy5wdXNoKGFbYl0pfSk7cmV0dXJuIGN9O1xuZ29vZy5hcnJheS5jb25jYXRNYXA9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBnb29nLmFycmF5LmNvbmNhdC5hcHBseShbXSxnb29nLmFycmF5Lm1hcChhLGIsYykpfTtnb29nLmNyeXB0PXt9O2dvb2cuY3J5cHQuc3RyaW5nVG9CeXRlQXJyYXk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MCxkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWEuY2hhckNvZGVBdChkKTsyNTU8ZSYmKGJbYysrXT1lJjI1NSxlPj49OCk7YltjKytdPWV9cmV0dXJuIGJ9O2dvb2cuY3J5cHQuYnl0ZUFycmF5VG9TdHJpbmc9ZnVuY3Rpb24oYSl7aWYoODE5Mj49YS5sZW5ndGgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhKTtmb3IodmFyIGI9XCJcIixjPTA7YzxhLmxlbmd0aDtjKz04MTkyKXt2YXIgZD1nb29nLmFycmF5LnNsaWNlKGEsYyxjKzgxOTIpO2IrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxkKX1yZXR1cm4gYn07XG5nb29nLmNyeXB0LmJ5dGVBcnJheVRvSGV4PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuYXJyYXkubWFwKGEsZnVuY3Rpb24oYSl7YT1hLnRvU3RyaW5nKDE2KTtyZXR1cm4gMTxhLmxlbmd0aD9hOlwiMFwiK2F9KS5qb2luKGJ8fFwiXCIpfTtnb29nLmNyeXB0LmhleFRvQnl0ZUFycmF5PWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoMD09YS5sZW5ndGglMixcIktleSBzdHJpbmcgbGVuZ3RoIG11c3QgYmUgbXVsdGlwbGUgb2YgMlwiKTtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7Yys9MiliLnB1c2gocGFyc2VJbnQoYS5zdWJzdHJpbmcoYyxjKzIpLDE2KSk7cmV0dXJuIGJ9O1xuZ29vZy5jcnlwdC5zdHJpbmdUb1V0ZjhCeXRlQXJyYXk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MCxkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWEuY2hhckNvZGVBdChkKTsxMjg+ZT9iW2MrK109ZTooMjA0OD5lP2JbYysrXT1lPj42fDE5MjooNTUyOTY9PShlJjY0NTEyKSYmZCsxPGEubGVuZ3RoJiY1NjMyMD09KGEuY2hhckNvZGVBdChkKzEpJjY0NTEyKT8oZT02NTUzNisoKGUmMTAyMyk8PDEwKSsoYS5jaGFyQ29kZUF0KCsrZCkmMTAyMyksYltjKytdPWU+PjE4fDI0MCxiW2MrK109ZT4+MTImNjN8MTI4KTpiW2MrK109ZT4+MTJ8MjI0LGJbYysrXT1lPj42JjYzfDEyOCksYltjKytdPWUmNjN8MTI4KX1yZXR1cm4gYn07XG5nb29nLmNyeXB0LnV0ZjhCeXRlQXJyYXlUb1N0cmluZz1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wLGQ9MDtjPGEubGVuZ3RoOyl7dmFyIGU9YVtjKytdO2lmKDEyOD5lKWJbZCsrXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpO2Vsc2UgaWYoMTkxPGUmJjIyND5lKXt2YXIgZj1hW2MrK107YltkKytdPVN0cmluZy5mcm9tQ2hhckNvZGUoKGUmMzEpPDw2fGYmNjMpfWVsc2UgaWYoMjM5PGUmJjM2NT5lKXtmPWFbYysrXTt2YXIgZz1hW2MrK10saD1hW2MrK107ZT0oKGUmNyk8PDE4fChmJjYzKTw8MTJ8KGcmNjMpPDw2fGgmNjMpLTY1NTM2O2JbZCsrXT1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2KyhlPj4xMCkpO2JbZCsrXT1TdHJpbmcuZnJvbUNoYXJDb2RlKDU2MzIwKyhlJjEwMjMpKX1lbHNlIGY9YVtjKytdLGc9YVtjKytdLGJbZCsrXT1TdHJpbmcuZnJvbUNoYXJDb2RlKChlJjE1KTw8MTJ8KGYmNjMpPDw2fGcmNjMpfXJldHVybiBiLmpvaW4oXCJcIil9O1xuZ29vZy5jcnlwdC54b3JCeXRlQXJyYXk9ZnVuY3Rpb24oYSxiKXtnb29nLmFzc2VydHMuYXNzZXJ0KGEubGVuZ3RoPT1iLmxlbmd0aCxcIlhPUiBhcnJheSBsZW5ndGhzIG11c3QgbWF0Y2hcIik7Zm9yKHZhciBjPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyljLnB1c2goYVtkXV5iW2RdKTtyZXR1cm4gY307Z29vZy5zdHJpbmc9e307Z29vZy5zdHJpbmcuaW50ZXJuYWw9e307Z29vZy5zdHJpbmcuaW50ZXJuYWwuc3RhcnRzV2l0aD1mdW5jdGlvbihhLGIpe3JldHVybiAwPT1hLmxhc3RJbmRleE9mKGIsMCl9O2dvb2cuc3RyaW5nLmludGVybmFsLmVuZHNXaXRoPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgtYi5sZW5ndGg7cmV0dXJuIDA8PWMmJmEuaW5kZXhPZihiLGMpPT1jfTtnb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVTdGFydHNXaXRoPWZ1bmN0aW9uKGEsYil7cmV0dXJuIDA9PWdvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUNvbXBhcmUoYixhLnN1YnN0cigwLGIubGVuZ3RoKSl9O2dvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUVuZHNXaXRoPWZ1bmN0aW9uKGEsYil7cmV0dXJuIDA9PWdvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUNvbXBhcmUoYixhLnN1YnN0cihhLmxlbmd0aC1iLmxlbmd0aCxiLmxlbmd0aCkpfTtcbmdvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUVxdWFscz1mdW5jdGlvbihhLGIpe3JldHVybiBhLnRvTG93ZXJDYXNlKCk9PWIudG9Mb3dlckNhc2UoKX07Z29vZy5zdHJpbmcuaW50ZXJuYWwuaXNFbXB0eU9yV2hpdGVzcGFjZT1mdW5jdGlvbihhKXtyZXR1cm4vXltcXHNcXHhhMF0qJC8udGVzdChhKX07Z29vZy5zdHJpbmcuaW50ZXJuYWwudHJpbT1nb29nLlRSVVNURURfU0lURSYmU3RyaW5nLnByb3RvdHlwZS50cmltP2Z1bmN0aW9uKGEpe3JldHVybiBhLnRyaW0oKX06ZnVuY3Rpb24oYSl7cmV0dXJuL15bXFxzXFx4YTBdKihbXFxzXFxTXSo/KVtcXHNcXHhhMF0qJC8uZXhlYyhhKVsxXX07Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlQ29tcGFyZT1mdW5jdGlvbihhLGIpe2E9U3RyaW5nKGEpLnRvTG93ZXJDYXNlKCk7Yj1TdHJpbmcoYikudG9Mb3dlckNhc2UoKTtyZXR1cm4gYTxiPy0xOmE9PWI/MDoxfTtcbmdvb2cuc3RyaW5nLmludGVybmFsLm5ld0xpbmVUb0JyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEucmVwbGFjZSgvKFxcclxcbnxcXHJ8XFxuKS9nLGI/XCI8YnIgLz5cIjpcIjxicj5cIil9O1xuZ29vZy5zdHJpbmcuaW50ZXJuYWwuaHRtbEVzY2FwZT1mdW5jdGlvbihhLGIpe2lmKGIpYT1hLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuQU1QX1JFXyxcIiZhbXA7XCIpLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuTFRfUkVfLFwiJmx0O1wiKS5yZXBsYWNlKGdvb2cuc3RyaW5nLmludGVybmFsLkdUX1JFXyxcIiZndDtcIikucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5RVU9UX1JFXyxcIiZxdW90O1wiKS5yZXBsYWNlKGdvb2cuc3RyaW5nLmludGVybmFsLlNJTkdMRV9RVU9URV9SRV8sXCImIzM5O1wiKS5yZXBsYWNlKGdvb2cuc3RyaW5nLmludGVybmFsLk5VTExfUkVfLFwiJiMwO1wiKTtlbHNle2lmKCFnb29nLnN0cmluZy5pbnRlcm5hbC5BTExfUkVfLnRlc3QoYSkpcmV0dXJuIGE7LTEhPWEuaW5kZXhPZihcIiZcIikmJihhPWEucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5BTVBfUkVfLFwiJmFtcDtcIikpOy0xIT1hLmluZGV4T2YoXCI8XCIpJiYoYT1hLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuTFRfUkVfLFxuXCImbHQ7XCIpKTstMSE9YS5pbmRleE9mKFwiPlwiKSYmKGE9YS5yZXBsYWNlKGdvb2cuc3RyaW5nLmludGVybmFsLkdUX1JFXyxcIiZndDtcIikpOy0xIT1hLmluZGV4T2YoJ1wiJykmJihhPWEucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5RVU9UX1JFXyxcIiZxdW90O1wiKSk7LTEhPWEuaW5kZXhPZihcIidcIikmJihhPWEucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5TSU5HTEVfUVVPVEVfUkVfLFwiJiMzOTtcIikpOy0xIT1hLmluZGV4T2YoXCJcXHgwMFwiKSYmKGE9YS5yZXBsYWNlKGdvb2cuc3RyaW5nLmludGVybmFsLk5VTExfUkVfLFwiJiMwO1wiKSl9cmV0dXJuIGF9O2dvb2cuc3RyaW5nLmludGVybmFsLkFNUF9SRV89LyYvZztnb29nLnN0cmluZy5pbnRlcm5hbC5MVF9SRV89LzwvZztnb29nLnN0cmluZy5pbnRlcm5hbC5HVF9SRV89Lz4vZztnb29nLnN0cmluZy5pbnRlcm5hbC5RVU9UX1JFXz0vXCIvZztnb29nLnN0cmluZy5pbnRlcm5hbC5TSU5HTEVfUVVPVEVfUkVfPS8nL2c7XG5nb29nLnN0cmluZy5pbnRlcm5hbC5OVUxMX1JFXz0vXFx4MDAvZztnb29nLnN0cmluZy5pbnRlcm5hbC5BTExfUkVfPS9bXFx4MDAmPD5cIiddLztnb29nLnN0cmluZy5pbnRlcm5hbC53aGl0ZXNwYWNlRXNjYXBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuc3RyaW5nLmludGVybmFsLm5ld0xpbmVUb0JyKGEucmVwbGFjZSgvICAvZyxcIiAmIzE2MDtcIiksYil9O2dvb2cuc3RyaW5nLmludGVybmFsLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuLTEhPWEuaW5kZXhPZihiKX07Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlQ29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29udGFpbnMoYS50b0xvd2VyQ2FzZSgpLGIudG9Mb3dlckNhc2UoKSl9O1xuZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29tcGFyZVZlcnNpb25zPWZ1bmN0aW9uKGEsYil7dmFyIGM9MDthPWdvb2cuc3RyaW5nLmludGVybmFsLnRyaW0oU3RyaW5nKGEpKS5zcGxpdChcIi5cIik7Yj1nb29nLnN0cmluZy5pbnRlcm5hbC50cmltKFN0cmluZyhiKSkuc3BsaXQoXCIuXCIpO2Zvcih2YXIgZD1NYXRoLm1heChhLmxlbmd0aCxiLmxlbmd0aCksZT0wOzA9PWMmJmU8ZDtlKyspe3ZhciBmPWFbZV18fFwiXCIsZz1iW2VdfHxcIlwiO2Rve2Y9LyhcXGQqKShcXEQqKSguKikvLmV4ZWMoZil8fFtcIlwiLFwiXCIsXCJcIixcIlwiXTtnPS8oXFxkKikoXFxEKikoLiopLy5leGVjKGcpfHxbXCJcIixcIlwiLFwiXCIsXCJcIl07aWYoMD09ZlswXS5sZW5ndGgmJjA9PWdbMF0ubGVuZ3RoKWJyZWFrO2M9MD09ZlsxXS5sZW5ndGg/MDpwYXJzZUludChmWzFdLDEwKTt2YXIgaD0wPT1nWzFdLmxlbmd0aD8wOnBhcnNlSW50KGdbMV0sMTApO2M9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY29tcGFyZUVsZW1lbnRzXyhjLGgpfHxnb29nLnN0cmluZy5pbnRlcm5hbC5jb21wYXJlRWxlbWVudHNfKDA9PVxuZlsyXS5sZW5ndGgsMD09Z1syXS5sZW5ndGgpfHxnb29nLnN0cmluZy5pbnRlcm5hbC5jb21wYXJlRWxlbWVudHNfKGZbMl0sZ1syXSk7Zj1mWzNdO2c9Z1szXX13aGlsZSgwPT1jKX1yZXR1cm4gY307Z29vZy5zdHJpbmcuaW50ZXJuYWwuY29tcGFyZUVsZW1lbnRzXz1mdW5jdGlvbihhLGIpe3JldHVybiBhPGI/LTE6YT5iPzE6MH07Z29vZy5zdHJpbmcuVHlwZWRTdHJpbmc9ZnVuY3Rpb24oKXt9O2dvb2cuc3RyaW5nLkNvbnN0PWZ1bmN0aW9uKGEsYil7dGhpcy5zdHJpbmdDb25zdFZhbHVlV2l0aFNlY3VyaXR5Q29udHJhY3RfX2dvb2dTdHJpbmdTZWN1cml0eVByaXZhdGVfPWE9PT1nb29nLnN0cmluZy5Db25zdC5HT09HX1NUUklOR19DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFXyYmYnx8XCJcIjt0aGlzLlNUUklOR19DT05TVF9UWVBFX01BUktFUl9fR09PR19TVFJJTkdfU0VDVVJJVFlfUFJJVkFURV89Z29vZy5zdHJpbmcuQ29uc3QuVFlQRV9NQVJLRVJffTtnb29nLnN0cmluZy5Db25zdC5wcm90b3R5cGUuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz0hMDtnb29nLnN0cmluZy5Db25zdC5wcm90b3R5cGUuZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZ0NvbnN0VmFsdWVXaXRoU2VjdXJpdHlDb250cmFjdF9fZ29vZ1N0cmluZ1NlY3VyaXR5UHJpdmF0ZV99O1xuZ29vZy5zdHJpbmcuQ29uc3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJDb25zdHtcIit0aGlzLnN0cmluZ0NvbnN0VmFsdWVXaXRoU2VjdXJpdHlDb250cmFjdF9fZ29vZ1N0cmluZ1NlY3VyaXR5UHJpdmF0ZV8rXCJ9XCJ9O2dvb2cuc3RyaW5nLkNvbnN0LnVud3JhcD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgZ29vZy5zdHJpbmcuQ29uc3QmJmEuY29uc3RydWN0b3I9PT1nb29nLnN0cmluZy5Db25zdCYmYS5TVFJJTkdfQ09OU1RfVFlQRV9NQVJLRVJfX0dPT0dfU1RSSU5HX1NFQ1VSSVRZX1BSSVZBVEVfPT09Z29vZy5zdHJpbmcuQ29uc3QuVFlQRV9NQVJLRVJfKXJldHVybiBhLnN0cmluZ0NvbnN0VmFsdWVXaXRoU2VjdXJpdHlDb250cmFjdF9fZ29vZ1N0cmluZ1NlY3VyaXR5UHJpdmF0ZV87Z29vZy5hc3NlcnRzLmZhaWwoXCJleHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBDb25zdCwgZ290ICdcIithK1wiJ1wiKTtyZXR1cm5cInR5cGVfZXJyb3I6Q29uc3RcIn07XG5nb29nLnN0cmluZy5Db25zdC5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgZ29vZy5zdHJpbmcuQ29uc3QoZ29vZy5zdHJpbmcuQ29uc3QuR09PR19TVFJJTkdfQ09OU1RSVUNUT1JfVE9LRU5fUFJJVkFURV8sYSl9O2dvb2cuc3RyaW5nLkNvbnN0LlRZUEVfTUFSS0VSXz17fTtnb29nLnN0cmluZy5Db25zdC5HT09HX1NUUklOR19DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFXz17fTtnb29nLnN0cmluZy5Db25zdC5FTVBUWT1nb29nLnN0cmluZy5Db25zdC5mcm9tKFwiXCIpO2dvb2cuZnM9e307Z29vZy5mcy51cmw9e307Z29vZy5mcy51cmwuY3JlYXRlT2JqZWN0VXJsPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmZzLnVybC5nZXRVcmxPYmplY3RfKCkuY3JlYXRlT2JqZWN0VVJMKGEpfTtnb29nLmZzLnVybC5yZXZva2VPYmplY3RVcmw9ZnVuY3Rpb24oYSl7Z29vZy5mcy51cmwuZ2V0VXJsT2JqZWN0XygpLnJldm9rZU9iamVjdFVSTChhKX07Z29vZy5mcy51cmwuZ2V0VXJsT2JqZWN0Xz1mdW5jdGlvbigpe3ZhciBhPWdvb2cuZnMudXJsLmZpbmRVcmxPYmplY3RfKCk7aWYobnVsbCE9YSlyZXR1cm4gYTt0aHJvdyBFcnJvcihcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCBibG9iIFVSTHNcIik7fTtcbmdvb2cuZnMudXJsLmZpbmRVcmxPYmplY3RfPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cuaXNEZWYoZ29vZy5nbG9iYWwuVVJMKSYmZ29vZy5pc0RlZihnb29nLmdsb2JhbC5VUkwuY3JlYXRlT2JqZWN0VVJMKT9nb29nLmdsb2JhbC5VUkw6Z29vZy5pc0RlZihnb29nLmdsb2JhbC53ZWJraXRVUkwpJiZnb29nLmlzRGVmKGdvb2cuZ2xvYmFsLndlYmtpdFVSTC5jcmVhdGVPYmplY3RVUkwpP2dvb2cuZ2xvYmFsLndlYmtpdFVSTDpnb29nLmlzRGVmKGdvb2cuZ2xvYmFsLmNyZWF0ZU9iamVjdFVSTCk/Z29vZy5nbG9iYWw6bnVsbH07Z29vZy5mcy51cmwuYnJvd3NlclN1cHBvcnRzT2JqZWN0VXJscz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1nb29nLmZzLnVybC5maW5kVXJsT2JqZWN0XygpfTtnb29nLmh0bWw9e307Z29vZy5odG1sLnRydXN0ZWR0eXBlcz17fTtnb29nLmh0bWwudHJ1c3RlZHR5cGVzLlBSSVZBVEVfRE9fTk9UX0FDQ0VTU19PUl9FTFNFX1BPTElDWT1nb29nLlRSVVNURURfVFlQRVNfUE9MSUNZX05BTUU/Z29vZy5jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3koZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FK1wiI2h0bWxcIik6bnVsbDtnb29nLmkxOG49e307Z29vZy5pMThuLmJpZGk9e307Z29vZy5pMThuLmJpZGkuRk9SQ0VfUlRMPSExO1xuZ29vZy5pMThuLmJpZGkuSVNfUlRMPWdvb2cuaTE4bi5iaWRpLkZPUkNFX1JUTHx8KFwiYXJcIj09Z29vZy5MT0NBTEUuc3Vic3RyaW5nKDAsMikudG9Mb3dlckNhc2UoKXx8XCJmYVwiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpfHxcImhlXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZygwLDIpLnRvTG93ZXJDYXNlKCl8fFwiaXdcIj09Z29vZy5MT0NBTEUuc3Vic3RyaW5nKDAsMikudG9Mb3dlckNhc2UoKXx8XCJwc1wiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpfHxcInNkXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZygwLDIpLnRvTG93ZXJDYXNlKCl8fFwidWdcIj09Z29vZy5MT0NBTEUuc3Vic3RyaW5nKDAsMikudG9Mb3dlckNhc2UoKXx8XCJ1clwiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpfHxcInlpXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZygwLDIpLnRvTG93ZXJDYXNlKCkpJiYoMj09Z29vZy5MT0NBTEUubGVuZ3RofHxcblwiLVwiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMiwzKXx8XCJfXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZygyLDMpKXx8Mzw9Z29vZy5MT0NBTEUubGVuZ3RoJiZcImNrYlwiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMCwzKS50b0xvd2VyQ2FzZSgpJiYoMz09Z29vZy5MT0NBTEUubGVuZ3RofHxcIi1cIj09Z29vZy5MT0NBTEUuc3Vic3RyaW5nKDMsNCl8fFwiX1wiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMyw0KSl8fDc8PWdvb2cuTE9DQUxFLmxlbmd0aCYmKFwiLVwiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMiwzKXx8XCJfXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZygyLDMpKSYmKFwiYWRsbVwiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMyw3KS50b0xvd2VyQ2FzZSgpfHxcImFyYWJcIj09Z29vZy5MT0NBTEUuc3Vic3RyaW5nKDMsNykudG9Mb3dlckNhc2UoKXx8XCJoZWJyXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZygzLDcpLnRvTG93ZXJDYXNlKCl8fFwibmtvb1wiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMyxcbjcpLnRvTG93ZXJDYXNlKCl8fFwicm9oZ1wiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMyw3KS50b0xvd2VyQ2FzZSgpfHxcInRoYWFcIj09Z29vZy5MT0NBTEUuc3Vic3RyaW5nKDMsNykudG9Mb3dlckNhc2UoKSl8fDg8PWdvb2cuTE9DQUxFLmxlbmd0aCYmKFwiLVwiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoMyw0KXx8XCJfXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZygzLDQpKSYmKFwiYWRsbVwiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoNCw4KS50b0xvd2VyQ2FzZSgpfHxcImFyYWJcIj09Z29vZy5MT0NBTEUuc3Vic3RyaW5nKDQsOCkudG9Mb3dlckNhc2UoKXx8XCJoZWJyXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZyg0LDgpLnRvTG93ZXJDYXNlKCl8fFwibmtvb1wiPT1nb29nLkxPQ0FMRS5zdWJzdHJpbmcoNCw4KS50b0xvd2VyQ2FzZSgpfHxcInJvaGdcIj09Z29vZy5MT0NBTEUuc3Vic3RyaW5nKDQsOCkudG9Mb3dlckNhc2UoKXx8XCJ0aGFhXCI9PWdvb2cuTE9DQUxFLnN1YnN0cmluZyg0LDgpLnRvTG93ZXJDYXNlKCkpO1xuZ29vZy5pMThuLmJpZGkuRm9ybWF0PXtMUkU6XCJcXHUyMDJhXCIsUkxFOlwiXFx1MjAyYlwiLFBERjpcIlxcdTIwMmNcIixMUk06XCJcXHUyMDBlXCIsUkxNOlwiXFx1MjAwZlwifTtnb29nLmkxOG4uYmlkaS5EaXI9e0xUUjoxLFJUTDotMSxORVVUUkFMOjB9O2dvb2cuaTE4bi5iaWRpLlJJR0hUPVwicmlnaHRcIjtnb29nLmkxOG4uYmlkaS5MRUZUPVwibGVmdFwiO2dvb2cuaTE4bi5iaWRpLkkxOE5fUklHSFQ9Z29vZy5pMThuLmJpZGkuSVNfUlRMP2dvb2cuaTE4bi5iaWRpLkxFRlQ6Z29vZy5pMThuLmJpZGkuUklHSFQ7Z29vZy5pMThuLmJpZGkuSTE4Tl9MRUZUPWdvb2cuaTE4bi5iaWRpLklTX1JUTD9nb29nLmkxOG4uYmlkaS5SSUdIVDpnb29nLmkxOG4uYmlkaS5MRUZUO1xuZ29vZy5pMThuLmJpZGkudG9EaXI9ZnVuY3Rpb24oYSxiKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgYT8wPGE/Z29vZy5pMThuLmJpZGkuRGlyLkxUUjowPmE/Z29vZy5pMThuLmJpZGkuRGlyLlJUTDpiP251bGw6Z29vZy5pMThuLmJpZGkuRGlyLk5FVVRSQUw6bnVsbD09YT9udWxsOmE/Z29vZy5pMThuLmJpZGkuRGlyLlJUTDpnb29nLmkxOG4uYmlkaS5EaXIuTFRSfTtnb29nLmkxOG4uYmlkaS5sdHJDaGFyc189XCJBLVphLXpcXHUwMGMwLVxcdTAwZDZcXHUwMGQ4LVxcdTAwZjZcXHUwMGY4LVxcdTAyYjhcXHUwMzAwLVxcdTA1OTBcXHUwOTAwLVxcdTFmZmZcXHUyMDBlXFx1MmMwMC1cXHVkODAxXFx1ZDgwNC1cXHVkODM5XFx1ZDgzYy1cXHVkYmZmXFx1ZjkwMC1cXHVmYjFjXFx1ZmUwMC1cXHVmZTZmXFx1ZmVmZC1cXHVmZmZmXCI7Z29vZy5pMThuLmJpZGkucnRsQ2hhcnNfPVwiXFx1MDU5MS1cXHUwNmVmXFx1MDZmYS1cXHUwOGZmXFx1MjAwZlxcdWQ4MDItXFx1ZDgwM1xcdWQ4M2EtXFx1ZDgzYlxcdWZiMWQtXFx1ZmRmZlxcdWZlNzAtXFx1ZmVmY1wiO1xuZ29vZy5pMThuLmJpZGkuaHRtbFNraXBSZWdfPS88W14+XSo+fCZbXjtdKzsvZztnb29nLmkxOG4uYmlkaS5zdHJpcEh0bWxJZk5lZWRlZF89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9hLnJlcGxhY2UoZ29vZy5pMThuLmJpZGkuaHRtbFNraXBSZWdfLFwiXCIpOmF9O2dvb2cuaTE4bi5iaWRpLnJ0bENoYXJSZWdfPW5ldyBSZWdFeHAoXCJbXCIrZ29vZy5pMThuLmJpZGkucnRsQ2hhcnNfK1wiXVwiKTtnb29nLmkxOG4uYmlkaS5sdHJDaGFyUmVnXz1uZXcgUmVnRXhwKFwiW1wiK2dvb2cuaTE4bi5iaWRpLmx0ckNoYXJzXytcIl1cIik7Z29vZy5pMThuLmJpZGkuaGFzQW55UnRsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuaTE4bi5iaWRpLnJ0bENoYXJSZWdfLnRlc3QoZ29vZy5pMThuLmJpZGkuc3RyaXBIdG1sSWZOZWVkZWRfKGEsYikpfTtnb29nLmkxOG4uYmlkaS5oYXNSdGxDaGFyPWdvb2cuaTE4bi5iaWRpLmhhc0FueVJ0bDtcbmdvb2cuaTE4bi5iaWRpLmhhc0FueUx0cj1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmkxOG4uYmlkaS5sdHJDaGFyUmVnXy50ZXN0KGdvb2cuaTE4bi5iaWRpLnN0cmlwSHRtbElmTmVlZGVkXyhhLGIpKX07Z29vZy5pMThuLmJpZGkubHRyUmVfPW5ldyBSZWdFeHAoXCJeW1wiK2dvb2cuaTE4bi5iaWRpLmx0ckNoYXJzXytcIl1cIik7Z29vZy5pMThuLmJpZGkucnRsUmVfPW5ldyBSZWdFeHAoXCJeW1wiK2dvb2cuaTE4bi5iaWRpLnJ0bENoYXJzXytcIl1cIik7Z29vZy5pMThuLmJpZGkuaXNSdGxDaGFyPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmkxOG4uYmlkaS5ydGxSZV8udGVzdChhKX07Z29vZy5pMThuLmJpZGkuaXNMdHJDaGFyPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmkxOG4uYmlkaS5sdHJSZV8udGVzdChhKX07Z29vZy5pMThuLmJpZGkuaXNOZXV0cmFsQ2hhcj1mdW5jdGlvbihhKXtyZXR1cm4hZ29vZy5pMThuLmJpZGkuaXNMdHJDaGFyKGEpJiYhZ29vZy5pMThuLmJpZGkuaXNSdGxDaGFyKGEpfTtcbmdvb2cuaTE4bi5iaWRpLmx0ckRpckNoZWNrUmVfPW5ldyBSZWdFeHAoXCJeW15cIitnb29nLmkxOG4uYmlkaS5ydGxDaGFyc18rXCJdKltcIitnb29nLmkxOG4uYmlkaS5sdHJDaGFyc18rXCJdXCIpO2dvb2cuaTE4bi5iaWRpLnJ0bERpckNoZWNrUmVfPW5ldyBSZWdFeHAoXCJeW15cIitnb29nLmkxOG4uYmlkaS5sdHJDaGFyc18rXCJdKltcIitnb29nLmkxOG4uYmlkaS5ydGxDaGFyc18rXCJdXCIpO2dvb2cuaTE4bi5iaWRpLnN0YXJ0c1dpdGhSdGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5pMThuLmJpZGkucnRsRGlyQ2hlY2tSZV8udGVzdChnb29nLmkxOG4uYmlkaS5zdHJpcEh0bWxJZk5lZWRlZF8oYSxiKSl9O2dvb2cuaTE4bi5iaWRpLmlzUnRsVGV4dD1nb29nLmkxOG4uYmlkaS5zdGFydHNXaXRoUnRsO1xuZ29vZy5pMThuLmJpZGkuc3RhcnRzV2l0aEx0cj1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmkxOG4uYmlkaS5sdHJEaXJDaGVja1JlXy50ZXN0KGdvb2cuaTE4bi5iaWRpLnN0cmlwSHRtbElmTmVlZGVkXyhhLGIpKX07Z29vZy5pMThuLmJpZGkuaXNMdHJUZXh0PWdvb2cuaTE4bi5iaWRpLnN0YXJ0c1dpdGhMdHI7Z29vZy5pMThuLmJpZGkuaXNSZXF1aXJlZEx0clJlXz0vXmh0dHA6XFwvXFwvLiovO2dvb2cuaTE4bi5iaWRpLmlzTmV1dHJhbFRleHQ9ZnVuY3Rpb24oYSxiKXthPWdvb2cuaTE4bi5iaWRpLnN0cmlwSHRtbElmTmVlZGVkXyhhLGIpO3JldHVybiBnb29nLmkxOG4uYmlkaS5pc1JlcXVpcmVkTHRyUmVfLnRlc3QoYSl8fCFnb29nLmkxOG4uYmlkaS5oYXNBbnlMdHIoYSkmJiFnb29nLmkxOG4uYmlkaS5oYXNBbnlSdGwoYSl9O1xuZ29vZy5pMThuLmJpZGkubHRyRXhpdERpckNoZWNrUmVfPW5ldyBSZWdFeHAoXCJbXCIrZ29vZy5pMThuLmJpZGkubHRyQ2hhcnNfK1wiXVteXCIrZ29vZy5pMThuLmJpZGkucnRsQ2hhcnNfK1wiXSokXCIpO2dvb2cuaTE4bi5iaWRpLnJ0bEV4aXREaXJDaGVja1JlXz1uZXcgUmVnRXhwKFwiW1wiK2dvb2cuaTE4bi5iaWRpLnJ0bENoYXJzXytcIl1bXlwiK2dvb2cuaTE4bi5iaWRpLmx0ckNoYXJzXytcIl0qJFwiKTtnb29nLmkxOG4uYmlkaS5lbmRzV2l0aEx0cj1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmkxOG4uYmlkaS5sdHJFeGl0RGlyQ2hlY2tSZV8udGVzdChnb29nLmkxOG4uYmlkaS5zdHJpcEh0bWxJZk5lZWRlZF8oYSxiKSl9O2dvb2cuaTE4bi5iaWRpLmlzTHRyRXhpdFRleHQ9Z29vZy5pMThuLmJpZGkuZW5kc1dpdGhMdHI7XG5nb29nLmkxOG4uYmlkaS5lbmRzV2l0aFJ0bD1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmkxOG4uYmlkaS5ydGxFeGl0RGlyQ2hlY2tSZV8udGVzdChnb29nLmkxOG4uYmlkaS5zdHJpcEh0bWxJZk5lZWRlZF8oYSxiKSl9O2dvb2cuaTE4bi5iaWRpLmlzUnRsRXhpdFRleHQ9Z29vZy5pMThuLmJpZGkuZW5kc1dpdGhSdGw7Z29vZy5pMThuLmJpZGkucnRsTG9jYWxlc1JlXz0vXihhcnxja2J8ZHZ8aGV8aXd8ZmF8bnFvfHBzfHNkfHVnfHVyfHlpfC4qWy1fXShBZGxtfEFyYWJ8SGVicnxOa29vfFJvaGd8VGhhYSkpKD8hLipbLV9dKExhdG58Q3lybCkoJHwtfF8pKSgkfC18XykvaTtnb29nLmkxOG4uYmlkaS5pc1J0bExhbmd1YWdlPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmkxOG4uYmlkaS5ydGxMb2NhbGVzUmVfLnRlc3QoYSl9O2dvb2cuaTE4bi5iaWRpLmJyYWNrZXRHdWFyZFRleHRSZV89LyhcXCguKj9cXCkrKXwoXFxbLio/XFxdKyl8KFxcey4qP1xcfSspfCg8Lio/PispL2c7XG5nb29nLmkxOG4uYmlkaS5ndWFyZEJyYWNrZXRJblRleHQ9ZnVuY3Rpb24oYSxiKXtiPSh2b2lkIDA9PT1iP2dvb2cuaTE4bi5iaWRpLmhhc0FueVJ0bChhKTpiKT9nb29nLmkxOG4uYmlkaS5Gb3JtYXQuUkxNOmdvb2cuaTE4bi5iaWRpLkZvcm1hdC5MUk07cmV0dXJuIGEucmVwbGFjZShnb29nLmkxOG4uYmlkaS5icmFja2V0R3VhcmRUZXh0UmVfLGIrXCIkJlwiK2IpfTtnb29nLmkxOG4uYmlkaS5lbmZvcmNlUnRsSW5IdG1sPWZ1bmN0aW9uKGEpe3JldHVyblwiPFwiPT1hLmNoYXJBdCgwKT9hLnJlcGxhY2UoLzxcXHcrLyxcIiQmIGRpcj1ydGxcIik6XCJcXG48c3BhbiBkaXI9cnRsPlwiK2ErXCI8L3NwYW4+XCJ9O2dvb2cuaTE4bi5iaWRpLmVuZm9yY2VSdGxJblRleHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuaTE4bi5iaWRpLkZvcm1hdC5STEUrYStnb29nLmkxOG4uYmlkaS5Gb3JtYXQuUERGfTtcbmdvb2cuaTE4bi5iaWRpLmVuZm9yY2VMdHJJbkh0bWw9ZnVuY3Rpb24oYSl7cmV0dXJuXCI8XCI9PWEuY2hhckF0KDApP2EucmVwbGFjZSgvPFxcdysvLFwiJCYgZGlyPWx0clwiKTpcIlxcbjxzcGFuIGRpcj1sdHI+XCIrYStcIjwvc3Bhbj5cIn07Z29vZy5pMThuLmJpZGkuZW5mb3JjZUx0ckluVGV4dD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5pMThuLmJpZGkuRm9ybWF0LkxSRSthK2dvb2cuaTE4bi5iaWRpLkZvcm1hdC5QREZ9O2dvb2cuaTE4bi5iaWRpLmRpbWVuc2lvbnNSZV89LzpcXHMqKFsuXFxkXVsuXFx3XSopXFxzKyhbLlxcZF1bLlxcd10qKVxccysoWy5cXGRdWy5cXHddKilcXHMrKFsuXFxkXVsuXFx3XSopL2c7Z29vZy5pMThuLmJpZGkubGVmdFJlXz0vbGVmdC9naTtnb29nLmkxOG4uYmlkaS5yaWdodFJlXz0vcmlnaHQvZ2k7Z29vZy5pMThuLmJpZGkudGVtcFJlXz0vJSUlJS9nO1xuZ29vZy5pMThuLmJpZGkubWlycm9yQ1NTPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoZ29vZy5pMThuLmJpZGkuZGltZW5zaW9uc1JlXyxcIjokMSAkNCAkMyAkMlwiKS5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLmxlZnRSZV8sXCIlJSUlXCIpLnJlcGxhY2UoZ29vZy5pMThuLmJpZGkucmlnaHRSZV8sZ29vZy5pMThuLmJpZGkuTEVGVCkucmVwbGFjZShnb29nLmkxOG4uYmlkaS50ZW1wUmVfLGdvb2cuaTE4bi5iaWRpLlJJR0hUKX07Z29vZy5pMThuLmJpZGkuZG91YmxlUXVvdGVTdWJzdGl0dXRlUmVfPS8oW1xcdTA1OTEtXFx1MDVmMl0pXCIvZztnb29nLmkxOG4uYmlkaS5zaW5nbGVRdW90ZVN1YnN0aXR1dGVSZV89LyhbXFx1MDU5MS1cXHUwNWYyXSknL2c7XG5nb29nLmkxOG4uYmlkaS5ub3JtYWxpemVIZWJyZXdRdW90ZT1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLmRvdWJsZVF1b3RlU3Vic3RpdHV0ZVJlXyxcIiQxXFx1MDVmNFwiKS5yZXBsYWNlKGdvb2cuaTE4bi5iaWRpLnNpbmdsZVF1b3RlU3Vic3RpdHV0ZVJlXyxcIiQxXFx1MDVmM1wiKX07Z29vZy5pMThuLmJpZGkud29yZFNlcGFyYXRvclJlXz0vXFxzKy87Z29vZy5pMThuLmJpZGkuaGFzTnVtZXJhbHNSZV89L1tcXGRcXHUwNmYwLVxcdTA2ZjldLztnb29nLmkxOG4uYmlkaS5ydGxEZXRlY3Rpb25UaHJlc2hvbGRfPS40O1xuZ29vZy5pMThuLmJpZGkuZXN0aW1hdGVEaXJlY3Rpb249ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9MCxlPSExO2E9Z29vZy5pMThuLmJpZGkuc3RyaXBIdG1sSWZOZWVkZWRfKGEsYikuc3BsaXQoZ29vZy5pMThuLmJpZGkud29yZFNlcGFyYXRvclJlXyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGY9YVtiXTtnb29nLmkxOG4uYmlkaS5zdGFydHNXaXRoUnRsKGYpPyhjKyssZCsrKTpnb29nLmkxOG4uYmlkaS5pc1JlcXVpcmVkTHRyUmVfLnRlc3QoZik/ZT0hMDpnb29nLmkxOG4uYmlkaS5oYXNBbnlMdHIoZik/ZCsrOmdvb2cuaTE4bi5iaWRpLmhhc051bWVyYWxzUmVfLnRlc3QoZikmJihlPSEwKX1yZXR1cm4gMD09ZD9lP2dvb2cuaTE4bi5iaWRpLkRpci5MVFI6Z29vZy5pMThuLmJpZGkuRGlyLk5FVVRSQUw6Yy9kPmdvb2cuaTE4bi5iaWRpLnJ0bERldGVjdGlvblRocmVzaG9sZF8/Z29vZy5pMThuLmJpZGkuRGlyLlJUTDpnb29nLmkxOG4uYmlkaS5EaXIuTFRSfTtcbmdvb2cuaTE4bi5iaWRpLmRldGVjdFJ0bERpcmVjdGlvbmFsaXR5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuaTE4bi5iaWRpLmVzdGltYXRlRGlyZWN0aW9uKGEsYik9PWdvb2cuaTE4bi5iaWRpLkRpci5SVEx9O2dvb2cuaTE4bi5iaWRpLnNldEVsZW1lbnREaXJBbmRBbGlnbj1mdW5jdGlvbihhLGIpe2EmJihiPWdvb2cuaTE4bi5iaWRpLnRvRGlyKGIpKSYmKGEuc3R5bGUudGV4dEFsaWduPWI9PWdvb2cuaTE4bi5iaWRpLkRpci5SVEw/Z29vZy5pMThuLmJpZGkuUklHSFQ6Z29vZy5pMThuLmJpZGkuTEVGVCxhLmRpcj1iPT1nb29nLmkxOG4uYmlkaS5EaXIuUlRMP1wicnRsXCI6XCJsdHJcIil9O1xuZ29vZy5pMThuLmJpZGkuc2V0RWxlbWVudERpckJ5VGV4dERpcmVjdGlvbmFsaXR5PWZ1bmN0aW9uKGEsYil7c3dpdGNoKGdvb2cuaTE4bi5iaWRpLmVzdGltYXRlRGlyZWN0aW9uKGIpKXtjYXNlIGdvb2cuaTE4bi5iaWRpLkRpci5MVFI6YS5kaXI9XCJsdHJcIjticmVhaztjYXNlIGdvb2cuaTE4bi5iaWRpLkRpci5SVEw6YS5kaXI9XCJydGxcIjticmVhaztkZWZhdWx0OmEucmVtb3ZlQXR0cmlidXRlKFwiZGlyXCIpfX07Z29vZy5pMThuLmJpZGkuRGlyZWN0aW9uYWxTdHJpbmc9ZnVuY3Rpb24oKXt9O2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmw9ZnVuY3Rpb24oKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVRydXN0ZWRSZXNvdXJjZVVybFdyYXBwZWRWYWx1ZV89XCJcIjt0aGlzLnRydXN0ZWRVUkxfPW51bGw7dGhpcy5UUlVTVEVEX1JFU09VUkNFX1VSTF9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV99O2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwucHJvdG90eXBlLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmc9ITA7Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5wcm90b3R5cGUuZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVRydXN0ZWRSZXNvdXJjZVVybFdyYXBwZWRWYWx1ZV8udG9TdHJpbmcoKX07XG5nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnByb3RvdHlwZS5pbXBsZW1lbnRzR29vZ0kxOG5CaWRpRGlyZWN0aW9uYWxTdHJpbmc9ITA7Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5wcm90b3R5cGUuZ2V0RGlyZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cuaTE4bi5iaWRpLkRpci5MVFJ9O1xuZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5wcm90b3R5cGUuY2xvbmVXaXRoUGFyYW1zPWZ1bmN0aW9uKGEsYil7dmFyIGM9Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXAodGhpcyk7Yz1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLlVSTF9QQVJBTV9QQVJTRVJfLmV4ZWMoYyk7dmFyIGQ9Y1szXXx8XCJcIjtyZXR1cm4gZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5jcmVhdGVUcnVzdGVkUmVzb3VyY2VVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShjWzFdK2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuc3RyaW5naWZ5UGFyYW1zXyhcIj9cIixjWzJdfHxcIlwiLGEpK2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuc3RyaW5naWZ5UGFyYW1zXyhcIiNcIixkLGIpKX07XG5nb29nLkRFQlVHJiYoZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIlRydXN0ZWRSZXNvdXJjZVVybHtcIit0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVRydXN0ZWRSZXNvdXJjZVVybFdyYXBwZWRWYWx1ZV8rXCJ9XCJ9KTtnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXBUcnVzdGVkU2NyaXB0VVJMKGEpLnRvU3RyaW5nKCl9O1xuZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXBUcnVzdGVkU2NyaXB0VVJMPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJiZhLmNvbnN0cnVjdG9yPT09Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCYmYS5UUlVTVEVEX1JFU09VUkNFX1VSTF9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89PT1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLlRZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXylyZXR1cm4gYS5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VUcnVzdGVkUmVzb3VyY2VVcmxXcmFwcGVkVmFsdWVfO2dvb2cuYXNzZXJ0cy5mYWlsKFwiZXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgVHJ1c3RlZFJlc291cmNlVXJsLCBnb3QgJ1wiK2ErXCInIG9mIHR5cGUgXCIrZ29vZy50eXBlT2YoYSkpO3JldHVyblwidHlwZV9lcnJvcjpUcnVzdGVkUmVzb3VyY2VVcmxcIn07XG5nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcFRydXN0ZWRVUkw9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJ1c3RlZFVSTF8/YS50cnVzdGVkVVJMXzpnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcChhKX07XG5nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmZvcm1hdD1mdW5jdGlvbihhLGIpe3ZhciBjPWdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKTtpZighZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5CQVNFX1VSTF8udGVzdChjKSl0aHJvdyBFcnJvcihcIkludmFsaWQgVHJ1c3RlZFJlc291cmNlVXJsIGZvcm1hdDogXCIrYyk7YT1jLnJlcGxhY2UoZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5GT1JNQVRfTUFSS0VSXyxmdW5jdGlvbihhLGUpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYixlKSl0aHJvdyBFcnJvcignRm91bmQgbWFya2VyLCBcIicrZSsnXCIsIGluIGZvcm1hdCBzdHJpbmcsIFwiJytjKydcIiwgYnV0IG5vIHZhbGlkIGxhYmVsIG1hcHBpbmcgZm91bmQgaW4gYXJnczogJytKU09OLnN0cmluZ2lmeShiKSk7YT1iW2VdO3JldHVybiBhIGluc3RhbmNlb2YgZ29vZy5zdHJpbmcuQ29uc3Q/Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpOlxuZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhhKSl9KTtyZXR1cm4gZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5jcmVhdGVUcnVzdGVkUmVzb3VyY2VVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKX07Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5GT1JNQVRfTUFSS0VSXz0vJXsoXFx3Kyl9L2c7Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5CQVNFX1VSTF89L14oKGh0dHBzOik/XFwvXFwvWzAtOWEtei46W1xcXS1dK1xcL3xcXC9bXi9cXFxcXXxbXjovXFxcXCVdK1xcL3xbXjovXFxcXCVdKls/I118YWJvdXQ6YmxhbmsjKS9pO2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuVVJMX1BBUkFNX1BBUlNFUl89L14oW14/I10qKShcXD9bXiNdKik/KCNbXFxzXFxTXSopPy87XG5nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmZvcm1hdFdpdGhQYXJhbXM9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuZm9ybWF0KGEsYikuY2xvbmVXaXRoUGFyYW1zKGMsZCl9O2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuZnJvbUNvbnN0YW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmNyZWF0ZVRydXN0ZWRSZXNvdXJjZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKSl9O2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuZnJvbUNvbnN0YW50cz1mdW5jdGlvbihhKXtmb3IodmFyIGI9XCJcIixjPTA7YzxhLmxlbmd0aDtjKyspYis9Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGFbY10pO3JldHVybiBnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmNyZWF0ZVRydXN0ZWRSZXNvdXJjZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGIpfTtcbmdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPXt9O1xuZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5jcmVhdGVUcnVzdGVkUmVzb3VyY2VVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZT1mdW5jdGlvbihhKXt2YXIgYj1uZXcgZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybDtiLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVRydXN0ZWRSZXNvdXJjZVVybFdyYXBwZWRWYWx1ZV89Z29vZy5odG1sLnRydXN0ZWR0eXBlcy5QUklWQVRFX0RPX05PVF9BQ0NFU1NfT1JfRUxTRV9QT0xJQ1k/Z29vZy5odG1sLnRydXN0ZWR0eXBlcy5QUklWQVRFX0RPX05PVF9BQ0NFU1NfT1JfRUxTRV9QT0xJQ1kuY3JlYXRlU2NyaXB0VVJMKGEpOmE7Z29vZy5odG1sLnRydXN0ZWR0eXBlcy5QUklWQVRFX0RPX05PVF9BQ0NFU1NfT1JfRUxTRV9QT0xJQ1kmJihiLnRydXN0ZWRVUkxfPWdvb2cuaHRtbC50cnVzdGVkdHlwZXMuUFJJVkFURV9ET19OT1RfQUNDRVNTX09SX0VMU0VfUE9MSUNZLmNyZWF0ZVVSTChhKSk7cmV0dXJuIGJ9O1xuZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5zdHJpbmdpZnlQYXJhbXNfPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT1jKXJldHVybiBiO2lmKGdvb2cuaXNTdHJpbmcoYykpcmV0dXJuIGM/YStlbmNvZGVVUklDb21wb25lbnQoYyk6XCJcIjtmb3IodmFyIGQgaW4gYyl7dmFyIGU9Y1tkXTtlPWdvb2cuaXNBcnJheShlKT9lOltlXTtmb3IodmFyIGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGc9ZVtmXTtudWxsIT1nJiYoYnx8KGI9YSksYis9KGIubGVuZ3RoPmEubGVuZ3RoP1wiJlwiOlwiXCIpK2VuY29kZVVSSUNvbXBvbmVudChkKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGcpKSl9fXJldHVybiBifTtnb29nLmh0bWwuU2FmZVVybD1mdW5jdGlvbigpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV89XCJcIjt0aGlzLlNBRkVfVVJMX1RZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXz1nb29nLmh0bWwuU2FmZVVybC5UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV99O2dvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkc9XCJhYm91dDppbnZhbGlkI3pDbG9zdXJlelwiO2dvb2cuaHRtbC5TYWZlVXJsLnByb3RvdHlwZS5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO2dvb2cuaHRtbC5TYWZlVXJsLnByb3RvdHlwZS5nZXRUeXBlZFN0cmluZ1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV8udG9TdHJpbmcoKX07XG5nb29nLmh0bWwuU2FmZVVybC5wcm90b3R5cGUuaW1wbGVtZW50c0dvb2dJMThuQmlkaURpcmVjdGlvbmFsU3RyaW5nPSEwO2dvb2cuaHRtbC5TYWZlVXJsLnByb3RvdHlwZS5nZXREaXJlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5pMThuLmJpZGkuRGlyLkxUUn07Z29vZy5ERUJVRyYmKGdvb2cuaHRtbC5TYWZlVXJsLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiU2FmZVVybHtcIit0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVVcmxXcmFwcGVkVmFsdWVfK1wifVwifSk7Z29vZy5odG1sLlNhZmVVcmwudW53cmFwPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmh0bWwuU2FmZVVybC51bndyYXBUcnVzdGVkVVJMKGEpLnRvU3RyaW5nKCl9O1xuZ29vZy5odG1sLlNhZmVVcmwudW53cmFwVHJ1c3RlZFVSTD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmwmJmEuY29uc3RydWN0b3I9PT1nb29nLmh0bWwuU2FmZVVybCYmYS5TQUZFX1VSTF9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89PT1nb29nLmh0bWwuU2FmZVVybC5UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV8pcmV0dXJuIGEucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV87Z29vZy5hc3NlcnRzLmZhaWwoXCJleHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBTYWZlVXJsLCBnb3QgJ1wiK2ErXCInIG9mIHR5cGUgXCIrZ29vZy50eXBlT2YoYSkpO3JldHVyblwidHlwZV9lcnJvcjpTYWZlVXJsXCJ9O2dvb2cuaHRtbC5TYWZlVXJsLmZyb21Db25zdGFudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKSl9O1xuZ29vZy5odG1sLlNBRkVfTUlNRV9UWVBFX1BBVFRFUk5fPS9eKD86YXVkaW9cXC8oPzozZ3BwMnwzZ3BwfGFhY3xMMTZ8bWlkaXxtcDN8bXA0fG1wZWd8b2dhfG9nZ3xvcHVzfHgtbTRhfHgtd2F2fHdhdnx3ZWJtKXxpbWFnZVxcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicHx4LWljb24pfHRleHRcXC9jc3Z8dmlkZW9cXC8oPzptcGVnfG1wNHxvZ2d8d2VibXxxdWlja3RpbWUpKSg/OjtcXHcrPSg/Olxcdyt8XCJbXFx3Oz1dK1wiKSkqJC9pO2dvb2cuaHRtbC5TYWZlVXJsLmlzU2FmZU1pbWVUeXBlPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmh0bWwuU0FGRV9NSU1FX1RZUEVfUEFUVEVSTl8udGVzdChhKX07Z29vZy5odG1sLlNhZmVVcmwuZnJvbUJsb2I9ZnVuY3Rpb24oYSl7YT1nb29nLmh0bWwuU0FGRV9NSU1FX1RZUEVfUEFUVEVSTl8udGVzdChhLnR5cGUpP2dvb2cuZnMudXJsLmNyZWF0ZU9iamVjdFVybChhKTpnb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9O1xuZ29vZy5odG1sLkRBVEFfVVJMX1BBVFRFUk5fPS9eZGF0YTooW14sXSopO2Jhc2U2NCxbYS16MC05K1xcL10rPSokL2k7Z29vZy5odG1sLlNhZmVVcmwuZnJvbURhdGFVcmw9ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoLyglMEF8JTBEKS9nLFwiXCIpO3ZhciBiPWEubWF0Y2goZ29vZy5odG1sLkRBVEFfVVJMX1BBVFRFUk5fKTtiPWImJmdvb2cuaHRtbC5TQUZFX01JTUVfVFlQRV9QQVRURVJOXy50ZXN0KGJbMV0pO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYj9hOmdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkcpfTtnb29nLmh0bWwuU2FmZVVybC5mcm9tVGVsVXJsPWZ1bmN0aW9uKGEpe2dvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZVN0YXJ0c1dpdGgoYSxcInRlbDpcIil8fChhPWdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkcpO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9O1xuZ29vZy5odG1sLlNJUF9VUkxfUEFUVEVSTl89L15zaXBbc10/OlsrYS16MC05Xy4hJCUmJypcXC89XmB7fH1+LV0rQChbYS16MC05LV0rXFwuKStbYS16MC05XXsyLDYzfSQvaTtnb29nLmh0bWwuU2FmZVVybC5mcm9tU2lwVXJsPWZ1bmN0aW9uKGEpe2dvb2cuaHRtbC5TSVBfVVJMX1BBVFRFUk5fLnRlc3QoZGVjb2RlVVJJQ29tcG9uZW50KGEpKXx8KGE9Z29vZy5odG1sLlNhZmVVcmwuSU5OT0NVT1VTX1NUUklORyk7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLmNyZWF0ZVNhZmVVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKX07Z29vZy5odG1sLlNhZmVVcmwuZnJvbUZhY2Vib29rTWVzc2VuZ2VyVXJsPWZ1bmN0aW9uKGEpe2dvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZVN0YXJ0c1dpdGgoYSxcImZiLW1lc3NlbmdlcjovL3NoYXJlXCIpfHwoYT1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTtcbmdvb2cuaHRtbC5TYWZlVXJsLmZyb21XaGF0c0FwcFVybD1mdW5jdGlvbihhKXtnb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVTdGFydHNXaXRoKGEsXCJ3aGF0c2FwcDovL3NlbmRcIil8fChhPWdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkcpO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9O2dvb2cuaHRtbC5TYWZlVXJsLmZyb21TbXNVcmw9ZnVuY3Rpb24oYSl7Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlU3RhcnRzV2l0aChhLFwic21zOlwiKSYmZ29vZy5odG1sLlNhZmVVcmwuaXNTbXNVcmxCb2R5VmFsaWRfKGEpfHwoYT1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTtcbmdvb2cuaHRtbC5TYWZlVXJsLmlzU21zVXJsQm9keVZhbGlkXz1mdW5jdGlvbihhKXt2YXIgYj1hLmluZGV4T2YoXCIjXCIpOzA8YiYmKGE9YS5zdWJzdHJpbmcoMCxiKSk7Yj1hLm1hdGNoKC9bPyZdYm9keT0vZ2kpO2lmKCFiKXJldHVybiEwO2lmKDE8Yi5sZW5ndGgpcmV0dXJuITE7YT1hLm1hdGNoKC9bPyZdYm9keT0oW14mXSopLylbMV07aWYoIWEpcmV0dXJuITA7dHJ5e2RlY29kZVVSSUNvbXBvbmVudChhKX1jYXRjaChjKXtyZXR1cm4hMX1yZXR1cm4vXig/OlthLXowLTlcXC1fLn5dfCVbMC05YS1mXXsyfSkrJC9pLnRlc3QoYSl9O2dvb2cuaHRtbC5TYWZlVXJsLmZyb21Tc2hVcmw9ZnVuY3Rpb24oYSl7Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlU3RhcnRzV2l0aChhLFwic3NoOi8vXCIpfHwoYT1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTtcbmdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQ2hyb21lRXh0ZW5zaW9uVXJsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplRXh0ZW5zaW9uVXJsXygvXmNocm9tZS1leHRlbnNpb246XFwvXFwvKFteXFwvXSspXFwvLyxhLGIpfTtnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUZpcmVmb3hFeHRlbnNpb25Vcmw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVFeHRlbnNpb25VcmxfKC9ebW96LWV4dGVuc2lvbjpcXC9cXC8oW15cXC9dKylcXC8vLGEsYil9O2dvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplRWRnZUV4dGVuc2lvblVybD1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUV4dGVuc2lvblVybF8oL15tcy1icm93c2VyLWV4dGVuc2lvbjpcXC9cXC8oW15cXC9dKylcXC8vLGEsYil9O1xuZ29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVFeHRlbnNpb25VcmxfPWZ1bmN0aW9uKGEsYixjKXsoYT1hLmV4ZWMoYikpPyhhPWFbMV0sLTE9PShjIGluc3RhbmNlb2YgZ29vZy5zdHJpbmcuQ29uc3Q/W2dvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChjKV06Yy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKX0pKS5pbmRleE9mKGEpJiYoYj1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HKSk6Yj1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYil9O2dvb2cuaHRtbC5TYWZlVXJsLmZyb21UcnVzdGVkUmVzb3VyY2VVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLmNyZWF0ZVNhZmVVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcChhKSl9O1xuZ29vZy5odG1sLlNBRkVfVVJMX1BBVFRFUk5fPS9eKD86KD86aHR0cHM/fG1haWx0b3xmdHApOnxbXjovPyNdKig/OlsvPyNdfCQpKS9pO2dvb2cuaHRtbC5TYWZlVXJsLlNBRkVfVVJMX1BBVFRFUk49Z29vZy5odG1sLlNBRkVfVVJMX1BBVFRFUk5fO2dvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybClyZXR1cm4gYTthPVwib2JqZWN0XCI9PXR5cGVvZiBhJiZhLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmc/YS5nZXRUeXBlZFN0cmluZ1ZhbHVlKCk6U3RyaW5nKGEpO2dvb2cuaHRtbC5TQUZFX1VSTF9QQVRURVJOXy50ZXN0KGEpfHwoYT1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTtcbmdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkPWZ1bmN0aW9uKGEsYil7aWYoYSBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsKXJldHVybiBhO2E9XCJvYmplY3RcIj09dHlwZW9mIGEmJmEuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz9hLmdldFR5cGVkU3RyaW5nVmFsdWUoKTpTdHJpbmcoYSk7aWYoYiYmL15kYXRhOi9pLnRlc3QoYSkmJihiPWdvb2cuaHRtbC5TYWZlVXJsLmZyb21EYXRhVXJsKGEpLGIuZ2V0VHlwZWRTdHJpbmdWYWx1ZSgpPT1hKSlyZXR1cm4gYjtnb29nLmFzc2VydHMuYXNzZXJ0KGdvb2cuaHRtbC5TQUZFX1VSTF9QQVRURVJOXy50ZXN0KGEpLFwiJXMgZG9lcyBub3QgbWF0Y2ggdGhlIHNhZmUgVVJMIHBhdHRlcm5cIixhKXx8KGE9Z29vZy5odG1sLlNhZmVVcmwuSU5OT0NVT1VTX1NUUklORyk7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLmNyZWF0ZVNhZmVVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKX07XG5nb29nLmh0bWwuU2FmZVVybC5UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89e307Z29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBnb29nLmh0bWwuU2FmZVVybDtiLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVVcmxXcmFwcGVkVmFsdWVfPWdvb2cuaHRtbC50cnVzdGVkdHlwZXMuUFJJVkFURV9ET19OT1RfQUNDRVNTX09SX0VMU0VfUE9MSUNZP2dvb2cuaHRtbC50cnVzdGVkdHlwZXMuUFJJVkFURV9ET19OT1RfQUNDRVNTX09SX0VMU0VfUE9MSUNZLmNyZWF0ZVVSTChhKTphO3JldHVybiBifTtnb29nLmh0bWwuU2FmZVVybC5BQk9VVF9CTEFOSz1nb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoXCJhYm91dDpibGFua1wiKTtnb29nLmh0bWwuU2FmZVN0eWxlPWZ1bmN0aW9uKCl7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVXcmFwcGVkVmFsdWVfPVwiXCI7dGhpcy5TQUZFX1NUWUxFX1RZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXz1nb29nLmh0bWwuU2FmZVN0eWxlLlRZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFX307Z29vZy5odG1sLlNhZmVTdHlsZS5wcm90b3R5cGUuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz0hMDtnb29nLmh0bWwuU2FmZVN0eWxlLlRZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXz17fTtcbmdvb2cuaHRtbC5TYWZlU3R5bGUuZnJvbUNvbnN0YW50PWZ1bmN0aW9uKGEpe2E9Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gZ29vZy5odG1sLlNhZmVTdHlsZS5FTVBUWTtnb29nLmFzc2VydHMuYXNzZXJ0KGdvb2cuc3RyaW5nLmludGVybmFsLmVuZHNXaXRoKGEsXCI7XCIpLFwiTGFzdCBjaGFyYWN0ZXIgb2Ygc3R5bGUgc3RyaW5nIGlzIG5vdCAnOyc6IFwiK2EpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29udGFpbnMoYSxcIjpcIiksXCJTdHlsZSBzdHJpbmcgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSAnOicsIHRvIHNwZWNpZnkgYSBcXFwibmFtZTogdmFsdWVcXFwiIHBhaXI6IFwiK2EpO3JldHVybiBnb29nLmh0bWwuU2FmZVN0eWxlLmNyZWF0ZVNhZmVTdHlsZVNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTtcbmdvb2cuaHRtbC5TYWZlU3R5bGUucHJvdG90eXBlLmdldFR5cGVkU3RyaW5nVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVXcmFwcGVkVmFsdWVffTtnb29nLkRFQlVHJiYoZ29vZy5odG1sLlNhZmVTdHlsZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIlNhZmVTdHlsZXtcIit0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVdyYXBwZWRWYWx1ZV8rXCJ9XCJ9KTtcbmdvb2cuaHRtbC5TYWZlU3R5bGUudW53cmFwPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVN0eWxlJiZhLmNvbnN0cnVjdG9yPT09Z29vZy5odG1sLlNhZmVTdHlsZSYmYS5TQUZFX1NUWUxFX1RZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXz09PWdvb2cuaHRtbC5TYWZlU3R5bGUuVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfKXJldHVybiBhLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVdyYXBwZWRWYWx1ZV87Z29vZy5hc3NlcnRzLmZhaWwoXCJleHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBTYWZlU3R5bGUsIGdvdCAnXCIrYStcIicgb2YgdHlwZSBcIitnb29nLnR5cGVPZihhKSk7cmV0dXJuXCJ0eXBlX2Vycm9yOlNhZmVTdHlsZVwifTtnb29nLmh0bWwuU2FmZVN0eWxlLmNyZWF0ZVNhZmVTdHlsZVNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlPWZ1bmN0aW9uKGEpe3JldHVybihuZXcgZ29vZy5odG1sLlNhZmVTdHlsZSkuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXyhhKX07XG5nb29nLmh0bWwuU2FmZVN0eWxlLnByb3RvdHlwZS5pbml0U2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VfPWZ1bmN0aW9uKGEpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlV3JhcHBlZFZhbHVlXz1hO3JldHVybiB0aGlzfTtnb29nLmh0bWwuU2FmZVN0eWxlLkVNUFRZPWdvb2cuaHRtbC5TYWZlU3R5bGUuY3JlYXRlU2FmZVN0eWxlU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoXCJcIik7Z29vZy5odG1sLlNhZmVTdHlsZS5JTk5PQ1VPVVNfU1RSSU5HPVwiekNsb3N1cmV6XCI7XG5nb29nLmh0bWwuU2FmZVN0eWxlLmNyZWF0ZT1mdW5jdGlvbihhKXt2YXIgYj1cIlwiLGM7Zm9yKGMgaW4gYSl7aWYoIS9eWy1fYS16QS1aMC05XSskLy50ZXN0KGMpKXRocm93IEVycm9yKFwiTmFtZSBhbGxvd3Mgb25seSBbLV9hLXpBLVowLTldLCBnb3Q6IFwiK2MpO3ZhciBkPWFbY107bnVsbCE9ZCYmKGQ9Z29vZy5pc0FycmF5KGQpP2dvb2cuYXJyYXkubWFwKGQsZ29vZy5odG1sLlNhZmVTdHlsZS5zYW5pdGl6ZVByb3BlcnR5VmFsdWVfKS5qb2luKFwiIFwiKTpnb29nLmh0bWwuU2FmZVN0eWxlLnNhbml0aXplUHJvcGVydHlWYWx1ZV8oZCksYis9YytcIjpcIitkK1wiO1wiKX1yZXR1cm4gYj9nb29nLmh0bWwuU2FmZVN0eWxlLmNyZWF0ZVNhZmVTdHlsZVNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGIpOmdvb2cuaHRtbC5TYWZlU3R5bGUuRU1QVFl9O1xuZ29vZy5odG1sLlNhZmVTdHlsZS5zYW5pdGl6ZVByb3BlcnR5VmFsdWVfPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybClyZXR1cm4ndXJsKFwiJytnb29nLmh0bWwuU2FmZVVybC51bndyYXAoYSkucmVwbGFjZSgvPC9nLFwiJTNjXCIpLnJlcGxhY2UoL1tcXFxcXCJdL2csXCJcXFxcJCZcIikrJ1wiKSc7YT1hIGluc3RhbmNlb2YgZ29vZy5zdHJpbmcuQ29uc3Q/Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpOmdvb2cuaHRtbC5TYWZlU3R5bGUuc2FuaXRpemVQcm9wZXJ0eVZhbHVlU3RyaW5nXyhTdHJpbmcoYSkpO2lmKC9bezt9XS8udGVzdChhKSl0aHJvdyBuZXcgZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yKFwiVmFsdWUgZG9lcyBub3QgYWxsb3cgW3s7fV0sIGdvdDogJXMuXCIsW2FdKTtyZXR1cm4gYX07XG5nb29nLmh0bWwuU2FmZVN0eWxlLnNhbml0aXplUHJvcGVydHlWYWx1ZVN0cmluZ189ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGdvb2cuaHRtbC5TYWZlU3R5bGUuRlVOQ1RJT05TX1JFXyxcIiQxXCIpLnJlcGxhY2UoZ29vZy5odG1sLlNhZmVTdHlsZS5GVU5DVElPTlNfUkVfLFwiJDFcIikucmVwbGFjZShnb29nLmh0bWwuU2FmZVN0eWxlLlVSTF9SRV8sXCJ1cmxcIik7aWYoZ29vZy5odG1sLlNhZmVTdHlsZS5WQUxVRV9SRV8udGVzdChiKSl7aWYoZ29vZy5odG1sLlNhZmVTdHlsZS5DT01NRU5UX1JFXy50ZXN0KGEpKXJldHVybiBnb29nLmFzc2VydHMuZmFpbChcIlN0cmluZyB2YWx1ZSBkaXNhbGxvd3MgY29tbWVudHMsIGdvdDogXCIrYSksZ29vZy5odG1sLlNhZmVTdHlsZS5JTk5PQ1VPVVNfU1RSSU5HO2lmKCFnb29nLmh0bWwuU2FmZVN0eWxlLmhhc0JhbGFuY2VkUXVvdGVzXyhhKSlyZXR1cm4gZ29vZy5hc3NlcnRzLmZhaWwoXCJTdHJpbmcgdmFsdWUgcmVxdWlyZXMgYmFsYW5jZWQgcXVvdGVzLCBnb3Q6IFwiK1xuYSksZ29vZy5odG1sLlNhZmVTdHlsZS5JTk5PQ1VPVVNfU1RSSU5HO2lmKCFnb29nLmh0bWwuU2FmZVN0eWxlLmhhc0JhbGFuY2VkU3F1YXJlQnJhY2tldHNfKGEpKXJldHVybiBnb29nLmFzc2VydHMuZmFpbChcIlN0cmluZyB2YWx1ZSByZXF1aXJlcyBiYWxhbmNlZCBzcXVhcmUgYnJhY2tldHMgYW5kIG9uZSBpZGVudGlmaWVyIHBlciBwYWlyIG9mIGJyYWNrZXRzLCBnb3Q6IFwiK2EpLGdvb2cuaHRtbC5TYWZlU3R5bGUuSU5OT0NVT1VTX1NUUklOR31lbHNlIHJldHVybiBnb29nLmFzc2VydHMuZmFpbChcIlN0cmluZyB2YWx1ZSBhbGxvd3Mgb25seSBcIitnb29nLmh0bWwuU2FmZVN0eWxlLlZBTFVFX0FMTE9XRURfQ0hBUlNfK1wiIGFuZCBzaW1wbGUgZnVuY3Rpb25zLCBnb3Q6IFwiK2EpLGdvb2cuaHRtbC5TYWZlU3R5bGUuSU5OT0NVT1VTX1NUUklORztyZXR1cm4gZ29vZy5odG1sLlNhZmVTdHlsZS5zYW5pdGl6ZVVybF8oYSl9O1xuZ29vZy5odG1sLlNhZmVTdHlsZS5oYXNCYWxhbmNlZFF1b3Rlc189ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSEwLGM9ITAsZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hLmNoYXJBdChkKTtcIidcIj09ZSYmYz9iPSFiOidcIic9PWUmJmImJihjPSFjKX1yZXR1cm4gYiYmY307Z29vZy5odG1sLlNhZmVTdHlsZS5oYXNCYWxhbmNlZFNxdWFyZUJyYWNrZXRzXz1mdW5jdGlvbihhKXtmb3IodmFyIGI9ITAsYz0vXlstX2EtekEtWjAtOV0kLyxkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWEuY2hhckF0KGQpO2lmKFwiXVwiPT1lKXtpZihiKXJldHVybiExO2I9ITB9ZWxzZSBpZihcIltcIj09ZSl7aWYoIWIpcmV0dXJuITE7Yj0hMX1lbHNlIGlmKCFiJiYhYy50ZXN0KGUpKXJldHVybiExfXJldHVybiBifTtnb29nLmh0bWwuU2FmZVN0eWxlLlZBTFVFX0FMTE9XRURfQ0hBUlNfPVwiWy0sLlxcXCInJV8hIyBhLXpBLVowLTlcXFxcW1xcXFxdXVwiO1xuZ29vZy5odG1sLlNhZmVTdHlsZS5WQUxVRV9SRV89bmV3IFJlZ0V4cChcIl5cIitnb29nLmh0bWwuU2FmZVN0eWxlLlZBTFVFX0FMTE9XRURfQ0hBUlNfK1wiKyRcIik7Z29vZy5odG1sLlNhZmVTdHlsZS5VUkxfUkVfPS9cXGIodXJsXFwoWyBcXHRcXG5dKikoJ1sgLSYoLVxcW1xcXS1+XSonfFwiWyAhIy1cXFtcXF0tfl0qXCJ8WyEjLSYqLVxcW1xcXS1+XSopKFsgXFx0XFxuXSpcXCkpL2c7Z29vZy5odG1sLlNhZmVTdHlsZS5GVU5DVElPTlNfUkVfPS9cXGIoaHNsfGhzbGF8cmdifHJnYmF8bWF0cml4fGNhbGN8bWlubWF4fGZpdC1jb250ZW50fHJlcGVhdHwocm90YXRlfHNjYWxlfHRyYW5zbGF0ZSkoWHxZfFp8M2QpPylcXChbLSsqLzAtOWEtei4lXFxbXFxdLCBdK1xcKS9nO2dvb2cuaHRtbC5TYWZlU3R5bGUuQ09NTUVOVF9SRV89L1xcL1xcKi87XG5nb29nLmh0bWwuU2FmZVN0eWxlLnNhbml0aXplVXJsXz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGdvb2cuaHRtbC5TYWZlU3R5bGUuVVJMX1JFXyxmdW5jdGlvbihhLGMsZCxlKXt2YXIgYj1cIlwiO2Q9ZC5yZXBsYWNlKC9eKFsnXCJdKSguKilcXDEkLyxmdW5jdGlvbihhLGMsZCl7Yj1jO3JldHVybiBkfSk7YT1nb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZShkKS5nZXRUeXBlZFN0cmluZ1ZhbHVlKCk7cmV0dXJuIGMrYithK2IrZX0pfTtnb29nLmh0bWwuU2FmZVN0eWxlLmNvbmNhdD1mdW5jdGlvbihhKXt2YXIgYj1cIlwiLGM9ZnVuY3Rpb24oYSl7Z29vZy5pc0FycmF5KGEpP2dvb2cuYXJyYXkuZm9yRWFjaChhLGMpOmIrPWdvb2cuaHRtbC5TYWZlU3R5bGUudW53cmFwKGEpfTtnb29nLmFycmF5LmZvckVhY2goYXJndW1lbnRzLGMpO3JldHVybiBiP2dvb2cuaHRtbC5TYWZlU3R5bGUuY3JlYXRlU2FmZVN0eWxlU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYik6Z29vZy5odG1sLlNhZmVTdHlsZS5FTVBUWX07Z29vZy5odG1sLlNhZmVTY3JpcHQ9ZnVuY3Rpb24oKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTY3JpcHRXcmFwcGVkVmFsdWVfPVwiXCI7dGhpcy5TQUZFX1NDUklQVF9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89Z29vZy5odG1sLlNhZmVTY3JpcHQuVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVffTtnb29nLmh0bWwuU2FmZVNjcmlwdC5wcm90b3R5cGUuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz0hMDtnb29nLmh0bWwuU2FmZVNjcmlwdC5UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89e307Z29vZy5odG1sLlNhZmVTY3JpcHQuZnJvbUNvbnN0YW50PWZ1bmN0aW9uKGEpe2E9Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpO3JldHVybiAwPT09YS5sZW5ndGg/Z29vZy5odG1sLlNhZmVTY3JpcHQuRU1QVFk6Z29vZy5odG1sLlNhZmVTY3JpcHQuY3JlYXRlU2FmZVNjcmlwdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTtcbmdvb2cuaHRtbC5TYWZlU2NyaXB0LmZyb21Db25zdGFudEFuZEFyZ3M9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W10sZD0xO2Q8YXJndW1lbnRzLmxlbmd0aDtkKyspYy5wdXNoKGdvb2cuaHRtbC5TYWZlU2NyaXB0LnN0cmluZ2lmeV8oYXJndW1lbnRzW2RdKSk7cmV0dXJuIGdvb2cuaHRtbC5TYWZlU2NyaXB0LmNyZWF0ZVNhZmVTY3JpcHRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShcIihcIitnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSkrXCIpKFwiK2Muam9pbihcIiwgXCIpK1wiKTtcIil9O2dvb2cuaHRtbC5TYWZlU2NyaXB0LmZyb21Kc29uPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmh0bWwuU2FmZVNjcmlwdC5jcmVhdGVTYWZlU2NyaXB0U2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoZ29vZy5odG1sLlNhZmVTY3JpcHQuc3RyaW5naWZ5XyhhKSl9O2dvb2cuaHRtbC5TYWZlU2NyaXB0LnByb3RvdHlwZS5nZXRUeXBlZFN0cmluZ1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVNjcmlwdFdyYXBwZWRWYWx1ZV8udG9TdHJpbmcoKX07XG5nb29nLkRFQlVHJiYoZ29vZy5odG1sLlNhZmVTY3JpcHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJTYWZlU2NyaXB0e1wiK3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVNjcmlwdFdyYXBwZWRWYWx1ZV8rXCJ9XCJ9KTtnb29nLmh0bWwuU2FmZVNjcmlwdC51bndyYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuaHRtbC5TYWZlU2NyaXB0LnVud3JhcFRydXN0ZWRTY3JpcHQoYSkudG9TdHJpbmcoKX07XG5nb29nLmh0bWwuU2FmZVNjcmlwdC51bndyYXBUcnVzdGVkU2NyaXB0PWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVNjcmlwdCYmYS5jb25zdHJ1Y3Rvcj09PWdvb2cuaHRtbC5TYWZlU2NyaXB0JiZhLlNBRkVfU0NSSVBUX1RZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXz09PWdvb2cuaHRtbC5TYWZlU2NyaXB0LlRZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXylyZXR1cm4gYS5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU2NyaXB0V3JhcHBlZFZhbHVlXztnb29nLmFzc2VydHMuZmFpbChcImV4cGVjdGVkIG9iamVjdCBvZiB0eXBlIFNhZmVTY3JpcHQsIGdvdCAnXCIrYStcIicgb2YgdHlwZSBcIitnb29nLnR5cGVPZihhKSk7cmV0dXJuXCJ0eXBlX2Vycm9yOlNhZmVTY3JpcHRcIn07XG5nb29nLmh0bWwuU2FmZVNjcmlwdC5zdHJpbmdpZnlfPWZ1bmN0aW9uKGEpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKS5yZXBsYWNlKC88L2csXCJcXFxceDNjXCIpfTtnb29nLmh0bWwuU2FmZVNjcmlwdC5jcmVhdGVTYWZlU2NyaXB0U2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2U9ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyBnb29nLmh0bWwuU2FmZVNjcmlwdCkuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXyhhKX07XG5nb29nLmh0bWwuU2FmZVNjcmlwdC5wcm90b3R5cGUuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXz1mdW5jdGlvbihhKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTY3JpcHRXcmFwcGVkVmFsdWVfPWdvb2cuaHRtbC50cnVzdGVkdHlwZXMuUFJJVkFURV9ET19OT1RfQUNDRVNTX09SX0VMU0VfUE9MSUNZP2dvb2cuaHRtbC50cnVzdGVkdHlwZXMuUFJJVkFURV9ET19OT1RfQUNDRVNTX09SX0VMU0VfUE9MSUNZLmNyZWF0ZVNjcmlwdChhKTphO3JldHVybiB0aGlzfTtnb29nLmh0bWwuU2FmZVNjcmlwdC5FTVBUWT1nb29nLmh0bWwuU2FmZVNjcmlwdC5jcmVhdGVTYWZlU2NyaXB0U2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoXCJcIik7Z29vZy5vYmplY3Q9e307Z29vZy5vYmplY3QuaXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWI/MCE9PWF8fDEvYT09PTEvYjphIT09YSYmYiE9PWJ9O2dvb2cub2JqZWN0LmZvckVhY2g9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCBpbiBhKWIuY2FsbChjLGFbZF0sZCxhKX07Z29vZy5vYmplY3QuZmlsdGVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fSxlO2ZvcihlIGluIGEpYi5jYWxsKGMsYVtlXSxlLGEpJiYoZFtlXT1hW2VdKTtyZXR1cm4gZH07Z29vZy5vYmplY3QubWFwPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fSxlO2ZvcihlIGluIGEpZFtlXT1iLmNhbGwoYyxhW2VdLGUsYSk7cmV0dXJuIGR9O2dvb2cub2JqZWN0LnNvbWU9ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCBpbiBhKWlmKGIuY2FsbChjLGFbZF0sZCxhKSlyZXR1cm4hMDtyZXR1cm4hMX07XG5nb29nLm9iamVjdC5ldmVyeT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpaWYoIWIuY2FsbChjLGFbZF0sZCxhKSlyZXR1cm4hMTtyZXR1cm4hMH07Z29vZy5vYmplY3QuZ2V0Q291bnQ9ZnVuY3Rpb24oYSl7dmFyIGI9MCxjO2ZvcihjIGluIGEpYisrO3JldHVybiBifTtnb29nLm9iamVjdC5nZXRBbnlLZXk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuIGJ9O2dvb2cub2JqZWN0LmdldEFueVZhbHVlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXJldHVybiBhW2JdfTtnb29nLm9iamVjdC5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLm9iamVjdC5jb250YWluc1ZhbHVlKGEsYil9O2dvb2cub2JqZWN0LmdldFZhbHVlcz1mdW5jdGlvbihhKXt2YXIgYj1bXSxjPTAsZDtmb3IoZCBpbiBhKWJbYysrXT1hW2RdO3JldHVybiBifTtcbmdvb2cub2JqZWN0LmdldEtleXM9ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz0wLGQ7Zm9yKGQgaW4gYSliW2MrK109ZDtyZXR1cm4gYn07Z29vZy5vYmplY3QuZ2V0VmFsdWVCeUtleXM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1nb29nLmlzQXJyYXlMaWtlKGIpLGQ9Yz9iOmFyZ3VtZW50cztmb3IoYz1jPzA6MTtjPGQubGVuZ3RoO2MrKyl7aWYobnVsbD09YSlyZXR1cm47YT1hW2RbY11dfXJldHVybiBhfTtnb29nLm9iamVjdC5jb250YWluc0tleT1mdW5jdGlvbihhLGIpe3JldHVybiBudWxsIT09YSYmYiBpbiBhfTtnb29nLm9iamVjdC5jb250YWluc1ZhbHVlPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGEpaWYoYVtjXT09YilyZXR1cm4hMDtyZXR1cm4hMX07Z29vZy5vYmplY3QuZmluZEtleT1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkIGluIGEpaWYoYi5jYWxsKGMsYVtkXSxkLGEpKXJldHVybiBkfTtcbmdvb2cub2JqZWN0LmZpbmRWYWx1ZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuKGI9Z29vZy5vYmplY3QuZmluZEtleShhLGIsYykpJiZhW2JdfTtnb29nLm9iamVjdC5pc0VtcHR5PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXJldHVybiExO3JldHVybiEwfTtnb29nLm9iamVjdC5jbGVhcj1mdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlkZWxldGUgYVtiXX07Z29vZy5vYmplY3QucmVtb3ZlPWZ1bmN0aW9uKGEsYil7dmFyIGM7KGM9YiBpbiBhKSYmZGVsZXRlIGFbYl07cmV0dXJuIGN9O2dvb2cub2JqZWN0LmFkZD1mdW5jdGlvbihhLGIsYyl7aWYobnVsbCE9PWEmJmIgaW4gYSl0aHJvdyBFcnJvcignVGhlIG9iamVjdCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBrZXkgXCInK2IrJ1wiJyk7Z29vZy5vYmplY3Quc2V0KGEsYixjKX07Z29vZy5vYmplY3QuZ2V0PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbnVsbCE9PWEmJmIgaW4gYT9hW2JdOmN9O1xuZ29vZy5vYmplY3Quc2V0PWZ1bmN0aW9uKGEsYixjKXthW2JdPWN9O2dvb2cub2JqZWN0LnNldElmVW5kZWZpbmVkPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYiBpbiBhP2FbYl06YVtiXT1jfTtnb29nLm9iamVjdC5zZXRXaXRoUmV0dXJuVmFsdWVJZk5vdFNldD1mdW5jdGlvbihhLGIsYyl7aWYoYiBpbiBhKXJldHVybiBhW2JdO2M9YygpO3JldHVybiBhW2JdPWN9O2dvb2cub2JqZWN0LmVxdWFscz1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyBpbiBhKWlmKCEoYyBpbiBiKXx8YVtjXSE9PWJbY10pcmV0dXJuITE7Zm9yKHZhciBkIGluIGIpaWYoIShkIGluIGEpKXJldHVybiExO3JldHVybiEwfTtnb29nLm9iamVjdC5jbG9uZT1mdW5jdGlvbihhKXt2YXIgYj17fSxjO2ZvcihjIGluIGEpYltjXT1hW2NdO3JldHVybiBifTtcbmdvb2cub2JqZWN0LnVuc2FmZUNsb25lPWZ1bmN0aW9uKGEpe3ZhciBiPWdvb2cudHlwZU9mKGEpO2lmKFwib2JqZWN0XCI9PWJ8fFwiYXJyYXlcIj09Yil7aWYoZ29vZy5pc0Z1bmN0aW9uKGEuY2xvbmUpKXJldHVybiBhLmNsb25lKCk7Yj1cImFycmF5XCI9PWI/W106e307Zm9yKHZhciBjIGluIGEpYltjXT1nb29nLm9iamVjdC51bnNhZmVDbG9uZShhW2NdKTtyZXR1cm4gYn1yZXR1cm4gYX07Z29vZy5vYmplY3QudHJhbnNwb3NlPWZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9O2dvb2cub2JqZWN0LlBST1RPVFlQRV9GSUVMRFNfPVwiY29uc3RydWN0b3IgaGFzT3duUHJvcGVydHkgaXNQcm90b3R5cGVPZiBwcm9wZXJ0eUlzRW51bWVyYWJsZSB0b0xvY2FsZVN0cmluZyB0b1N0cmluZyB2YWx1ZU9mXCIuc3BsaXQoXCIgXCIpO1xuZ29vZy5vYmplY3QuZXh0ZW5kPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8Z29vZy5vYmplY3QuUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoO2YrKyljPWdvb2cub2JqZWN0LlBST1RPVFlQRV9GSUVMRFNfW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O1xuZ29vZy5vYmplY3QuY3JlYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cy5sZW5ndGg7aWYoMT09YiYmZ29vZy5pc0FycmF5KGFyZ3VtZW50c1swXSkpcmV0dXJuIGdvb2cub2JqZWN0LmNyZWF0ZS5hcHBseShudWxsLGFyZ3VtZW50c1swXSk7aWYoYiUyKXRocm93IEVycm9yKFwiVW5ldmVuIG51bWJlciBvZiBhcmd1bWVudHNcIik7Zm9yKHZhciBjPXt9LGQ9MDtkPGI7ZCs9MiljW2FyZ3VtZW50c1tkXV09YXJndW1lbnRzW2QrMV07cmV0dXJuIGN9O2dvb2cub2JqZWN0LmNyZWF0ZVNldD1mdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMubGVuZ3RoO2lmKDE9PWImJmdvb2cuaXNBcnJheShhcmd1bWVudHNbMF0pKXJldHVybiBnb29nLm9iamVjdC5jcmVhdGVTZXQuYXBwbHkobnVsbCxhcmd1bWVudHNbMF0pO2Zvcih2YXIgYz17fSxkPTA7ZDxiO2QrKyljW2FyZ3VtZW50c1tkXV09ITA7cmV0dXJuIGN9O1xuZ29vZy5vYmplY3QuY3JlYXRlSW1tdXRhYmxlVmlldz1mdW5jdGlvbihhKXt2YXIgYj1hO09iamVjdC5pc0Zyb3plbiYmIU9iamVjdC5pc0Zyb3plbihhKSYmKGI9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZnJlZXplKGIpKTtyZXR1cm4gYn07Z29vZy5vYmplY3QuaXNJbW11dGFibGVWaWV3PWZ1bmN0aW9uKGEpe3JldHVybiEhT2JqZWN0LmlzRnJvemVuJiZPYmplY3QuaXNGcm96ZW4oYSl9O1xuZ29vZy5vYmplY3QuZ2V0QWxsUHJvcGVydHlOYW1lcz1mdW5jdGlvbihhLGIsYyl7aWYoIWEpcmV0dXJuW107aWYoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHwhT2JqZWN0LmdldFByb3RvdHlwZU9mKXJldHVybiBnb29nLm9iamVjdC5nZXRLZXlzKGEpO2Zvcih2YXIgZD17fTthJiYoYSE9PU9iamVjdC5wcm90b3R5cGV8fGIpJiYoYSE9PUZ1bmN0aW9uLnByb3RvdHlwZXx8Yyk7KXtmb3IodmFyIGU9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYSksZj0wO2Y8ZS5sZW5ndGg7ZisrKWRbZVtmXV09ITA7YT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSl9cmV0dXJuIGdvb2cub2JqZWN0LmdldEtleXMoZCl9O2dvb2cub2JqZWN0LmdldFN1cGVyQ2xhc3M9ZnVuY3Rpb24oYSl7cmV0dXJuKGE9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEucHJvdG90eXBlKSkmJmEuY29uc3RydWN0b3J9O2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldD1mdW5jdGlvbigpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlU2hlZXRXcmFwcGVkVmFsdWVfPVwiXCI7dGhpcy5TQUZFX1NUWUxFX1NIRUVUX1RZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXz1nb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQuVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVffTtnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQucHJvdG90eXBlLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmc9ITA7Z29vZy5odG1sLlNhZmVTdHlsZVNoZWV0LlRZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXz17fTtcbmdvb2cuaHRtbC5TYWZlU3R5bGVTaGVldC5jcmVhdGVSdWxlPWZ1bmN0aW9uKGEsYil7aWYoZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29udGFpbnMoYSxcIjxcIikpdGhyb3cgRXJyb3IoXCJTZWxlY3RvciBkb2VzIG5vdCBhbGxvdyAnPCcsIGdvdDogXCIrYSk7dmFyIGM9YS5yZXBsYWNlKC8oJ3xcIikoKD8hXFwxKVteXFxyXFxuXFxmXFxcXF18XFxcXFtcXHNcXFNdKSpcXDEvZyxcIlwiKTtpZighL15bLV9hLXpBLVowLTkjLjoqICw+K35bXFxdKCk9XiR8XSskLy50ZXN0KGMpKXRocm93IEVycm9yKFwiU2VsZWN0b3IgYWxsb3dzIG9ubHkgWy1fYS16QS1aMC05Iy46KiAsPit+W1xcXFxdKCk9XiR8XSBhbmQgc3RyaW5ncywgZ290OiBcIithKTtpZighZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0Lmhhc0JhbGFuY2VkQnJhY2tldHNfKGMpKXRocm93IEVycm9yKFwiKCkgYW5kIFtdIGluIHNlbGVjdG9yIG11c3QgYmUgYmFsYW5jZWQsIGdvdDogXCIrYSk7YiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlU3R5bGV8fChiPWdvb2cuaHRtbC5TYWZlU3R5bGUuY3JlYXRlKGIpKTtcbmE9YStcIntcIitnb29nLmh0bWwuU2FmZVN0eWxlLnVud3JhcChiKS5yZXBsYWNlKC88L2csXCJcXFxcM0MgXCIpK1wifVwiO3JldHVybiBnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQuY3JlYXRlU2FmZVN0eWxlU2hlZXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKX07Z29vZy5odG1sLlNhZmVTdHlsZVNoZWV0Lmhhc0JhbGFuY2VkQnJhY2tldHNfPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17XCIoXCI6XCIpXCIsXCJbXCI6XCJdXCJ9LGM9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO2lmKGJbZV0pYy5wdXNoKGJbZV0pO2Vsc2UgaWYoZ29vZy5vYmplY3QuY29udGFpbnMoYixlKSYmYy5wb3AoKSE9ZSlyZXR1cm4hMX1yZXR1cm4gMD09Yy5sZW5ndGh9O1xuZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0LmNvbmNhdD1mdW5jdGlvbihhKXt2YXIgYj1cIlwiLGM9ZnVuY3Rpb24oYSl7Z29vZy5pc0FycmF5KGEpP2dvb2cuYXJyYXkuZm9yRWFjaChhLGMpOmIrPWdvb2cuaHRtbC5TYWZlU3R5bGVTaGVldC51bndyYXAoYSl9O2dvb2cuYXJyYXkuZm9yRWFjaChhcmd1bWVudHMsYyk7cmV0dXJuIGdvb2cuaHRtbC5TYWZlU3R5bGVTaGVldC5jcmVhdGVTYWZlU3R5bGVTaGVldFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGIpfTtcbmdvb2cuaHRtbC5TYWZlU3R5bGVTaGVldC5mcm9tQ29uc3RhbnQ9ZnVuY3Rpb24oYSl7YT1nb29nLnN0cmluZy5Db25zdC51bndyYXAoYSk7aWYoMD09PWEubGVuZ3RoKXJldHVybiBnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQuRU1QVFk7Z29vZy5hc3NlcnRzLmFzc2VydCghZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29udGFpbnMoYSxcIjxcIiksXCJGb3JiaWRkZW4gJzwnIGNoYXJhY3RlciBpbiBzdHlsZSBzaGVldCBzdHJpbmc6IFwiK2EpO3JldHVybiBnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQuY3JlYXRlU2FmZVN0eWxlU2hlZXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKX07Z29vZy5odG1sLlNhZmVTdHlsZVNoZWV0LnByb3RvdHlwZS5nZXRUeXBlZFN0cmluZ1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlU2hlZXRXcmFwcGVkVmFsdWVffTtcbmdvb2cuREVCVUcmJihnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJTYWZlU3R5bGVTaGVldHtcIit0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVNoZWV0V3JhcHBlZFZhbHVlXytcIn1cIn0pO1xuZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0LnVud3JhcD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JiZhLmNvbnN0cnVjdG9yPT09Z29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JiZhLlNBRkVfU1RZTEVfU0hFRVRfVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPT09Z29vZy5odG1sLlNhZmVTdHlsZVNoZWV0LlRZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXylyZXR1cm4gYS5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVTaGVldFdyYXBwZWRWYWx1ZV87Z29vZy5hc3NlcnRzLmZhaWwoXCJleHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBTYWZlU3R5bGVTaGVldCwgZ290ICdcIithK1wiJyBvZiB0eXBlIFwiK2dvb2cudHlwZU9mKGEpKTtyZXR1cm5cInR5cGVfZXJyb3I6U2FmZVN0eWxlU2hlZXRcIn07XG5nb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQuY3JlYXRlU2FmZVN0eWxlU2hlZXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZT1mdW5jdGlvbihhKXtyZXR1cm4obmV3IGdvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCkuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXyhhKX07Z29vZy5odG1sLlNhZmVTdHlsZVNoZWV0LnByb3RvdHlwZS5pbml0U2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VfPWZ1bmN0aW9uKGEpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlU2hlZXRXcmFwcGVkVmFsdWVfPWE7cmV0dXJuIHRoaXN9O2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldC5FTVBUWT1nb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQuY3JlYXRlU2FmZVN0eWxlU2hlZXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShcIlwiKTtnb29nLmRvbS50YWdzPXt9O2dvb2cuZG9tLnRhZ3MuVk9JRF9UQUdTXz17YXJlYTohMCxiYXNlOiEwLGJyOiEwLGNvbDohMCxjb21tYW5kOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9O2dvb2cuZG9tLnRhZ3MuaXNWb2lkVGFnPWZ1bmN0aW9uKGEpe3JldHVybiEwPT09Z29vZy5kb20udGFncy5WT0lEX1RBR1NfW2FdfTtnb29nLmRvbS5IdG1sRWxlbWVudD1mdW5jdGlvbigpe307Z29vZy5kb20uVGFnTmFtZT1mdW5jdGlvbihhKXt0aGlzLnRhZ05hbWVfPWF9O2dvb2cuZG9tLlRhZ05hbWUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFnTmFtZV99O2dvb2cuZG9tLlRhZ05hbWUuQT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkFcIik7Z29vZy5kb20uVGFnTmFtZS5BQkJSPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQUJCUlwiKTtnb29nLmRvbS5UYWdOYW1lLkFDUk9OWU09bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJBQ1JPTllNXCIpO2dvb2cuZG9tLlRhZ05hbWUuQUREUkVTUz1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkFERFJFU1NcIik7Z29vZy5kb20uVGFnTmFtZS5BUFBMRVQ9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJBUFBMRVRcIik7Z29vZy5kb20uVGFnTmFtZS5BUkVBPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQVJFQVwiKTtnb29nLmRvbS5UYWdOYW1lLkFSVElDTEU9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJBUlRJQ0xFXCIpO1xuZ29vZy5kb20uVGFnTmFtZS5BU0lERT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkFTSURFXCIpO2dvb2cuZG9tLlRhZ05hbWUuQVVESU89bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJBVURJT1wiKTtnb29nLmRvbS5UYWdOYW1lLkI9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJCXCIpO2dvb2cuZG9tLlRhZ05hbWUuQkFTRT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkJBU0VcIik7Z29vZy5kb20uVGFnTmFtZS5CQVNFRk9OVD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkJBU0VGT05UXCIpO2dvb2cuZG9tLlRhZ05hbWUuQkRJPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQkRJXCIpO2dvb2cuZG9tLlRhZ05hbWUuQkRPPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQkRPXCIpO2dvb2cuZG9tLlRhZ05hbWUuQklHPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQklHXCIpO2dvb2cuZG9tLlRhZ05hbWUuQkxPQ0tRVU9URT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkJMT0NLUVVPVEVcIik7Z29vZy5kb20uVGFnTmFtZS5CT0RZPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQk9EWVwiKTtcbmdvb2cuZG9tLlRhZ05hbWUuQlI9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJCUlwiKTtnb29nLmRvbS5UYWdOYW1lLkJVVFRPTj1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkJVVFRPTlwiKTtnb29nLmRvbS5UYWdOYW1lLkNBTlZBUz1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkNBTlZBU1wiKTtnb29nLmRvbS5UYWdOYW1lLkNBUFRJT049bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJDQVBUSU9OXCIpO2dvb2cuZG9tLlRhZ05hbWUuQ0VOVEVSPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQ0VOVEVSXCIpO2dvb2cuZG9tLlRhZ05hbWUuQ0lURT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkNJVEVcIik7Z29vZy5kb20uVGFnTmFtZS5DT0RFPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQ09ERVwiKTtnb29nLmRvbS5UYWdOYW1lLkNPTD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkNPTFwiKTtnb29nLmRvbS5UYWdOYW1lLkNPTEdST1VQPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiQ09MR1JPVVBcIik7XG5nb29nLmRvbS5UYWdOYW1lLkNPTU1BTkQ9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJDT01NQU5EXCIpO2dvb2cuZG9tLlRhZ05hbWUuREFUQT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkRBVEFcIik7Z29vZy5kb20uVGFnTmFtZS5EQVRBTElTVD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkRBVEFMSVNUXCIpO2dvb2cuZG9tLlRhZ05hbWUuREQ9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJERFwiKTtnb29nLmRvbS5UYWdOYW1lLkRFTD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkRFTFwiKTtnb29nLmRvbS5UYWdOYW1lLkRFVEFJTFM9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJERVRBSUxTXCIpO2dvb2cuZG9tLlRhZ05hbWUuREZOPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiREZOXCIpO2dvb2cuZG9tLlRhZ05hbWUuRElBTE9HPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiRElBTE9HXCIpO2dvb2cuZG9tLlRhZ05hbWUuRElSPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiRElSXCIpO2dvb2cuZG9tLlRhZ05hbWUuRElWPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiRElWXCIpO1xuZ29vZy5kb20uVGFnTmFtZS5ETD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkRMXCIpO2dvb2cuZG9tLlRhZ05hbWUuRFQ9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJEVFwiKTtnb29nLmRvbS5UYWdOYW1lLkVNPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiRU1cIik7Z29vZy5kb20uVGFnTmFtZS5FTUJFRD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkVNQkVEXCIpO2dvb2cuZG9tLlRhZ05hbWUuRklFTERTRVQ9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJGSUVMRFNFVFwiKTtnb29nLmRvbS5UYWdOYW1lLkZJR0NBUFRJT049bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJGSUdDQVBUSU9OXCIpO2dvb2cuZG9tLlRhZ05hbWUuRklHVVJFPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiRklHVVJFXCIpO2dvb2cuZG9tLlRhZ05hbWUuRk9OVD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkZPTlRcIik7Z29vZy5kb20uVGFnTmFtZS5GT09URVI9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJGT09URVJcIik7Z29vZy5kb20uVGFnTmFtZS5GT1JNPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiRk9STVwiKTtcbmdvb2cuZG9tLlRhZ05hbWUuRlJBTUU9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJGUkFNRVwiKTtnb29nLmRvbS5UYWdOYW1lLkZSQU1FU0VUPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiRlJBTUVTRVRcIik7Z29vZy5kb20uVGFnTmFtZS5IMT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkgxXCIpO2dvb2cuZG9tLlRhZ05hbWUuSDI9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJIMlwiKTtnb29nLmRvbS5UYWdOYW1lLkgzPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiSDNcIik7Z29vZy5kb20uVGFnTmFtZS5IND1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkg0XCIpO2dvb2cuZG9tLlRhZ05hbWUuSDU9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJINVwiKTtnb29nLmRvbS5UYWdOYW1lLkg2PW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiSDZcIik7Z29vZy5kb20uVGFnTmFtZS5IRUFEPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiSEVBRFwiKTtnb29nLmRvbS5UYWdOYW1lLkhFQURFUj1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkhFQURFUlwiKTtcbmdvb2cuZG9tLlRhZ05hbWUuSEdST1VQPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiSEdST1VQXCIpO2dvb2cuZG9tLlRhZ05hbWUuSFI9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJIUlwiKTtnb29nLmRvbS5UYWdOYW1lLkhUTUw9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJIVE1MXCIpO2dvb2cuZG9tLlRhZ05hbWUuST1uZXcgZ29vZy5kb20uVGFnTmFtZShcIklcIik7Z29vZy5kb20uVGFnTmFtZS5JRlJBTUU9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJJRlJBTUVcIik7Z29vZy5kb20uVGFnTmFtZS5JTUc9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJJTUdcIik7Z29vZy5kb20uVGFnTmFtZS5JTlBVVD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIklOUFVUXCIpO2dvb2cuZG9tLlRhZ05hbWUuSU5TPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiSU5TXCIpO2dvb2cuZG9tLlRhZ05hbWUuSVNJTkRFWD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIklTSU5ERVhcIik7Z29vZy5kb20uVGFnTmFtZS5LQkQ9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJLQkRcIik7XG5nb29nLmRvbS5UYWdOYW1lLktFWUdFTj1uZXcgZ29vZy5kb20uVGFnTmFtZShcIktFWUdFTlwiKTtnb29nLmRvbS5UYWdOYW1lLkxBQkVMPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiTEFCRUxcIik7Z29vZy5kb20uVGFnTmFtZS5MRUdFTkQ9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJMRUdFTkRcIik7Z29vZy5kb20uVGFnTmFtZS5MST1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkxJXCIpO2dvb2cuZG9tLlRhZ05hbWUuTElOSz1uZXcgZ29vZy5kb20uVGFnTmFtZShcIkxJTktcIik7Z29vZy5kb20uVGFnTmFtZS5NQUlOPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiTUFJTlwiKTtnb29nLmRvbS5UYWdOYW1lLk1BUD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIk1BUFwiKTtnb29nLmRvbS5UYWdOYW1lLk1BUks9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJNQVJLXCIpO2dvb2cuZG9tLlRhZ05hbWUuTUFUSD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIk1BVEhcIik7Z29vZy5kb20uVGFnTmFtZS5NRU5VPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiTUVOVVwiKTtcbmdvb2cuZG9tLlRhZ05hbWUuTUVOVUlURU09bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJNRU5VSVRFTVwiKTtnb29nLmRvbS5UYWdOYW1lLk1FVEE9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJNRVRBXCIpO2dvb2cuZG9tLlRhZ05hbWUuTUVURVI9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJNRVRFUlwiKTtnb29nLmRvbS5UYWdOYW1lLk5BVj1uZXcgZ29vZy5kb20uVGFnTmFtZShcIk5BVlwiKTtnb29nLmRvbS5UYWdOYW1lLk5PRlJBTUVTPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiTk9GUkFNRVNcIik7Z29vZy5kb20uVGFnTmFtZS5OT1NDUklQVD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIk5PU0NSSVBUXCIpO2dvb2cuZG9tLlRhZ05hbWUuT0JKRUNUPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiT0JKRUNUXCIpO2dvb2cuZG9tLlRhZ05hbWUuT0w9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJPTFwiKTtnb29nLmRvbS5UYWdOYW1lLk9QVEdST1VQPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiT1BUR1JPVVBcIik7XG5nb29nLmRvbS5UYWdOYW1lLk9QVElPTj1uZXcgZ29vZy5kb20uVGFnTmFtZShcIk9QVElPTlwiKTtnb29nLmRvbS5UYWdOYW1lLk9VVFBVVD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIk9VVFBVVFwiKTtnb29nLmRvbS5UYWdOYW1lLlA9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJQXCIpO2dvb2cuZG9tLlRhZ05hbWUuUEFSQU09bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJQQVJBTVwiKTtnb29nLmRvbS5UYWdOYW1lLlBJQ1RVUkU9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJQSUNUVVJFXCIpO2dvb2cuZG9tLlRhZ05hbWUuUFJFPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiUFJFXCIpO2dvb2cuZG9tLlRhZ05hbWUuUFJPR1JFU1M9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJQUk9HUkVTU1wiKTtnb29nLmRvbS5UYWdOYW1lLlE9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJRXCIpO2dvb2cuZG9tLlRhZ05hbWUuUlA9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJSUFwiKTtnb29nLmRvbS5UYWdOYW1lLlJUPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiUlRcIik7XG5nb29nLmRvbS5UYWdOYW1lLlJUQz1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlJUQ1wiKTtnb29nLmRvbS5UYWdOYW1lLlJVQlk9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJSVUJZXCIpO2dvb2cuZG9tLlRhZ05hbWUuUz1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlNcIik7Z29vZy5kb20uVGFnTmFtZS5TQU1QPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiU0FNUFwiKTtnb29nLmRvbS5UYWdOYW1lLlNDUklQVD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlNDUklQVFwiKTtnb29nLmRvbS5UYWdOYW1lLlNFQ1RJT049bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJTRUNUSU9OXCIpO2dvb2cuZG9tLlRhZ05hbWUuU0VMRUNUPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiU0VMRUNUXCIpO2dvb2cuZG9tLlRhZ05hbWUuU01BTEw9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJTTUFMTFwiKTtnb29nLmRvbS5UYWdOYW1lLlNPVVJDRT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlNPVVJDRVwiKTtnb29nLmRvbS5UYWdOYW1lLlNQQU49bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJTUEFOXCIpO1xuZ29vZy5kb20uVGFnTmFtZS5TVFJJS0U9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJTVFJJS0VcIik7Z29vZy5kb20uVGFnTmFtZS5TVFJPTkc9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJTVFJPTkdcIik7Z29vZy5kb20uVGFnTmFtZS5TVFlMRT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlNUWUxFXCIpO2dvb2cuZG9tLlRhZ05hbWUuU1VCPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiU1VCXCIpO2dvb2cuZG9tLlRhZ05hbWUuU1VNTUFSWT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlNVTU1BUllcIik7Z29vZy5kb20uVGFnTmFtZS5TVVA9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJTVVBcIik7Z29vZy5kb20uVGFnTmFtZS5TVkc9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJTVkdcIik7Z29vZy5kb20uVGFnTmFtZS5UQUJMRT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlRBQkxFXCIpO2dvb2cuZG9tLlRhZ05hbWUuVEJPRFk9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJUQk9EWVwiKTtnb29nLmRvbS5UYWdOYW1lLlREPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiVERcIik7XG5nb29nLmRvbS5UYWdOYW1lLlRFTVBMQVRFPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiVEVNUExBVEVcIik7Z29vZy5kb20uVGFnTmFtZS5URVhUQVJFQT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlRFWFRBUkVBXCIpO2dvb2cuZG9tLlRhZ05hbWUuVEZPT1Q9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJURk9PVFwiKTtnb29nLmRvbS5UYWdOYW1lLlRIPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiVEhcIik7Z29vZy5kb20uVGFnTmFtZS5USEVBRD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlRIRUFEXCIpO2dvb2cuZG9tLlRhZ05hbWUuVElNRT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlRJTUVcIik7Z29vZy5kb20uVGFnTmFtZS5USVRMRT1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlRJVExFXCIpO2dvb2cuZG9tLlRhZ05hbWUuVFI9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJUUlwiKTtnb29nLmRvbS5UYWdOYW1lLlRSQUNLPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiVFJBQ0tcIik7Z29vZy5kb20uVGFnTmFtZS5UVD1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlRUXCIpO1xuZ29vZy5kb20uVGFnTmFtZS5VPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiVVwiKTtnb29nLmRvbS5UYWdOYW1lLlVMPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiVUxcIik7Z29vZy5kb20uVGFnTmFtZS5WQVI9bmV3IGdvb2cuZG9tLlRhZ05hbWUoXCJWQVJcIik7Z29vZy5kb20uVGFnTmFtZS5WSURFTz1uZXcgZ29vZy5kb20uVGFnTmFtZShcIlZJREVPXCIpO2dvb2cuZG9tLlRhZ05hbWUuV0JSPW5ldyBnb29nLmRvbS5UYWdOYW1lKFwiV0JSXCIpO2dvb2cubGFicz17fTtnb29nLmxhYnMudXNlckFnZW50PXt9O2dvb2cubGFicy51c2VyQWdlbnQudXRpbD17fTtnb29nLmxhYnMudXNlckFnZW50LnV0aWwuZ2V0TmF0aXZlVXNlckFnZW50U3RyaW5nXz1mdW5jdGlvbigpe3ZhciBhPWdvb2cubGFicy51c2VyQWdlbnQudXRpbC5nZXROYXZpZ2F0b3JfKCk7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOlwiXCJ9O2dvb2cubGFicy51c2VyQWdlbnQudXRpbC5nZXROYXZpZ2F0b3JfPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cuZ2xvYmFsLm5hdmlnYXRvcn07Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLnVzZXJBZ2VudF89Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLmdldE5hdGl2ZVVzZXJBZ2VudFN0cmluZ18oKTtnb29nLmxhYnMudXNlckFnZW50LnV0aWwuc2V0VXNlckFnZW50PWZ1bmN0aW9uKGEpe2dvb2cubGFicy51c2VyQWdlbnQudXRpbC51c2VyQWdlbnRfPWF8fGdvb2cubGFicy51c2VyQWdlbnQudXRpbC5nZXROYXRpdmVVc2VyQWdlbnRTdHJpbmdfKCl9O1xuZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLmdldFVzZXJBZ2VudD1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwudXNlckFnZW50X307Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWdvb2cubGFicy51c2VyQWdlbnQudXRpbC5nZXRVc2VyQWdlbnQoKTtyZXR1cm4gZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29udGFpbnMoYixhKX07Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50SWdub3JlQ2FzZT1mdW5jdGlvbihhKXt2YXIgYj1nb29nLmxhYnMudXNlckFnZW50LnV0aWwuZ2V0VXNlckFnZW50KCk7cmV0dXJuIGdvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUNvbnRhaW5zKGIsYSl9O1xuZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLmV4dHJhY3RWZXJzaW9uVHVwbGVzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0vKFxcd1tcXHcgXSspXFwvKFteXFxzXSspXFxzKig/OlxcKCguKj8pXFwpKT8vZyxjPVtdLGQ7ZD1iLmV4ZWMoYSk7KWMucHVzaChbZFsxXSxkWzJdLGRbM118fHZvaWQgMF0pO3JldHVybiBjfTtnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXI9e307Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoT3BlcmFfPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cubGFicy51c2VyQWdlbnQudXRpbC5tYXRjaFVzZXJBZ2VudChcIk9wZXJhXCIpfTtnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hJRV89ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiVHJpZGVudFwiKXx8Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiTVNJRVwiKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoRWRnZUh0bWxfPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cubGFicy51c2VyQWdlbnQudXRpbC5tYXRjaFVzZXJBZ2VudChcIkVkZ2VcIil9O2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaEVkZ2VDaHJvbWl1bV89ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiRWRnL1wiKX07XG5nb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hPcGVyYUNocm9taXVtXz1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJPUFJcIil9O2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaEZpcmVmb3hfPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cubGFicy51c2VyQWdlbnQudXRpbC5tYXRjaFVzZXJBZ2VudChcIkZpcmVmb3hcIil8fGdvb2cubGFicy51c2VyQWdlbnQudXRpbC5tYXRjaFVzZXJBZ2VudChcIkZ4aU9TXCIpfTtcbmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaFNhZmFyaV89ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiU2FmYXJpXCIpJiYhKGdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaENocm9tZV8oKXx8Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoQ29hc3RfKCl8fGdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaE9wZXJhXygpfHxnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hFZGdlSHRtbF8oKXx8Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoRWRnZUNocm9taXVtXygpfHxnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hPcGVyYUNocm9taXVtXygpfHxnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hGaXJlZm94XygpfHxnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNTaWxrKCl8fGdvb2cubGFicy51c2VyQWdlbnQudXRpbC5tYXRjaFVzZXJBZ2VudChcIkFuZHJvaWRcIikpfTtcbmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaENvYXN0Xz1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJDb2FzdFwiKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoSW9zV2Vidmlld189ZnVuY3Rpb24oKXtyZXR1cm4oZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiaVBhZFwiKXx8Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiaVBob25lXCIpKSYmIWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaFNhZmFyaV8oKSYmIWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaENocm9tZV8oKSYmIWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaENvYXN0XygpJiYhZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoRmlyZWZveF8oKSYmZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiQXBwbGVXZWJLaXRcIil9O1xuZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoQ2hyb21lXz1mdW5jdGlvbigpe3JldHVybihnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJDaHJvbWVcIil8fGdvb2cubGFicy51c2VyQWdlbnQudXRpbC5tYXRjaFVzZXJBZ2VudChcIkNyaU9TXCIpKSYmIWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaEVkZ2VIdG1sXygpfTtnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hBbmRyb2lkQnJvd3Nlcl89ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiQW5kcm9pZFwiKSYmIShnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNDaHJvbWUoKXx8Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzRmlyZWZveCgpfHxnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNPcGVyYSgpfHxnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNTaWxrKCkpfTtcbmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc09wZXJhPWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaE9wZXJhXztnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNJRT1nb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hJRV87Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzRWRnZT1nb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hFZGdlSHRtbF87Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzRWRnZUNocm9taXVtPWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaEVkZ2VDaHJvbWl1bV87Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzT3BlcmFDaHJvbWl1bT1nb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIubWF0Y2hPcGVyYUNocm9taXVtXztnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNGaXJlZm94PWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaEZpcmVmb3hfO1xuZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzU2FmYXJpPWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaFNhZmFyaV87Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzQ29hc3Q9Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoQ29hc3RfO2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc0lvc1dlYnZpZXc9Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoSW9zV2Vidmlld187Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzQ2hyb21lPWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5tYXRjaENocm9tZV87Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzQW5kcm9pZEJyb3dzZXI9Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLm1hdGNoQW5kcm9pZEJyb3dzZXJfO2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc1NpbGs9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiU2lsa1wiKX07XG5nb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuZ2V0VmVyc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7YT1nb29nLmFycmF5LmZpbmQoYSxkKTtyZXR1cm4gY1thXXx8XCJcIn12YXIgYj1nb29nLmxhYnMudXNlckFnZW50LnV0aWwuZ2V0VXNlckFnZW50KCk7aWYoZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzSUUoKSlyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmdldElFVmVyc2lvbl8oYik7Yj1nb29nLmxhYnMudXNlckFnZW50LnV0aWwuZXh0cmFjdFZlcnNpb25UdXBsZXMoYik7dmFyIGM9e307Z29vZy5hcnJheS5mb3JFYWNoKGIsZnVuY3Rpb24oYSl7Y1thWzBdXT1hWzFdfSk7dmFyIGQ9Z29vZy5wYXJ0aWFsKGdvb2cub2JqZWN0LmNvbnRhaW5zS2V5LGMpO3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNPcGVyYSgpP2EoW1wiVmVyc2lvblwiLFwiT3BlcmFcIl0pOmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc0VkZ2UoKT9hKFtcIkVkZ2VcIl0pOlxuZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzRWRnZUNocm9taXVtKCk/YShbXCJFZGdcIl0pOmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc0Nocm9tZSgpP2EoW1wiQ2hyb21lXCIsXCJDcmlPU1wiXSk6KGI9YlsyXSkmJmJbMV18fFwiXCJ9O2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc1ZlcnNpb25PckhpZ2hlcj1mdW5jdGlvbihhKXtyZXR1cm4gMDw9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY29tcGFyZVZlcnNpb25zKGdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5nZXRWZXJzaW9uKCksYSl9O1xuZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmdldElFVmVyc2lvbl89ZnVuY3Rpb24oYSl7dmFyIGI9L3J2OiAqKFtcXGRcXC5dKikvLmV4ZWMoYSk7aWYoYiYmYlsxXSlyZXR1cm4gYlsxXTtiPVwiXCI7dmFyIGM9L01TSUUgKyhbXFxkXFwuXSspLy5leGVjKGEpO2lmKGMmJmNbMV0paWYoYT0vVHJpZGVudFxcLyhcXGQuXFxkKS8uZXhlYyhhKSxcIjcuMFwiPT1jWzFdKWlmKGEmJmFbMV0pc3dpdGNoKGFbMV0pe2Nhc2UgXCI0LjBcIjpiPVwiOC4wXCI7YnJlYWs7Y2FzZSBcIjUuMFwiOmI9XCI5LjBcIjticmVhaztjYXNlIFwiNi4wXCI6Yj1cIjEwLjBcIjticmVhaztjYXNlIFwiNy4wXCI6Yj1cIjExLjBcIn1lbHNlIGI9XCI3LjBcIjtlbHNlIGI9Y1sxXTtyZXR1cm4gYn07Z29vZy5odG1sLlNhZmVIdG1sPWZ1bmN0aW9uKCl7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlSHRtbFdyYXBwZWRWYWx1ZV89XCJcIjt0aGlzLlNBRkVfSFRNTF9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89Z29vZy5odG1sLlNhZmVIdG1sLlRZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXzt0aGlzLmRpcl89bnVsbH07Z29vZy5odG1sLlNhZmVIdG1sLnByb3RvdHlwZS5pbXBsZW1lbnRzR29vZ0kxOG5CaWRpRGlyZWN0aW9uYWxTdHJpbmc9ITA7Z29vZy5odG1sLlNhZmVIdG1sLnByb3RvdHlwZS5nZXREaXJlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXJffTtnb29nLmh0bWwuU2FmZUh0bWwucHJvdG90eXBlLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmc9ITA7Z29vZy5odG1sLlNhZmVIdG1sLnByb3RvdHlwZS5nZXRUeXBlZFN0cmluZ1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZUh0bWxXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9O1xuZ29vZy5ERUJVRyYmKGdvb2cuaHRtbC5TYWZlSHRtbC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIlNhZmVIdG1se1wiK3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZUh0bWxXcmFwcGVkVmFsdWVfK1wifVwifSk7Z29vZy5odG1sLlNhZmVIdG1sLnVud3JhcD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5odG1sLlNhZmVIdG1sLnVud3JhcFRydXN0ZWRIVE1MKGEpLnRvU3RyaW5nKCl9O1xuZ29vZy5odG1sLlNhZmVIdG1sLnVud3JhcFRydXN0ZWRIVE1MPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZUh0bWwmJmEuY29uc3RydWN0b3I9PT1nb29nLmh0bWwuU2FmZUh0bWwmJmEuU0FGRV9IVE1MX1RZUEVfTUFSS0VSX0dPT0dfSFRNTF9TRUNVUklUWV9QUklWQVRFXz09PWdvb2cuaHRtbC5TYWZlSHRtbC5UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV8pcmV0dXJuIGEucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZUh0bWxXcmFwcGVkVmFsdWVfO2dvb2cuYXNzZXJ0cy5mYWlsKFwiZXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgU2FmZUh0bWwsIGdvdCAnXCIrYStcIicgb2YgdHlwZSBcIitnb29nLnR5cGVPZihhKSk7cmV0dXJuXCJ0eXBlX2Vycm9yOlNhZmVIdG1sXCJ9O1xuZ29vZy5odG1sLlNhZmVIdG1sLmh0bWxFc2NhcGU9ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlSHRtbClyZXR1cm4gYTt2YXIgYj1cIm9iamVjdFwiPT10eXBlb2YgYSxjPW51bGw7YiYmYS5pbXBsZW1lbnRzR29vZ0kxOG5CaWRpRGlyZWN0aW9uYWxTdHJpbmcmJihjPWEuZ2V0RGlyZWN0aW9uKCkpO2E9YiYmYS5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nP2EuZ2V0VHlwZWRTdHJpbmdWYWx1ZSgpOlN0cmluZyhhKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuaHRtbEVzY2FwZShhKSxjKX07XG5nb29nLmh0bWwuU2FmZUh0bWwuaHRtbEVzY2FwZVByZXNlcnZpbmdOZXdsaW5lcz1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVIdG1sKXJldHVybiBhO2E9Z29vZy5odG1sLlNhZmVIdG1sLmh0bWxFc2NhcGUoYSk7cmV0dXJuIGdvb2cuaHRtbC5TYWZlSHRtbC5jcmVhdGVTYWZlSHRtbFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGdvb2cuc3RyaW5nLmludGVybmFsLm5ld0xpbmVUb0JyKGdvb2cuaHRtbC5TYWZlSHRtbC51bndyYXAoYSkpLGEuZ2V0RGlyZWN0aW9uKCkpfTtcbmdvb2cuaHRtbC5TYWZlSHRtbC5odG1sRXNjYXBlUHJlc2VydmluZ05ld2xpbmVzQW5kU3BhY2VzPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZUh0bWwpcmV0dXJuIGE7YT1nb29nLmh0bWwuU2FmZUh0bWwuaHRtbEVzY2FwZShhKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwud2hpdGVzcGFjZUVzY2FwZShnb29nLmh0bWwuU2FmZUh0bWwudW53cmFwKGEpKSxhLmdldERpcmVjdGlvbigpKX07Z29vZy5odG1sLlNhZmVIdG1sLmZyb209Z29vZy5odG1sLlNhZmVIdG1sLmh0bWxFc2NhcGU7Z29vZy5odG1sLlNhZmVIdG1sLlZBTElEX05BTUVTX0lOX1RBR189L15bYS16QS1aMC05LV0rJC87XG5nb29nLmh0bWwuU2FmZUh0bWwuVVJMX0FUVFJJQlVURVNfPXthY3Rpb246ITAsY2l0ZTohMCxkYXRhOiEwLGZvcm1hY3Rpb246ITAsaHJlZjohMCxtYW5pZmVzdDohMCxwb3N0ZXI6ITAsc3JjOiEwfTtnb29nLmh0bWwuU2FmZUh0bWwuTk9UX0FMTE9XRURfVEFHX05BTUVTXz17QVBQTEVUOiEwLEJBU0U6ITAsRU1CRUQ6ITAsSUZSQU1FOiEwLExJTks6ITAsTUFUSDohMCxNRVRBOiEwLE9CSkVDVDohMCxTQ1JJUFQ6ITAsU1RZTEU6ITAsU1ZHOiEwLFRFTVBMQVRFOiEwfTtnb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlPWZ1bmN0aW9uKGEsYixjKXtnb29nLmh0bWwuU2FmZUh0bWwudmVyaWZ5VGFnTmFtZShTdHJpbmcoYSkpO3JldHVybiBnb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxUYWdTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShTdHJpbmcoYSksYixjKX07XG5nb29nLmh0bWwuU2FmZUh0bWwudmVyaWZ5VGFnTmFtZT1mdW5jdGlvbihhKXtpZighZ29vZy5odG1sLlNhZmVIdG1sLlZBTElEX05BTUVTX0lOX1RBR18udGVzdChhKSl0aHJvdyBFcnJvcihcIkludmFsaWQgdGFnIG5hbWUgPFwiK2ErXCI+LlwiKTtpZihhLnRvVXBwZXJDYXNlKClpbiBnb29nLmh0bWwuU2FmZUh0bWwuTk9UX0FMTE9XRURfVEFHX05BTUVTXyl0aHJvdyBFcnJvcihcIlRhZyBuYW1lIDxcIithK1wiPiBpcyBub3QgYWxsb3dlZCBmb3IgU2FmZUh0bWwuXCIpO307XG5nb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlSWZyYW1lPWZ1bmN0aW9uKGEsYixjLGQpe2EmJmdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwudW53cmFwKGEpO3ZhciBlPXt9O2Uuc3JjPWF8fG51bGw7ZS5zcmNkb2M9YiYmZ29vZy5odG1sLlNhZmVIdG1sLnVud3JhcChiKTthPWdvb2cuaHRtbC5TYWZlSHRtbC5jb21iaW5lQXR0cmlidXRlcyhlLHtzYW5kYm94OlwiXCJ9LGMpO3JldHVybiBnb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxUYWdTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShcImlmcmFtZVwiLGEsZCl9O1xuZ29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZVNhbmRib3hJZnJhbWU9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIWdvb2cuaHRtbC5TYWZlSHRtbC5jYW5Vc2VTYW5kYm94SWZyYW1lKCkpdGhyb3cgRXJyb3IoXCJUaGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHNhbmRib3hlZCBpZnJhbWVzLlwiKTt2YXIgZT17fTtlLnNyYz1hP2dvb2cuaHRtbC5TYWZlVXJsLnVud3JhcChnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZShhKSk6bnVsbDtlLnNyY2RvYz1ifHxudWxsO2Uuc2FuZGJveD1cIlwiO2E9Z29vZy5odG1sLlNhZmVIdG1sLmNvbWJpbmVBdHRyaWJ1dGVzKGUse30sYyk7cmV0dXJuIGdvb2cuaHRtbC5TYWZlSHRtbC5jcmVhdGVTYWZlSHRtbFRhZ1NlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKFwiaWZyYW1lXCIsYSxkKX07XG5nb29nLmh0bWwuU2FmZUh0bWwuY2FuVXNlU2FuZGJveElmcmFtZT1mdW5jdGlvbigpe3JldHVybiBnb29nLmdsb2JhbC5IVE1MSUZyYW1lRWxlbWVudCYmXCJzYW5kYm94XCJpbiBnb29nLmdsb2JhbC5IVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGV9O2dvb2cuaHRtbC5TYWZlSHRtbC5jcmVhdGVTY3JpcHRTcmM9ZnVuY3Rpb24oYSxiKXtnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcChhKTthPWdvb2cuaHRtbC5TYWZlSHRtbC5jb21iaW5lQXR0cmlidXRlcyh7c3JjOmF9LHt9LGIpO3JldHVybiBnb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxUYWdTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShcInNjcmlwdFwiLGEpfTtcbmdvb2cuaHRtbC5TYWZlSHRtbC5jcmVhdGVTY3JpcHQ9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMgaW4gYil7dmFyIGQ9Yy50b0xvd2VyQ2FzZSgpO2lmKFwibGFuZ3VhZ2VcIj09ZHx8XCJzcmNcIj09ZHx8XCJ0ZXh0XCI9PWR8fFwidHlwZVwiPT1kKXRocm93IEVycm9yKCdDYW5ub3Qgc2V0IFwiJytkKydcIiBhdHRyaWJ1dGUnKTt9Yz1cIlwiO2E9Z29vZy5hcnJheS5jb25jYXQoYSk7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKyljKz1nb29nLmh0bWwuU2FmZVNjcmlwdC51bndyYXAoYVtkXSk7YT1nb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShjLGdvb2cuaTE4bi5iaWRpLkRpci5ORVVUUkFMKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sVGFnU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoXCJzY3JpcHRcIixiLGEpfTtcbmdvb2cuaHRtbC5TYWZlSHRtbC5jcmVhdGVTdHlsZT1mdW5jdGlvbihhLGIpe2I9Z29vZy5odG1sLlNhZmVIdG1sLmNvbWJpbmVBdHRyaWJ1dGVzKHt0eXBlOlwidGV4dC9jc3NcIn0se30sYik7dmFyIGM9XCJcIjthPWdvb2cuYXJyYXkuY29uY2F0KGEpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWMrPWdvb2cuaHRtbC5TYWZlU3R5bGVTaGVldC51bndyYXAoYVtkXSk7YT1nb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShjLGdvb2cuaTE4bi5iaWRpLkRpci5ORVVUUkFMKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sVGFnU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoXCJzdHlsZVwiLGIsYSl9O1xuZ29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZU1ldGFSZWZyZXNoPWZ1bmN0aW9uKGEsYil7YT1nb29nLmh0bWwuU2FmZVVybC51bndyYXAoZ29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemUoYSkpOyhnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNJRSgpfHxnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNFZGdlKCkpJiZnb29nLnN0cmluZy5pbnRlcm5hbC5jb250YWlucyhhLFwiO1wiKSYmKGE9XCInXCIrYS5yZXBsYWNlKC8nL2csXCIlMjdcIikrXCInXCIpO3JldHVybiBnb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxUYWdTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShcIm1ldGFcIix7XCJodHRwLWVxdWl2XCI6XCJyZWZyZXNoXCIsY29udGVudDooYnx8MCkrXCI7IHVybD1cIithfSl9O1xuZ29vZy5odG1sLlNhZmVIdG1sLmdldEF0dHJOYW1lQW5kVmFsdWVfPWZ1bmN0aW9uKGEsYixjKXtpZihjIGluc3RhbmNlb2YgZ29vZy5zdHJpbmcuQ29uc3QpYz1nb29nLnN0cmluZy5Db25zdC51bndyYXAoYyk7ZWxzZSBpZihcInN0eWxlXCI9PWIudG9Mb3dlckNhc2UoKSljPWdvb2cuaHRtbC5TYWZlSHRtbC5nZXRTdHlsZVZhbHVlXyhjKTtlbHNle2lmKC9eb24vaS50ZXN0KGIpKXRocm93IEVycm9yKCdBdHRyaWJ1dGUgXCInK2IrJ1wiIHJlcXVpcmVzIGdvb2cuc3RyaW5nLkNvbnN0IHZhbHVlLCBcIicrYysnXCIgZ2l2ZW4uJyk7aWYoYi50b0xvd2VyQ2FzZSgpaW4gZ29vZy5odG1sLlNhZmVIdG1sLlVSTF9BVFRSSUJVVEVTXylpZihjIGluc3RhbmNlb2YgZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCljPWdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwudW53cmFwKGMpO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsKWM9Z29vZy5odG1sLlNhZmVVcmwudW53cmFwKGMpO1xuZWxzZSBpZihnb29nLmlzU3RyaW5nKGMpKWM9Z29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemUoYykuZ2V0VHlwZWRTdHJpbmdWYWx1ZSgpO2Vsc2UgdGhyb3cgRXJyb3IoJ0F0dHJpYnV0ZSBcIicrYisnXCIgb24gdGFnIFwiJythKydcIiByZXF1aXJlcyBnb29nLmh0bWwuU2FmZVVybCwgZ29vZy5zdHJpbmcuQ29uc3QsIG9yIHN0cmluZywgdmFsdWUgXCInK2MrJ1wiIGdpdmVuLicpO31jLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmcmJihjPWMuZ2V0VHlwZWRTdHJpbmdWYWx1ZSgpKTtnb29nLmFzc2VydHMuYXNzZXJ0KGdvb2cuaXNTdHJpbmcoYyl8fGdvb2cuaXNOdW1iZXIoYyksXCJTdHJpbmcgb3IgbnVtYmVyIHZhbHVlIGV4cGVjdGVkLCBnb3QgXCIrdHlwZW9mIGMrXCIgd2l0aCB2YWx1ZTogXCIrYyk7cmV0dXJuIGIrJz1cIicrZ29vZy5zdHJpbmcuaW50ZXJuYWwuaHRtbEVzY2FwZShTdHJpbmcoYykpKydcIid9O1xuZ29vZy5odG1sLlNhZmVIdG1sLmdldFN0eWxlVmFsdWVfPWZ1bmN0aW9uKGEpe2lmKCFnb29nLmlzT2JqZWN0KGEpKXRocm93IEVycm9yKCdUaGUgXCJzdHlsZVwiIGF0dHJpYnV0ZSByZXF1aXJlcyBnb29nLmh0bWwuU2FmZVN0eWxlIG9yIG1hcCBvZiBzdHlsZSBwcm9wZXJ0aWVzLCAnK3R5cGVvZiBhK1wiIGdpdmVuOiBcIithKTthIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVTdHlsZXx8KGE9Z29vZy5odG1sLlNhZmVTdHlsZS5jcmVhdGUoYSkpO3JldHVybiBnb29nLmh0bWwuU2FmZVN0eWxlLnVud3JhcChhKX07Z29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZVdpdGhEaXI9ZnVuY3Rpb24oYSxiLGMsZCl7Yj1nb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlKGIsYyxkKTtiLmRpcl89YTtyZXR1cm4gYn07XG5nb29nLmh0bWwuU2FmZUh0bWwuam9pbj1mdW5jdGlvbihhLGIpe2E9Z29vZy5odG1sLlNhZmVIdG1sLmh0bWxFc2NhcGUoYSk7dmFyIGM9YS5nZXREaXJlY3Rpb24oKSxkPVtdLGU9ZnVuY3Rpb24oYSl7Z29vZy5pc0FycmF5KGEpP2dvb2cuYXJyYXkuZm9yRWFjaChhLGUpOihhPWdvb2cuaHRtbC5TYWZlSHRtbC5odG1sRXNjYXBlKGEpLGQucHVzaChnb29nLmh0bWwuU2FmZUh0bWwudW53cmFwKGEpKSxhPWEuZ2V0RGlyZWN0aW9uKCksYz09Z29vZy5pMThuLmJpZGkuRGlyLk5FVVRSQUw/Yz1hOmEhPWdvb2cuaTE4bi5iaWRpLkRpci5ORVVUUkFMJiZjIT1hJiYoYz1udWxsKSl9O2dvb2cuYXJyYXkuZm9yRWFjaChiLGUpO3JldHVybiBnb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShkLmpvaW4oZ29vZy5odG1sLlNhZmVIdG1sLnVud3JhcChhKSksYyl9O1xuZ29vZy5odG1sLlNhZmVIdG1sLmNvbmNhdD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5odG1sLlNhZmVIdG1sLmpvaW4oZ29vZy5odG1sLlNhZmVIdG1sLkVNUFRZLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfTtnb29nLmh0bWwuU2FmZUh0bWwuY29uY2F0V2l0aERpcj1mdW5jdGlvbihhLGIpe3ZhciBjPWdvb2cuaHRtbC5TYWZlSHRtbC5jb25jYXQoZ29vZy5hcnJheS5zbGljZShhcmd1bWVudHMsMSkpO2MuZGlyXz1hO3JldHVybiBjfTtnb29nLmh0bWwuU2FmZUh0bWwuVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPXt9O2dvb2cuaHRtbC5TYWZlSHRtbC5jcmVhdGVTYWZlSHRtbFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlPWZ1bmN0aW9uKGEsYil7cmV0dXJuKG5ldyBnb29nLmh0bWwuU2FmZUh0bWwpLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV8oYSxiKX07XG5nb29nLmh0bWwuU2FmZUh0bWwucHJvdG90eXBlLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV89ZnVuY3Rpb24oYSxiKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVIdG1sV3JhcHBlZFZhbHVlXz1nb29nLmh0bWwudHJ1c3RlZHR5cGVzLlBSSVZBVEVfRE9fTk9UX0FDQ0VTU19PUl9FTFNFX1BPTElDWT9nb29nLmh0bWwudHJ1c3RlZHR5cGVzLlBSSVZBVEVfRE9fTk9UX0FDQ0VTU19PUl9FTFNFX1BPTElDWS5jcmVhdGVIVE1MKGEpOmE7dGhpcy5kaXJfPWI7cmV0dXJuIHRoaXN9O1xuZ29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sVGFnU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2U9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW51bGw7dmFyIGU9XCI8XCIrYStnb29nLmh0bWwuU2FmZUh0bWwuc3RyaW5naWZ5QXR0cmlidXRlcyhhLGIpO2dvb2cuaXNEZWZBbmROb3ROdWxsKGMpP2dvb2cuaXNBcnJheShjKXx8KGM9W2NdKTpjPVtdO2dvb2cuZG9tLnRhZ3MuaXNWb2lkVGFnKGEudG9Mb3dlckNhc2UoKSk/KGdvb2cuYXNzZXJ0cy5hc3NlcnQoIWMubGVuZ3RoLFwiVm9pZCB0YWcgPFwiK2ErXCI+IGRvZXMgbm90IGFsbG93IGNvbnRlbnQuXCIpLGUrPVwiPlwiKTooZD1nb29nLmh0bWwuU2FmZUh0bWwuY29uY2F0KGMpLGUrPVwiPlwiK2dvb2cuaHRtbC5TYWZlSHRtbC51bndyYXAoZCkrXCI8L1wiK2ErXCI+XCIsZD1kLmdldERpcmVjdGlvbigpKTsoYT1iJiZiLmRpcikmJihkPS9eKGx0cnxydGx8YXV0bykkL2kudGVzdChhKT9nb29nLmkxOG4uYmlkaS5EaXIuTkVVVFJBTDpcbm51bGwpO3JldHVybiBnb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShlLGQpfTtnb29nLmh0bWwuU2FmZUh0bWwuc3RyaW5naWZ5QXR0cmlidXRlcz1mdW5jdGlvbihhLGIpe3ZhciBjPVwiXCI7aWYoYilmb3IodmFyIGQgaW4gYil7aWYoIWdvb2cuaHRtbC5TYWZlSHRtbC5WQUxJRF9OQU1FU19JTl9UQUdfLnRlc3QoZCkpdGhyb3cgRXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWUgXCInK2QrJ1wiLicpO3ZhciBlPWJbZF07Z29vZy5pc0RlZkFuZE5vdE51bGwoZSkmJihjKz1cIiBcIitnb29nLmh0bWwuU2FmZUh0bWwuZ2V0QXR0ck5hbWVBbmRWYWx1ZV8oYSxkLGUpKX1yZXR1cm4gY307XG5nb29nLmh0bWwuU2FmZUh0bWwuY29tYmluZUF0dHJpYnV0ZXM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9LGU7Zm9yKGUgaW4gYSlnb29nLmFzc2VydHMuYXNzZXJ0KGUudG9Mb3dlckNhc2UoKT09ZSxcIk11c3QgYmUgbG93ZXIgY2FzZVwiKSxkW2VdPWFbZV07Zm9yKGUgaW4gYilnb29nLmFzc2VydHMuYXNzZXJ0KGUudG9Mb3dlckNhc2UoKT09ZSxcIk11c3QgYmUgbG93ZXIgY2FzZVwiKSxkW2VdPWJbZV07Zm9yKGUgaW4gYyl7dmFyIGY9ZS50b0xvd2VyQ2FzZSgpO2lmKGYgaW4gYSl0aHJvdyBFcnJvcignQ2Fubm90IG92ZXJyaWRlIFwiJytmKydcIiBhdHRyaWJ1dGUsIGdvdCBcIicrZSsnXCIgd2l0aCB2YWx1ZSBcIicrY1tlXSsnXCInKTtmIGluIGImJmRlbGV0ZSBkW2ZdO2RbZV09Y1tlXX1yZXR1cm4gZH07XG5nb29nLmh0bWwuU2FmZUh0bWwuRE9DVFlQRV9IVE1MPWdvb2cuaHRtbC5TYWZlSHRtbC5jcmVhdGVTYWZlSHRtbFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKFwiPCFET0NUWVBFIGh0bWw+XCIsZ29vZy5pMThuLmJpZGkuRGlyLk5FVVRSQUwpO2dvb2cuaHRtbC5TYWZlSHRtbC5FTVBUWT1nb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShcIlwiLGdvb2cuaTE4bi5iaWRpLkRpci5ORVVUUkFMKTtnb29nLmh0bWwuU2FmZUh0bWwuQlI9Z29vZy5odG1sLlNhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoXCI8YnI+XCIsZ29vZy5pMThuLmJpZGkuRGlyLk5FVVRSQUwpO2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucz17fTtnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMuc2FmZUh0bWxGcm9tU3RyaW5nS25vd25Ub1NhdGlzZnlUeXBlQ29udHJhY3Q9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnRTdHJpbmcoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpLFwibXVzdCBwcm92aWRlIGp1c3RpZmljYXRpb25cIik7Z29vZy5hc3NlcnRzLmFzc2VydCghZ29vZy5zdHJpbmcuaW50ZXJuYWwuaXNFbXB0eU9yV2hpdGVzcGFjZShnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSkpLFwibXVzdCBwcm92aWRlIG5vbi1lbXB0eSBqdXN0aWZpY2F0aW9uXCIpO3JldHVybiBnb29nLmh0bWwuU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiLGN8fG51bGwpfTtcbmdvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlU2NyaXB0RnJvbVN0cmluZ0tub3duVG9TYXRpc2Z5VHlwZUNvbnRyYWN0PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydFN0cmluZyhnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSksXCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvblwiKTtnb29nLmFzc2VydHMuYXNzZXJ0KCFnb29nLnN0cmluZy5pbnRlcm5hbC5pc0VtcHR5T3JXaGl0ZXNwYWNlKGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKSksXCJtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IGp1c3RpZmljYXRpb25cIik7cmV0dXJuIGdvb2cuaHRtbC5TYWZlU2NyaXB0LmNyZWF0ZVNhZmVTY3JpcHRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiKX07XG5nb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMuc2FmZVN0eWxlRnJvbVN0cmluZ0tub3duVG9TYXRpc2Z5VHlwZUNvbnRyYWN0PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydFN0cmluZyhnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSksXCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvblwiKTtnb29nLmFzc2VydHMuYXNzZXJ0KCFnb29nLnN0cmluZy5pbnRlcm5hbC5pc0VtcHR5T3JXaGl0ZXNwYWNlKGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKSksXCJtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IGp1c3RpZmljYXRpb25cIik7cmV0dXJuIGdvb2cuaHRtbC5TYWZlU3R5bGUuY3JlYXRlU2FmZVN0eWxlU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYil9O1xuZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zLnNhZmVTdHlsZVNoZWV0RnJvbVN0cmluZ0tub3duVG9TYXRpc2Z5VHlwZUNvbnRyYWN0PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydFN0cmluZyhnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSksXCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvblwiKTtnb29nLmFzc2VydHMuYXNzZXJ0KCFnb29nLnN0cmluZy5pbnRlcm5hbC5pc0VtcHR5T3JXaGl0ZXNwYWNlKGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKSksXCJtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IGp1c3RpZmljYXRpb25cIik7cmV0dXJuIGdvb2cuaHRtbC5TYWZlU3R5bGVTaGVldC5jcmVhdGVTYWZlU3R5bGVTaGVldFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGIpfTtcbmdvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlVXJsRnJvbVN0cmluZ0tub3duVG9TYXRpc2Z5VHlwZUNvbnRyYWN0PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydFN0cmluZyhnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSksXCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvblwiKTtnb29nLmFzc2VydHMuYXNzZXJ0KCFnb29nLnN0cmluZy5pbnRlcm5hbC5pc0VtcHR5T3JXaGl0ZXNwYWNlKGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKSksXCJtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IGp1c3RpZmljYXRpb25cIik7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLmNyZWF0ZVNhZmVVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiKX07XG5nb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMudHJ1c3RlZFJlc291cmNlVXJsRnJvbVN0cmluZ0tub3duVG9TYXRpc2Z5VHlwZUNvbnRyYWN0PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydFN0cmluZyhnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSksXCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvblwiKTtnb29nLmFzc2VydHMuYXNzZXJ0KCFnb29nLnN0cmluZy5pbnRlcm5hbC5pc0VtcHR5T3JXaGl0ZXNwYWNlKGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKSksXCJtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IGp1c3RpZmljYXRpb25cIik7cmV0dXJuIGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuY3JlYXRlVHJ1c3RlZFJlc291cmNlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYil9O2dvb2cuZG9tLmFzc2VydHM9e307Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0xvY2F0aW9uPWZ1bmN0aW9uKGEpe2lmKGdvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyl7dmFyIGI9Z29vZy5kb20uYXNzZXJ0cy5nZXRXaW5kb3dfKGEpO2ImJighYXx8IShhIGluc3RhbmNlb2YgYi5Mb2NhdGlvbikmJmEgaW5zdGFuY2VvZiBiLkVsZW1lbnQpJiZnb29nLmFzc2VydHMuZmFpbChcIkFyZ3VtZW50IGlzIG5vdCBhIExvY2F0aW9uIChvciBhIG5vbi1FbGVtZW50IG1vY2spOyBnb3Q6ICVzXCIsZ29vZy5kb20uYXNzZXJ0cy5kZWJ1Z1N0cmluZ0ZvclR5cGVfKGEpKX1yZXR1cm4gYX07XG5nb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfPWZ1bmN0aW9uKGEsYil7aWYoZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTKXt2YXIgYz1nb29nLmRvbS5hc3NlcnRzLmdldFdpbmRvd18oYSk7YyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNbYl0mJihhJiYoYSBpbnN0YW5jZW9mIGNbYl18fCEoYSBpbnN0YW5jZW9mIGMuTG9jYXRpb258fGEgaW5zdGFuY2VvZiBjLkVsZW1lbnQpKXx8Z29vZy5hc3NlcnRzLmZhaWwoXCJBcmd1bWVudCBpcyBub3QgYSAlcyAob3IgYSBub24tRWxlbWVudCwgbm9uLUxvY2F0aW9uIG1vY2spOyBnb3Q6ICVzXCIsYixnb29nLmRvbS5hc3NlcnRzLmRlYnVnU3RyaW5nRm9yVHlwZV8oYSkpKX1yZXR1cm4gYX07Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxBbmNob3JFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsXCJIVE1MQW5jaG9yRWxlbWVudFwiKX07XG5nb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTEJ1dHRvbkVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSxcIkhUTUxCdXR0b25FbGVtZW50XCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTExpbmtFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsXCJIVE1MTGlua0VsZW1lbnRcIil9O2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MSW1hZ2VFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsXCJIVE1MSW1hZ2VFbGVtZW50XCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTEF1ZGlvRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLFwiSFRNTEF1ZGlvRWxlbWVudFwiKX07XG5nb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTFZpZGVvRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLFwiSFRNTFZpZGVvRWxlbWVudFwiKX07Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxJbnB1dEVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSxcIkhUTUxJbnB1dEVsZW1lbnRcIil9O2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MVGV4dEFyZWFFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsXCJIVE1MVGV4dEFyZWFFbGVtZW50XCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTENhbnZhc0VsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSxcIkhUTUxDYW52YXNFbGVtZW50XCIpfTtcbmdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MRW1iZWRFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsXCJIVE1MRW1iZWRFbGVtZW50XCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTEZvcm1FbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsXCJIVE1MRm9ybUVsZW1lbnRcIil9O2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MRnJhbWVFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsXCJIVE1MRnJhbWVFbGVtZW50XCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTElGcmFtZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSxcIkhUTUxJRnJhbWVFbGVtZW50XCIpfTtcbmdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MT2JqZWN0RWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLFwiSFRNTE9iamVjdEVsZW1lbnRcIil9O2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MU2NyaXB0RWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLFwiSFRNTFNjcmlwdEVsZW1lbnRcIil9O1xuZ29vZy5kb20uYXNzZXJ0cy5kZWJ1Z1N0cmluZ0ZvclR5cGVfPWZ1bmN0aW9uKGEpe2lmKGdvb2cuaXNPYmplY3QoYSkpdHJ5e3JldHVybiBhLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX1jYXRjaChiKXtyZXR1cm5cIjxvYmplY3QgY291bGQgbm90IGJlIHN0cmluZ2lmaWVkPlwifWVsc2UgcmV0dXJuIHZvaWQgMD09PWE/XCJ1bmRlZmluZWRcIjpudWxsPT09YT9cIm51bGxcIjp0eXBlb2YgYX07Z29vZy5kb20uYXNzZXJ0cy5nZXRXaW5kb3dfPWZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hJiZhLm93bmVyRG9jdW1lbnQsYz1iJiYoYi5kZWZhdWx0Vmlld3x8Yi5wYXJlbnRXaW5kb3cpO2M9Y3x8Z29vZy5nbG9iYWw7aWYoYy5FbGVtZW50JiZjLkxvY2F0aW9uKXJldHVybiBjfWNhdGNoKGQpe31yZXR1cm4gbnVsbH07Z29vZy5mdW5jdGlvbnM9e307Z29vZy5mdW5jdGlvbnMuY29uc3RhbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGF9fTtnb29nLmZ1bmN0aW9ucy5GQUxTRT1mdW5jdGlvbigpe3JldHVybiExfTtnb29nLmZ1bmN0aW9ucy5UUlVFPWZ1bmN0aW9uKCl7cmV0dXJuITB9O2dvb2cuZnVuY3Rpb25zLk5VTEw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07Z29vZy5mdW5jdGlvbnMuaWRlbnRpdHk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYX07Z29vZy5mdW5jdGlvbnMuZXJyb3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoYSk7fX07Z29vZy5mdW5jdGlvbnMuZmFpbD1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXt0aHJvdyBhO319O1xuZ29vZy5mdW5jdGlvbnMubG9jaz1mdW5jdGlvbihhLGIpe2I9Ynx8MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwLGIpKX19O2dvb2cuZnVuY3Rpb25zLm50aD1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzW2FdfX07Z29vZy5mdW5jdGlvbnMucGFydGlhbFJpZ2h0PWZ1bmN0aW9uKGEsYil7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Yi5wdXNoLmFwcGx5KGIsYyk7cmV0dXJuIGEuYXBwbHkodGhpcyxiKX19O2dvb2cuZnVuY3Rpb25zLndpdGhSZXR1cm5WYWx1ZT1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmZ1bmN0aW9ucy5zZXF1ZW5jZShhLGdvb2cuZnVuY3Rpb25zLmNvbnN0YW50KGIpKX07XG5nb29nLmZ1bmN0aW9ucy5lcXVhbFRvPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiP2E9PWM6YT09PWN9fTtnb29nLmZ1bmN0aW9ucy5jb21wb3NlPWZ1bmN0aW9uKGEsYil7dmFyIGM9YXJndW1lbnRzLGQ9Yy5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE7ZCYmKGE9Y1tkLTFdLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7Zm9yKHZhciBiPWQtMjswPD1iO2ItLSlhPWNbYl0uY2FsbCh0aGlzLGEpO3JldHVybiBhfX07Z29vZy5mdW5jdGlvbnMuc2VxdWVuY2U9ZnVuY3Rpb24oYSl7dmFyIGI9YXJndW1lbnRzLGM9Yi5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBhLGU9MDtlPGM7ZSsrKWE9YltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGF9fTtcbmdvb2cuZnVuY3Rpb25zLmFuZD1mdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1iLmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGM7YSsrKWlmKCFiW2FdLmFwcGx5KHRoaXMsYXJndW1lbnRzKSlyZXR1cm4hMTtyZXR1cm4hMH19O2dvb2cuZnVuY3Rpb25zLm9yPWZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWIubGVuZ3RoO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8YzthKyspaWYoYlthXS5hcHBseSh0aGlzLGFyZ3VtZW50cykpcmV0dXJuITA7cmV0dXJuITF9fTtnb29nLmZ1bmN0aW9ucy5ub3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07XG5nb29nLmZ1bmN0aW9ucy5jcmVhdGU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbigpe307Yy5wcm90b3R5cGU9YS5wcm90b3R5cGU7Yz1uZXcgYzthLmFwcGx5KGMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTtyZXR1cm4gY307Z29vZy5mdW5jdGlvbnMuQ0FDSEVfUkVUVVJOX1ZBTFVFPSEwO2dvb2cuZnVuY3Rpb25zLmNhY2hlUmV0dXJuVmFsdWU9ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYztyZXR1cm4gZnVuY3Rpb24oKXtpZighZ29vZy5mdW5jdGlvbnMuQ0FDSEVfUkVUVVJOX1ZBTFVFKXJldHVybiBhKCk7Ynx8KGM9YSgpLGI9ITApO3JldHVybiBjfX07Z29vZy5mdW5jdGlvbnMub25jZT1mdW5jdGlvbihhKXt2YXIgYj1hO3JldHVybiBmdW5jdGlvbigpe2lmKGIpe3ZhciBhPWI7Yj1udWxsO2EoKX19fTtcbmdvb2cuZnVuY3Rpb25zLmRlYm91bmNlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0wO3JldHVybiBmdW5jdGlvbihlKXtnb29nLmdsb2JhbC5jbGVhclRpbWVvdXQoZCk7dmFyIGY9YXJndW1lbnRzO2Q9Z29vZy5nbG9iYWwuc2V0VGltZW91dChmdW5jdGlvbigpe2EuYXBwbHkoYyxmKX0sYil9fTtnb29nLmZ1bmN0aW9ucy50aHJvdHRsZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSExLGY9W10sZz1mdW5jdGlvbigpe2Q9MDtlJiYoZT0hMSxoKCkpfSxoPWZ1bmN0aW9uKCl7ZD1nb29nLmdsb2JhbC5zZXRUaW1lb3V0KGcsYik7YS5hcHBseShjLGYpfTtyZXR1cm4gZnVuY3Rpb24oYSl7Zj1hcmd1bWVudHM7ZD9lPSEwOmgoKX19O2dvb2cuZnVuY3Rpb25zLnJhdGVMaW1pdD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPWZ1bmN0aW9uKCl7ZD0wfTtyZXR1cm4gZnVuY3Rpb24oZil7ZHx8KGQ9Z29vZy5nbG9iYWwuc2V0VGltZW91dChlLGIpLGEuYXBwbHkoYyxhcmd1bWVudHMpKX19O2dvb2cuZG9tLnNhZmU9e307Z29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbj17QUZURVJCRUdJTjpcImFmdGVyYmVnaW5cIixBRlRFUkVORDpcImFmdGVyZW5kXCIsQkVGT1JFQkVHSU46XCJiZWZvcmViZWdpblwiLEJFRk9SRUVORDpcImJlZm9yZWVuZFwifTtnb29nLmRvbS5zYWZlLmluc2VydEFkamFjZW50SHRtbD1mdW5jdGlvbihhLGIsYyl7YS5pbnNlcnRBZGphY2VudEhUTUwoYixnb29nLmh0bWwuU2FmZUh0bWwudW53cmFwVHJ1c3RlZEhUTUwoYykpfTtnb29nLmRvbS5zYWZlLlNFVF9JTk5FUl9IVE1MX0RJU0FMTE9XRURfVEFHU189e01BVEg6ITAsU0NSSVBUOiEwLFNUWUxFOiEwLFNWRzohMCxURU1QTEFURTohMH07XG5nb29nLmRvbS5zYWZlLmlzSW5uZXJIdG1sQ2xlYW51cFJlY3Vyc2l2ZV89Z29vZy5mdW5jdGlvbnMuY2FjaGVSZXR1cm5WYWx1ZShmdW5jdGlvbigpe2lmKGdvb2cuREVCVUcmJlwidW5kZWZpbmVkXCI9PT10eXBlb2YgZG9jdW1lbnQpcmV0dXJuITE7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Yi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTthLmFwcGVuZENoaWxkKGIpO2lmKGdvb2cuREVCVUcmJiFhLmZpcnN0Q2hpbGQpcmV0dXJuITE7Yj1hLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDthLmlubmVySFRNTD1nb29nLmh0bWwuU2FmZUh0bWwudW53cmFwVHJ1c3RlZEhUTUwoZ29vZy5odG1sLlNhZmVIdG1sLkVNUFRZKTtyZXR1cm4hYi5wYXJlbnRFbGVtZW50fSk7XG5nb29nLmRvbS5zYWZlLnVuc2FmZVNldElubmVySHRtbERvTm90VXNlT3JFbHNlPWZ1bmN0aW9uKGEsYil7aWYoZ29vZy5kb20uc2FmZS5pc0lubmVySHRtbENsZWFudXBSZWN1cnNpdmVfKCkpZm9yKDthLmxhc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCk7YS5pbm5lckhUTUw9Z29vZy5odG1sLlNhZmVIdG1sLnVud3JhcFRydXN0ZWRIVE1MKGIpfTtcbmdvb2cuZG9tLnNhZmUuc2V0SW5uZXJIdG1sPWZ1bmN0aW9uKGEsYil7aWYoZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTKXt2YXIgYz1hLnRhZ05hbWUudG9VcHBlckNhc2UoKTtpZihnb29nLmRvbS5zYWZlLlNFVF9JTk5FUl9IVE1MX0RJU0FMTE9XRURfVEFHU19bY10pdGhyb3cgRXJyb3IoXCJnb29nLmRvbS5zYWZlLnNldElubmVySHRtbCBjYW5ub3QgYmUgdXNlZCB0byBzZXQgY29udGVudCBvZiBcIithLnRhZ05hbWUrXCIuXCIpO31nb29nLmRvbS5zYWZlLnVuc2FmZVNldElubmVySHRtbERvTm90VXNlT3JFbHNlKGEsYil9O2dvb2cuZG9tLnNhZmUuc2V0T3V0ZXJIdG1sPWZ1bmN0aW9uKGEsYil7YS5vdXRlckhUTUw9Z29vZy5odG1sLlNhZmVIdG1sLnVud3JhcFRydXN0ZWRIVE1MKGIpfTtcbmdvb2cuZG9tLnNhZmUuc2V0Rm9ybUVsZW1lbnRBY3Rpb249ZnVuY3Rpb24oYSxiKXtiPWIgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybD9iOmdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGIpO2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MRm9ybUVsZW1lbnQoYSkuYWN0aW9uPWdvb2cuaHRtbC5TYWZlVXJsLnVud3JhcFRydXN0ZWRVUkwoYil9O2dvb2cuZG9tLnNhZmUuc2V0QnV0dG9uRm9ybUFjdGlvbj1mdW5jdGlvbihhLGIpe2I9YiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsP2I6Z29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVBc3NlcnRVbmNoYW5nZWQoYik7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxCdXR0b25FbGVtZW50KGEpLmZvcm1BY3Rpb249Z29vZy5odG1sLlNhZmVVcmwudW53cmFwVHJ1c3RlZFVSTChiKX07XG5nb29nLmRvbS5zYWZlLnNldElucHV0Rm9ybUFjdGlvbj1mdW5jdGlvbihhLGIpe2I9YiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsP2I6Z29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVBc3NlcnRVbmNoYW5nZWQoYik7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxJbnB1dEVsZW1lbnQoYSkuZm9ybUFjdGlvbj1nb29nLmh0bWwuU2FmZVVybC51bndyYXBUcnVzdGVkVVJMKGIpfTtnb29nLmRvbS5zYWZlLnNldFN0eWxlPWZ1bmN0aW9uKGEsYil7YS5zdHlsZS5jc3NUZXh0PWdvb2cuaHRtbC5TYWZlU3R5bGUudW53cmFwKGIpfTtnb29nLmRvbS5zYWZlLmRvY3VtZW50V3JpdGU9ZnVuY3Rpb24oYSxiKXthLndyaXRlKGdvb2cuaHRtbC5TYWZlSHRtbC51bndyYXBUcnVzdGVkSFRNTChiKSl9O1xuZ29vZy5kb20uc2FmZS5zZXRBbmNob3JIcmVmPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxBbmNob3JFbGVtZW50KGEpO2I9YiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsP2I6Z29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVBc3NlcnRVbmNoYW5nZWQoYik7YS5ocmVmPWdvb2cuaHRtbC5TYWZlVXJsLnVud3JhcFRydXN0ZWRVUkwoYil9O2dvb2cuZG9tLnNhZmUuc2V0SW1hZ2VTcmM9ZnVuY3Rpb24oYSxiKXtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTEltYWdlRWxlbWVudChhKTtpZighKGIgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybCkpe3ZhciBjPS9eZGF0YTppbWFnZVxcLy9pLnRlc3QoYik7Yj1nb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUFzc2VydFVuY2hhbmdlZChiLGMpfWEuc3JjPWdvb2cuaHRtbC5TYWZlVXJsLnVud3JhcFRydXN0ZWRVUkwoYil9O1xuZ29vZy5kb20uc2FmZS5zZXRBdWRpb1NyYz1mdW5jdGlvbihhLGIpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MQXVkaW9FbGVtZW50KGEpO2lmKCEoYiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsKSl7dmFyIGM9L15kYXRhOmF1ZGlvXFwvL2kudGVzdChiKTtiPWdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGIsYyl9YS5zcmM9Z29vZy5odG1sLlNhZmVVcmwudW53cmFwVHJ1c3RlZFVSTChiKX07Z29vZy5kb20uc2FmZS5zZXRWaWRlb1NyYz1mdW5jdGlvbihhLGIpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MVmlkZW9FbGVtZW50KGEpO2lmKCEoYiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsKSl7dmFyIGM9L15kYXRhOnZpZGVvXFwvL2kudGVzdChiKTtiPWdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGIsYyl9YS5zcmM9Z29vZy5odG1sLlNhZmVVcmwudW53cmFwVHJ1c3RlZFVSTChiKX07XG5nb29nLmRvbS5zYWZlLnNldEVtYmVkU3JjPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxFbWJlZEVsZW1lbnQoYSk7YS5zcmM9Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXBUcnVzdGVkU2NyaXB0VVJMKGIpfTtnb29nLmRvbS5zYWZlLnNldEZyYW1lU3JjPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxGcmFtZUVsZW1lbnQoYSk7YS5zcmM9Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXBUcnVzdGVkVVJMKGIpfTtnb29nLmRvbS5zYWZlLnNldElmcmFtZVNyYz1mdW5jdGlvbihhLGIpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MSUZyYW1lRWxlbWVudChhKTthLnNyYz1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcFRydXN0ZWRVUkwoYil9O1xuZ29vZy5kb20uc2FmZS5zZXRJZnJhbWVTcmNkb2M9ZnVuY3Rpb24oYSxiKXtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTElGcmFtZUVsZW1lbnQoYSk7YS5zcmNkb2M9Z29vZy5odG1sLlNhZmVIdG1sLnVud3JhcFRydXN0ZWRIVE1MKGIpfTtcbmdvb2cuZG9tLnNhZmUuc2V0TGlua0hyZWZBbmRSZWw9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MTGlua0VsZW1lbnQoYSk7YS5yZWw9Yztnb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVDb250YWlucyhjLFwic3R5bGVzaGVldFwiKT8oZ29vZy5hc3NlcnRzLmFzc2VydChiIGluc3RhbmNlb2YgZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCwnVVJMIG11c3QgYmUgVHJ1c3RlZFJlc291cmNlVXJsIGJlY2F1c2UgXCJyZWxcIiBjb250YWlucyBcInN0eWxlc2hlZXRcIicpLGEuaHJlZj1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcFRydXN0ZWRVUkwoYikpOmEuaHJlZj1iIGluc3RhbmNlb2YgZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybD9nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcFRydXN0ZWRVUkwoYik6YiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsP2dvb2cuaHRtbC5TYWZlVXJsLnVud3JhcFRydXN0ZWRVUkwoYik6XG5nb29nLmh0bWwuU2FmZVVybC51bndyYXBUcnVzdGVkVVJMKGdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGIpKX07Z29vZy5kb20uc2FmZS5zZXRPYmplY3REYXRhPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxPYmplY3RFbGVtZW50KGEpO2EuZGF0YT1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcFRydXN0ZWRTY3JpcHRVUkwoYil9O2dvb2cuZG9tLnNhZmUuc2V0U2NyaXB0U3JjPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxTY3JpcHRFbGVtZW50KGEpO2Euc3JjPWdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwudW53cmFwVHJ1c3RlZFNjcmlwdFVSTChiKTsoYj1nb29nLmdldFNjcmlwdE5vbmNlKCkpJiZhLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsYil9O1xuZ29vZy5kb20uc2FmZS5zZXRTY3JpcHRDb250ZW50PWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxTY3JpcHRFbGVtZW50KGEpO2EudGV4dD1nb29nLmh0bWwuU2FmZVNjcmlwdC51bndyYXBUcnVzdGVkU2NyaXB0KGIpOyhiPWdvb2cuZ2V0U2NyaXB0Tm9uY2UoKSkmJmEuc2V0QXR0cmlidXRlKFwibm9uY2VcIixiKX07Z29vZy5kb20uc2FmZS5zZXRMb2NhdGlvbkhyZWY9ZnVuY3Rpb24oYSxiKXtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzTG9jYXRpb24oYSk7Yj1iIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmw/Yjpnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUFzc2VydFVuY2hhbmdlZChiKTthLmhyZWY9Z29vZy5odG1sLlNhZmVVcmwudW53cmFwVHJ1c3RlZFVSTChiKX07XG5nb29nLmRvbS5zYWZlLmFzc2lnbkxvY2F0aW9uPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0xvY2F0aW9uKGEpO2I9YiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsP2I6Z29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVBc3NlcnRVbmNoYW5nZWQoYik7YS5hc3NpZ24oZ29vZy5odG1sLlNhZmVVcmwudW53cmFwVHJ1c3RlZFVSTChiKSl9O2dvb2cuZG9tLnNhZmUucmVwbGFjZUxvY2F0aW9uPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0xvY2F0aW9uKGEpO2I9YiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsP2I6Z29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVBc3NlcnRVbmNoYW5nZWQoYik7YS5yZXBsYWNlKGdvb2cuaHRtbC5TYWZlVXJsLnVud3JhcFRydXN0ZWRVUkwoYikpfTtcbmdvb2cuZG9tLnNhZmUub3BlbkluV2luZG93PWZ1bmN0aW9uKGEsYixjLGQsZSl7YT1hIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmw/YTpnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUFzc2VydFVuY2hhbmdlZChhKTtyZXR1cm4oYnx8Z29vZy5nbG9iYWwpLm9wZW4oZ29vZy5odG1sLlNhZmVVcmwudW53cmFwVHJ1c3RlZFVSTChhKSxjP2dvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChjKTpcIlwiLGQsZSl9O2dvb2cuZG9tLnNhZmUucGFyc2VGcm9tU3RyaW5nSHRtbD1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmRvbS5zYWZlLnBhcnNlRnJvbVN0cmluZyhhLGIsXCJ0ZXh0L2h0bWxcIil9O2dvb2cuZG9tLnNhZmUucGFyc2VGcm9tU3RyaW5nPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5wYXJzZUZyb21TdHJpbmcoZ29vZy5odG1sLlNhZmVIdG1sLnVud3JhcFRydXN0ZWRIVE1MKGIpLGMpfTtcbmdvb2cuZG9tLnNhZmUuY3JlYXRlSW1hZ2VGcm9tQmxvYj1mdW5jdGlvbihhKXtpZighL15pbWFnZVxcLy4qL2cudGVzdChhLnR5cGUpKXRocm93IEVycm9yKFwiZ29vZy5kb20uc2FmZS5jcmVhdGVJbWFnZUZyb21CbG9iIG9ubHkgYWNjZXB0cyBNSU1FIHR5cGUgaW1hZ2UvLiouXCIpO3ZhciBiPWdvb2cuZ2xvYmFsLlVSTC5jcmVhdGVPYmplY3RVUkwoYSk7YT1uZXcgZ29vZy5nbG9iYWwuSW1hZ2U7YS5vbmxvYWQ9ZnVuY3Rpb24oKXtnb29nLmdsb2JhbC5VUkwucmV2b2tlT2JqZWN0VVJMKGIpfTtnb29nLmRvbS5zYWZlLnNldEltYWdlU3JjKGEsZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zLnNhZmVVcmxGcm9tU3RyaW5nS25vd25Ub1NhdGlzZnlUeXBlQ29udHJhY3QoZ29vZy5zdHJpbmcuQ29uc3QuZnJvbShcIkltYWdlIGJsb2IgVVJMLlwiKSxiKSk7cmV0dXJuIGF9O2dvb2cuc3RyaW5nLkRFVEVDVF9ET1VCTEVfRVNDQVBJTkc9ITE7Z29vZy5zdHJpbmcuRk9SQ0VfTk9OX0RPTV9IVE1MX1VORVNDQVBJTkc9ITE7Z29vZy5zdHJpbmcuVW5pY29kZT17TkJTUDpcIlxcdTAwYTBcIn07Z29vZy5zdHJpbmcuc3RhcnRzV2l0aD1nb29nLnN0cmluZy5pbnRlcm5hbC5zdGFydHNXaXRoO2dvb2cuc3RyaW5nLmVuZHNXaXRoPWdvb2cuc3RyaW5nLmludGVybmFsLmVuZHNXaXRoO2dvb2cuc3RyaW5nLmNhc2VJbnNlbnNpdGl2ZVN0YXJ0c1dpdGg9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlU3RhcnRzV2l0aDtnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVFbmRzV2l0aD1nb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVFbmRzV2l0aDtnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVFcXVhbHM9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlRXF1YWxzO1xuZ29vZy5zdHJpbmcuc3Vicz1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLnNwbGl0KFwiJXNcIiksZD1cIlwiLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2UubGVuZ3RoJiYxPGMubGVuZ3RoOylkKz1jLnNoaWZ0KCkrZS5zaGlmdCgpO3JldHVybiBkK2Muam9pbihcIiVzXCIpfTtnb29nLnN0cmluZy5jb2xsYXBzZVdoaXRlc3BhY2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvW1xcc1xceGEwXSsvZyxcIiBcIikucmVwbGFjZSgvXlxccyt8XFxzKyQvZyxcIlwiKX07Z29vZy5zdHJpbmcuaXNFbXB0eU9yV2hpdGVzcGFjZT1nb29nLnN0cmluZy5pbnRlcm5hbC5pc0VtcHR5T3JXaGl0ZXNwYWNlO2dvb2cuc3RyaW5nLmlzRW1wdHlTdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PWEubGVuZ3RofTtnb29nLnN0cmluZy5pc0VtcHR5PWdvb2cuc3RyaW5nLmlzRW1wdHlPcldoaXRlc3BhY2U7Z29vZy5zdHJpbmcuaXNFbXB0eU9yV2hpdGVzcGFjZVNhZmU9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuc3RyaW5nLmlzRW1wdHlPcldoaXRlc3BhY2UoZ29vZy5zdHJpbmcubWFrZVNhZmUoYSkpfTtcbmdvb2cuc3RyaW5nLmlzRW1wdHlTYWZlPWdvb2cuc3RyaW5nLmlzRW1wdHlPcldoaXRlc3BhY2VTYWZlO2dvb2cuc3RyaW5nLmlzQnJlYWtpbmdXaGl0ZXNwYWNlPWZ1bmN0aW9uKGEpe3JldHVybiEvW15cXHRcXG5cXHIgXS8udGVzdChhKX07Z29vZy5zdHJpbmcuaXNBbHBoYT1mdW5jdGlvbihhKXtyZXR1cm4hL1teYS16QS1aXS8udGVzdChhKX07Z29vZy5zdHJpbmcuaXNOdW1lcmljPWZ1bmN0aW9uKGEpe3JldHVybiEvW14wLTldLy50ZXN0KGEpfTtnb29nLnN0cmluZy5pc0FscGhhTnVtZXJpYz1mdW5jdGlvbihhKXtyZXR1cm4hL1teYS16QS1aMC05XS8udGVzdChhKX07Z29vZy5zdHJpbmcuaXNTcGFjZT1mdW5jdGlvbihhKXtyZXR1cm5cIiBcIj09YX07Z29vZy5zdHJpbmcuaXNVbmljb2RlQ2hhcj1mdW5jdGlvbihhKXtyZXR1cm4gMT09YS5sZW5ndGgmJlwiIFwiPD1hJiZcIn5cIj49YXx8XCJcXHUwMDgwXCI8PWEmJlwiXFx1ZmZmZFwiPj1hfTtcbmdvb2cuc3RyaW5nLnN0cmlwTmV3bGluZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvKFxcclxcbnxcXHJ8XFxuKSsvZyxcIiBcIil9O2dvb2cuc3RyaW5nLmNhbm9uaWNhbGl6ZU5ld2xpbmVzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoLyhcXHJcXG58XFxyfFxcbikvZyxcIlxcblwiKX07Z29vZy5zdHJpbmcubm9ybWFsaXplV2hpdGVzcGFjZT1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXHhhMHxcXHMvZyxcIiBcIil9O2dvb2cuc3RyaW5nLm5vcm1hbGl6ZVNwYWNlcz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXHhhMHxbIFxcdF0rL2csXCIgXCIpfTtnb29nLnN0cmluZy5jb2xsYXBzZUJyZWFraW5nU3BhY2VzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1tcXHRcXHJcXG4gXSsvZyxcIiBcIikucmVwbGFjZSgvXltcXHRcXHJcXG4gXSt8W1xcdFxcclxcbiBdKyQvZyxcIlwiKX07Z29vZy5zdHJpbmcudHJpbT1nb29nLnN0cmluZy5pbnRlcm5hbC50cmltO1xuZ29vZy5zdHJpbmcudHJpbUxlZnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvXltcXHNcXHhhMF0rLyxcIlwiKX07Z29vZy5zdHJpbmcudHJpbVJpZ2h0PWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1tcXHNcXHhhMF0rJC8sXCJcIil9O2dvb2cuc3RyaW5nLmNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTtcbmdvb2cuc3RyaW5nLm51bWJlckF3YXJlQ29tcGFyZV89ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PWIpcmV0dXJuIDA7aWYoIWEpcmV0dXJuLTE7aWYoIWIpcmV0dXJuIDE7Zm9yKHZhciBkPWEudG9Mb3dlckNhc2UoKS5tYXRjaChjKSxlPWIudG9Mb3dlckNhc2UoKS5tYXRjaChjKSxmPU1hdGgubWluKGQubGVuZ3RoLGUubGVuZ3RoKSxnPTA7ZzxmO2crKyl7Yz1kW2ddO3ZhciBoPWVbZ107aWYoYyE9aClyZXR1cm4gYT1wYXJzZUludChjLDEwKSwhaXNOYU4oYSkmJihiPXBhcnNlSW50KGgsMTApLCFpc05hTihiKSYmYS1iKT9hLWI6YzxoPy0xOjF9cmV0dXJuIGQubGVuZ3RoIT1lLmxlbmd0aD9kLmxlbmd0aC1lLmxlbmd0aDphPGI/LTE6MX07Z29vZy5zdHJpbmcuaW50QXdhcmVDb21wYXJlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuc3RyaW5nLm51bWJlckF3YXJlQ29tcGFyZV8oYSxiLC9cXGQrfFxcRCsvZyl9O1xuZ29vZy5zdHJpbmcuZmxvYXRBd2FyZUNvbXBhcmU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5zdHJpbmcubnVtYmVyQXdhcmVDb21wYXJlXyhhLGIsL1xcZCt8XFwuXFxkK3xcXEQrL2cpfTtnb29nLnN0cmluZy5udW1lcmF0ZUNvbXBhcmU9Z29vZy5zdHJpbmcuZmxvYXRBd2FyZUNvbXBhcmU7Z29vZy5zdHJpbmcudXJsRW5jb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGEpKX07Z29vZy5zdHJpbmcudXJsRGVjb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYS5yZXBsYWNlKC9cXCsvZyxcIiBcIikpfTtnb29nLnN0cmluZy5uZXdMaW5lVG9Ccj1nb29nLnN0cmluZy5pbnRlcm5hbC5uZXdMaW5lVG9Ccjtcbmdvb2cuc3RyaW5nLmh0bWxFc2NhcGU9ZnVuY3Rpb24oYSxiKXthPWdvb2cuc3RyaW5nLmludGVybmFsLmh0bWxFc2NhcGUoYSxiKTtnb29nLnN0cmluZy5ERVRFQ1RfRE9VQkxFX0VTQ0FQSU5HJiYoYT1hLnJlcGxhY2UoZ29vZy5zdHJpbmcuRV9SRV8sXCImIzEwMTtcIikpO3JldHVybiBhfTtnb29nLnN0cmluZy5FX1JFXz0vZS9nO2dvb2cuc3RyaW5nLnVuZXNjYXBlRW50aXRpZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuc3RyaW5nLmNvbnRhaW5zKGEsXCImXCIpPyFnb29nLnN0cmluZy5GT1JDRV9OT05fRE9NX0hUTUxfVU5FU0NBUElORyYmXCJkb2N1bWVudFwiaW4gZ29vZy5nbG9iYWw/Z29vZy5zdHJpbmcudW5lc2NhcGVFbnRpdGllc1VzaW5nRG9tXyhhKTpnb29nLnN0cmluZy51bmVzY2FwZVB1cmVYbWxFbnRpdGllc18oYSk6YX07XG5nb29nLnN0cmluZy51bmVzY2FwZUVudGl0aWVzV2l0aERvY3VtZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuc3RyaW5nLmNvbnRhaW5zKGEsXCImXCIpP2dvb2cuc3RyaW5nLnVuZXNjYXBlRW50aXRpZXNVc2luZ0RvbV8oYSxiKTphfTtcbmdvb2cuc3RyaW5nLnVuZXNjYXBlRW50aXRpZXNVc2luZ0RvbV89ZnVuY3Rpb24oYSxiKXt2YXIgYz17XCImYW1wO1wiOlwiJlwiLFwiJmx0O1wiOlwiPFwiLFwiJmd0O1wiOlwiPlwiLFwiJnF1b3Q7XCI6J1wiJ307dmFyIGQ9Yj9iLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik6Z29vZy5nbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gYS5yZXBsYWNlKGdvb2cuc3RyaW5nLkhUTUxfRU5USVRZX1BBVFRFUk5fLGZ1bmN0aW9uKGEsYil7dmFyIGU9Y1thXTtpZihlKXJldHVybiBlO1wiI1wiPT1iLmNoYXJBdCgwKSYmKGI9TnVtYmVyKFwiMFwiK2Iuc3Vic3RyKDEpKSxpc05hTihiKXx8KGU9U3RyaW5nLmZyb21DaGFyQ29kZShiKSkpO2V8fChnb29nLmRvbS5zYWZlLnNldElubmVySHRtbChkLGdvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlSHRtbEZyb21TdHJpbmdLbm93blRvU2F0aXNmeVR5cGVDb250cmFjdChnb29nLnN0cmluZy5Db25zdC5mcm9tKFwiU2luZ2xlIEhUTUwgZW50aXR5LlwiKSxcbmErXCIgXCIpKSxlPWQuZmlyc3RDaGlsZC5ub2RlVmFsdWUuc2xpY2UoMCwtMSkpO3JldHVybiBjW2FdPWV9KX07Z29vZy5zdHJpbmcudW5lc2NhcGVQdXJlWG1sRW50aXRpZXNfPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoLyYoW147XSspOy9nLGZ1bmN0aW9uKGEsYyl7c3dpdGNoKGMpe2Nhc2UgXCJhbXBcIjpyZXR1cm5cIiZcIjtjYXNlIFwibHRcIjpyZXR1cm5cIjxcIjtjYXNlIFwiZ3RcIjpyZXR1cm5cIj5cIjtjYXNlIFwicXVvdFwiOnJldHVybidcIic7ZGVmYXVsdDpyZXR1cm5cIiNcIiE9Yy5jaGFyQXQoMCl8fChjPU51bWJlcihcIjBcIitjLnN1YnN0cigxKSksaXNOYU4oYykpP2E6U3RyaW5nLmZyb21DaGFyQ29kZShjKX19KX07Z29vZy5zdHJpbmcuSFRNTF9FTlRJVFlfUEFUVEVSTl89LyYoW147XFxzPCZdKyk7Py9nO2dvb2cuc3RyaW5nLndoaXRlc3BhY2VFc2NhcGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5zdHJpbmcubmV3TGluZVRvQnIoYS5yZXBsYWNlKC8gIC9nLFwiICYjMTYwO1wiKSxiKX07XG5nb29nLnN0cmluZy5wcmVzZXJ2ZVNwYWNlcz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC8oXnxbXFxuIF0pIC9nLFwiJDFcIitnb29nLnN0cmluZy5Vbmljb2RlLk5CU1ApfTtnb29nLnN0cmluZy5zdHJpcFF1b3Rlcz1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7dmFyIGU9MT09Yz9iOmIuY2hhckF0KGQpO2lmKGEuY2hhckF0KDApPT1lJiZhLmNoYXJBdChhLmxlbmd0aC0xKT09ZSlyZXR1cm4gYS5zdWJzdHJpbmcoMSxhLmxlbmd0aC0xKX1yZXR1cm4gYX07Z29vZy5zdHJpbmcudHJ1bmNhdGU9ZnVuY3Rpb24oYSxiLGMpe2MmJihhPWdvb2cuc3RyaW5nLnVuZXNjYXBlRW50aXRpZXMoYSkpO2EubGVuZ3RoPmImJihhPWEuc3Vic3RyaW5nKDAsYi0zKStcIi4uLlwiKTtjJiYoYT1nb29nLnN0cmluZy5odG1sRXNjYXBlKGEpKTtyZXR1cm4gYX07XG5nb29nLnN0cmluZy50cnVuY2F0ZU1pZGRsZT1mdW5jdGlvbihhLGIsYyxkKXtjJiYoYT1nb29nLnN0cmluZy51bmVzY2FwZUVudGl0aWVzKGEpKTtpZihkJiZhLmxlbmd0aD5iKXtkPmImJihkPWIpO3ZhciBlPWEubGVuZ3RoLWQ7YT1hLnN1YnN0cmluZygwLGItZCkrXCIuLi5cIithLnN1YnN0cmluZyhlKX1lbHNlIGEubGVuZ3RoPmImJihkPU1hdGguZmxvb3IoYi8yKSxlPWEubGVuZ3RoLWQsYT1hLnN1YnN0cmluZygwLGQrYiUyKStcIi4uLlwiK2Euc3Vic3RyaW5nKGUpKTtjJiYoYT1nb29nLnN0cmluZy5odG1sRXNjYXBlKGEpKTtyZXR1cm4gYX07Z29vZy5zdHJpbmcuc3BlY2lhbEVzY2FwZUNoYXJzXz17XCJcXHgwMFwiOlwiXFxcXDBcIixcIlxcYlwiOlwiXFxcXGJcIixcIlxcZlwiOlwiXFxcXGZcIixcIlxcblwiOlwiXFxcXG5cIixcIlxcclwiOlwiXFxcXHJcIixcIlxcdFwiOlwiXFxcXHRcIixcIlxceDBCXCI6XCJcXFxceDBCXCIsJ1wiJzonXFxcXFwiJyxcIlxcXFxcIjpcIlxcXFxcXFxcXCIsXCI8XCI6XCJcXFxcdTAwM0NcIn07Z29vZy5zdHJpbmcuanNFc2NhcGVDYWNoZV89e1wiJ1wiOlwiXFxcXCdcIn07XG5nb29nLnN0cmluZy5xdW90ZT1mdW5jdGlvbihhKXthPVN0cmluZyhhKTtmb3IodmFyIGI9WydcIiddLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YS5jaGFyQXQoYyksZT1kLmNoYXJDb2RlQXQoMCk7YltjKzFdPWdvb2cuc3RyaW5nLnNwZWNpYWxFc2NhcGVDaGFyc19bZF18fCgzMTxlJiYxMjc+ZT9kOmdvb2cuc3RyaW5nLmVzY2FwZUNoYXIoZCkpfWIucHVzaCgnXCInKTtyZXR1cm4gYi5qb2luKFwiXCIpfTtnb29nLnN0cmluZy5lc2NhcGVTdHJpbmc9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliW2NdPWdvb2cuc3RyaW5nLmVzY2FwZUNoYXIoYS5jaGFyQXQoYykpO3JldHVybiBiLmpvaW4oXCJcIil9O1xuZ29vZy5zdHJpbmcuZXNjYXBlQ2hhcj1mdW5jdGlvbihhKXtpZihhIGluIGdvb2cuc3RyaW5nLmpzRXNjYXBlQ2FjaGVfKXJldHVybiBnb29nLnN0cmluZy5qc0VzY2FwZUNhY2hlX1thXTtpZihhIGluIGdvb2cuc3RyaW5nLnNwZWNpYWxFc2NhcGVDaGFyc18pcmV0dXJuIGdvb2cuc3RyaW5nLmpzRXNjYXBlQ2FjaGVfW2FdPWdvb2cuc3RyaW5nLnNwZWNpYWxFc2NhcGVDaGFyc19bYV07dmFyIGI9YS5jaGFyQ29kZUF0KDApO2lmKDMxPGImJjEyNz5iKXZhciBjPWE7ZWxzZXtpZigyNTY+Yil7aWYoYz1cIlxcXFx4XCIsMTY+Ynx8MjU2PGIpYys9XCIwXCJ9ZWxzZSBjPVwiXFxcXHVcIiw0MDk2PmImJihjKz1cIjBcIik7Yys9Yi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1yZXR1cm4gZ29vZy5zdHJpbmcuanNFc2NhcGVDYWNoZV9bYV09Y307Z29vZy5zdHJpbmcuY29udGFpbnM9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY29udGFpbnM7Z29vZy5zdHJpbmcuY2FzZUluc2Vuc2l0aXZlQ29udGFpbnM9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlQ29udGFpbnM7XG5nb29nLnN0cmluZy5jb3VudE9mPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJmI/YS5zcGxpdChiKS5sZW5ndGgtMTowfTtnb29nLnN0cmluZy5yZW1vdmVBdD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YTswPD1iJiZiPGEubGVuZ3RoJiYwPGMmJihkPWEuc3Vic3RyKDAsYikrYS5zdWJzdHIoYitjLGEubGVuZ3RoLWItYykpO3JldHVybiBkfTtnb29nLnN0cmluZy5yZW1vdmU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5yZXBsYWNlKGIsXCJcIil9O2dvb2cuc3RyaW5nLnJlbW92ZUFsbD1mdW5jdGlvbihhLGIpe2I9bmV3IFJlZ0V4cChnb29nLnN0cmluZy5yZWdFeHBFc2NhcGUoYiksXCJnXCIpO3JldHVybiBhLnJlcGxhY2UoYixcIlwiKX07Z29vZy5zdHJpbmcucmVwbGFjZUFsbD1mdW5jdGlvbihhLGIsYyl7Yj1uZXcgUmVnRXhwKGdvb2cuc3RyaW5nLnJlZ0V4cEVzY2FwZShiKSxcImdcIik7cmV0dXJuIGEucmVwbGFjZShiLGMucmVwbGFjZSgvXFwkL2csXCIkJCQkXCIpKX07XG5nb29nLnN0cmluZy5yZWdFeHBFc2NhcGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKS5yZXBsYWNlKC8oWy0oKVxcW1xcXXt9Kz8qLiRcXF58LDojPCFcXFxcXSkvZyxcIlxcXFwkMVwiKS5yZXBsYWNlKC9cXHgwOC9nLFwiXFxcXHgwOFwiKX07Z29vZy5zdHJpbmcucmVwZWF0PVN0cmluZy5wcm90b3R5cGUucmVwZWF0P2Z1bmN0aW9uKGEsYil7cmV0dXJuIGEucmVwZWF0KGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBBcnJheShiKzEpLmpvaW4oYSl9O2dvb2cuc3RyaW5nLnBhZE51bWJlcj1mdW5jdGlvbihhLGIsYyl7YT1nb29nLmlzRGVmKGMpP2EudG9GaXhlZChjKTpTdHJpbmcoYSk7Yz1hLmluZGV4T2YoXCIuXCIpOy0xPT1jJiYoYz1hLmxlbmd0aCk7cmV0dXJuIGdvb2cuc3RyaW5nLnJlcGVhdChcIjBcIixNYXRoLm1heCgwLGItYykpK2F9O2dvb2cuc3RyaW5nLm1ha2VTYWZlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP1wiXCI6U3RyaW5nKGEpfTtcbmdvb2cuc3RyaW5nLmJ1aWxkU3RyaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKGFyZ3VtZW50cyxcIlwiKX07Z29vZy5zdHJpbmcuZ2V0UmFuZG9tU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZmxvb3IoMjE0NzQ4MzY0OCpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygzNikrTWF0aC5hYnMoTWF0aC5mbG9vcigyMTQ3NDgzNjQ4Kk1hdGgucmFuZG9tKCkpXmdvb2cubm93KCkpLnRvU3RyaW5nKDM2KX07Z29vZy5zdHJpbmcuY29tcGFyZVZlcnNpb25zPWdvb2cuc3RyaW5nLmludGVybmFsLmNvbXBhcmVWZXJzaW9ucztnb29nLnN0cmluZy5oYXNoQ29kZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPTA7YzxhLmxlbmd0aDsrK2MpYj0zMSpiK2EuY2hhckNvZGVBdChjKT4+PjA7cmV0dXJuIGJ9O2dvb2cuc3RyaW5nLnVuaXF1ZVN0cmluZ0NvdW50ZXJfPTIxNDc0ODM2NDgqTWF0aC5yYW5kb20oKXwwO1xuZ29vZy5zdHJpbmcuY3JlYXRlVW5pcXVlU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJnb29nX1wiK2dvb2cuc3RyaW5nLnVuaXF1ZVN0cmluZ0NvdW50ZXJfKyt9O2dvb2cuc3RyaW5nLnRvTnVtYmVyPWZ1bmN0aW9uKGEpe3ZhciBiPU51bWJlcihhKTtyZXR1cm4gMD09YiYmZ29vZy5zdHJpbmcuaXNFbXB0eU9yV2hpdGVzcGFjZShhKT9OYU46Yn07Z29vZy5zdHJpbmcuaXNMb3dlckNhbWVsQ2FzZT1mdW5jdGlvbihhKXtyZXR1cm4vXlthLXpdKyhbQS1aXVthLXpdKikqJC8udGVzdChhKX07Z29vZy5zdHJpbmcuaXNVcHBlckNhbWVsQ2FzZT1mdW5jdGlvbihhKXtyZXR1cm4vXihbQS1aXVthLXpdKikrJC8udGVzdChhKX07Z29vZy5zdHJpbmcudG9DYW1lbENhc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKS5yZXBsYWNlKC9cXC0oW2Etel0pL2csZnVuY3Rpb24oYSxjKXtyZXR1cm4gYy50b1VwcGVyQ2FzZSgpfSl9O1xuZ29vZy5zdHJpbmcudG9TZWxlY3RvckNhc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKS5yZXBsYWNlKC8oW0EtWl0pL2csXCItJDFcIikudG9Mb3dlckNhc2UoKX07Z29vZy5zdHJpbmcudG9UaXRsZUNhc2U9ZnVuY3Rpb24oYSxiKXtiPWdvb2cuaXNTdHJpbmcoYik/Z29vZy5zdHJpbmcucmVnRXhwRXNjYXBlKGIpOlwiXFxcXHNcIjtyZXR1cm4gYS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXlwiKyhiP1wifFtcIitiK1wiXStcIjpcIlwiKStcIikoW2Etel0pXCIsXCJnXCIpLGZ1bmN0aW9uKGEsYixlKXtyZXR1cm4gYitlLnRvVXBwZXJDYXNlKCl9KX07Z29vZy5zdHJpbmcuY2FwaXRhbGl6ZT1mdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEuY2hhckF0KDApKS50b1VwcGVyQ2FzZSgpK1N0cmluZyhhLnN1YnN0cigxKSkudG9Mb3dlckNhc2UoKX07XG5nb29nLnN0cmluZy5wYXJzZUludD1mdW5jdGlvbihhKXtpc0Zpbml0ZShhKSYmKGE9U3RyaW5nKGEpKTtyZXR1cm4gZ29vZy5pc1N0cmluZyhhKT8vXlxccyotPzB4L2kudGVzdChhKT9wYXJzZUludChhLDE2KTpwYXJzZUludChhLDEwKTpOYU59O2dvb2cuc3RyaW5nLnNwbGl0TGltaXQ9ZnVuY3Rpb24oYSxiLGMpe2E9YS5zcGxpdChiKTtmb3IodmFyIGQ9W107MDxjJiZhLmxlbmd0aDspZC5wdXNoKGEuc2hpZnQoKSksYy0tO2EubGVuZ3RoJiZkLnB1c2goYS5qb2luKGIpKTtyZXR1cm4gZH07Z29vZy5zdHJpbmcubGFzdENvbXBvbmVudD1mdW5jdGlvbihhLGIpe2lmKGIpXCJzdHJpbmdcIj09dHlwZW9mIGImJihiPVtiXSk7ZWxzZSByZXR1cm4gYTtmb3IodmFyIGM9LTEsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWlmKFwiXCIhPWJbZF0pe3ZhciBlPWEubGFzdEluZGV4T2YoYltkXSk7ZT5jJiYoYz1lKX1yZXR1cm4tMT09Yz9hOmEuc2xpY2UoYysxKX07XG5nb29nLnN0cmluZy5lZGl0RGlzdGFuY2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkPVtdO2lmKGE9PWIpcmV0dXJuIDA7aWYoIWEubGVuZ3RofHwhYi5sZW5ndGgpcmV0dXJuIE1hdGgubWF4KGEubGVuZ3RoLGIubGVuZ3RoKTtmb3IodmFyIGU9MDtlPGIubGVuZ3RoKzE7ZSsrKWNbZV09ZTtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtkWzBdPWUrMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylkW2YrMV09TWF0aC5taW4oZFtmXSsxLGNbZisxXSsxLGNbZl0rTnVtYmVyKGFbZV0hPWJbZl0pKTtmb3IoZj0wO2Y8Yy5sZW5ndGg7ZisrKWNbZl09ZFtmXX1yZXR1cm4gZFtiLmxlbmd0aF19O2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm09e307Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0FuZHJvaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiQW5kcm9pZFwiKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lwb2Q9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiaVBvZFwiKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lwaG9uZT1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJpUGhvbmVcIikmJiFnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJpUG9kXCIpJiYhZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiaVBhZFwiKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lwYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiaVBhZFwiKX07XG5nb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtLmlzSW9zPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNJcGhvbmUoKXx8Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lwYWQoKXx8Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lwb2QoKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc01hY2ludG9zaD1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJNYWNpbnRvc2hcIil9O2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNMaW51eD1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJMaW51eFwiKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc1dpbmRvd3M9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiV2luZG93c1wiKX07XG5nb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtLmlzQ2hyb21lT1M9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiQ3JPU1wiKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0Nocm9tZWNhc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiQ3JLZXlcIil9O2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNLYWlPUz1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnRJZ25vcmVDYXNlKFwiS2FpT1NcIil9O2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNHbzJQaG9uZT1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnRJZ25vcmVDYXNlKFwiR0FGUFwiKX07XG5nb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtLmdldFZlcnNpb249ZnVuY3Rpb24oKXt2YXIgYT1nb29nLmxhYnMudXNlckFnZW50LnV0aWwuZ2V0VXNlckFnZW50KCksYj1cIlwiO2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNXaW5kb3dzKCk/KGI9L1dpbmRvd3MgKD86TlR8UGhvbmUpIChbMC05Ll0rKS8sYj0oYT1iLmV4ZWMoYSkpP2FbMV06XCIwLjBcIik6Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lvcygpPyhiPS8oPzppUGhvbmV8aVBvZHxpUGFkfENQVSlcXHMrT1NcXHMrKFxcUyspLyxiPShhPWIuZXhlYyhhKSkmJmFbMV0ucmVwbGFjZSgvXy9nLFwiLlwiKSk6Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc01hY2ludG9zaCgpPyhiPS9NYWMgT1MgWCAoWzAtOV8uXSspLyxiPShhPWIuZXhlYyhhKSk/YVsxXS5yZXBsYWNlKC9fL2csXCIuXCIpOlwiMTBcIik6Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0thaU9TKCk/KGI9Lyg/OkthaU9TKVxcLyhcXFMrKS9pLFxuYj0oYT1iLmV4ZWMoYSkpJiZhWzFdKTpnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtLmlzQW5kcm9pZCgpPyhiPS9BbmRyb2lkXFxzKyhbXlxcKTtdKykoXFwpfDspLyxiPShhPWIuZXhlYyhhKSkmJmFbMV0pOmdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNDaHJvbWVPUygpJiYoYj0vKD86Q3JPU1xccysoPzppNjg2fHg4Nl82NClcXHMrKFswLTkuXSspKS8sYj0oYT1iLmV4ZWMoYSkpJiZhWzFdKTtyZXR1cm4gYnx8XCJcIn07Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc1ZlcnNpb25PckhpZ2hlcj1mdW5jdGlvbihhKXtyZXR1cm4gMDw9Z29vZy5zdHJpbmcuY29tcGFyZVZlcnNpb25zKGdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uZ2V0VmVyc2lvbigpLGEpfTtnb29nLnJlZmxlY3Q9e307Z29vZy5yZWZsZWN0Lm9iamVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBifTtnb29nLnJlZmxlY3Qub2JqZWN0UHJvcGVydHk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYX07Z29vZy5yZWZsZWN0LnNpbmtWYWx1ZT1mdW5jdGlvbihhKXtnb29nLnJlZmxlY3Quc2lua1ZhbHVlW1wiIFwiXShhKTtyZXR1cm4gYX07Z29vZy5yZWZsZWN0LnNpbmtWYWx1ZVtcIiBcIl09Z29vZy5udWxsRnVuY3Rpb247Z29vZy5yZWZsZWN0LmNhbkFjY2Vzc1Byb3BlcnR5PWZ1bmN0aW9uKGEsYil7dHJ5e3JldHVybiBnb29nLnJlZmxlY3Quc2lua1ZhbHVlKGFbYl0pLCEwfWNhdGNoKGMpe31yZXR1cm4hMX07Z29vZy5yZWZsZWN0LmNhY2hlPWZ1bmN0aW9uKGEsYixjLGQpe2Q9ZD9kKGIpOmI7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGQpP2FbZF06YVtkXT1jKGIpfTtnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZT17fTtnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5pc1ByZXN0bz1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJQcmVzdG9cIil9O2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lLmlzVHJpZGVudD1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJUcmlkZW50XCIpfHxnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJNU0lFXCIpfTtnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5pc0VkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiRWRnZVwiKX07XG5nb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5pc1dlYktpdD1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnRJZ25vcmVDYXNlKFwiV2ViS2l0XCIpJiYhZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUuaXNFZGdlKCl9O2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lLmlzR2Vja289ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50KFwiR2Vja29cIikmJiFnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5pc1dlYktpdCgpJiYhZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUuaXNUcmlkZW50KCkmJiFnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5pc0VkZ2UoKX07XG5nb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5nZXRWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGE9Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLmdldFVzZXJBZ2VudCgpO2lmKGEpe2E9Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLmV4dHJhY3RWZXJzaW9uVHVwbGVzKGEpO3ZhciBiPWdvb2cubGFicy51c2VyQWdlbnQuZW5naW5lLmdldEVuZ2luZVR1cGxlXyhhKTtpZihiKXJldHVyblwiR2Vja29cIj09YlswXT9nb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5nZXRWZXJzaW9uRm9yS2V5XyhhLFwiRmlyZWZveFwiKTpiWzFdO2E9YVswXTt2YXIgYztpZihhJiYoYz1hWzJdKSYmKGM9L1RyaWRlbnRcXC8oW15cXHM7XSspLy5leGVjKGMpKSlyZXR1cm4gY1sxXX1yZXR1cm5cIlwifTtcbmdvb2cubGFicy51c2VyQWdlbnQuZW5naW5lLmdldEVuZ2luZVR1cGxlXz1mdW5jdGlvbihhKXtpZighZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUuaXNFZGdlKCkpcmV0dXJuIGFbMV07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl07aWYoXCJFZGdlXCI9PWNbMF0pcmV0dXJuIGN9fTtnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5pc1ZlcnNpb25PckhpZ2hlcj1mdW5jdGlvbihhKXtyZXR1cm4gMDw9Z29vZy5zdHJpbmcuY29tcGFyZVZlcnNpb25zKGdvb2cubGFicy51c2VyQWdlbnQuZW5naW5lLmdldFZlcnNpb24oKSxhKX07Z29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUuZ2V0VmVyc2lvbkZvcktleV89ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT1nb29nLmFycmF5LmZpbmQoYSxmdW5jdGlvbihhKXtyZXR1cm4gYj09YVswXX0pKSYmYVsxXXx8XCJcIn07Z29vZy51c2VyQWdlbnQ9e307Z29vZy51c2VyQWdlbnQuQVNTVU1FX0lFPSExO2dvb2cudXNlckFnZW50LkFTU1VNRV9FREdFPSExO2dvb2cudXNlckFnZW50LkFTU1VNRV9HRUNLTz0hMTtnb29nLnVzZXJBZ2VudC5BU1NVTUVfV0VCS0lUPSExO2dvb2cudXNlckFnZW50LkFTU1VNRV9NT0JJTEVfV0VCS0lUPSExO2dvb2cudXNlckFnZW50LkFTU1VNRV9PUEVSQT0hMTtnb29nLnVzZXJBZ2VudC5BU1NVTUVfQU5ZX1ZFUlNJT049ITE7Z29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl89Z29vZy51c2VyQWdlbnQuQVNTVU1FX0lFfHxnb29nLnVzZXJBZ2VudC5BU1NVTUVfRURHRXx8Z29vZy51c2VyQWdlbnQuQVNTVU1FX0dFQ0tPfHxnb29nLnVzZXJBZ2VudC5BU1NVTUVfTU9CSUxFX1dFQktJVHx8Z29vZy51c2VyQWdlbnQuQVNTVU1FX1dFQktJVHx8Z29vZy51c2VyQWdlbnQuQVNTVU1FX09QRVJBO2dvb2cudXNlckFnZW50LmdldFVzZXJBZ2VudFN0cmluZz1mdW5jdGlvbigpe3JldHVybiBnb29nLmxhYnMudXNlckFnZW50LnV0aWwuZ2V0VXNlckFnZW50KCl9O1xuZ29vZy51c2VyQWdlbnQuZ2V0TmF2aWdhdG9yVHlwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5nbG9iYWwubmF2aWdhdG9yfHxudWxsfTtnb29nLnVzZXJBZ2VudC5nZXROYXZpZ2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy51c2VyQWdlbnQuZ2V0TmF2aWdhdG9yVHlwZWQoKX07Z29vZy51c2VyQWdlbnQuT1BFUkE9Z29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl8/Z29vZy51c2VyQWdlbnQuQVNTVU1FX09QRVJBOmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc09wZXJhKCk7Z29vZy51c2VyQWdlbnQuSUU9Z29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl8/Z29vZy51c2VyQWdlbnQuQVNTVU1FX0lFOmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc0lFKCk7Z29vZy51c2VyQWdlbnQuRURHRT1nb29nLnVzZXJBZ2VudC5CUk9XU0VSX0tOT1dOXz9nb29nLnVzZXJBZ2VudC5BU1NVTUVfRURHRTpnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZS5pc0VkZ2UoKTtcbmdvb2cudXNlckFnZW50LkVER0VfT1JfSUU9Z29vZy51c2VyQWdlbnQuRURHRXx8Z29vZy51c2VyQWdlbnQuSUU7Z29vZy51c2VyQWdlbnQuR0VDS089Z29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl8/Z29vZy51c2VyQWdlbnQuQVNTVU1FX0dFQ0tPOmdvb2cubGFicy51c2VyQWdlbnQuZW5naW5lLmlzR2Vja28oKTtnb29nLnVzZXJBZ2VudC5XRUJLSVQ9Z29vZy51c2VyQWdlbnQuQlJPV1NFUl9LTk9XTl8/Z29vZy51c2VyQWdlbnQuQVNTVU1FX1dFQktJVHx8Z29vZy51c2VyQWdlbnQuQVNTVU1FX01PQklMRV9XRUJLSVQ6Z29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUuaXNXZWJLaXQoKTtnb29nLnVzZXJBZ2VudC5pc01vYmlsZV89ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy51c2VyQWdlbnQuV0VCS0lUJiZnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQoXCJNb2JpbGVcIil9O1xuZ29vZy51c2VyQWdlbnQuTU9CSUxFPWdvb2cudXNlckFnZW50LkFTU1VNRV9NT0JJTEVfV0VCS0lUfHxnb29nLnVzZXJBZ2VudC5pc01vYmlsZV8oKTtnb29nLnVzZXJBZ2VudC5TQUZBUkk9Z29vZy51c2VyQWdlbnQuV0VCS0lUO2dvb2cudXNlckFnZW50LmRldGVybWluZVBsYXRmb3JtXz1mdW5jdGlvbigpe3ZhciBhPWdvb2cudXNlckFnZW50LmdldE5hdmlnYXRvclR5cGVkKCk7cmV0dXJuIGEmJmEucGxhdGZvcm18fFwiXCJ9O2dvb2cudXNlckFnZW50LlBMQVRGT1JNPWdvb2cudXNlckFnZW50LmRldGVybWluZVBsYXRmb3JtXygpO2dvb2cudXNlckFnZW50LkFTU1VNRV9NQUM9ITE7Z29vZy51c2VyQWdlbnQuQVNTVU1FX1dJTkRPV1M9ITE7Z29vZy51c2VyQWdlbnQuQVNTVU1FX0xJTlVYPSExO2dvb2cudXNlckFnZW50LkFTU1VNRV9YMTE9ITE7Z29vZy51c2VyQWdlbnQuQVNTVU1FX0FORFJPSUQ9ITE7Z29vZy51c2VyQWdlbnQuQVNTVU1FX0lQSE9ORT0hMTtcbmdvb2cudXNlckFnZW50LkFTU1VNRV9JUEFEPSExO2dvb2cudXNlckFnZW50LkFTU1VNRV9JUE9EPSExO2dvb2cudXNlckFnZW50LkFTU1VNRV9LQUlPUz0hMTtnb29nLnVzZXJBZ2VudC5BU1NVTUVfR08yUEhPTkU9ITE7Z29vZy51c2VyQWdlbnQuUExBVEZPUk1fS05PV05fPWdvb2cudXNlckFnZW50LkFTU1VNRV9NQUN8fGdvb2cudXNlckFnZW50LkFTU1VNRV9XSU5ET1dTfHxnb29nLnVzZXJBZ2VudC5BU1NVTUVfTElOVVh8fGdvb2cudXNlckFnZW50LkFTU1VNRV9YMTF8fGdvb2cudXNlckFnZW50LkFTU1VNRV9BTkRST0lEfHxnb29nLnVzZXJBZ2VudC5BU1NVTUVfSVBIT05FfHxnb29nLnVzZXJBZ2VudC5BU1NVTUVfSVBBRHx8Z29vZy51c2VyQWdlbnQuQVNTVU1FX0lQT0Q7Z29vZy51c2VyQWdlbnQuTUFDPWdvb2cudXNlckFnZW50LlBMQVRGT1JNX0tOT1dOXz9nb29nLnVzZXJBZ2VudC5BU1NVTUVfTUFDOmdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNNYWNpbnRvc2goKTtcbmdvb2cudXNlckFnZW50LldJTkRPV1M9Z29vZy51c2VyQWdlbnQuUExBVEZPUk1fS05PV05fP2dvb2cudXNlckFnZW50LkFTU1VNRV9XSU5ET1dTOmdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNXaW5kb3dzKCk7Z29vZy51c2VyQWdlbnQuaXNMZWdhY3lMaW51eF89ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0xpbnV4KCl8fGdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNDaHJvbWVPUygpfTtnb29nLnVzZXJBZ2VudC5MSU5VWD1nb29nLnVzZXJBZ2VudC5QTEFURk9STV9LTk9XTl8/Z29vZy51c2VyQWdlbnQuQVNTVU1FX0xJTlVYOmdvb2cudXNlckFnZW50LmlzTGVnYWN5TGludXhfKCk7Z29vZy51c2VyQWdlbnQuaXNYMTFfPWZ1bmN0aW9uKCl7dmFyIGE9Z29vZy51c2VyQWdlbnQuZ2V0TmF2aWdhdG9yVHlwZWQoKTtyZXR1cm4hIWEmJmdvb2cuc3RyaW5nLmNvbnRhaW5zKGEuYXBwVmVyc2lvbnx8XCJcIixcIlgxMVwiKX07XG5nb29nLnVzZXJBZ2VudC5YMTE9Z29vZy51c2VyQWdlbnQuUExBVEZPUk1fS05PV05fP2dvb2cudXNlckFnZW50LkFTU1VNRV9YMTE6Z29vZy51c2VyQWdlbnQuaXNYMTFfKCk7Z29vZy51c2VyQWdlbnQuQU5EUk9JRD1nb29nLnVzZXJBZ2VudC5QTEFURk9STV9LTk9XTl8/Z29vZy51c2VyQWdlbnQuQVNTVU1FX0FORFJPSUQ6Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0FuZHJvaWQoKTtnb29nLnVzZXJBZ2VudC5JUEhPTkU9Z29vZy51c2VyQWdlbnQuUExBVEZPUk1fS05PV05fP2dvb2cudXNlckFnZW50LkFTU1VNRV9JUEhPTkU6Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lwaG9uZSgpO2dvb2cudXNlckFnZW50LklQQUQ9Z29vZy51c2VyQWdlbnQuUExBVEZPUk1fS05PV05fP2dvb2cudXNlckFnZW50LkFTU1VNRV9JUEFEOmdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNJcGFkKCk7XG5nb29nLnVzZXJBZ2VudC5JUE9EPWdvb2cudXNlckFnZW50LlBMQVRGT1JNX0tOT1dOXz9nb29nLnVzZXJBZ2VudC5BU1NVTUVfSVBPRDpnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtLmlzSXBvZCgpO2dvb2cudXNlckFnZW50LklPUz1nb29nLnVzZXJBZ2VudC5QTEFURk9STV9LTk9XTl8/Z29vZy51c2VyQWdlbnQuQVNTVU1FX0lQSE9ORXx8Z29vZy51c2VyQWdlbnQuQVNTVU1FX0lQQUR8fGdvb2cudXNlckFnZW50LkFTU1VNRV9JUE9EOmdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNJb3MoKTtnb29nLnVzZXJBZ2VudC5LQUlPUz1nb29nLnVzZXJBZ2VudC5QTEFURk9STV9LTk9XTl8/Z29vZy51c2VyQWdlbnQuQVNTVU1FX0tBSU9TOmdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNLYWlPUygpO2dvb2cudXNlckFnZW50LkdPMlBIT05FPWdvb2cudXNlckFnZW50LlBMQVRGT1JNX0tOT1dOXz9nb29nLnVzZXJBZ2VudC5BU1NVTUVfR08yUEhPTkU6Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0dvMlBob25lKCk7XG5nb29nLnVzZXJBZ2VudC5kZXRlcm1pbmVWZXJzaW9uXz1mdW5jdGlvbigpe3ZhciBhPVwiXCIsYj1nb29nLnVzZXJBZ2VudC5nZXRWZXJzaW9uUmVnZXhSZXN1bHRfKCk7YiYmKGE9Yj9iWzFdOlwiXCIpO3JldHVybiBnb29nLnVzZXJBZ2VudC5JRSYmKGI9Z29vZy51c2VyQWdlbnQuZ2V0RG9jdW1lbnRNb2RlXygpLG51bGwhPWImJmI+cGFyc2VGbG9hdChhKSk/U3RyaW5nKGIpOmF9O1xuZ29vZy51c2VyQWdlbnQuZ2V0VmVyc2lvblJlZ2V4UmVzdWx0Xz1mdW5jdGlvbigpe3ZhciBhPWdvb2cudXNlckFnZW50LmdldFVzZXJBZ2VudFN0cmluZygpO2lmKGdvb2cudXNlckFnZW50LkdFQ0tPKXJldHVybi9ydjooW15cXCk7XSspKFxcKXw7KS8uZXhlYyhhKTtpZihnb29nLnVzZXJBZ2VudC5FREdFKXJldHVybi9FZGdlXFwvKFtcXGRcXC5dKykvLmV4ZWMoYSk7aWYoZ29vZy51c2VyQWdlbnQuSUUpcmV0dXJuL1xcYig/Ok1TSUV8cnYpWzogXShbXlxcKTtdKykoXFwpfDspLy5leGVjKGEpO2lmKGdvb2cudXNlckFnZW50LldFQktJVClyZXR1cm4vV2ViS2l0XFwvKFxcUyspLy5leGVjKGEpO2lmKGdvb2cudXNlckFnZW50Lk9QRVJBKXJldHVybi8oPzpWZXJzaW9uKVsgXFwvXT8oXFxTKykvLmV4ZWMoYSl9O2dvb2cudXNlckFnZW50LmdldERvY3VtZW50TW9kZV89ZnVuY3Rpb24oKXt2YXIgYT1nb29nLmdsb2JhbC5kb2N1bWVudDtyZXR1cm4gYT9hLmRvY3VtZW50TW9kZTp2b2lkIDB9O1xuZ29vZy51c2VyQWdlbnQuVkVSU0lPTj1nb29nLnVzZXJBZ2VudC5kZXRlcm1pbmVWZXJzaW9uXygpO2dvb2cudXNlckFnZW50LmNvbXBhcmU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5zdHJpbmcuY29tcGFyZVZlcnNpb25zKGEsYil9O2dvb2cudXNlckFnZW50LmlzVmVyc2lvbk9ySGlnaGVyQ2FjaGVfPXt9O2dvb2cudXNlckFnZW50LmlzVmVyc2lvbk9ySGlnaGVyPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLnVzZXJBZ2VudC5BU1NVTUVfQU5ZX1ZFUlNJT058fGdvb2cucmVmbGVjdC5jYWNoZShnb29nLnVzZXJBZ2VudC5pc1ZlcnNpb25PckhpZ2hlckNhY2hlXyxhLGZ1bmN0aW9uKCl7cmV0dXJuIDA8PWdvb2cuc3RyaW5nLmNvbXBhcmVWZXJzaW9ucyhnb29nLnVzZXJBZ2VudC5WRVJTSU9OLGEpfSl9O2dvb2cudXNlckFnZW50LmlzVmVyc2lvbj1nb29nLnVzZXJBZ2VudC5pc1ZlcnNpb25PckhpZ2hlcjtcbmdvb2cudXNlckFnZW50LmlzRG9jdW1lbnRNb2RlT3JIaWdoZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIE51bWJlcihnb29nLnVzZXJBZ2VudC5ET0NVTUVOVF9NT0RFKT49YX07Z29vZy51c2VyQWdlbnQuaXNEb2N1bWVudE1vZGU9Z29vZy51c2VyQWdlbnQuaXNEb2N1bWVudE1vZGVPckhpZ2hlcjtnb29nLnVzZXJBZ2VudC5ET0NVTUVOVF9NT0RFPWZ1bmN0aW9uKCl7aWYoZ29vZy5nbG9iYWwuZG9jdW1lbnQmJmdvb2cudXNlckFnZW50LklFKXJldHVybiBnb29nLnVzZXJBZ2VudC5nZXREb2N1bWVudE1vZGVfKCl9KCk7Z29vZy51c2VyQWdlbnQucHJvZHVjdD17fTtnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9GSVJFRk9YPSExO2dvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0lQSE9ORT0hMTtnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9JUEFEPSExO2dvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0FORFJPSUQ9ITE7Z29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfQ0hST01FPSExO2dvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX1NBRkFSST0hMTtcbmdvb2cudXNlckFnZW50LnByb2R1Y3QuUFJPRFVDVF9LTk9XTl89Z29vZy51c2VyQWdlbnQuQVNTVU1FX0lFfHxnb29nLnVzZXJBZ2VudC5BU1NVTUVfRURHRXx8Z29vZy51c2VyQWdlbnQuQVNTVU1FX09QRVJBfHxnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9GSVJFRk9YfHxnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9JUEhPTkV8fGdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0lQQUR8fGdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0FORFJPSUR8fGdvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0NIUk9NRXx8Z29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfU0FGQVJJO2dvb2cudXNlckFnZW50LnByb2R1Y3QuT1BFUkE9Z29vZy51c2VyQWdlbnQuT1BFUkE7Z29vZy51c2VyQWdlbnQucHJvZHVjdC5JRT1nb29nLnVzZXJBZ2VudC5JRTtnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkVER0U9Z29vZy51c2VyQWdlbnQuRURHRTtcbmdvb2cudXNlckFnZW50LnByb2R1Y3QuRklSRUZPWD1nb29nLnVzZXJBZ2VudC5wcm9kdWN0LlBST0RVQ1RfS05PV05fP2dvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0ZJUkVGT1g6Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzRmlyZWZveCgpO2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNJcGhvbmVPcklwb2RfPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0uaXNJcGhvbmUoKXx8Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lwb2QoKX07Z29vZy51c2VyQWdlbnQucHJvZHVjdC5JUEhPTkU9Z29vZy51c2VyQWdlbnQucHJvZHVjdC5QUk9EVUNUX0tOT1dOXz9nb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9JUEhPTkU6Z29vZy51c2VyQWdlbnQucHJvZHVjdC5pc0lwaG9uZU9ySXBvZF8oKTtcbmdvb2cudXNlckFnZW50LnByb2R1Y3QuSVBBRD1nb29nLnVzZXJBZ2VudC5wcm9kdWN0LlBST0RVQ1RfS05PV05fP2dvb2cudXNlckFnZW50LnByb2R1Y3QuQVNTVU1FX0lQQUQ6Z29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybS5pc0lwYWQoKTtnb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFORFJPSUQ9Z29vZy51c2VyQWdlbnQucHJvZHVjdC5QUk9EVUNUX0tOT1dOXz9nb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9BTkRST0lEOmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc0FuZHJvaWRCcm93c2VyKCk7Z29vZy51c2VyQWdlbnQucHJvZHVjdC5DSFJPTUU9Z29vZy51c2VyQWdlbnQucHJvZHVjdC5QUk9EVUNUX0tOT1dOXz9nb29nLnVzZXJBZ2VudC5wcm9kdWN0LkFTU1VNRV9DSFJPTUU6Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzQ2hyb21lKCk7XG5nb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzU2FmYXJpRGVza3RvcF89ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzU2FmYXJpKCkmJiFnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtLmlzSW9zKCl9O2dvb2cudXNlckFnZW50LnByb2R1Y3QuU0FGQVJJPWdvb2cudXNlckFnZW50LnByb2R1Y3QuUFJPRFVDVF9LTk9XTl8/Z29vZy51c2VyQWdlbnQucHJvZHVjdC5BU1NVTUVfU0FGQVJJOmdvb2cudXNlckFnZW50LnByb2R1Y3QuaXNTYWZhcmlEZXNrdG9wXygpO2dvb2cuY3J5cHQuYmFzZTY0PXt9O2dvb2cuY3J5cHQuYmFzZTY0LkRFRkFVTFRfQUxQSEFCRVRfQ09NTU9OXz1cIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XCI7Z29vZy5jcnlwdC5iYXNlNjQuRU5DT0RFRF9WQUxTPWdvb2cuY3J5cHQuYmFzZTY0LkRFRkFVTFRfQUxQSEFCRVRfQ09NTU9OXytcIisvPVwiO2dvb2cuY3J5cHQuYmFzZTY0LkVOQ09ERURfVkFMU19XRUJTQUZFPWdvb2cuY3J5cHQuYmFzZTY0LkRFRkFVTFRfQUxQSEFCRVRfQ09NTU9OXytcIi1fLlwiO2dvb2cuY3J5cHQuYmFzZTY0LkFscGhhYmV0PXtERUZBVUxUOjAsTk9fUEFERElORzoxLFdFQlNBRkU6MixXRUJTQUZFX0RPVF9QQURESU5HOjMsV0VCU0FGRV9OT19QQURESU5HOjR9O2dvb2cuY3J5cHQuYmFzZTY0LnBhZGRpbmdDaGFyc189XCI9LlwiO1xuZ29vZy5jcnlwdC5iYXNlNjQuaXNQYWRkaW5nXz1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5zdHJpbmcuY29udGFpbnMoZ29vZy5jcnlwdC5iYXNlNjQucGFkZGluZ0NoYXJzXyxhKX07Z29vZy5jcnlwdC5iYXNlNjQuYnl0ZVRvQ2hhck1hcHNfPXt9O2dvb2cuY3J5cHQuYmFzZTY0LmNoYXJUb0J5dGVNYXBfPW51bGw7Z29vZy5jcnlwdC5iYXNlNjQuQVNTVU1FX05BVElWRV9TVVBQT1JUXz1nb29nLnVzZXJBZ2VudC5HRUNLT3x8Z29vZy51c2VyQWdlbnQuV0VCS0lUJiYhZ29vZy51c2VyQWdlbnQucHJvZHVjdC5TQUZBUkl8fGdvb2cudXNlckFnZW50Lk9QRVJBO2dvb2cuY3J5cHQuYmFzZTY0LkhBU19OQVRJVkVfRU5DT0RFXz1nb29nLmNyeXB0LmJhc2U2NC5BU1NVTUVfTkFUSVZFX1NVUFBPUlRffHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBnb29nLmdsb2JhbC5idG9hO1xuZ29vZy5jcnlwdC5iYXNlNjQuSEFTX05BVElWRV9ERUNPREVfPWdvb2cuY3J5cHQuYmFzZTY0LkFTU1VNRV9OQVRJVkVfU1VQUE9SVF98fCFnb29nLnVzZXJBZ2VudC5wcm9kdWN0LlNBRkFSSSYmIWdvb2cudXNlckFnZW50LklFJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBnb29nLmdsb2JhbC5hdG9iO1xuZ29vZy5jcnlwdC5iYXNlNjQuZW5jb2RlQnl0ZUFycmF5PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydChnb29nLmlzQXJyYXlMaWtlKGEpLFwiZW5jb2RlQnl0ZUFycmF5IHRha2VzIGFuIGFycmF5IGFzIGEgcGFyYW1ldGVyXCIpO3ZvaWQgMD09PWImJihiPWdvb2cuY3J5cHQuYmFzZTY0LkFscGhhYmV0LkRFRkFVTFQpO2dvb2cuY3J5cHQuYmFzZTY0LmluaXRfKCk7Yj1nb29nLmNyeXB0LmJhc2U2NC5ieXRlVG9DaGFyTWFwc19bYl07Zm9yKHZhciBjPVtdLGQ9MDtkPGEubGVuZ3RoO2QrPTMpe3ZhciBlPWFbZF0sZj1kKzE8YS5sZW5ndGgsZz1mP2FbZCsxXTowLGg9ZCsyPGEubGVuZ3RoLGs9aD9hW2QrMl06MCxsPWU+PjI7ZT0oZSYzKTw8NHxnPj40O2c9KGcmMTUpPDwyfGs+PjY7ayY9NjM7aHx8KGs9NjQsZnx8KGc9NjQpKTtjLnB1c2goYltsXSxiW2VdLGJbZ118fFwiXCIsYltrXXx8XCJcIil9cmV0dXJuIGMuam9pbihcIlwiKX07XG5nb29nLmNyeXB0LmJhc2U2NC5lbmNvZGVTdHJpbmc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5jcnlwdC5iYXNlNjQuSEFTX05BVElWRV9FTkNPREVfJiYhYj9nb29nLmdsb2JhbC5idG9hKGEpOmdvb2cuY3J5cHQuYmFzZTY0LmVuY29kZUJ5dGVBcnJheShnb29nLmNyeXB0LnN0cmluZ1RvQnl0ZUFycmF5KGEpLGIpfTtnb29nLmNyeXB0LmJhc2U2NC5kZWNvZGVTdHJpbmc9ZnVuY3Rpb24oYSxiKXtpZihnb29nLmNyeXB0LmJhc2U2NC5IQVNfTkFUSVZFX0RFQ09ERV8mJiFiKXJldHVybiBnb29nLmdsb2JhbC5hdG9iKGEpO3ZhciBjPVwiXCI7Z29vZy5jcnlwdC5iYXNlNjQuZGVjb2RlU3RyaW5nSW50ZXJuYWxfKGEsZnVuY3Rpb24oYSl7Yys9U3RyaW5nLmZyb21DaGFyQ29kZShhKX0pO3JldHVybiBjfTtcbmdvb2cuY3J5cHQuYmFzZTY0LmRlY29kZVN0cmluZ1RvQnl0ZUFycmF5PWZ1bmN0aW9uKGEsYil7dmFyIGM9W107Z29vZy5jcnlwdC5iYXNlNjQuZGVjb2RlU3RyaW5nSW50ZXJuYWxfKGEsZnVuY3Rpb24oYSl7Yy5wdXNoKGEpfSk7cmV0dXJuIGN9O1xuZ29vZy5jcnlwdC5iYXNlNjQuZGVjb2RlU3RyaW5nVG9VaW50OEFycmF5PWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoIWdvb2cudXNlckFnZW50LklFfHxnb29nLnVzZXJBZ2VudC5pc1ZlcnNpb25PckhpZ2hlcihcIjEwXCIpLFwiQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGFycmF5c1wiKTt2YXIgYj1hLmxlbmd0aCxjPTMqYi80O2MlMz9jPU1hdGguZmxvb3IoYyk6Z29vZy5jcnlwdC5iYXNlNjQuaXNQYWRkaW5nXyhhW2ItMV0pJiYoYz1nb29nLmNyeXB0LmJhc2U2NC5pc1BhZGRpbmdfKGFbYi0yXSk/Yy0yOmMtMSk7dmFyIGQ9bmV3IFVpbnQ4QXJyYXkoYyksZT0wO2dvb2cuY3J5cHQuYmFzZTY0LmRlY29kZVN0cmluZ0ludGVybmFsXyhhLGZ1bmN0aW9uKGEpe2RbZSsrXT1hfSk7cmV0dXJuIGQuc3ViYXJyYXkoMCxlKX07XG5nb29nLmNyeXB0LmJhc2U2NC5kZWNvZGVTdHJpbmdJbnRlcm5hbF89ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe2Zvcig7ZDxhLmxlbmd0aDspe3ZhciBjPWEuY2hhckF0KGQrKyksZT1nb29nLmNyeXB0LmJhc2U2NC5jaGFyVG9CeXRlTWFwX1tjXTtpZihudWxsIT1lKXJldHVybiBlO2lmKCFnb29nLnN0cmluZy5pc0VtcHR5T3JXaGl0ZXNwYWNlKGMpKXRocm93IEVycm9yKFwiVW5rbm93biBiYXNlNjQgZW5jb2RpbmcgYXQgY2hhcjogXCIrYyk7fXJldHVybiBifWdvb2cuY3J5cHQuYmFzZTY0LmluaXRfKCk7Zm9yKHZhciBkPTA7Oyl7dmFyIGU9YygtMSksZj1jKDApLGc9Yyg2NCksaD1jKDY0KTtpZig2ND09PWgmJi0xPT09ZSlicmVhaztiKGU8PDJ8Zj4+NCk7NjQhPWcmJihiKGY8PDQmMjQwfGc+PjIpLDY0IT1oJiZiKGc8PDYmMTkyfGgpKX19O1xuZ29vZy5jcnlwdC5iYXNlNjQuaW5pdF89ZnVuY3Rpb24oKXtpZighZ29vZy5jcnlwdC5iYXNlNjQuY2hhclRvQnl0ZU1hcF8pe2dvb2cuY3J5cHQuYmFzZTY0LmNoYXJUb0J5dGVNYXBfPXt9O2Zvcih2YXIgYT1nb29nLmNyeXB0LmJhc2U2NC5ERUZBVUxUX0FMUEhBQkVUX0NPTU1PTl8uc3BsaXQoXCJcIiksYj1bXCIrLz1cIixcIisvXCIsXCItXz1cIixcIi1fLlwiLFwiLV9cIl0sYz0wOzU+YztjKyspe3ZhciBkPWEuY29uY2F0KGJbY10uc3BsaXQoXCJcIikpO2dvb2cuY3J5cHQuYmFzZTY0LmJ5dGVUb0NoYXJNYXBzX1tjXT1kO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1kW2VdLGc9Z29vZy5jcnlwdC5iYXNlNjQuY2hhclRvQnl0ZU1hcF9bZl07dm9pZCAwPT09Zz9nb29nLmNyeXB0LmJhc2U2NC5jaGFyVG9CeXRlTWFwX1tmXT1lOmdvb2cuYXNzZXJ0cy5hc3NlcnQoZz09PWUpfX19fTtqc3BiLnV0aWxzPXt9O2pzcGIudXRpbHMuc3BsaXQ2NExvdz0wO2pzcGIudXRpbHMuc3BsaXQ2NEhpZ2g9MDtqc3BiLnV0aWxzLnNwbGl0VWludDY0PWZ1bmN0aW9uKGEpe3ZhciBiPWE+Pj4wO2E9TWF0aC5mbG9vcigoYS1iKS9qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIpPj4+MDtqc3BiLnV0aWxzLnNwbGl0NjRMb3c9Yjtqc3BiLnV0aWxzLnNwbGl0NjRIaWdoPWF9O2pzcGIudXRpbHMuc3BsaXRJbnQ2ND1mdW5jdGlvbihhKXt2YXIgYj0wPmE7YT1NYXRoLmFicyhhKTt2YXIgYz1hPj4+MDthPU1hdGguZmxvb3IoKGEtYykvanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKTthPj4+PTA7YiYmKGE9fmE+Pj4wLGM9KH5jPj4+MCkrMSw0Mjk0OTY3Mjk1PGMmJihjPTAsYSsrLDQyOTQ5NjcyOTU8YSYmKGE9MCkpKTtqc3BiLnV0aWxzLnNwbGl0NjRMb3c9Yztqc3BiLnV0aWxzLnNwbGl0NjRIaWdoPWF9O1xuanNwYi51dGlscy5zcGxpdFppZ3phZzY0PWZ1bmN0aW9uKGEpe3ZhciBiPTA+YTthPTIqTWF0aC5hYnMoYSk7anNwYi51dGlscy5zcGxpdFVpbnQ2NChhKTthPWpzcGIudXRpbHMuc3BsaXQ2NExvdzt2YXIgYz1qc3BiLnV0aWxzLnNwbGl0NjRIaWdoO2ImJigwPT1hPzA9PWM/Yz1hPTQyOTQ5NjcyOTU6KGMtLSxhPTQyOTQ5NjcyOTUpOmEtLSk7anNwYi51dGlscy5zcGxpdDY0TG93PWE7anNwYi51dGlscy5zcGxpdDY0SGlnaD1jfTtcbmpzcGIudXRpbHMuc3BsaXRGbG9hdDMyPWZ1bmN0aW9uKGEpe3ZhciBiPTA+YT8xOjA7YT1iPy1hOmE7aWYoMD09PWEpMDwxL2E/KGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2g9MCxqc3BiLnV0aWxzLnNwbGl0NjRMb3c9MCk6KGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2g9MCxqc3BiLnV0aWxzLnNwbGl0NjRMb3c9MjE0NzQ4MzY0OCk7ZWxzZSBpZihpc05hTihhKSlqc3BiLnV0aWxzLnNwbGl0NjRIaWdoPTAsanNwYi51dGlscy5zcGxpdDY0TG93PTIxNDc0ODM2NDc7ZWxzZSBpZihhPmpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfTUFYKWpzcGIudXRpbHMuc3BsaXQ2NEhpZ2g9MCxqc3BiLnV0aWxzLnNwbGl0NjRMb3c9KGI8PDMxfDIxMzkwOTUwNDApPj4+MDtlbHNlIGlmKGE8anNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQzMl9NSU4pYT1NYXRoLnJvdW5kKGEvTWF0aC5wb3coMiwtMTQ5KSksanNwYi51dGlscy5zcGxpdDY0SGlnaD0wLGpzcGIudXRpbHMuc3BsaXQ2NExvdz0oYjw8MzF8XG5hKT4+PjA7ZWxzZXt2YXIgYz1NYXRoLmZsb29yKE1hdGgubG9nKGEpL01hdGguTE4yKTthKj1NYXRoLnBvdygyLC1jKTthPU1hdGgucm91bmQoYSpqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMjMpJjgzODg2MDc7anNwYi51dGlscy5zcGxpdDY0SGlnaD0wO2pzcGIudXRpbHMuc3BsaXQ2NExvdz0oYjw8MzF8YysxMjc8PDIzfGEpPj4+MH19O1xuanNwYi51dGlscy5zcGxpdEZsb2F0NjQ9ZnVuY3Rpb24oYSl7dmFyIGI9MD5hPzE6MDthPWI/LWE6YTtpZigwPT09YSlqc3BiLnV0aWxzLnNwbGl0NjRIaWdoPTA8MS9hPzA6MjE0NzQ4MzY0OCxqc3BiLnV0aWxzLnNwbGl0NjRMb3c9MDtlbHNlIGlmKGlzTmFOKGEpKWpzcGIudXRpbHMuc3BsaXQ2NEhpZ2g9MjE0NzQ4MzY0Nyxqc3BiLnV0aWxzLnNwbGl0NjRMb3c9NDI5NDk2NzI5NTtlbHNlIGlmKGE+anNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQ2NF9NQVgpanNwYi51dGlscy5zcGxpdDY0SGlnaD0oYjw8MzF8MjE0NjQzNTA3Mik+Pj4wLGpzcGIudXRpbHMuc3BsaXQ2NExvdz0wO2Vsc2UgaWYoYTxqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDY0X01JTil7dmFyIGM9YS9NYXRoLnBvdygyLC0xMDc0KTthPWMvanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyO2pzcGIudXRpbHMuc3BsaXQ2NEhpZ2g9KGI8PDMxfGEpPj4+MDtqc3BiLnV0aWxzLnNwbGl0NjRMb3c9Yz4+PjB9ZWxzZXtjPVxuYTt2YXIgZD0wO2lmKDI8PWMpZm9yKDsyPD1jJiYxMDIzPmQ7KWQrKyxjLz0yO2Vsc2UgZm9yKDsxPmMmJi0xMDIyPGQ7KWMqPTIsZC0tO2M9YSpNYXRoLnBvdygyLC1kKTthPWMqanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzIwJjEwNDg1NzU7Yz1jKmpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT181Mj4+PjA7anNwYi51dGlscy5zcGxpdDY0SGlnaD0oYjw8MzF8ZCsxMDIzPDwyMHxhKT4+PjA7anNwYi51dGlscy5zcGxpdDY0TG93PWN9fTtcbmpzcGIudXRpbHMuc3BsaXRIYXNoNjQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5jaGFyQ29kZUF0KDApLGM9YS5jaGFyQ29kZUF0KDEpLGQ9YS5jaGFyQ29kZUF0KDIpLGU9YS5jaGFyQ29kZUF0KDMpLGY9YS5jaGFyQ29kZUF0KDQpLGc9YS5jaGFyQ29kZUF0KDUpLGg9YS5jaGFyQ29kZUF0KDYpO2E9YS5jaGFyQ29kZUF0KDcpO2pzcGIudXRpbHMuc3BsaXQ2NExvdz1iKyhjPDw4KSsoZDw8MTYpKyhlPDwyNCk+Pj4wO2pzcGIudXRpbHMuc3BsaXQ2NEhpZ2g9ZisoZzw8OCkrKGg8PDE2KSsoYTw8MjQpPj4+MH07anNwYi51dGlscy5qb2luVWludDY0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIqanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKyhhPj4+MCl9O1xuanNwYi51dGlscy5qb2luSW50NjQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iJjIxNDc0ODM2NDg7YyYmKGE9fmErMT4+PjAsYj1+Yj4+PjAsMD09YSYmKGI9YisxPj4+MCkpO2E9anNwYi51dGlscy5qb2luVWludDY0KGEsYik7cmV0dXJuIGM/LWE6YX07anNwYi51dGlscy50b1ppZ3phZzY0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iPj4zMTtyZXR1cm4gYyhhPDwxXmQsKGI8PDF8YT4+PjMxKV5kKX07anNwYi51dGlscy5qb2luWmlnemFnNjQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4ganNwYi51dGlscy5mcm9tWmlnemFnNjQoYSxiLGpzcGIudXRpbHMuam9pbkludDY0KX07anNwYi51dGlscy5mcm9tWmlnemFnNjQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPS0oYSYxKTtyZXR1cm4gYygoYT4+PjF8Yjw8MzEpXmQsYj4+PjFeZCl9O1xuanNwYi51dGlscy5qb2luRmxvYXQzMj1mdW5jdGlvbihhLGIpe2I9MiooYT4+MzEpKzE7dmFyIGM9YT4+PjIzJjI1NTthJj04Mzg4NjA3O3JldHVybiAyNTU9PWM/YT9OYU46SW5maW5pdHkqYjowPT1jP2IqTWF0aC5wb3coMiwtMTQ5KSphOmIqTWF0aC5wb3coMixjLTE1MCkqKGErTWF0aC5wb3coMiwyMykpfTtqc3BiLnV0aWxzLmpvaW5GbG9hdDY0PWZ1bmN0aW9uKGEsYil7dmFyIGM9MiooYj4+MzEpKzEsZD1iPj4+MjAmMjA0NzthPWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMiooYiYxMDQ4NTc1KSthO3JldHVybiAyMDQ3PT1kP2E/TmFOOkluZmluaXR5KmM6MD09ZD9jKk1hdGgucG93KDIsLTEwNzQpKmE6YypNYXRoLnBvdygyLGQtMTA3NSkqKGEranNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzUyKX07XG5qc3BiLnV0aWxzLmpvaW5IYXNoNjQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhPj4+MCYyNTUsYT4+PjgmMjU1LGE+Pj4xNiYyNTUsYT4+PjI0JjI1NSxiPj4+MCYyNTUsYj4+PjgmMjU1LGI+Pj4xNiYyNTUsYj4+PjI0JjI1NSl9O2pzcGIudXRpbHMuRElHSVRTPVwiMDEyMzQ1Njc4OWFiY2RlZlwiLnNwbGl0KFwiXCIpO2pzcGIudXRpbHMuWkVST19DSEFSX0NPREVfPTQ4O2pzcGIudXRpbHMuQV9DSEFSX0NPREVfPTk3O1xuanNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2E9YT9TdHJpbmcoYSk6XCJcIjtyZXR1cm4gYj9cIjAwMDAwMDBcIi5zbGljZShhLmxlbmd0aCkrYTphfWlmKDIwOTcxNTE+PWIpcmV0dXJuXCJcIitqc3BiLnV0aWxzLmpvaW5VaW50NjQoYSxiKTt2YXIgZD0oYT4+PjI0fGI8PDgpPj4+MCYxNjc3NzIxNTtiPWI+PjE2JjY1NTM1O2E9KGEmMTY3NzcyMTUpKzY3NzcyMTYqZCs2NzEwNjU2KmI7ZCs9ODE0NzQ5NypiO2IqPTI7MUU3PD1hJiYoZCs9TWF0aC5mbG9vcihhLzFFNyksYSU9MUU3KTsxRTc8PWQmJihiKz1NYXRoLmZsb29yKGQvMUU3KSxkJT0xRTcpO3JldHVybiBjKGIsMCkrYyhkLGIpK2MoYSwxKX07XG5qc3BiLnV0aWxzLmpvaW5TaWduZWREZWNpbWFsU3RyaW5nPWZ1bmN0aW9uKGEsYil7dmFyIGM9YiYyMTQ3NDgzNjQ4O2MmJihhPX5hKzE+Pj4wLGI9fmIrKDA9PWE/MTowKT4+PjApO2E9anNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKGEsYik7cmV0dXJuIGM/XCItXCIrYTphfTtqc3BiLnV0aWxzLmhhc2g2NFRvRGVjaW1hbFN0cmluZz1mdW5jdGlvbihhLGIpe2pzcGIudXRpbHMuc3BsaXRIYXNoNjQoYSk7YT1qc3BiLnV0aWxzLnNwbGl0NjRMb3c7dmFyIGM9anNwYi51dGlscy5zcGxpdDY0SGlnaDtyZXR1cm4gYj9qc3BiLnV0aWxzLmpvaW5TaWduZWREZWNpbWFsU3RyaW5nKGEsYyk6anNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKGEsYyl9O1xuanNwYi51dGlscy5oYXNoNjRBcnJheVRvRGVjaW1hbFN0cmluZ3M9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9QXJyYXkoYS5sZW5ndGgpLGQ9MDtkPGEubGVuZ3RoO2QrKyljW2RdPWpzcGIudXRpbHMuaGFzaDY0VG9EZWNpbWFsU3RyaW5nKGFbZF0sYik7cmV0dXJuIGN9O1xuanNwYi51dGlscy5kZWNpbWFsU3RyaW5nVG9IYXNoNjQ9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe2Zvcih2YXIgYz0wOzg+YyYmKDEhPT1hfHwwPGIpO2MrKyliPWEqZVtjXStiLGVbY109YiYyNTUsYj4+Pj04fWZ1bmN0aW9uIGMoKXtmb3IodmFyIGE9MDs4PmE7YSsrKWVbYV09fmVbYV0mMjU1fWdvb2cuYXNzZXJ0cy5hc3NlcnQoMDxhLmxlbmd0aCk7dmFyIGQ9ITE7XCItXCI9PT1hWzBdJiYoZD0hMCxhPWEuc2xpY2UoMSkpO2Zvcih2YXIgZT1bMCwwLDAsMCwwLDAsMCwwXSxmPTA7ZjxhLmxlbmd0aDtmKyspYigxMCxhLmNoYXJDb2RlQXQoZiktanNwYi51dGlscy5aRVJPX0NIQVJfQ09ERV8pO2QmJihjKCksYigxLDEpKTtyZXR1cm4gZ29vZy5jcnlwdC5ieXRlQXJyYXlUb1N0cmluZyhlKX07anNwYi51dGlscy5zcGxpdERlY2ltYWxTdHJpbmc9ZnVuY3Rpb24oYSl7anNwYi51dGlscy5zcGxpdEhhc2g2NChqc3BiLnV0aWxzLmRlY2ltYWxTdHJpbmdUb0hhc2g2NChhKSl9O1xuanNwYi51dGlscy50b0hleERpZ2l0Xz1mdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgxMD5hP2pzcGIudXRpbHMuWkVST19DSEFSX0NPREVfK2E6anNwYi51dGlscy5BX0NIQVJfQ09ERV8tMTArYSl9O2pzcGIudXRpbHMuZnJvbUhleENoYXJDb2RlXz1mdW5jdGlvbihhKXtyZXR1cm4gYT49anNwYi51dGlscy5BX0NIQVJfQ09ERV8/YS1qc3BiLnV0aWxzLkFfQ0hBUl9DT0RFXysxMDphLWpzcGIudXRpbHMuWkVST19DSEFSX0NPREVffTtqc3BiLnV0aWxzLmhhc2g2NFRvSGV4U3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBiPUFycmF5KDE4KTtiWzBdPVwiMFwiO2JbMV09XCJ4XCI7Zm9yKHZhciBjPTA7OD5jO2MrKyl7dmFyIGQ9YS5jaGFyQ29kZUF0KDctYyk7YlsyKmMrMl09anNwYi51dGlscy50b0hleERpZ2l0XyhkPj40KTtiWzIqYyszXT1qc3BiLnV0aWxzLnRvSGV4RGlnaXRfKGQmMTUpfXJldHVybiBiLmpvaW4oXCJcIil9O1xuanNwYi51dGlscy5oZXhTdHJpbmdUb0hhc2g2ND1mdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTtnb29nLmFzc2VydHMuYXNzZXJ0KDE4PT1hLmxlbmd0aCk7Z29vZy5hc3NlcnRzLmFzc2VydChcIjBcIj09YVswXSk7Z29vZy5hc3NlcnRzLmFzc2VydChcInhcIj09YVsxXSk7Zm9yKHZhciBiPVwiXCIsYz0wOzg+YztjKyspe3ZhciBkPWpzcGIudXRpbHMuZnJvbUhleENoYXJDb2RlXyhhLmNoYXJDb2RlQXQoMipjKzIpKSxlPWpzcGIudXRpbHMuZnJvbUhleENoYXJDb2RlXyhhLmNoYXJDb2RlQXQoMipjKzMpKTtiPVN0cmluZy5mcm9tQ2hhckNvZGUoMTYqZCtlKStifXJldHVybiBifTtcbmpzcGIudXRpbHMuaGFzaDY0VG9OdW1iZXI9ZnVuY3Rpb24oYSxiKXtqc3BiLnV0aWxzLnNwbGl0SGFzaDY0KGEpO2E9anNwYi51dGlscy5zcGxpdDY0TG93O3ZhciBjPWpzcGIudXRpbHMuc3BsaXQ2NEhpZ2g7cmV0dXJuIGI/anNwYi51dGlscy5qb2luSW50NjQoYSxjKTpqc3BiLnV0aWxzLmpvaW5VaW50NjQoYSxjKX07anNwYi51dGlscy5udW1iZXJUb0hhc2g2ND1mdW5jdGlvbihhKXtqc3BiLnV0aWxzLnNwbGl0SW50NjQoYSk7cmV0dXJuIGpzcGIudXRpbHMuam9pbkhhc2g2NChqc3BiLnV0aWxzLnNwbGl0NjRMb3csanNwYi51dGlscy5zcGxpdDY0SGlnaCl9O2pzcGIudXRpbHMuY291bnRWYXJpbnRzPWZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MCxlPWI7ZTxjO2UrKylkKz1hW2VdPj43O3JldHVybiBjLWItZH07XG5qc3BiLnV0aWxzLmNvdW50VmFyaW50RmllbGRzPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPTA7ZD04KmQranNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UO2lmKDEyOD5kKWZvcig7YjxjJiZhW2IrK109PWQ7KWZvcihlKys7Oyl7dmFyIGY9YVtiKytdO2lmKDA9PShmJjEyOCkpYnJlYWt9ZWxzZSBmb3IoO2I8Yzspe2ZvcihmPWQ7MTI4PGY7KXtpZihhW2JdIT0oZiYxMjd8MTI4KSlyZXR1cm4gZTtiKys7Zj4+PTd9aWYoYVtiKytdIT1mKWJyZWFrO2ZvcihlKys7Zj1hW2IrK10sMCE9KGYmMTI4KTspO31yZXR1cm4gZX07anNwYi51dGlscy5jb3VudEZpeGVkRmllbGRzXz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPTA7aWYoMTI4PmQpZm9yKDtiPGMmJmFbYisrXT09ZDspZisrLGIrPWU7ZWxzZSBmb3IoO2I8Yzspe2Zvcih2YXIgZz1kOzEyODxnOyl7aWYoYVtiKytdIT0oZyYxMjd8MTI4KSlyZXR1cm4gZjtnPj49N31pZihhW2IrK10hPWcpYnJlYWs7ZisrO2IrPWV9cmV0dXJuIGZ9O1xuanNwYi51dGlscy5jb3VudEZpeGVkMzJGaWVsZHM9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGpzcGIudXRpbHMuY291bnRGaXhlZEZpZWxkc18oYSxiLGMsOCpkK2pzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVEMzIsNCl9O2pzcGIudXRpbHMuY291bnRGaXhlZDY0RmllbGRzPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBqc3BiLnV0aWxzLmNvdW50Rml4ZWRGaWVsZHNfKGEsYixjLDgqZCtqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0LDgpfTtcbmpzcGIudXRpbHMuY291bnREZWxpbWl0ZWRGaWVsZHM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9MDtmb3IoZD04KmQranNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEO2I8Yzspe2Zvcih2YXIgZj1kOzEyODxmOyl7aWYoYVtiKytdIT0oZiYxMjd8MTI4KSlyZXR1cm4gZTtmPj49N31pZihhW2IrK10hPWYpYnJlYWs7ZSsrO2Zvcih2YXIgZz0wLGg9MTtmPWFbYisrXSxnKz0oZiYxMjcpKmgsaCo9MTI4LDAhPShmJjEyOCk7KTtiKz1nfXJldHVybiBlfTtqc3BiLnV0aWxzLmRlYnVnQnl0ZXNUb1RleHRGb3JtYXQ9ZnVuY3Rpb24oYSl7dmFyIGI9J1wiJztpZihhKXthPWpzcGIudXRpbHMuYnl0ZVNvdXJjZVRvVWludDhBcnJheShhKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliKz1cIlxcXFx4XCIsMTY+YVtjXSYmKGIrPVwiMFwiKSxiKz1hW2NdLnRvU3RyaW5nKDE2KX1yZXR1cm4gYisnXCInfTtcbmpzcGIudXRpbHMuZGVidWdTY2FsYXJUb1RleHRGb3JtYXQ9ZnVuY3Rpb24oYSl7cmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBhP2dvb2cuc3RyaW5nLnF1b3RlKGEpOmEudG9TdHJpbmcoKX07anNwYi51dGlscy5zdHJpbmdUb0J5dGVBcnJheT1mdW5jdGlvbihhKXtmb3IodmFyIGI9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YS5jaGFyQ29kZUF0KGMpO2lmKDI1NTxkKXRocm93IEVycm9yKFwiQ29udmVyc2lvbiBlcnJvcjogc3RyaW5nIGNvbnRhaW5zIGNvZGVwb2ludCBvdXRzaWRlIG9mIGJ5dGUgcmFuZ2VcIik7YltjXT1kfXJldHVybiBifTtcbmpzcGIudXRpbHMuYnl0ZVNvdXJjZVRvVWludDhBcnJheT1mdW5jdGlvbihhKXtpZihhLmNvbnN0cnVjdG9yPT09VWludDhBcnJheSlyZXR1cm4gYTtpZihhLmNvbnN0cnVjdG9yPT09QXJyYXlCdWZmZXJ8fFwidW5kZWZpbmVkXCIhPXR5cGVvZiBCdWZmZXImJmEuY29uc3RydWN0b3I9PT1CdWZmZXJ8fGEuY29uc3RydWN0b3I9PT1BcnJheSlyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYSk7aWYoYS5jb25zdHJ1Y3Rvcj09PVN0cmluZylyZXR1cm4gZ29vZy5jcnlwdC5iYXNlNjQuZGVjb2RlU3RyaW5nVG9VaW50OEFycmF5KGEpO2dvb2cuYXNzZXJ0cy5mYWlsKFwiVHlwZSBub3QgY29udmVydGlibGUgdG8gVWludDhBcnJheS5cIik7cmV0dXJuIG5ldyBVaW50OEFycmF5KDApfTtqc3BiLkJpbmFyeURlY29kZXI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYnl0ZXNfPW51bGw7dGhpcy5jdXJzb3JfPXRoaXMuZW5kXz10aGlzLnN0YXJ0Xz0wO3RoaXMuZXJyb3JfPSExO2EmJnRoaXMuc2V0QmxvY2soYSxiLGMpfTtqc3BiLkJpbmFyeURlY29kZXIuaW5zdGFuY2VDYWNoZV89W107anNwYi5CaW5hcnlEZWNvZGVyLmFsbG9jPWZ1bmN0aW9uKGEsYixjKXtpZihqc3BiLkJpbmFyeURlY29kZXIuaW5zdGFuY2VDYWNoZV8ubGVuZ3RoKXt2YXIgZD1qc3BiLkJpbmFyeURlY29kZXIuaW5zdGFuY2VDYWNoZV8ucG9wKCk7YSYmZC5zZXRCbG9jayhhLGIsYyk7cmV0dXJuIGR9cmV0dXJuIG5ldyBqc3BiLkJpbmFyeURlY29kZXIoYSxiLGMpfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLmZyZWU9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCk7MTAwPmpzcGIuQmluYXJ5RGVjb2Rlci5pbnN0YW5jZUNhY2hlXy5sZW5ndGgmJmpzcGIuQmluYXJ5RGVjb2Rlci5pbnN0YW5jZUNhY2hlXy5wdXNoKHRoaXMpfTtcbmpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4ganNwYi5CaW5hcnlEZWNvZGVyLmFsbG9jKHRoaXMuYnl0ZXNfLHRoaXMuc3RhcnRfLHRoaXMuZW5kXy10aGlzLnN0YXJ0Xyl9O2pzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmJ5dGVzXz1udWxsO3RoaXMuY3Vyc29yXz10aGlzLmVuZF89dGhpcy5zdGFydF89MDt0aGlzLmVycm9yXz0hMX07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ieXRlc199O1xuanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5zZXRCbG9jaz1mdW5jdGlvbihhLGIsYyl7dGhpcy5ieXRlc189anNwYi51dGlscy5ieXRlU291cmNlVG9VaW50OEFycmF5KGEpO3RoaXMuc3RhcnRfPXZvaWQgMCE9PWI/YjowO3RoaXMuZW5kXz12b2lkIDAhPT1jP3RoaXMuc3RhcnRfK2M6dGhpcy5ieXRlc18ubGVuZ3RoO3RoaXMuY3Vyc29yXz10aGlzLnN0YXJ0X307anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5nZXRFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmRffTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihhKXt0aGlzLmVuZF89YX07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuY3Vyc29yXz10aGlzLnN0YXJ0X307anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5nZXRDdXJzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJzb3JffTtcbmpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUuc2V0Q3Vyc29yPWZ1bmN0aW9uKGEpe3RoaXMuY3Vyc29yXz1hfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLmFkdmFuY2U9ZnVuY3Rpb24oYSl7dGhpcy5jdXJzb3JfKz1hO2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfPD10aGlzLmVuZF8pfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLmF0RW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3Vyc29yXz09dGhpcy5lbmRffTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnBhc3RFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJzb3JfPnRoaXMuZW5kX307anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5nZXRFcnJvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yX3x8MD50aGlzLmN1cnNvcl98fHRoaXMuY3Vyc29yXz50aGlzLmVuZF99O1xuanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkU3BsaXRWYXJpbnQ2ND1mdW5jdGlvbihhKXtmb3IodmFyIGI9MTI4LGM9MCxkPTAsZT0wOzQ+ZSYmMTI4PD1iO2UrKyliPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXSxjfD0oYiYxMjcpPDw3KmU7MTI4PD1iJiYoYj10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rK10sY3w9KGImMTI3KTw8MjgsZHw9KGImMTI3KT4+NCk7aWYoMTI4PD1iKWZvcihlPTA7NT5lJiYxMjg8PWI7ZSsrKWI9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKytdLGR8PShiJjEyNyk8PDcqZSszO2lmKDEyOD5iKXJldHVybiBhKGM+Pj4wLGQ+Pj4wKTtnb29nLmFzc2VydHMuZmFpbChcIkZhaWxlZCB0byByZWFkIHZhcmludCwgZW5jb2RpbmcgaXMgaW52YWxpZC5cIik7dGhpcy5lcnJvcl89ITB9O1xuanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkU3BsaXRaaWd6YWdWYXJpbnQ2ND1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZWFkU3BsaXRWYXJpbnQ2NChmdW5jdGlvbihiLGMpe3JldHVybiBqc3BiLnV0aWxzLmZyb21aaWd6YWc2NChiLGMsYSl9KX07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkU3BsaXRGaXhlZDY0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYnl0ZXNfLGM9dGhpcy5jdXJzb3JfO3RoaXMuY3Vyc29yXys9ODtmb3IodmFyIGQ9MCxlPTAsZj1jKzc7Zj49YztmLS0pZD1kPDw4fGJbZl0sZT1lPDw4fGJbZis0XTtyZXR1cm4gYShkLGUpfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnNraXBWYXJpbnQ9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yX10mMTI4Oyl0aGlzLmN1cnNvcl8rKzt0aGlzLmN1cnNvcl8rK307XG5qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnVuc2tpcFZhcmludD1mdW5jdGlvbihhKXtmb3IoOzEyODxhOyl0aGlzLmN1cnNvcl8tLSxhPj4+PTc7dGhpcy5jdXJzb3JfLS19O1xuanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkVW5zaWduZWRWYXJpbnQzMj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfO3ZhciBiPWFbdGhpcy5jdXJzb3JfKzBdO3ZhciBjPWImMTI3O2lmKDEyOD5iKXJldHVybiB0aGlzLmN1cnNvcl8rPTEsZ29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl88PXRoaXMuZW5kXyksYztiPWFbdGhpcy5jdXJzb3JfKzFdO2N8PShiJjEyNyk8PDc7aWYoMTI4PmIpcmV0dXJuIHRoaXMuY3Vyc29yXys9Mixnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXzw9dGhpcy5lbmRfKSxjO2I9YVt0aGlzLmN1cnNvcl8rMl07Y3w9KGImMTI3KTw8MTQ7aWYoMTI4PmIpcmV0dXJuIHRoaXMuY3Vyc29yXys9Myxnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXzw9dGhpcy5lbmRfKSxjO2I9YVt0aGlzLmN1cnNvcl8rM107Y3w9KGImMTI3KTw8MjE7aWYoMTI4PmIpcmV0dXJuIHRoaXMuY3Vyc29yXys9NCxnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXzw9XG50aGlzLmVuZF8pLGM7Yj1hW3RoaXMuY3Vyc29yXys0XTtjfD0oYiYxNSk8PDI4O2lmKDEyOD5iKXJldHVybiB0aGlzLmN1cnNvcl8rPTUsZ29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl88PXRoaXMuZW5kXyksYz4+PjA7dGhpcy5jdXJzb3JfKz01OzEyODw9YVt0aGlzLmN1cnNvcl8rK10mJjEyODw9YVt0aGlzLmN1cnNvcl8rK10mJjEyODw9YVt0aGlzLmN1cnNvcl8rK10mJjEyODw9YVt0aGlzLmN1cnNvcl8rK10mJjEyODw9YVt0aGlzLmN1cnNvcl8rK10mJmdvb2cuYXNzZXJ0cy5hc3NlcnQoITEpO2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfPD10aGlzLmVuZF8pO3JldHVybiBjfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRTaWduZWRWYXJpbnQzMj1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVbnNpZ25lZFZhcmludDMyO2pzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFVuc2lnbmVkVmFyaW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkVW5zaWduZWRWYXJpbnQzMigpLnRvU3RyaW5nKCl9O1xuanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkU2lnbmVkVmFyaW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkU2lnbmVkVmFyaW50MzIoKS50b1N0cmluZygpfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRaaWd6YWdWYXJpbnQzMj1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVuc2lnbmVkVmFyaW50MzIoKTtyZXR1cm4gYT4+PjFeLShhJjEpfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVbnNpZ25lZFZhcmludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFNwbGl0VmFyaW50NjQoanNwYi51dGlscy5qb2luVWludDY0KX07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRTcGxpdFZhcmludDY0KGpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZyl9O1xuanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkU2lnbmVkVmFyaW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkU3BsaXRWYXJpbnQ2NChqc3BiLnV0aWxzLmpvaW5JbnQ2NCl9O2pzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFNpZ25lZFZhcmludDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFNwbGl0VmFyaW50NjQoanNwYi51dGlscy5qb2luU2lnbmVkRGVjaW1hbFN0cmluZyl9O2pzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFppZ3phZ1ZhcmludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFNwbGl0VmFyaW50NjQoanNwYi51dGlscy5qb2luWmlnemFnNjQpfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRaaWd6YWdWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkU3BsaXRaaWd6YWdWYXJpbnQ2NChqc3BiLnV0aWxzLmpvaW5IYXNoNjQpfTtcbmpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFppZ3phZ1ZhcmludDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFNwbGl0WmlnemFnVmFyaW50NjQoanNwYi51dGlscy5qb2luU2lnbmVkRGVjaW1hbFN0cmluZyl9O2pzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFVpbnQ4PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzBdO3RoaXMuY3Vyc29yXys9MTtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXzw9dGhpcy5lbmRfKTtyZXR1cm4gYX07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkVWludDE2PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzBdLGI9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzFdO3RoaXMuY3Vyc29yXys9Mjtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXzw9dGhpcy5lbmRfKTtyZXR1cm4gYTw8MHxiPDw4fTtcbmpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFVpbnQzMj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXSxiPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysxXSxjPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysyXSxkPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyszXTt0aGlzLmN1cnNvcl8rPTQ7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl88PXRoaXMuZW5kXyk7cmV0dXJuKGE8PDB8Yjw8OHxjPDwxNnxkPDwyNCk+Pj4wfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVaW50NjQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxiPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBqc3BiLnV0aWxzLmpvaW5VaW50NjQoYSxiKX07XG5qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxiPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBqc3BiLnV0aWxzLmpvaW5VbnNpZ25lZERlY2ltYWxTdHJpbmcoYSxiKX07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXTt0aGlzLmN1cnNvcl8rPTE7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl88PXRoaXMuZW5kXyk7cmV0dXJuIGE8PDI0Pj4yNH07XG5qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRJbnQxNj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXSxiPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysxXTt0aGlzLmN1cnNvcl8rPTI7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl88PXRoaXMuZW5kXyk7cmV0dXJuKGE8PDB8Yjw8OCk8PDE2Pj4xNn07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkSW50MzI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMF0sYj10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMV0sYz10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMl0sZD10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rM107dGhpcy5jdXJzb3JfKz00O2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfPD10aGlzLmVuZF8pO3JldHVybiBhPDwwfGI8PDh8Yzw8MTZ8ZDw8MjR9O1xuanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkSW50NjQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxiPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBqc3BiLnV0aWxzLmpvaW5JbnQ2NChhLGIpfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRJbnQ2NFN0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVpbnQzMigpLGI9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIGpzcGIudXRpbHMuam9pblNpZ25lZERlY2ltYWxTdHJpbmcoYSxiKX07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkRmxvYXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKTtyZXR1cm4ganNwYi51dGlscy5qb2luRmxvYXQzMihhLDApfTtcbmpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZERvdWJsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVpbnQzMigpLGI9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIGpzcGIudXRpbHMuam9pbkZsb2F0NjQoYSxiKX07anNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkQm9vbD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKytdfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRFbnVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFNpZ25lZFZhcmludDMyKCl9O1xuanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkU3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYnl0ZXNfLGM9dGhpcy5jdXJzb3JfO2E9YythO2Zvcih2YXIgZD1bXSxlPVwiXCI7YzxhOyl7dmFyIGY9YltjKytdO2lmKDEyOD5mKWQucHVzaChmKTtlbHNlIGlmKDE5Mj5mKWNvbnRpbnVlO2Vsc2UgaWYoMjI0PmYpe3ZhciBnPWJbYysrXTtkLnB1c2goKGYmMzEpPDw2fGcmNjMpfWVsc2UgaWYoMjQwPmYpe2c9YltjKytdO3ZhciBoPWJbYysrXTtkLnB1c2goKGYmMTUpPDwxMnwoZyY2Myk8PDZ8aCY2Myl9ZWxzZSBpZigyNDg+Zil7Zz1iW2MrK107aD1iW2MrK107dmFyIGs9YltjKytdO2Y9KGYmNyk8PDE4fChnJjYzKTw8MTJ8KGgmNjMpPDw2fGsmNjM7Zi09NjU1MzY7ZC5wdXNoKChmPj4xMCYxMDIzKSs1NTI5NiwoZiYxMDIzKSs1NjMyMCl9ODE5Mjw9ZC5sZW5ndGgmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZCksZC5sZW5ndGg9MCl9ZSs9Z29vZy5jcnlwdC5ieXRlQXJyYXlUb1N0cmluZyhkKTtcbnRoaXMuY3Vyc29yXz1jO3JldHVybiBlfTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRTdHJpbmdXaXRoTGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO3JldHVybiB0aGlzLnJlYWRTdHJpbmcoYSl9O2pzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZEJ5dGVzPWZ1bmN0aW9uKGEpe2lmKDA+YXx8dGhpcy5jdXJzb3JfK2E+dGhpcy5ieXRlc18ubGVuZ3RoKXJldHVybiB0aGlzLmVycm9yXz0hMCxnb29nLmFzc2VydHMuZmFpbChcIkludmFsaWQgYnl0ZSBsZW5ndGghXCIpLG5ldyBVaW50OEFycmF5KDApO3ZhciBiPXRoaXMuYnl0ZXNfLnN1YmFycmF5KHRoaXMuY3Vyc29yXyx0aGlzLmN1cnNvcl8rYSk7dGhpcy5jdXJzb3JfKz1hO2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfPD10aGlzLmVuZF8pO3JldHVybiBifTtqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkU3BsaXRWYXJpbnQ2NChqc3BiLnV0aWxzLmpvaW5IYXNoNjQpfTtcbmpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc18sYj10aGlzLmN1cnNvcl8sYz1hW2IrMF0sZD1hW2IrMV0sZT1hW2IrMl0sZj1hW2IrM10sZz1hW2IrNF0saD1hW2IrNV0saz1hW2IrNl07YT1hW2IrN107dGhpcy5jdXJzb3JfKz04O3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMsZCxlLGYsZyxoLGssYSl9O2pzcGIuQmluYXJ5UmVhZGVyPWZ1bmN0aW9uKGEsYixjKXt0aGlzLmRlY29kZXJfPWpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYyhhLGIsYyk7dGhpcy5maWVsZEN1cnNvcl89dGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKTt0aGlzLm5leHRGaWVsZF89anNwYi5CaW5hcnlDb25zdGFudHMuSU5WQUxJRF9GSUVMRF9OVU1CRVI7dGhpcy5uZXh0V2lyZVR5cGVfPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLklOVkFMSUQ7dGhpcy5lcnJvcl89ITE7dGhpcy5yZWFkQ2FsbGJhY2tzXz1udWxsfTtqc3BiLkJpbmFyeVJlYWRlci5pbnN0YW5jZUNhY2hlXz1bXTtcbmpzcGIuQmluYXJ5UmVhZGVyLmFsbG9jPWZ1bmN0aW9uKGEsYixjKXtpZihqc3BiLkJpbmFyeVJlYWRlci5pbnN0YW5jZUNhY2hlXy5sZW5ndGgpe3ZhciBkPWpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLnBvcCgpO2EmJmQuZGVjb2Rlcl8uc2V0QmxvY2soYSxiLGMpO3JldHVybiBkfXJldHVybiBuZXcganNwYi5CaW5hcnlSZWFkZXIoYSxiLGMpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuYWxsb2M9anNwYi5CaW5hcnlSZWFkZXIuYWxsb2M7XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuZnJlZT1mdW5jdGlvbigpe3RoaXMuZGVjb2Rlcl8uY2xlYXIoKTt0aGlzLm5leHRGaWVsZF89anNwYi5CaW5hcnlDb25zdGFudHMuSU5WQUxJRF9GSUVMRF9OVU1CRVI7dGhpcy5uZXh0V2lyZVR5cGVfPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLklOVkFMSUQ7dGhpcy5lcnJvcl89ITE7dGhpcy5yZWFkQ2FsbGJhY2tzXz1udWxsOzEwMD5qc3BiLkJpbmFyeVJlYWRlci5pbnN0YW5jZUNhY2hlXy5sZW5ndGgmJmpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLnB1c2godGhpcyl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5nZXRGaWVsZEN1cnNvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpZWxkQ3Vyc29yX307anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLmdldEN1cnNvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLmdldEN1cnNvcigpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5nZXRCdWZmZXIoKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLmdldEZpZWxkTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmV4dEZpZWxkX307anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLmdldFdpcmVUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmV4dFdpcmVUeXBlX307anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLmlzRGVsaW1pdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuaXNFbmRHcm91cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5leHRXaXJlVHlwZV89PWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkVORF9HUk9VUH07XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuZ2V0RXJyb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvcl98fHRoaXMuZGVjb2Rlcl8uZ2V0RXJyb3IoKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnNldEJsb2NrPWZ1bmN0aW9uKGEsYixjKXt0aGlzLmRlY29kZXJfLnNldEJsb2NrKGEsYixjKTt0aGlzLm5leHRGaWVsZF89anNwYi5CaW5hcnlDb25zdGFudHMuSU5WQUxJRF9GSUVMRF9OVU1CRVI7dGhpcy5uZXh0V2lyZVR5cGVfPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLklOVkFMSUR9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuZGVjb2Rlcl8ucmVzZXQoKTt0aGlzLm5leHRGaWVsZF89anNwYi5CaW5hcnlDb25zdGFudHMuSU5WQUxJRF9GSUVMRF9OVU1CRVI7dGhpcy5uZXh0V2lyZVR5cGVfPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLklOVkFMSUR9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLmFkdmFuY2U9ZnVuY3Rpb24oYSl7dGhpcy5kZWNvZGVyXy5hZHZhbmNlKGEpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5uZXh0RmllbGQ9ZnVuY3Rpb24oKXtpZih0aGlzLmRlY29kZXJfLmF0RW5kKCkpcmV0dXJuITE7aWYodGhpcy5nZXRFcnJvcigpKXJldHVybiBnb29nLmFzc2VydHMuZmFpbChcIkRlY29kZXIgaGl0IGFuIGVycm9yXCIpLCExO3RoaXMuZmllbGRDdXJzb3JfPXRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCk7dmFyIGE9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpLGI9YT4+PjM7YSY9NztpZihhIT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQmJmEhPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVEMzImJmEhPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQmJmEhPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCYmYSE9anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuU1RBUlRfR1JPVVAmJmEhPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkVORF9HUk9VUClyZXR1cm4gZ29vZy5hc3NlcnRzLmZhaWwoXCJJbnZhbGlkIHdpcmUgdHlwZTogJXMgKGF0IHBvc2l0aW9uICVzKVwiLFxuYSx0aGlzLmZpZWxkQ3Vyc29yXyksdGhpcy5lcnJvcl89ITAsITE7dGhpcy5uZXh0RmllbGRfPWI7dGhpcy5uZXh0V2lyZVR5cGVfPWE7cmV0dXJuITB9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS51bnNraXBIZWFkZXI9ZnVuY3Rpb24oKXt0aGlzLmRlY29kZXJfLnVuc2tpcFZhcmludCh0aGlzLm5leHRGaWVsZF88PDN8dGhpcy5uZXh0V2lyZVR5cGVfKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnNraXBNYXRjaGluZ0ZpZWxkcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMubmV4dEZpZWxkXztmb3IodGhpcy51bnNraXBIZWFkZXIoKTt0aGlzLm5leHRGaWVsZCgpJiZ0aGlzLmdldEZpZWxkTnVtYmVyKCk9PWE7KXRoaXMuc2tpcEZpZWxkKCk7dGhpcy5kZWNvZGVyXy5hdEVuZCgpfHx0aGlzLnVuc2tpcEhlYWRlcigpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5za2lwVmFyaW50RmllbGQ9ZnVuY3Rpb24oKXt0aGlzLm5leHRXaXJlVHlwZV8hPWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVD8oZ29vZy5hc3NlcnRzLmZhaWwoXCJJbnZhbGlkIHdpcmUgdHlwZSBmb3Igc2tpcFZhcmludEZpZWxkXCIpLHRoaXMuc2tpcEZpZWxkKCkpOnRoaXMuZGVjb2Rlcl8uc2tpcFZhcmludCgpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuc2tpcERlbGltaXRlZEZpZWxkPWZ1bmN0aW9uKCl7aWYodGhpcy5uZXh0V2lyZVR5cGVfIT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQpZ29vZy5hc3NlcnRzLmZhaWwoXCJJbnZhbGlkIHdpcmUgdHlwZSBmb3Igc2tpcERlbGltaXRlZEZpZWxkXCIpLHRoaXMuc2tpcEZpZWxkKCk7ZWxzZXt2YXIgYT10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7dGhpcy5kZWNvZGVyXy5hZHZhbmNlKGEpfX07XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuc2tpcEZpeGVkMzJGaWVsZD1mdW5jdGlvbigpe3RoaXMubmV4dFdpcmVUeXBlXyE9anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQzMj8oZ29vZy5hc3NlcnRzLmZhaWwoXCJJbnZhbGlkIHdpcmUgdHlwZSBmb3Igc2tpcEZpeGVkMzJGaWVsZFwiKSx0aGlzLnNraXBGaWVsZCgpKTp0aGlzLmRlY29kZXJfLmFkdmFuY2UoNCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5za2lwRml4ZWQ2NEZpZWxkPWZ1bmN0aW9uKCl7dGhpcy5uZXh0V2lyZVR5cGVfIT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0Pyhnb29nLmFzc2VydHMuZmFpbChcIkludmFsaWQgd2lyZSB0eXBlIGZvciBza2lwRml4ZWQ2NEZpZWxkXCIpLHRoaXMuc2tpcEZpZWxkKCkpOnRoaXMuZGVjb2Rlcl8uYWR2YW5jZSg4KX07XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuc2tpcEdyb3VwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZXh0RmllbGRfO2Rve2lmKCF0aGlzLm5leHRGaWVsZCgpKXtnb29nLmFzc2VydHMuZmFpbChcIlVubWF0Y2hlZCBzdGFydC1ncm91cCB0YWc6IHN0cmVhbSBFT0ZcIik7dGhpcy5lcnJvcl89ITA7YnJlYWt9aWYodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5FTkRfR1JPVVApe3RoaXMubmV4dEZpZWxkXyE9YSYmKGdvb2cuYXNzZXJ0cy5mYWlsKFwiVW5tYXRjaGVkIGVuZC1ncm91cCB0YWdcIiksdGhpcy5lcnJvcl89ITApO2JyZWFrfXRoaXMuc2tpcEZpZWxkKCl9d2hpbGUoMSl9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnNraXBGaWVsZD1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLm5leHRXaXJlVHlwZV8pe2Nhc2UganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UOnRoaXMuc2tpcFZhcmludEZpZWxkKCk7YnJlYWs7Y2FzZSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0OnRoaXMuc2tpcEZpeGVkNjRGaWVsZCgpO2JyZWFrO2Nhc2UganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEOnRoaXMuc2tpcERlbGltaXRlZEZpZWxkKCk7YnJlYWs7Y2FzZSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyOnRoaXMuc2tpcEZpeGVkMzJGaWVsZCgpO2JyZWFrO2Nhc2UganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuU1RBUlRfR1JPVVA6dGhpcy5za2lwR3JvdXAoKTticmVhaztkZWZhdWx0Omdvb2cuYXNzZXJ0cy5mYWlsKFwiSW52YWxpZCB3aXJlIGVuY29kaW5nIGZvciBmaWVsZC5cIil9fTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWdpc3RlclJlYWRDYWxsYmFjaz1mdW5jdGlvbihhLGIpe251bGw9PT10aGlzLnJlYWRDYWxsYmFja3NfJiYodGhpcy5yZWFkQ2FsbGJhY2tzXz17fSk7Z29vZy5hc3NlcnRzLmFzc2VydCghdGhpcy5yZWFkQ2FsbGJhY2tzX1thXSk7dGhpcy5yZWFkQ2FsbGJhY2tzX1thXT1ifTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucnVuUmVhZENhbGxiYWNrPWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9PXRoaXMucmVhZENhbGxiYWNrc18pO2E9dGhpcy5yZWFkQ2FsbGJhY2tzX1thXTtnb29nLmFzc2VydHMuYXNzZXJ0KGEpO3JldHVybiBhKHRoaXMpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkQW55PWZ1bmN0aW9uKGEpe3RoaXMubmV4dFdpcmVUeXBlXz1qc3BiLkJpbmFyeUNvbnN0YW50cy5GaWVsZFR5cGVUb1dpcmVUeXBlKGEpO3ZhciBiPWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZpZWxkVHlwZTtzd2l0Y2goYSl7Y2FzZSBiLkRPVUJMRTpyZXR1cm4gdGhpcy5yZWFkRG91YmxlKCk7Y2FzZSBiLkZMT0FUOnJldHVybiB0aGlzLnJlYWRGbG9hdCgpO2Nhc2UgYi5JTlQ2NDpyZXR1cm4gdGhpcy5yZWFkSW50NjQoKTtjYXNlIGIuVUlOVDY0OnJldHVybiB0aGlzLnJlYWRVaW50NjQoKTtjYXNlIGIuSU5UMzI6cmV0dXJuIHRoaXMucmVhZEludDMyKCk7Y2FzZSBiLkZJWEVENjQ6cmV0dXJuIHRoaXMucmVhZEZpeGVkNjQoKTtjYXNlIGIuRklYRUQzMjpyZXR1cm4gdGhpcy5yZWFkRml4ZWQzMigpO2Nhc2UgYi5CT09MOnJldHVybiB0aGlzLnJlYWRCb29sKCk7Y2FzZSBiLlNUUklORzpyZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7XG5jYXNlIGIuR1JPVVA6Z29vZy5hc3NlcnRzLmZhaWwoXCJHcm91cCBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcmVhZEFueSgpXCIpO2Nhc2UgYi5NRVNTQUdFOmdvb2cuYXNzZXJ0cy5mYWlsKFwiTWVzc2FnZSBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcmVhZEFueSgpXCIpO2Nhc2UgYi5CWVRFUzpyZXR1cm4gdGhpcy5yZWFkQnl0ZXMoKTtjYXNlIGIuVUlOVDMyOnJldHVybiB0aGlzLnJlYWRVaW50MzIoKTtjYXNlIGIuRU5VTTpyZXR1cm4gdGhpcy5yZWFkRW51bSgpO2Nhc2UgYi5TRklYRUQzMjpyZXR1cm4gdGhpcy5yZWFkU2ZpeGVkMzIoKTtjYXNlIGIuU0ZJWEVENjQ6cmV0dXJuIHRoaXMucmVhZFNmaXhlZDY0KCk7Y2FzZSBiLlNJTlQzMjpyZXR1cm4gdGhpcy5yZWFkU2ludDMyKCk7Y2FzZSBiLlNJTlQ2NDpyZXR1cm4gdGhpcy5yZWFkU2ludDY0KCk7Y2FzZSBiLkZIQVNINjQ6cmV0dXJuIHRoaXMucmVhZEZpeGVkSGFzaDY0KCk7Y2FzZSBiLlZIQVNINjQ6cmV0dXJuIHRoaXMucmVhZFZhcmludEhhc2g2NCgpO1xuZGVmYXVsdDpnb29nLmFzc2VydHMuZmFpbChcIkludmFsaWQgZmllbGQgdHlwZSBpbiByZWFkQW55KClcIil9cmV0dXJuIDB9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkTWVzc2FnZT1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQpO3ZhciBjPXRoaXMuZGVjb2Rlcl8uZ2V0RW5kKCksZD10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7ZD10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpK2Q7dGhpcy5kZWNvZGVyXy5zZXRFbmQoZCk7YihhLHRoaXMpO3RoaXMuZGVjb2Rlcl8uc2V0Q3Vyc29yKGQpO3RoaXMuZGVjb2Rlcl8uc2V0RW5kKGMpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkR3JvdXA9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5TVEFSVF9HUk9VUCk7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRGaWVsZF89PWEpO2MoYix0aGlzKTt0aGlzLmVycm9yX3x8dGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5FTkRfR1JPVVB8fChnb29nLmFzc2VydHMuZmFpbChcIkdyb3VwIHN1Ym1lc3NhZ2UgZGlkIG5vdCBlbmQgd2l0aCBhbiBFTkRfR1JPVVAgdGFnXCIpLHRoaXMuZXJyb3JfPSEwKX07XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuZ2V0RmllbGREZWNvZGVyPWZ1bmN0aW9uKCl7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRXaXJlVHlwZV89PWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCk7dmFyIGE9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpLGI9dGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKSxjPWIrYTthPWpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYyh0aGlzLmRlY29kZXJfLmdldEJ1ZmZlcigpLGIsYSk7dGhpcy5kZWNvZGVyXy5zZXRDdXJzb3IoYyk7cmV0dXJuIGF9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkSW50MzI9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50MzIoKX07XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEludDMyU3RyaW5nPWZ1bmN0aW9uKCl7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRXaXJlVHlwZV89PWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyU3RyaW5nKCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkSW50NjQ9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50NjQoKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRJbnQ2NFN0cmluZz1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NFN0cmluZygpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkVWludDMyPWZ1bmN0aW9uKCl7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRXaXJlVHlwZV89PWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRVaW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMlN0cmluZygpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFVpbnQ2ND1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDY0KCl9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRVaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZygpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFNpbnQzMj1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQzMigpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFNpbnQ2ND1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQ2NCgpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkU2ludDY0U3RyaW5nPWZ1bmN0aW9uKCl7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRXaXJlVHlwZV89PWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDY0U3RyaW5nKCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkRml4ZWQzMj1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVWludDMyKCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkRml4ZWQ2ND1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0KTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVWludDY0KCl9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRGaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKCl7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRXaXJlVHlwZV89PWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRVaW50NjRTdHJpbmcoKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTZml4ZWQzMj1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkSW50MzIoKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTZml4ZWQzMlN0cmluZz1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkSW50MzIoKS50b1N0cmluZygpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkU2ZpeGVkNjQ9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEludDY0KCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkU2ZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEludDY0U3RyaW5nKCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkRmxvYXQ9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQzMik7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEZsb2F0KCl9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWREb3VibGU9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZERvdWJsZSgpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEJvb2w9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTtyZXR1cm4hIXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRFbnVtPWZ1bmN0aW9uKCl7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRXaXJlVHlwZV89PWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDY0KCl9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTdHJpbmc9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTt2YXIgYT10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFN0cmluZyhhKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRCeXRlcz1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQpO3ZhciBhPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkQnl0ZXMoYSl9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVmFyaW50SGFzaDY0KCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkU2ludEhhc2g2ND1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnRIYXNoNjQoKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTcGxpdFZhcmludDY0PWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTcGxpdFZhcmludDY0KGEpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkU3BsaXRaaWd6YWdWYXJpbnQ2ND1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkU3BsaXRWYXJpbnQ2NChmdW5jdGlvbihiLGMpe3JldHVybiBqc3BiLnV0aWxzLmZyb21aaWd6YWc2NChiLGMsYSl9KX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRGaXhlZEhhc2g2ND1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5uZXh0V2lyZVR5cGVfPT1qc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0KTtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkRml4ZWRIYXNoNjQoKX07XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFNwbGl0Rml4ZWQ2ND1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMubmV4dFdpcmVUeXBlXz09anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NCk7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNwbGl0Rml4ZWQ2NChhKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRGaWVsZF89ZnVuY3Rpb24oYSl7Z29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRXaXJlVHlwZV89PWpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCk7dmFyIGI9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO2I9dGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKStiO2Zvcih2YXIgYz1bXTt0aGlzLmRlY29kZXJfLmdldEN1cnNvcigpPGI7KWMucHVzaChhLmNhbGwodGhpcy5kZWNvZGVyXykpO3JldHVybiBjfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkSW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRJbnQzMlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50MzJTdHJpbmcpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZEludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkSW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDY0U3RyaW5nKX07XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZFVpbnQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMil9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkVWludDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyU3RyaW5nKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRVaW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50NjQpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZFVpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZyl9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRTaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDMyKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRTaW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDY0KX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRTaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDY0U3RyaW5nKX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRGaXhlZDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVaW50MzIpfTtcbmpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkRml4ZWQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVWludDY0KX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRGaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVaW50NjRTdHJpbmcpfTtqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZFNmaXhlZDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRJbnQzMil9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkU2ZpeGVkNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEludDY0KX07XG5qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZFNmaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRJbnQ2NFN0cmluZyl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkRmxvYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEZsb2F0KX07anNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWREb3VibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZERvdWJsZSl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkQm9vbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkQm9vbCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkRW51bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkRW51bSl9O1xuanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFZhcmludEhhc2g2NCl9O2pzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkRml4ZWRIYXNoNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEZpeGVkSGFzaDY0KX07anNwYi5NYXA9ZnVuY3Rpb24oYSxiKXt0aGlzLmFycl89YTt0aGlzLnZhbHVlQ3Rvcl89Yjt0aGlzLm1hcF89e307dGhpcy5hcnJDbGVhbj0hMDswPHRoaXMuYXJyXy5sZW5ndGgmJnRoaXMubG9hZEZyb21BcnJheV8oKX07anNwYi5NYXAucHJvdG90eXBlLmxvYWRGcm9tQXJyYXlfPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLmFycl8ubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5hcnJfW2FdLGM9YlswXTt0aGlzLm1hcF9bYy50b1N0cmluZygpXT1uZXcganNwYi5NYXAuRW50cnlfKGMsYlsxXSl9dGhpcy5hcnJDbGVhbj0hMH07XG5qc3BiLk1hcC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2lmKHRoaXMuYXJyQ2xlYW4pe2lmKHRoaXMudmFsdWVDdG9yXyl7dmFyIGE9dGhpcy5tYXBfLGI7Zm9yKGIgaW4gYSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKSl7dmFyIGM9YVtiXS52YWx1ZVdyYXBwZXI7YyYmYy50b0FycmF5KCl9fX1lbHNle3RoaXMuYXJyXy5sZW5ndGg9MDthPXRoaXMuc3RyaW5nS2V5c18oKTthLnNvcnQoKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD10aGlzLm1hcF9bYVtiXV07KGM9ZC52YWx1ZVdyYXBwZXIpJiZjLnRvQXJyYXkoKTt0aGlzLmFycl8ucHVzaChbZC5rZXksZC52YWx1ZV0pfXRoaXMuYXJyQ2xlYW49ITB9cmV0dXJuIHRoaXMuYXJyX307XG5qc3BiLk1hcC5wcm90b3R5cGUudG9PYmplY3Q9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy50b0FycmF5KCksZD1bXSxlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPXRoaXMubWFwX1tjW2VdWzBdLnRvU3RyaW5nKCldO3RoaXMud3JhcEVudHJ5XyhmKTt2YXIgZz1mLnZhbHVlV3JhcHBlcjtnPyhnb29nLmFzc2VydHMuYXNzZXJ0KGIpLGQucHVzaChbZi5rZXksYihhLGcpXSkpOmQucHVzaChbZi5rZXksZi52YWx1ZV0pfXJldHVybiBkfTtqc3BiLk1hcC5mcm9tT2JqZWN0PWZ1bmN0aW9uKGEsYixjKXtiPW5ldyBqc3BiLk1hcChbXSxiKTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXVswXSxmPWMoYVtkXVsxXSk7Yi5zZXQoZSxmKX1yZXR1cm4gYn07anNwYi5NYXAuQXJyYXlJdGVyYXRvckl0ZXJhYmxlXz1mdW5jdGlvbihhKXt0aGlzLmlkeF89MDt0aGlzLmFycl89YX07XG5qc3BiLk1hcC5BcnJheUl0ZXJhdG9ySXRlcmFibGVfLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR4Xzx0aGlzLmFycl8ubGVuZ3RoP3tkb25lOiExLHZhbHVlOnRoaXMuYXJyX1t0aGlzLmlkeF8rK119Ontkb25lOiEwLHZhbHVlOnZvaWQgMH19O1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJihqc3BiLk1hcC5BcnJheUl0ZXJhdG9ySXRlcmFibGVfLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTtqc3BiLk1hcC5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyaW5nS2V5c18oKS5sZW5ndGh9O2pzcGIuTWFwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwXz17fTt0aGlzLmFyckNsZWFuPSExfTtcbmpzcGIuTWFwLnByb3RvdHlwZS5kZWw9ZnVuY3Rpb24oYSl7YT1hLnRvU3RyaW5nKCk7dmFyIGI9dGhpcy5tYXBfLmhhc093blByb3BlcnR5KGEpO2RlbGV0ZSB0aGlzLm1hcF9bYV07dGhpcy5hcnJDbGVhbj0hMTtyZXR1cm4gYn07anNwYi5NYXAucHJvdG90eXBlLmdldEVudHJ5TGlzdD1mdW5jdGlvbigpe3ZhciBhPVtdLGI9dGhpcy5zdHJpbmdLZXlzXygpO2Iuc29ydCgpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLm1hcF9bYltjXV07YS5wdXNoKFtkLmtleSxkLnZhbHVlXSl9cmV0dXJuIGF9O2pzcGIuTWFwLnByb3RvdHlwZS5lbnRyaWVzPWZ1bmN0aW9uKCl7dmFyIGE9W10sYj10aGlzLnN0cmluZ0tleXNfKCk7Yi5zb3J0KCk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMubWFwX1tiW2NdXTthLnB1c2goW2Qua2V5LHRoaXMud3JhcEVudHJ5XyhkKV0pfXJldHVybiBuZXcganNwYi5NYXAuQXJyYXlJdGVyYXRvckl0ZXJhYmxlXyhhKX07XG5qc3BiLk1hcC5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBhPVtdLGI9dGhpcy5zdHJpbmdLZXlzXygpO2Iuc29ydCgpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaCh0aGlzLm1hcF9bYltjXV0ua2V5KTtyZXR1cm4gbmV3IGpzcGIuTWFwLkFycmF5SXRlcmF0b3JJdGVyYWJsZV8oYSl9O2pzcGIuTWFwLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgYT1bXSxiPXRoaXMuc3RyaW5nS2V5c18oKTtiLnNvcnQoKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2godGhpcy53cmFwRW50cnlfKHRoaXMubWFwX1tiW2NdXSkpO3JldHVybiBuZXcganNwYi5NYXAuQXJyYXlJdGVyYXRvckl0ZXJhYmxlXyhhKX07XG5qc3BiLk1hcC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc3RyaW5nS2V5c18oKTtjLnNvcnQoKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5tYXBfW2NbZF1dO2EuY2FsbChiLHRoaXMud3JhcEVudHJ5XyhlKSxlLmtleSx0aGlzKX19O2pzcGIuTWFwLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcganNwYi5NYXAuRW50cnlfKGEpO3RoaXMudmFsdWVDdG9yXz8oYy52YWx1ZVdyYXBwZXI9YixjLnZhbHVlPWIudG9BcnJheSgpKTpjLnZhbHVlPWI7dGhpcy5tYXBfW2EudG9TdHJpbmcoKV09Yzt0aGlzLmFyckNsZWFuPSExO3JldHVybiB0aGlzfTtqc3BiLk1hcC5wcm90b3R5cGUud3JhcEVudHJ5Xz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy52YWx1ZUN0b3JfPyhhLnZhbHVlV3JhcHBlcnx8KGEudmFsdWVXcmFwcGVyPW5ldyB0aGlzLnZhbHVlQ3Rvcl8oYS52YWx1ZSkpLGEudmFsdWVXcmFwcGVyKTphLnZhbHVlfTtcbmpzcGIuTWFwLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7aWYoYT10aGlzLm1hcF9bYS50b1N0cmluZygpXSlyZXR1cm4gdGhpcy53cmFwRW50cnlfKGEpfTtqc3BiLk1hcC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKClpbiB0aGlzLm1hcF99O2pzcGIuTWFwLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj10aGlzLnN0cmluZ0tleXNfKCk7Zi5zb3J0KCk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspe3ZhciBoPXRoaXMubWFwX1tmW2ddXTtiLmJlZ2luU3ViTWVzc2FnZShhKTtjLmNhbGwoYiwxLGgua2V5KTt0aGlzLnZhbHVlQ3Rvcl8/ZC5jYWxsKGIsMix0aGlzLndyYXBFbnRyeV8oaCksZSk6ZC5jYWxsKGIsMixoLnZhbHVlKTtiLmVuZFN1Yk1lc3NhZ2UoKX19O1xuanNwYi5NYXAuZGVzZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7Zm9yKDtiLm5leHRGaWVsZCgpJiYhYi5pc0VuZEdyb3VwKCk7KXt2YXIgaD1iLmdldEZpZWxkTnVtYmVyKCk7MT09aD9mPWMuY2FsbChiKToyPT1oJiYoYS52YWx1ZUN0b3JfPyhnb29nLmFzc2VydHMuYXNzZXJ0KGUpLGd8fChnPW5ldyBhLnZhbHVlQ3Rvcl8pLGQuY2FsbChiLGcsZSkpOmc9ZC5jYWxsKGIpKX1nb29nLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9Zik7Z29vZy5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPWcpO2Euc2V0KGYsZyl9O2pzcGIuTWFwLnByb3RvdHlwZS5zdHJpbmdLZXlzXz1mdW5jdGlvbigpe3ZhciBhPXRoaXMubWFwXyxiPVtdLGM7Zm9yKGMgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmYi5wdXNoKGMpO3JldHVybiBifTtcbmpzcGIuTWFwLkVudHJ5Xz1mdW5jdGlvbihhLGIpe3RoaXMua2V5PWE7dGhpcy52YWx1ZT1iO3RoaXMudmFsdWVXcmFwcGVyPXZvaWQgMH07anNwYi5FeHRlbnNpb25GaWVsZEluZm89ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aGlzLmZpZWxkSW5kZXg9YTt0aGlzLmZpZWxkTmFtZT1iO3RoaXMuY3Rvcj1jO3RoaXMudG9PYmplY3RGbj1kO3RoaXMuaXNSZXBlYXRlZD1lfTtqc3BiLkV4dGVuc2lvbkZpZWxkQmluYXJ5SW5mbz1mdW5jdGlvbihhLGIsYyxkLGUsZil7dGhpcy5maWVsZEluZm89YTt0aGlzLmJpbmFyeVJlYWRlckZuPWI7dGhpcy5iaW5hcnlXcml0ZXJGbj1jO3RoaXMuYmluYXJ5TWVzc2FnZVNlcmlhbGl6ZUZuPWQ7dGhpcy5iaW5hcnlNZXNzYWdlRGVzZXJpYWxpemVGbj1lO3RoaXMuaXNQYWNrZWQ9Zn07anNwYi5FeHRlbnNpb25GaWVsZEluZm8ucHJvdG90eXBlLmlzTWVzc2FnZVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuY3Rvcn07anNwYi5NZXNzYWdlPWZ1bmN0aW9uKCl7fTtqc3BiLk1lc3NhZ2UuR0VORVJBVEVfVE9fT0JKRUNUPSEwO2pzcGIuTWVzc2FnZS5HRU5FUkFURV9GUk9NX09CSkVDVD0hZ29vZy5ESVNBTExPV19URVNUX09OTFlfQ09ERTtcbmpzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19TVFJJTkc9ITA7anNwYi5NZXNzYWdlLkFTU1VNRV9MT0NBTF9BUlJBWVM9ITE7anNwYi5NZXNzYWdlLlNFUklBTElaRV9FTVBUWV9UUkFJTElOR19GSUVMRFM9ITA7anNwYi5NZXNzYWdlLlNVUFBPUlRTX1VJTlQ4QVJSQVlfPVwiZnVuY3Rpb25cIj09dHlwZW9mIFVpbnQ4QXJyYXk7anNwYi5NZXNzYWdlLnByb3RvdHlwZS5nZXRKc1BiTWVzc2FnZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZUlkX307anNwYi5NZXNzYWdlLmdldEluZGV4Xz1mdW5jdGlvbihhLGIpe3JldHVybiBiK2EuYXJyYXlJbmRleE9mZnNldF99O2pzcGIuTWVzc2FnZS5oaWRkZW5FUzZQcm9wZXJ0eV89ZnVuY3Rpb24oKXt9O2pzcGIuTWVzc2FnZS5nZXRGaWVsZE51bWJlcl89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi1hLmFycmF5SW5kZXhPZmZzZXRffTtcbmpzcGIuTWVzc2FnZS5pbml0aWFsaXplPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXthLndyYXBwZXJzXz1udWxsO2J8fChiPWM/W2NdOltdKTthLm1lc3NhZ2VJZF89Yz9TdHJpbmcoYyk6dm9pZCAwO2EuYXJyYXlJbmRleE9mZnNldF89MD09PWM/LTE6MDthLmFycmF5PWI7anNwYi5NZXNzYWdlLmluaXRQaXZvdEFuZEV4dGVuc2lvbk9iamVjdF8oYSxkKTthLmNvbnZlcnRlZFByaW1pdGl2ZUZpZWxkc189e307anNwYi5NZXNzYWdlLlNFUklBTElaRV9FTVBUWV9UUkFJTElOR19GSUVMRFN8fChhLnJlcGVhdGVkRmllbGRzPWUpO2lmKGUpZm9yKGI9MDtiPGUubGVuZ3RoO2IrKyljPWVbYl0sYzxhLnBpdm90Xz8oYz1qc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKGEsYyksYS5hcnJheVtjXT1hLmFycmF5W2NdfHxqc3BiLk1lc3NhZ2UuRU1QVFlfTElTVF9TRU5USU5FTF8pOihqc3BiLk1lc3NhZ2UubWF5YmVJbml0RW1wdHlFeHRlbnNpb25PYmplY3RfKGEpLGEuZXh0ZW5zaW9uT2JqZWN0X1tjXT1cbmEuZXh0ZW5zaW9uT2JqZWN0X1tjXXx8anNwYi5NZXNzYWdlLkVNUFRZX0xJU1RfU0VOVElORUxfKTtpZihmJiZmLmxlbmd0aClmb3IoYj0wO2I8Zi5sZW5ndGg7YisrKWpzcGIuTWVzc2FnZS5jb21wdXRlT25lb2ZDYXNlKGEsZltiXSl9O2pzcGIuTWVzc2FnZS5FTVBUWV9MSVNUX1NFTlRJTkVMXz1nb29nLkRFQlVHJiZPYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoW10pOltdO2pzcGIuTWVzc2FnZS5pc0FycmF5Xz1mdW5jdGlvbihhKXtyZXR1cm4ganNwYi5NZXNzYWdlLkFTU1VNRV9MT0NBTF9BUlJBWVM/YSBpbnN0YW5jZW9mIEFycmF5OkFycmF5LmlzQXJyYXkoYSl9O2pzcGIuTWVzc2FnZS5pc0V4dGVuc2lvbk9iamVjdF89ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hJiZcIm9iamVjdFwiPT10eXBlb2YgYSYmIWpzcGIuTWVzc2FnZS5pc0FycmF5XyhhKSYmIShqc3BiLk1lc3NhZ2UuU1VQUE9SVFNfVUlOVDhBUlJBWV8mJmEgaW5zdGFuY2VvZiBVaW50OEFycmF5KX07XG5qc3BiLk1lc3NhZ2UuaW5pdFBpdm90QW5kRXh0ZW5zaW9uT2JqZWN0Xz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYXJyYXkubGVuZ3RoLGQ9LTE7aWYoYyYmKGQ9Yy0xLGM9YS5hcnJheVtkXSxqc3BiLk1lc3NhZ2UuaXNFeHRlbnNpb25PYmplY3RfKGMpKSl7YS5waXZvdF89anNwYi5NZXNzYWdlLmdldEZpZWxkTnVtYmVyXyhhLGQpO2EuZXh0ZW5zaW9uT2JqZWN0Xz1jO3JldHVybn0tMTxiPyhhLnBpdm90Xz1NYXRoLm1heChiLGpzcGIuTWVzc2FnZS5nZXRGaWVsZE51bWJlcl8oYSxkKzEpKSxhLmV4dGVuc2lvbk9iamVjdF89bnVsbCk6YS5waXZvdF89TnVtYmVyLk1BWF9WQUxVRX07anNwYi5NZXNzYWdlLm1heWJlSW5pdEVtcHR5RXh0ZW5zaW9uT2JqZWN0Xz1mdW5jdGlvbihhKXt2YXIgYj1qc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKGEsYS5waXZvdF8pO2EuYXJyYXlbYl18fChhLmV4dGVuc2lvbk9iamVjdF89YS5hcnJheVtiXT17fSl9O1xuanNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdD1mdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGEubGVuZ3RoO2UrKylkW2VdPWIuY2FsbChhW2VdLGMsYVtlXSk7cmV0dXJuIGR9O2pzcGIuTWVzc2FnZS50b09iamVjdEV4dGVuc2lvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2Zvcih2YXIgZiBpbiBjKXt2YXIgZz1jW2ZdLGg9ZC5jYWxsKGEsZyk7aWYobnVsbCE9aCl7Zm9yKHZhciBrIGluIGcuZmllbGROYW1lKWlmKGcuZmllbGROYW1lLmhhc093blByb3BlcnR5KGspKWJyZWFrO2Jba109Zy50b09iamVjdEZuP2cuaXNSZXBlYXRlZD9qc3BiLk1lc3NhZ2UudG9PYmplY3RMaXN0KGgsZy50b09iamVjdEZuLGUpOmcudG9PYmplY3RGbihlLGgpOmh9fX07XG5qc3BiLk1lc3NhZ2Uuc2VyaWFsaXplQmluYXJ5RXh0ZW5zaW9ucz1mdW5jdGlvbihhLGIsYyxkKXtmb3IodmFyIGUgaW4gYyl7dmFyIGY9Y1tlXSxnPWYuZmllbGRJbmZvO2lmKCFmLmJpbmFyeVdyaXRlckZuKXRocm93IEVycm9yKFwiTWVzc2FnZSBleHRlbnNpb24gcHJlc2VudCB0aGF0IHdhcyBnZW5lcmF0ZWQgd2l0aG91dCBiaW5hcnkgc2VyaWFsaXphdGlvbiBzdXBwb3J0XCIpO3ZhciBoPWQuY2FsbChhLGcpO2lmKG51bGwhPWgpaWYoZy5pc01lc3NhZ2VUeXBlKCkpaWYoZi5iaW5hcnlNZXNzYWdlU2VyaWFsaXplRm4pZi5iaW5hcnlXcml0ZXJGbi5jYWxsKGIsZy5maWVsZEluZGV4LGgsZi5iaW5hcnlNZXNzYWdlU2VyaWFsaXplRm4pO2Vsc2UgdGhyb3cgRXJyb3IoXCJNZXNzYWdlIGV4dGVuc2lvbiBwcmVzZW50IGhvbGRpbmcgc3VibWVzc2FnZSB3aXRob3V0IGJpbmFyeSBzdXBwb3J0IGVuYWJsZWQsIGFuZCBtZXNzYWdlIGlzIGJlaW5nIHNlcmlhbGl6ZWQgdG8gYmluYXJ5IGZvcm1hdFwiKTtcbmVsc2UgZi5iaW5hcnlXcml0ZXJGbi5jYWxsKGIsZy5maWVsZEluZGV4LGgpfX07anNwYi5NZXNzYWdlLnJlYWRCaW5hcnlFeHRlbnNpb249ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1jW2IuZ2V0RmllbGROdW1iZXIoKV07aWYoZil7Yz1mLmZpZWxkSW5mbztpZighZi5iaW5hcnlSZWFkZXJGbil0aHJvdyBFcnJvcihcIkRlc2VyaWFsaXppbmcgZXh0ZW5zaW9uIHdob3NlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHN1cHBvcnQgYmluYXJ5IGZvcm1hdFwiKTtpZihjLmlzTWVzc2FnZVR5cGUoKSl7dmFyIGc9bmV3IGMuY3RvcjtmLmJpbmFyeVJlYWRlckZuLmNhbGwoYixnLGYuYmluYXJ5TWVzc2FnZURlc2VyaWFsaXplRm4pfWVsc2UgZz1mLmJpbmFyeVJlYWRlckZuLmNhbGwoYik7Yy5pc1JlcGVhdGVkJiYhZi5pc1BhY2tlZD8oYj1kLmNhbGwoYSxjKSk/Yi5wdXNoKGcpOmUuY2FsbChhLGMsW2ddKTplLmNhbGwoYSxjLGcpfWVsc2UgYi5za2lwRmllbGQoKX07XG5qc3BiLk1lc3NhZ2UuZ2V0RmllbGQ9ZnVuY3Rpb24oYSxiKXtpZihiPGEucGl2b3RfKXtiPWpzcGIuTWVzc2FnZS5nZXRJbmRleF8oYSxiKTt2YXIgYz1hLmFycmF5W2JdO3JldHVybiBjPT09anNwYi5NZXNzYWdlLkVNUFRZX0xJU1RfU0VOVElORUxfP2EuYXJyYXlbYl09W106Y31pZihhLmV4dGVuc2lvbk9iamVjdF8pcmV0dXJuIGM9YS5leHRlbnNpb25PYmplY3RfW2JdLGM9PT1qc3BiLk1lc3NhZ2UuRU1QVFlfTElTVF9TRU5USU5FTF8/YS5leHRlbnNpb25PYmplY3RfW2JdPVtdOmN9O2pzcGIuTWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGpzcGIuTWVzc2FnZS5nZXRGaWVsZChhLGIpfTtqc3BiLk1lc3NhZ2UuZ2V0T3B0aW9uYWxGbG9hdGluZ1BvaW50RmllbGQ9ZnVuY3Rpb24oYSxiKXthPWpzcGIuTWVzc2FnZS5nZXRGaWVsZChhLGIpO3JldHVybiBudWxsPT1hP2E6K2F9O1xuanNwYi5NZXNzYWdlLmdldEJvb2xlYW5GaWVsZD1mdW5jdGlvbihhLGIpe2E9anNwYi5NZXNzYWdlLmdldEZpZWxkKGEsYik7cmV0dXJuIG51bGw9PWE/YTohIWF9O2pzcGIuTWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0aW5nUG9pbnRGaWVsZD1mdW5jdGlvbihhLGIpe3ZhciBjPWpzcGIuTWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGEsYik7YS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNffHwoYS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNfPXt9KTtpZighYS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNfW2JdKXtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyljW2RdPStjW2RdO2EuY29udmVydGVkUHJpbWl0aXZlRmllbGRzX1tiXT0hMH1yZXR1cm4gY307XG5qc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sZWFuRmllbGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1qc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChhLGIpO2EuY29udmVydGVkUHJpbWl0aXZlRmllbGRzX3x8KGEuY29udmVydGVkUHJpbWl0aXZlRmllbGRzXz17fSk7aWYoIWEuY29udmVydGVkUHJpbWl0aXZlRmllbGRzX1tiXSl7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXT0hIWNbZF07YS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNfW2JdPSEwfXJldHVybiBjfTtcbmpzcGIuTWVzc2FnZS5ieXRlc0FzQjY0PWZ1bmN0aW9uKGEpe2lmKG51bGw9PWF8fFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtpZihqc3BiLk1lc3NhZ2UuU1VQUE9SVFNfVUlOVDhBUlJBWV8mJmEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBnb29nLmNyeXB0LmJhc2U2NC5lbmNvZGVCeXRlQXJyYXkoYSk7Z29vZy5hc3NlcnRzLmZhaWwoXCJDYW5ub3QgY29lcmNlIHRvIGI2NCBzdHJpbmc6IFwiK2dvb2cudHlwZU9mKGEpKTtyZXR1cm4gbnVsbH07anNwYi5NZXNzYWdlLmJ5dGVzQXNVOD1mdW5jdGlvbihhKXtpZihudWxsPT1hfHxhIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gYTtpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGdvb2cuY3J5cHQuYmFzZTY0LmRlY29kZVN0cmluZ1RvVWludDhBcnJheShhKTtnb29nLmFzc2VydHMuZmFpbChcIkNhbm5vdCBjb2VyY2UgdG8gVWludDhBcnJheTogXCIrZ29vZy50eXBlT2YoYSkpO3JldHVybiBudWxsfTtcbmpzcGIuTWVzc2FnZS5ieXRlc0xpc3RBc0I2ND1mdW5jdGlvbihhKXtqc3BiLk1lc3NhZ2UuYXNzZXJ0Q29uc2lzdGVudFR5cGVzXyhhKTtyZXR1cm4gYS5sZW5ndGgmJlwic3RyaW5nXCIhPT10eXBlb2YgYVswXT9nb29nLmFycmF5Lm1hcChhLGpzcGIuTWVzc2FnZS5ieXRlc0FzQjY0KTphfTtqc3BiLk1lc3NhZ2UuYnl0ZXNMaXN0QXNVOD1mdW5jdGlvbihhKXtqc3BiLk1lc3NhZ2UuYXNzZXJ0Q29uc2lzdGVudFR5cGVzXyhhKTtyZXR1cm4hYS5sZW5ndGh8fGFbMF1pbnN0YW5jZW9mIFVpbnQ4QXJyYXk/YTpnb29nLmFycmF5Lm1hcChhLGpzcGIuTWVzc2FnZS5ieXRlc0FzVTgpfTtcbmpzcGIuTWVzc2FnZS5hc3NlcnRDb25zaXN0ZW50VHlwZXNfPWZ1bmN0aW9uKGEpe2lmKGdvb2cuREVCVUcmJmEmJjE8YS5sZW5ndGgpe3ZhciBiPWdvb2cudHlwZU9mKGFbMF0pO2dvb2cuYXJyYXkuZm9yRWFjaChhLGZ1bmN0aW9uKGEpe2dvb2cudHlwZU9mKGEpIT1iJiZnb29nLmFzc2VydHMuZmFpbChcIkluY29uc2lzdGVudCB0eXBlIGluIEpTUEIgcmVwZWF0ZWQgZmllbGQgYXJyYXkuIEdvdCBcIitnb29nLnR5cGVPZihhKStcIiBleHBlY3RlZCBcIitiKX0pfX07anNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQ9ZnVuY3Rpb24oYSxiLGMpe2E9anNwYi5NZXNzYWdlLmdldEZpZWxkKGEsYik7cmV0dXJuIG51bGw9PWE/YzphfTtqc3BiLk1lc3NhZ2UuZ2V0Qm9vbGVhbkZpZWxkV2l0aERlZmF1bHQ9ZnVuY3Rpb24oYSxiLGMpe2E9anNwYi5NZXNzYWdlLmdldEJvb2xlYW5GaWVsZChhLGIpO3JldHVybiBudWxsPT1hP2M6YX07XG5qc3BiLk1lc3NhZ2UuZ2V0RmxvYXRpbmdQb2ludEZpZWxkV2l0aERlZmF1bHQ9ZnVuY3Rpb24oYSxiLGMpe2E9anNwYi5NZXNzYWdlLmdldE9wdGlvbmFsRmxvYXRpbmdQb2ludEZpZWxkKGEsYik7cmV0dXJuIG51bGw9PWE/YzphfTtqc3BiLk1lc3NhZ2UuZ2V0RmllbGRQcm90bzM9anNwYi5NZXNzYWdlLmdldEZpZWxkV2l0aERlZmF1bHQ7anNwYi5NZXNzYWdlLmdldE1hcEZpZWxkPWZ1bmN0aW9uKGEsYixjLGQpe2Eud3JhcHBlcnNffHwoYS53cmFwcGVyc189e30pO2lmKGIgaW4gYS53cmFwcGVyc18pcmV0dXJuIGEud3JhcHBlcnNfW2JdO3ZhciBlPWpzcGIuTWVzc2FnZS5nZXRGaWVsZChhLGIpO2lmKCFlKXtpZihjKXJldHVybjtlPVtdO2pzcGIuTWVzc2FnZS5zZXRGaWVsZChhLGIsZSl9cmV0dXJuIGEud3JhcHBlcnNfW2JdPW5ldyBqc3BiLk1hcChlLGQpfTtcbmpzcGIuTWVzc2FnZS5zZXRGaWVsZD1mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydEluc3RhbmNlb2YoYSxqc3BiLk1lc3NhZ2UpO2I8YS5waXZvdF8/YS5hcnJheVtqc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKGEsYildPWM6KGpzcGIuTWVzc2FnZS5tYXliZUluaXRFbXB0eUV4dGVuc2lvbk9iamVjdF8oYSksYS5leHRlbnNpb25PYmplY3RfW2JdPWMpO3JldHVybiBhfTtqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zSW50RmllbGQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqc3BiLk1lc3NhZ2Uuc2V0RmllbGRJZ25vcmluZ0RlZmF1bHRfKGEsYixjLDApfTtqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zRmxvYXRGaWVsZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZElnbm9yaW5nRGVmYXVsdF8oYSxiLGMsMCl9O1xuanNwYi5NZXNzYWdlLnNldFByb3RvM0Jvb2xlYW5GaWVsZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZElnbm9yaW5nRGVmYXVsdF8oYSxiLGMsITEpfTtqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zU3RyaW5nRmllbGQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqc3BiLk1lc3NhZ2Uuc2V0RmllbGRJZ25vcmluZ0RlZmF1bHRfKGEsYixjLFwiXCIpfTtqc3BiLk1lc3NhZ2Uuc2V0UHJvdG8zQnl0ZXNGaWVsZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZElnbm9yaW5nRGVmYXVsdF8oYSxiLGMsXCJcIil9O2pzcGIuTWVzc2FnZS5zZXRQcm90bzNFbnVtRmllbGQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqc3BiLk1lc3NhZ2Uuc2V0RmllbGRJZ25vcmluZ0RlZmF1bHRfKGEsYixjLDApfTtcbmpzcGIuTWVzc2FnZS5zZXRQcm90bzNTdHJpbmdJbnRGaWVsZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZElnbm9yaW5nRGVmYXVsdF8oYSxiLGMsXCIwXCIpfTtqc3BiLk1lc3NhZ2Uuc2V0RmllbGRJZ25vcmluZ0RlZmF1bHRfPWZ1bmN0aW9uKGEsYixjLGQpe2dvb2cuYXNzZXJ0cy5hc3NlcnRJbnN0YW5jZW9mKGEsanNwYi5NZXNzYWdlKTtjIT09ZD9qc3BiLk1lc3NhZ2Uuc2V0RmllbGQoYSxiLGMpOmI8YS5waXZvdF8/YS5hcnJheVtqc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKGEsYildPW51bGw6KGpzcGIuTWVzc2FnZS5tYXliZUluaXRFbXB0eUV4dGVuc2lvbk9iamVjdF8oYSksZGVsZXRlIGEuZXh0ZW5zaW9uT2JqZWN0X1tiXSk7cmV0dXJuIGF9O1xuanNwYi5NZXNzYWdlLmFkZFRvUmVwZWF0ZWRGaWVsZD1mdW5jdGlvbihhLGIsYyxkKXtnb29nLmFzc2VydHMuYXNzZXJ0SW5zdGFuY2VvZihhLGpzcGIuTWVzc2FnZSk7Yj1qc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChhLGIpO3ZvaWQgMCE9ZD9iLnNwbGljZShkLDAsYyk6Yi5wdXNoKGMpO3JldHVybiBhfTtqc3BiLk1lc3NhZ2Uuc2V0T25lb2ZGaWVsZD1mdW5jdGlvbihhLGIsYyxkKXtnb29nLmFzc2VydHMuYXNzZXJ0SW5zdGFuY2VvZihhLGpzcGIuTWVzc2FnZSk7KGM9anNwYi5NZXNzYWdlLmNvbXB1dGVPbmVvZkNhc2UoYSxjKSkmJmMhPT1iJiZ2b2lkIDAhPT1kJiYoYS53cmFwcGVyc18mJmMgaW4gYS53cmFwcGVyc18mJihhLndyYXBwZXJzX1tjXT12b2lkIDApLGpzcGIuTWVzc2FnZS5zZXRGaWVsZChhLGMsdm9pZCAwKSk7cmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZChhLGIsZCl9O1xuanNwYi5NZXNzYWdlLmNvbXB1dGVPbmVvZkNhc2U9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZCxlPTA7ZTxiLmxlbmd0aDtlKyspe3ZhciBmPWJbZV0sZz1qc3BiLk1lc3NhZ2UuZ2V0RmllbGQoYSxmKTtudWxsIT1nJiYoYz1mLGQ9Zyxqc3BiLk1lc3NhZ2Uuc2V0RmllbGQoYSxmLHZvaWQgMCkpfXJldHVybiBjPyhqc3BiLk1lc3NhZ2Uuc2V0RmllbGQoYSxjLGQpLGMpOjB9O2pzcGIuTWVzc2FnZS5nZXRXcmFwcGVyRmllbGQ9ZnVuY3Rpb24oYSxiLGMsZCl7YS53cmFwcGVyc198fChhLndyYXBwZXJzXz17fSk7aWYoIWEud3JhcHBlcnNfW2NdKXt2YXIgZT1qc3BiLk1lc3NhZ2UuZ2V0RmllbGQoYSxjKTtpZihkfHxlKWEud3JhcHBlcnNfW2NdPW5ldyBiKGUpfXJldHVybiBhLndyYXBwZXJzX1tjXX07XG5qc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRXcmFwcGVyRmllbGQ9ZnVuY3Rpb24oYSxiLGMpe2pzcGIuTWVzc2FnZS53cmFwUmVwZWF0ZWRGaWVsZF8oYSxiLGMpO2I9YS53cmFwcGVyc19bY107Yj09anNwYi5NZXNzYWdlLkVNUFRZX0xJU1RfU0VOVElORUxfJiYoYj1hLndyYXBwZXJzX1tjXT1bXSk7cmV0dXJuIGJ9O2pzcGIuTWVzc2FnZS53cmFwUmVwZWF0ZWRGaWVsZF89ZnVuY3Rpb24oYSxiLGMpe2Eud3JhcHBlcnNffHwoYS53cmFwcGVyc189e30pO2lmKCFhLndyYXBwZXJzX1tjXSl7Zm9yKHZhciBkPWpzcGIuTWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGEsYyksZT1bXSxmPTA7ZjxkLmxlbmd0aDtmKyspZVtmXT1uZXcgYihkW2ZdKTthLndyYXBwZXJzX1tjXT1lfX07XG5qc3BiLk1lc3NhZ2Uuc2V0V3JhcHBlckZpZWxkPWZ1bmN0aW9uKGEsYixjKXtnb29nLmFzc2VydHMuYXNzZXJ0SW5zdGFuY2VvZihhLGpzcGIuTWVzc2FnZSk7YS53cmFwcGVyc198fChhLndyYXBwZXJzXz17fSk7dmFyIGQ9Yz9jLnRvQXJyYXkoKTpjO2Eud3JhcHBlcnNfW2JdPWM7cmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZChhLGIsZCl9O2pzcGIuTWVzc2FnZS5zZXRPbmVvZldyYXBwZXJGaWVsZD1mdW5jdGlvbihhLGIsYyxkKXtnb29nLmFzc2VydHMuYXNzZXJ0SW5zdGFuY2VvZihhLGpzcGIuTWVzc2FnZSk7YS53cmFwcGVyc198fChhLndyYXBwZXJzXz17fSk7dmFyIGU9ZD9kLnRvQXJyYXkoKTpkO2Eud3JhcHBlcnNfW2JdPWQ7cmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRPbmVvZkZpZWxkKGEsYixjLGUpfTtcbmpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZD1mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydEluc3RhbmNlb2YoYSxqc3BiLk1lc3NhZ2UpO2Eud3JhcHBlcnNffHwoYS53cmFwcGVyc189e30pO2M9Y3x8W107Zm9yKHZhciBkPVtdLGU9MDtlPGMubGVuZ3RoO2UrKylkW2VdPWNbZV0udG9BcnJheSgpO2Eud3JhcHBlcnNfW2JdPWM7cmV0dXJuIGpzcGIuTWVzc2FnZS5zZXRGaWVsZChhLGIsZCl9O1xuanNwYi5NZXNzYWdlLmFkZFRvUmVwZWF0ZWRXcmFwcGVyRmllbGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXtqc3BiLk1lc3NhZ2Uud3JhcFJlcGVhdGVkRmllbGRfKGEsZCxiKTt2YXIgZj1hLndyYXBwZXJzX1tiXTtmfHwoZj1hLndyYXBwZXJzX1tiXT1bXSk7Yz1jP2M6bmV3IGQ7YT1qc3BiLk1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChhLGIpO3ZvaWQgMCE9ZT8oZi5zcGxpY2UoZSwwLGMpLGEuc3BsaWNlKGUsMCxjLnRvQXJyYXkoKSkpOihmLnB1c2goYyksYS5wdXNoKGMudG9BcnJheSgpKSk7cmV0dXJuIGN9O2pzcGIuTWVzc2FnZS50b01hcD1mdW5jdGlvbihhLGIsYyxkKXtmb3IodmFyIGU9e30sZj0wO2Y8YS5sZW5ndGg7ZisrKWVbYi5jYWxsKGFbZl0pXT1jP2MuY2FsbChhW2ZdLGQsYVtmXSk6YVtmXTtyZXR1cm4gZX07XG5qc3BiLk1lc3NhZ2UucHJvdG90eXBlLnN5bmNNYXBGaWVsZHNfPWZ1bmN0aW9uKCl7aWYodGhpcy53cmFwcGVyc18pZm9yKHZhciBhIGluIHRoaXMud3JhcHBlcnNfKXt2YXIgYj10aGlzLndyYXBwZXJzX1thXTtpZihBcnJheS5pc0FycmF5KGIpKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10udG9BcnJheSgpO2Vsc2UgYiYmYi50b0FycmF5KCl9fTtqc3BiLk1lc3NhZ2UucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXt0aGlzLnN5bmNNYXBGaWVsZHNfKCk7cmV0dXJuIHRoaXMuYXJyYXl9O2pzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19TVFJJTkcmJihqc3BiLk1lc3NhZ2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dGhpcy5zeW5jTWFwRmllbGRzXygpO3JldHVybiB0aGlzLmFycmF5LnRvU3RyaW5nKCl9KTtcbmpzcGIuTWVzc2FnZS5wcm90b3R5cGUuZ2V0RXh0ZW5zaW9uPWZ1bmN0aW9uKGEpe2lmKHRoaXMuZXh0ZW5zaW9uT2JqZWN0Xyl7dGhpcy53cmFwcGVyc198fCh0aGlzLndyYXBwZXJzXz17fSk7dmFyIGI9YS5maWVsZEluZGV4O2lmKGEuaXNSZXBlYXRlZCl7aWYoYS5pc01lc3NhZ2VUeXBlKCkpcmV0dXJuIHRoaXMud3JhcHBlcnNfW2JdfHwodGhpcy53cmFwcGVyc19bYl09Z29vZy5hcnJheS5tYXAodGhpcy5leHRlbnNpb25PYmplY3RfW2JdfHxbXSxmdW5jdGlvbihiKXtyZXR1cm4gbmV3IGEuY3RvcihiKX0pKSx0aGlzLndyYXBwZXJzX1tiXX1lbHNlIGlmKGEuaXNNZXNzYWdlVHlwZSgpKXJldHVybiF0aGlzLndyYXBwZXJzX1tiXSYmdGhpcy5leHRlbnNpb25PYmplY3RfW2JdJiYodGhpcy53cmFwcGVyc19bYl09bmV3IGEuY3Rvcih0aGlzLmV4dGVuc2lvbk9iamVjdF9bYl0pKSx0aGlzLndyYXBwZXJzX1tiXTtyZXR1cm4gdGhpcy5leHRlbnNpb25PYmplY3RfW2JdfX07XG5qc3BiLk1lc3NhZ2UucHJvdG90eXBlLnNldEV4dGVuc2lvbj1mdW5jdGlvbihhLGIpe3RoaXMud3JhcHBlcnNffHwodGhpcy53cmFwcGVyc189e30pO2pzcGIuTWVzc2FnZS5tYXliZUluaXRFbXB0eUV4dGVuc2lvbk9iamVjdF8odGhpcyk7dmFyIGM9YS5maWVsZEluZGV4O2EuaXNSZXBlYXRlZD8oYj1ifHxbXSxhLmlzTWVzc2FnZVR5cGUoKT8odGhpcy53cmFwcGVyc19bY109Yix0aGlzLmV4dGVuc2lvbk9iamVjdF9bY109Z29vZy5hcnJheS5tYXAoYixmdW5jdGlvbihhKXtyZXR1cm4gYS50b0FycmF5KCl9KSk6dGhpcy5leHRlbnNpb25PYmplY3RfW2NdPWIpOmEuaXNNZXNzYWdlVHlwZSgpPyh0aGlzLndyYXBwZXJzX1tjXT1iLHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tjXT1iP2IudG9BcnJheSgpOmIpOnRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tjXT1iO3JldHVybiB0aGlzfTtcbmpzcGIuTWVzc2FnZS5kaWZmZXJlbmNlPWZ1bmN0aW9uKGEsYil7aWYoIShhIGluc3RhbmNlb2YgYi5jb25zdHJ1Y3RvcikpdGhyb3cgRXJyb3IoXCJNZXNzYWdlcyBoYXZlIGRpZmZlcmVudCB0eXBlcy5cIik7dmFyIGM9YS50b0FycmF5KCk7Yj1iLnRvQXJyYXkoKTt2YXIgZD1bXSxlPTAsZj1jLmxlbmd0aD5iLmxlbmd0aD9jLmxlbmd0aDpiLmxlbmd0aDthLmdldEpzUGJNZXNzYWdlSWQoKSYmKGRbMF09YS5nZXRKc1BiTWVzc2FnZUlkKCksZT0xKTtmb3IoO2U8ZjtlKyspanNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHMoY1tlXSxiW2VdKXx8KGRbZV09YltlXSk7cmV0dXJuIG5ldyBhLmNvbnN0cnVjdG9yKGQpfTtqc3BiLk1lc3NhZ2UuZXF1YWxzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PWJ8fCEoIWF8fCFiKSYmYSBpbnN0YW5jZW9mIGIuY29uc3RydWN0b3ImJmpzcGIuTWVzc2FnZS5jb21wYXJlRmllbGRzKGEudG9BcnJheSgpLGIudG9BcnJheSgpKX07XG5qc3BiLk1lc3NhZ2UuY29tcGFyZUV4dGVuc2lvbnM9ZnVuY3Rpb24oYSxiKXthPWF8fHt9O2I9Ynx8e307dmFyIGM9e30sZDtmb3IoZCBpbiBhKWNbZF09MDtmb3IoZCBpbiBiKWNbZF09MDtmb3IoZCBpbiBjKWlmKCFqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcyhhW2RdLGJbZF0pKXJldHVybiExO3JldHVybiEwfTtcbmpzcGIuTWVzc2FnZS5jb21wYXJlRmllbGRzPWZ1bmN0aW9uKGEsYil7aWYoYT09YilyZXR1cm4hMDtpZighZ29vZy5pc09iamVjdChhKXx8IWdvb2cuaXNPYmplY3QoYikpcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhJiZpc05hTihhKXx8XCJudW1iZXJcIj09PXR5cGVvZiBiJiZpc05hTihiKT9TdHJpbmcoYSk9PVN0cmluZyhiKTohMTtpZihhLmNvbnN0cnVjdG9yIT1iLmNvbnN0cnVjdG9yKXJldHVybiExO2lmKGpzcGIuTWVzc2FnZS5TVVBQT1JUU19VSU5UOEFSUkFZXyYmYS5jb25zdHJ1Y3Rvcj09PVVpbnQ4QXJyYXkpe2lmKGEubGVuZ3RoIT1iLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdIT1iW2NdKXJldHVybiExO3JldHVybiEwfWlmKGEuY29uc3RydWN0b3I9PT1BcnJheSl7dmFyIGQ9dm9pZCAwLGU9dm9pZCAwLGY9TWF0aC5tYXgoYS5sZW5ndGgsYi5sZW5ndGgpO2ZvcihjPTA7YzxmO2MrKyl7dmFyIGc9YVtjXSxoPWJbY107ZyYmXG5nLmNvbnN0cnVjdG9yPT1PYmplY3QmJihnb29nLmFzc2VydHMuYXNzZXJ0KHZvaWQgMD09PWQpLGdvb2cuYXNzZXJ0cy5hc3NlcnQoYz09PWEubGVuZ3RoLTEpLGQ9ZyxnPXZvaWQgMCk7aCYmaC5jb25zdHJ1Y3Rvcj09T2JqZWN0JiYoZ29vZy5hc3NlcnRzLmFzc2VydCh2b2lkIDA9PT1lKSxnb29nLmFzc2VydHMuYXNzZXJ0KGM9PT1iLmxlbmd0aC0xKSxlPWgsaD12b2lkIDApO2lmKCFqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcyhnLGgpKXJldHVybiExfXJldHVybiBkfHxlPyhkPWR8fHt9LGU9ZXx8e30sanNwYi5NZXNzYWdlLmNvbXBhcmVFeHRlbnNpb25zKGQsZSkpOiEwfWlmKGEuY29uc3RydWN0b3I9PT1PYmplY3QpcmV0dXJuIGpzcGIuTWVzc2FnZS5jb21wYXJlRXh0ZW5zaW9ucyhhLGIpO3Rocm93IEVycm9yKFwiSW52YWxpZCB0eXBlIGluIEpTUEIgYXJyYXlcIik7fTtqc3BiLk1lc3NhZ2UucHJvdG90eXBlLmNsb25lTWVzc2FnZT1mdW5jdGlvbigpe3JldHVybiBqc3BiLk1lc3NhZ2UuY2xvbmVNZXNzYWdlKHRoaXMpfTtcbmpzcGIuTWVzc2FnZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4ganNwYi5NZXNzYWdlLmNsb25lTWVzc2FnZSh0aGlzKX07anNwYi5NZXNzYWdlLmNsb25lPWZ1bmN0aW9uKGEpe3JldHVybiBqc3BiLk1lc3NhZ2UuY2xvbmVNZXNzYWdlKGEpfTtqc3BiLk1lc3NhZ2UuY2xvbmVNZXNzYWdlPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgYS5jb25zdHJ1Y3Rvcihqc3BiLk1lc3NhZ2UuY2xvbmVfKGEudG9BcnJheSgpKSl9O1xuanNwYi5NZXNzYWdlLmNvcHlJbnRvPWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydEluc3RhbmNlb2YoYSxqc3BiLk1lc3NhZ2UpO2dvb2cuYXNzZXJ0cy5hc3NlcnRJbnN0YW5jZW9mKGIsanNwYi5NZXNzYWdlKTtnb29nLmFzc2VydHMuYXNzZXJ0KGEuY29uc3RydWN0b3I9PWIuY29uc3RydWN0b3IsXCJDb3B5IHNvdXJjZSBhbmQgdGFyZ2V0IG1lc3NhZ2Ugc2hvdWxkIGhhdmUgdGhlIHNhbWUgdHlwZS5cIik7YT1qc3BiLk1lc3NhZ2UuY2xvbmUoYSk7Zm9yKHZhciBjPWIudG9BcnJheSgpLGQ9YS50b0FycmF5KCksZT1jLmxlbmd0aD0wO2U8ZC5sZW5ndGg7ZSsrKWNbZV09ZFtlXTtiLndyYXBwZXJzXz1hLndyYXBwZXJzXztiLmV4dGVuc2lvbk9iamVjdF89YS5leHRlbnNpb25PYmplY3RffTtcbmpzcGIuTWVzc2FnZS5jbG9uZV89ZnVuY3Rpb24oYSl7aWYoQXJyYXkuaXNBcnJheShhKSl7Zm9yKHZhciBiPUFycmF5KGEubGVuZ3RoKSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107bnVsbCE9ZCYmKGJbY109XCJvYmplY3RcIj09dHlwZW9mIGQ/anNwYi5NZXNzYWdlLmNsb25lXyhnb29nLmFzc2VydHMuYXNzZXJ0KGQpKTpkKX1yZXR1cm4gYn1pZihqc3BiLk1lc3NhZ2UuU1VQUE9SVFNfVUlOVDhBUlJBWV8mJmEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBuZXcgVWludDhBcnJheShhKTtiPXt9O2ZvcihjIGluIGEpZD1hW2NdLG51bGwhPWQmJihiW2NdPVwib2JqZWN0XCI9PXR5cGVvZiBkP2pzcGIuTWVzc2FnZS5jbG9uZV8oZ29vZy5hc3NlcnRzLmFzc2VydChkKSk6ZCk7cmV0dXJuIGJ9O2pzcGIuTWVzc2FnZS5yZWdpc3Rlck1lc3NhZ2VUeXBlPWZ1bmN0aW9uKGEsYil7Yi5tZXNzYWdlSWQ9YX07anNwYi5NZXNzYWdlLm1lc3NhZ2VTZXRFeHRlbnNpb25zPXt9O1xuanNwYi5NZXNzYWdlLm1lc3NhZ2VTZXRFeHRlbnNpb25zQmluYXJ5PXt9O2pzcGIuYXJpdGg9e307anNwYi5hcml0aC5VSW50NjQ9ZnVuY3Rpb24oYSxiKXt0aGlzLmxvPWE7dGhpcy5oaT1ifTtqc3BiLmFyaXRoLlVJbnQ2NC5wcm90b3R5cGUuY21wPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhpPGEuaGl8fHRoaXMuaGk9PWEuaGkmJnRoaXMubG88YS5sbz8tMTp0aGlzLmhpPT1hLmhpJiZ0aGlzLmxvPT1hLmxvPzA6MX07anNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGpzcGIuYXJpdGguVUludDY0KCh0aGlzLmxvPj4+MXwodGhpcy5oaSYxKTw8MzEpPj4+MCx0aGlzLmhpPj4+MT4+PjApfTtqc3BiLmFyaXRoLlVJbnQ2NC5wcm90b3R5cGUubGVmdFNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBqc3BiLmFyaXRoLlVJbnQ2NCh0aGlzLmxvPDwxPj4+MCwodGhpcy5oaTw8MXx0aGlzLmxvPj4+MzEpPj4+MCl9O1xuanNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLm1zYj1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuaGkmMjE0NzQ4MzY0OCl9O2pzcGIuYXJpdGguVUludDY0LnByb3RvdHlwZS5sc2I9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLmxvJjEpfTtqc3BiLmFyaXRoLlVJbnQ2NC5wcm90b3R5cGUuemVybz1mdW5jdGlvbigpe3JldHVybiAwPT10aGlzLmxvJiYwPT10aGlzLmhpfTtqc3BiLmFyaXRoLlVJbnQ2NC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcganNwYi5hcml0aC5VSW50NjQoKHRoaXMubG8rYS5sbyY0Mjk0OTY3Mjk1KT4+PjA+Pj4wLCgodGhpcy5oaSthLmhpJjQyOTQ5NjcyOTUpPj4+MCkrKDQyOTQ5NjcyOTY8PXRoaXMubG8rYS5sbz8xOjApPj4+MCl9O1xuanNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGpzcGIuYXJpdGguVUludDY0KCh0aGlzLmxvLWEubG8mNDI5NDk2NzI5NSk+Pj4wPj4+MCwoKHRoaXMuaGktYS5oaSY0Mjk0OTY3Mjk1KT4+PjApLSgwPnRoaXMubG8tYS5sbz8xOjApPj4+MCl9O2pzcGIuYXJpdGguVUludDY0Lm11bDMyeDMyPWZ1bmN0aW9uKGEsYil7dmFyIGM9YSY2NTUzNTthPj4+PTE2O3ZhciBkPWImNjU1MzUsZT1iPj4+MTY7Yj1jKmQrNjU1MzYqKGMqZSY2NTUzNSkrNjU1MzYqKGEqZCY2NTUzNSk7Zm9yKGM9YSplKyhjKmU+Pj4xNikrKGEqZD4+PjE2KTs0Mjk0OTY3Mjk2PD1iOyliLT00Mjk0OTY3Mjk2LGMrPTE7cmV0dXJuIG5ldyBqc3BiLmFyaXRoLlVJbnQ2NChiPj4+MCxjPj4+MCl9O1xuanNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLm11bD1mdW5jdGlvbihhKXt2YXIgYj1qc3BiLmFyaXRoLlVJbnQ2NC5tdWwzMngzMih0aGlzLmxvLGEpO2E9anNwYi5hcml0aC5VSW50NjQubXVsMzJ4MzIodGhpcy5oaSxhKTthLmhpPWEubG87YS5sbz0wO3JldHVybiBiLmFkZChhKX07XG5qc3BiLmFyaXRoLlVJbnQ2NC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uKGEpe2lmKDA9PWEpcmV0dXJuW107dmFyIGI9bmV3IGpzcGIuYXJpdGguVUludDY0KDAsMCksYz1uZXcganNwYi5hcml0aC5VSW50NjQodGhpcy5sbyx0aGlzLmhpKTthPW5ldyBqc3BiLmFyaXRoLlVJbnQ2NChhLDApO2Zvcih2YXIgZD1uZXcganNwYi5hcml0aC5VSW50NjQoMSwwKTshYS5tc2IoKTspYT1hLmxlZnRTaGlmdCgpLGQ9ZC5sZWZ0U2hpZnQoKTtmb3IoOyFkLnplcm8oKTspMD49YS5jbXAoYykmJihiPWIuYWRkKGQpLGM9Yy5zdWIoYSkpLGE9YS5yaWdodFNoaWZ0KCksZD1kLnJpZ2h0U2hpZnQoKTtyZXR1cm5bYixjXX07anNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPVwiXCIsYj10aGlzOyFiLnplcm8oKTspe2I9Yi5kaXYoMTApO3ZhciBjPWJbMF07YT1iWzFdLmxvK2E7Yj1jfVwiXCI9PWEmJihhPVwiMFwiKTtyZXR1cm4gYX07XG5qc3BiLmFyaXRoLlVJbnQ2NC5mcm9tU3RyaW5nPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1uZXcganNwYi5hcml0aC5VSW50NjQoMCwwKSxjPW5ldyBqc3BiLmFyaXRoLlVJbnQ2NCgwLDApLGQ9MDtkPGEubGVuZ3RoO2QrKyl7aWYoXCIwXCI+YVtkXXx8XCI5XCI8YVtkXSlyZXR1cm4gbnVsbDt2YXIgZT1wYXJzZUludChhW2RdLDEwKTtjLmxvPWU7Yj1iLm11bCgxMCkuYWRkKGMpfXJldHVybiBifTtqc3BiLmFyaXRoLlVJbnQ2NC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGpzcGIuYXJpdGguVUludDY0KHRoaXMubG8sdGhpcy5oaSl9O2pzcGIuYXJpdGguSW50NjQ9ZnVuY3Rpb24oYSxiKXt0aGlzLmxvPWE7dGhpcy5oaT1ifTtcbmpzcGIuYXJpdGguSW50NjQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGpzcGIuYXJpdGguSW50NjQoKHRoaXMubG8rYS5sbyY0Mjk0OTY3Mjk1KT4+PjA+Pj4wLCgodGhpcy5oaSthLmhpJjQyOTQ5NjcyOTUpPj4+MCkrKDQyOTQ5NjcyOTY8PXRoaXMubG8rYS5sbz8xOjApPj4+MCl9O2pzcGIuYXJpdGguSW50NjQucHJvdG90eXBlLnN1Yj1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGpzcGIuYXJpdGguSW50NjQoKHRoaXMubG8tYS5sbyY0Mjk0OTY3Mjk1KT4+PjA+Pj4wLCgodGhpcy5oaS1hLmhpJjQyOTQ5NjcyOTUpPj4+MCktKDA+dGhpcy5sby1hLmxvPzE6MCk+Pj4wKX07anNwYi5hcml0aC5JbnQ2NC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGpzcGIuYXJpdGguSW50NjQodGhpcy5sbyx0aGlzLmhpKX07XG5qc3BiLmFyaXRoLkludDY0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPTAhPSh0aGlzLmhpJjIxNDc0ODM2NDgpLGI9bmV3IGpzcGIuYXJpdGguVUludDY0KHRoaXMubG8sdGhpcy5oaSk7YSYmKGI9KG5ldyBqc3BiLmFyaXRoLlVJbnQ2NCgwLDApKS5zdWIoYikpO3JldHVybihhP1wiLVwiOlwiXCIpK2IudG9TdHJpbmcoKX07anNwYi5hcml0aC5JbnQ2NC5mcm9tU3RyaW5nPWZ1bmN0aW9uKGEpe3ZhciBiPTA8YS5sZW5ndGgmJlwiLVwiPT1hWzBdO2ImJihhPWEuc3Vic3RyaW5nKDEpKTthPWpzcGIuYXJpdGguVUludDY0LmZyb21TdHJpbmcoYSk7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7YiYmKGE9KG5ldyBqc3BiLmFyaXRoLlVJbnQ2NCgwLDApKS5zdWIoYSkpO3JldHVybiBuZXcganNwYi5hcml0aC5JbnQ2NChhLmxvLGEuaGkpfTtqc3BiLkJpbmFyeUVuY29kZXI9ZnVuY3Rpb24oKXt0aGlzLmJ1ZmZlcl89W119O2pzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVmZmVyXy5sZW5ndGh9O2pzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXJfO3RoaXMuYnVmZmVyXz1bXTtyZXR1cm4gYX07XG5qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlU3BsaXRWYXJpbnQ2ND1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT09TWF0aC5mbG9vcihhKSk7Z29vZy5hc3NlcnRzLmFzc2VydChiPT1NYXRoLmZsb29yKGIpKTtnb29nLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKTtmb3IoZ29vZy5hc3NlcnRzLmFzc2VydCgwPD1iJiZiPGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMik7MDxifHwxMjc8YTspdGhpcy5idWZmZXJfLnB1c2goYSYxMjd8MTI4KSxhPShhPj4+N3xiPDwyNSk+Pj4wLGI+Pj49Nzt0aGlzLmJ1ZmZlcl8ucHVzaChhKX07XG5qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlU3BsaXRGaXhlZDY0PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydChhPT1NYXRoLmZsb29yKGEpKTtnb29nLmFzc2VydHMuYXNzZXJ0KGI9PU1hdGguZmxvb3IoYikpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoMDw9YiYmYjxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIpO3RoaXMud3JpdGVVaW50MzIoYSk7dGhpcy53cml0ZVVpbnQzMihiKX07XG5qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlVW5zaWduZWRWYXJpbnQzMj1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KGE9PU1hdGguZmxvb3IoYSkpO2Zvcihnb29nLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKTsxMjc8YTspdGhpcy5idWZmZXJfLnB1c2goYSYxMjd8MTI4KSxhPj4+PTc7dGhpcy5idWZmZXJfLnB1c2goYSl9O1xuanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVNpZ25lZFZhcmludDMyPWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT09TWF0aC5mbG9vcihhKSk7Z29vZy5hc3NlcnRzLmFzc2VydChhPj0tanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxJiZhPGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSk7aWYoMDw9YSl0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMihhKTtlbHNle2Zvcih2YXIgYj0wOzk+YjtiKyspdGhpcy5idWZmZXJfLnB1c2goYSYxMjd8MTI4KSxhPj49Nzt0aGlzLmJ1ZmZlcl8ucHVzaCgxKX19O1xuanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVVuc2lnbmVkVmFyaW50NjQ9ZnVuY3Rpb24oYSl7Z29vZy5hc3NlcnRzLmFzc2VydChhPT1NYXRoLmZsb29yKGEpKTtnb29nLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzY0KTtqc3BiLnV0aWxzLnNwbGl0SW50NjQoYSk7dGhpcy53cml0ZVNwbGl0VmFyaW50NjQoanNwYi51dGlscy5zcGxpdDY0TG93LGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpfTtcbmpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVTaWduZWRWYXJpbnQ2ND1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KGE9PU1hdGguZmxvb3IoYSkpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT49LWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MyYmYTxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjMpO2pzcGIudXRpbHMuc3BsaXRJbnQ2NChhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChqc3BiLnV0aWxzLnNwbGl0NjRMb3csanNwYi51dGlscy5zcGxpdDY0SGlnaCl9O1xuanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVppZ3phZ1ZhcmludDMyPWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT09TWF0aC5mbG9vcihhKSk7Z29vZy5hc3NlcnRzLmFzc2VydChhPj0tanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxJiZhPGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSk7dGhpcy53cml0ZVVuc2lnbmVkVmFyaW50MzIoKGE8PDFeYT4+MzEpPj4+MCl9O2pzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVaaWd6YWdWYXJpbnQ2ND1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KGE9PU1hdGguZmxvb3IoYSkpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT49LWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MyYmYTxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjMpO2pzcGIudXRpbHMuc3BsaXRaaWd6YWc2NChhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChqc3BiLnV0aWxzLnNwbGl0NjRMb3csanNwYi51dGlscy5zcGxpdDY0SGlnaCl9O1xuanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVppZ3phZ1ZhcmludDY0U3RyaW5nPWZ1bmN0aW9uKGEpe3RoaXMud3JpdGVaaWd6YWdWYXJpbnRIYXNoNjQoanNwYi51dGlscy5kZWNpbWFsU3RyaW5nVG9IYXNoNjQoYSkpfTtqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlWmlnemFnVmFyaW50SGFzaDY0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7anNwYi51dGlscy5zcGxpdEhhc2g2NChhKTtqc3BiLnV0aWxzLnRvWmlnemFnNjQoanNwYi51dGlscy5zcGxpdDY0TG93LGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gsZnVuY3Rpb24oYSxkKXtiLndyaXRlU3BsaXRWYXJpbnQ2NChhPj4+MCxkPj4+MCl9KX07XG5qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlVWludDg9ZnVuY3Rpb24oYSl7Z29vZy5hc3NlcnRzLmFzc2VydChhPT1NYXRoLmZsb29yKGEpKTtnb29nLmFzc2VydHMuYXNzZXJ0KDA8PWEmJjI1Nj5hKTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpfTtqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlVWludDE2PWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT09TWF0aC5mbG9vcihhKSk7Z29vZy5hc3NlcnRzLmFzc2VydCgwPD1hJiY2NTUzNj5hKTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj44JjI1NSl9O1xuanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVVpbnQzMj1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KGE9PU1hdGguZmxvb3IoYSkpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4wJjI1NSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjgmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MTYmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MjQmMjU1KX07anNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVVpbnQ2ND1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KGE9PU1hdGguZmxvb3IoYSkpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjQpO2pzcGIudXRpbHMuc3BsaXRVaW50NjQoYSk7dGhpcy53cml0ZVVpbnQzMihqc3BiLnV0aWxzLnNwbGl0NjRMb3cpO3RoaXMud3JpdGVVaW50MzIoanNwYi51dGlscy5zcGxpdDY0SGlnaCl9O1xuanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oYSl7Z29vZy5hc3NlcnRzLmFzc2VydChhPT1NYXRoLmZsb29yKGEpKTtnb29nLmFzc2VydHMuYXNzZXJ0KC0xMjg8PWEmJjEyOD5hKTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpfTtqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlSW50MTY9ZnVuY3Rpb24oYSl7Z29vZy5hc3NlcnRzLmFzc2VydChhPT1NYXRoLmZsb29yKGEpKTtnb29nLmFzc2VydHMuYXNzZXJ0KC0zMjc2ODw9YSYmMzI3Njg+YSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjAmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+OCYyNTUpfTtcbmpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVJbnQzMj1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KGE9PU1hdGguZmxvb3IoYSkpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT49LWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSYmYTxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4wJjI1NSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjgmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MTYmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MjQmMjU1KX07XG5qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlSW50NjQ9ZnVuY3Rpb24oYSl7Z29vZy5hc3NlcnRzLmFzc2VydChhPT1NYXRoLmZsb29yKGEpKTtnb29nLmFzc2VydHMuYXNzZXJ0KGE+PS1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjMmJmE8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKTtqc3BiLnV0aWxzLnNwbGl0SW50NjQoYSk7dGhpcy53cml0ZVNwbGl0Rml4ZWQ2NChqc3BiLnV0aWxzLnNwbGl0NjRMb3csanNwYi51dGlscy5zcGxpdDY0SGlnaCl9O1xuanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZUludDY0U3RyaW5nPWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT09TWF0aC5mbG9vcihhKSk7Z29vZy5hc3NlcnRzLmFzc2VydCgrYT49LWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MyYmK2E8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKTtqc3BiLnV0aWxzLnNwbGl0SGFzaDY0KGpzcGIudXRpbHMuZGVjaW1hbFN0cmluZ1RvSGFzaDY0KGEpKTt0aGlzLndyaXRlU3BsaXRGaXhlZDY0KGpzcGIudXRpbHMuc3BsaXQ2NExvdyxqc3BiLnV0aWxzLnNwbGl0NjRIaWdoKX07XG5qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlRmxvYXQ9ZnVuY3Rpb24oYSl7Z29vZy5hc3NlcnRzLmFzc2VydChJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWF8fGlzTmFOKGEpfHxhPj0tanNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQzMl9NQVgmJmE8PWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfTUFYKTtqc3BiLnV0aWxzLnNwbGl0RmxvYXQzMihhKTt0aGlzLndyaXRlVWludDMyKGpzcGIudXRpbHMuc3BsaXQ2NExvdyl9O1xuanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZURvdWJsZT1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YXx8aXNOYU4oYSl8fGE+PS1qc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDY0X01BWCYmYTw9anNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQ2NF9NQVgpO2pzcGIudXRpbHMuc3BsaXRGbG9hdDY0KGEpO3RoaXMud3JpdGVVaW50MzIoanNwYi51dGlscy5zcGxpdDY0TG93KTt0aGlzLndyaXRlVWludDMyKGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpfTtqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlQm9vbD1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIGF8fFwibnVtYmVyXCI9PT10eXBlb2YgYSk7dGhpcy5idWZmZXJfLnB1c2goYT8xOjApfTtcbmpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVFbnVtPWZ1bmN0aW9uKGEpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoYT09TWF0aC5mbG9vcihhKSk7Z29vZy5hc3NlcnRzLmFzc2VydChhPj0tanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxJiZhPGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSk7dGhpcy53cml0ZVNpZ25lZFZhcmludDMyKGEpfTtqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlQnl0ZXM9ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXJfLnB1c2guYXBwbHkodGhpcy5idWZmZXJfLGEpfTtqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlVmFyaW50SGFzaDY0PWZ1bmN0aW9uKGEpe2pzcGIudXRpbHMuc3BsaXRIYXNoNjQoYSk7dGhpcy53cml0ZVNwbGl0VmFyaW50NjQoanNwYi51dGlscy5zcGxpdDY0TG93LGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpfTtcbmpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVGaXhlZEhhc2g2ND1mdW5jdGlvbihhKXtqc3BiLnV0aWxzLnNwbGl0SGFzaDY0KGEpO3RoaXMud3JpdGVVaW50MzIoanNwYi51dGlscy5zcGxpdDY0TG93KTt0aGlzLndyaXRlVWludDMyKGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpfTtcbmpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVTdHJpbmc9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMuYnVmZmVyXy5sZW5ndGgsYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7aWYoMTI4PmQpdGhpcy5idWZmZXJfLnB1c2goZCk7ZWxzZSBpZigyMDQ4PmQpdGhpcy5idWZmZXJfLnB1c2goZD4+NnwxOTIpLHRoaXMuYnVmZmVyXy5wdXNoKGQmNjN8MTI4KTtlbHNlIGlmKDY1NTM2PmQpaWYoNTUyOTY8PWQmJjU2MzE5Pj1kJiZjKzE8YS5sZW5ndGgpe3ZhciBlPWEuY2hhckNvZGVBdChjKzEpOzU2MzIwPD1lJiY1NzM0Mz49ZSYmKGQ9MTAyNCooZC01NTI5NikrZS01NjMyMCs2NTUzNix0aGlzLmJ1ZmZlcl8ucHVzaChkPj4xOHwyNDApLHRoaXMuYnVmZmVyXy5wdXNoKGQ+PjEyJjYzfDEyOCksdGhpcy5idWZmZXJfLnB1c2goZD4+NiY2M3wxMjgpLHRoaXMuYnVmZmVyXy5wdXNoKGQmNjN8MTI4KSxjKyspfWVsc2UgdGhpcy5idWZmZXJfLnB1c2goZD4+XG4xMnwyMjQpLHRoaXMuYnVmZmVyXy5wdXNoKGQ+PjYmNjN8MTI4KSx0aGlzLmJ1ZmZlcl8ucHVzaChkJjYzfDEyOCl9cmV0dXJuIHRoaXMuYnVmZmVyXy5sZW5ndGgtYn07anNwYi5CaW5hcnlXcml0ZXI9ZnVuY3Rpb24oKXt0aGlzLmJsb2Nrc189W107dGhpcy50b3RhbExlbmd0aF89MDt0aGlzLmVuY29kZXJfPW5ldyBqc3BiLkJpbmFyeUVuY29kZXI7dGhpcy5ib29rbWFya3NfPVtdfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUuYXBwZW5kVWludDhBcnJheV89ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbmNvZGVyXy5lbmQoKTt0aGlzLmJsb2Nrc18ucHVzaChiKTt0aGlzLmJsb2Nrc18ucHVzaChhKTt0aGlzLnRvdGFsTGVuZ3RoXys9Yi5sZW5ndGgrYS5sZW5ndGh9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLmJlZ2luRGVsaW1pdGVkXz1mdW5jdGlvbihhKXt0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTthPXRoaXMuZW5jb2Rlcl8uZW5kKCk7dGhpcy5ibG9ja3NfLnB1c2goYSk7dGhpcy50b3RhbExlbmd0aF8rPWEubGVuZ3RoO2EucHVzaCh0aGlzLnRvdGFsTGVuZ3RoXyk7cmV0dXJuIGF9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5lbmREZWxpbWl0ZWRfPWZ1bmN0aW9uKGEpe3ZhciBiPWEucG9wKCk7Yj10aGlzLnRvdGFsTGVuZ3RoXyt0aGlzLmVuY29kZXJfLmxlbmd0aCgpLWI7Zm9yKGdvb2cuYXNzZXJ0cy5hc3NlcnQoMDw9Yik7MTI3PGI7KWEucHVzaChiJjEyN3wxMjgpLGI+Pj49Nyx0aGlzLnRvdGFsTGVuZ3RoXysrO2EucHVzaChiKTt0aGlzLnRvdGFsTGVuZ3RoXysrfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVNlcmlhbGl6ZWRNZXNzYWdlPWZ1bmN0aW9uKGEsYixjKXt0aGlzLmFwcGVuZFVpbnQ4QXJyYXlfKGEuc3ViYXJyYXkoYixjKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5tYXliZVdyaXRlU2VyaWFsaXplZE1lc3NhZ2U9ZnVuY3Rpb24oYSxiLGMpe251bGwhPWEmJm51bGwhPWImJm51bGwhPWMmJnRoaXMud3JpdGVTZXJpYWxpemVkTWVzc2FnZShhLGIsYyl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuYmxvY2tzXz1bXTt0aGlzLmVuY29kZXJfLmVuZCgpO3RoaXMudG90YWxMZW5ndGhfPTA7dGhpcy5ib29rbWFya3NfPVtdfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5nZXRSZXN1bHRCdWZmZXI9ZnVuY3Rpb24oKXtnb29nLmFzc2VydHMuYXNzZXJ0KDA9PXRoaXMuYm9va21hcmtzXy5sZW5ndGgpO2Zvcih2YXIgYT1uZXcgVWludDhBcnJheSh0aGlzLnRvdGFsTGVuZ3RoXyt0aGlzLmVuY29kZXJfLmxlbmd0aCgpKSxiPXRoaXMuYmxvY2tzXyxjPWIubGVuZ3RoLGQ9MCxlPTA7ZTxjO2UrKyl7dmFyIGY9YltlXTthLnNldChmLGQpO2QrPWYubGVuZ3RofWI9dGhpcy5lbmNvZGVyXy5lbmQoKTthLnNldChiLGQpO2QrPWIubGVuZ3RoO2dvb2cuYXNzZXJ0cy5hc3NlcnQoZD09YS5sZW5ndGgpO3RoaXMuYmxvY2tzXz1bYV07cmV0dXJuIGF9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5nZXRSZXN1bHRCYXNlNjRTdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuY3J5cHQuYmFzZTY0LmVuY29kZUJ5dGVBcnJheSh0aGlzLmdldFJlc3VsdEJ1ZmZlcigpLGEpfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5iZWdpblN1Yk1lc3NhZ2U9ZnVuY3Rpb24oYSl7dGhpcy5ib29rbWFya3NfLnB1c2godGhpcy5iZWdpbkRlbGltaXRlZF8oYSkpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUuZW5kU3ViTWVzc2FnZT1mdW5jdGlvbigpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoMDw9dGhpcy5ib29rbWFya3NfLmxlbmd0aCk7dGhpcy5lbmREZWxpbWl0ZWRfKHRoaXMuYm9va21hcmtzXy5wb3AoKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUZpZWxkSGVhZGVyXz1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoMTw9YSYmYT09TWF0aC5mbG9vcihhKSk7dGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCphK2IpfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUFueT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9anNwYi5CaW5hcnlDb25zdGFudHMuRmllbGRUeXBlO3N3aXRjaChhKXtjYXNlIGQuRE9VQkxFOnRoaXMud3JpdGVEb3VibGUoYixjKTticmVhaztjYXNlIGQuRkxPQVQ6dGhpcy53cml0ZUZsb2F0KGIsYyk7YnJlYWs7Y2FzZSBkLklOVDY0OnRoaXMud3JpdGVJbnQ2NChiLGMpO2JyZWFrO2Nhc2UgZC5VSU5UNjQ6dGhpcy53cml0ZVVpbnQ2NChiLGMpO2JyZWFrO2Nhc2UgZC5JTlQzMjp0aGlzLndyaXRlSW50MzIoYixjKTticmVhaztjYXNlIGQuRklYRUQ2NDp0aGlzLndyaXRlRml4ZWQ2NChiLGMpO2JyZWFrO2Nhc2UgZC5GSVhFRDMyOnRoaXMud3JpdGVGaXhlZDMyKGIsYyk7YnJlYWs7Y2FzZSBkLkJPT0w6dGhpcy53cml0ZUJvb2woYixjKTticmVhaztjYXNlIGQuU1RSSU5HOnRoaXMud3JpdGVTdHJpbmcoYixjKTticmVhaztjYXNlIGQuR1JPVVA6Z29vZy5hc3NlcnRzLmZhaWwoXCJHcm91cCBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gd3JpdGVBbnkoKVwiKTtcbmJyZWFrO2Nhc2UgZC5NRVNTQUdFOmdvb2cuYXNzZXJ0cy5mYWlsKFwiTWVzc2FnZSBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gd3JpdGVBbnkoKVwiKTticmVhaztjYXNlIGQuQllURVM6dGhpcy53cml0ZUJ5dGVzKGIsYyk7YnJlYWs7Y2FzZSBkLlVJTlQzMjp0aGlzLndyaXRlVWludDMyKGIsYyk7YnJlYWs7Y2FzZSBkLkVOVU06dGhpcy53cml0ZUVudW0oYixjKTticmVhaztjYXNlIGQuU0ZJWEVEMzI6dGhpcy53cml0ZVNmaXhlZDMyKGIsYyk7YnJlYWs7Y2FzZSBkLlNGSVhFRDY0OnRoaXMud3JpdGVTZml4ZWQ2NChiLGMpO2JyZWFrO2Nhc2UgZC5TSU5UMzI6dGhpcy53cml0ZVNpbnQzMihiLGMpO2JyZWFrO2Nhc2UgZC5TSU5UNjQ6dGhpcy53cml0ZVNpbnQ2NChiLGMpO2JyZWFrO2Nhc2UgZC5GSEFTSDY0OnRoaXMud3JpdGVGaXhlZEhhc2g2NChiLGMpO2JyZWFrO2Nhc2UgZC5WSEFTSDY0OnRoaXMud3JpdGVWYXJpbnRIYXNoNjQoYixjKTticmVhaztkZWZhdWx0Omdvb2cuYXNzZXJ0cy5mYWlsKFwiSW52YWxpZCBmaWVsZCB0eXBlIGluIHdyaXRlQW55KClcIil9fTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVVuc2lnbmVkVmFyaW50MzJfPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGIpKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU2lnbmVkVmFyaW50MzJfPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVVuc2lnbmVkVmFyaW50NjRfPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDY0KGIpKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTaWduZWRWYXJpbnQ2NF89ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCksdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDY0KGIpKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlWmlnemFnVmFyaW50MzJfPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnQzMihiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVppZ3phZ1ZhcmludDY0Xz1mdW5jdGlvbihhLGIpe251bGwhPWImJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKSx0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50NjQoYikpfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVppZ3phZ1ZhcmludDY0U3RyaW5nXz1mdW5jdGlvbihhLGIpe251bGwhPWImJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKSx0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50NjRTdHJpbmcoYikpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVaaWd6YWdWYXJpbnRIYXNoNjRfPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnRIYXNoNjQoYikpfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKGdvb2cuYXNzZXJ0cy5hc3NlcnQoYj49LWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSYmYjxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpLHRoaXMud3JpdGVTaWduZWRWYXJpbnQzMl8oYSxiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUludDMyU3RyaW5nPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKGI9cGFyc2VJbnQoYiwxMCksZ29vZy5hc3NlcnRzLmFzc2VydChiPj0tanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxJiZiPGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSksdGhpcy53cml0ZVNpZ25lZFZhcmludDMyXyhhLGIpKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVJbnQ2ND1mdW5jdGlvbihhLGIpe251bGwhPWImJihnb29nLmFzc2VydHMuYXNzZXJ0KGI+PS1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjMmJmI8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKSx0aGlzLndyaXRlU2lnbmVkVmFyaW50NjRfKGEsYikpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVJbnQ2NFN0cmluZz1mdW5jdGlvbihhLGIpe251bGwhPWImJihiPWpzcGIuYXJpdGguSW50NjQuZnJvbVN0cmluZyhiKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKSx0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRWYXJpbnQ2NChiLmxvLGIuaGkpKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVVaW50MzI9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiYoZ29vZy5hc3NlcnRzLmFzc2VydCgwPD1iJiZiPGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMiksdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50MzJfKGEsYikpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVVaW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiYoYj1wYXJzZUludChiLDEwKSxnb29nLmFzc2VydHMuYXNzZXJ0KDA8PWImJmI8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKSx0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMl8oYSxiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVVpbnQ2ND1mdW5jdGlvbihhLGIpe251bGwhPWImJihnb29nLmFzc2VydHMuYXNzZXJ0KDA8PWImJmI8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzY0KSx0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQ2NF8oYSxiKSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlVWludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKGI9anNwYi5hcml0aC5VSW50NjQuZnJvbVN0cmluZyhiKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKSx0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRWYXJpbnQ2NChiLmxvLGIuaGkpKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU2ludDMyPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKGdvb2cuYXNzZXJ0cy5hc3NlcnQoYj49LWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSYmYjxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpLHRoaXMud3JpdGVaaWd6YWdWYXJpbnQzMl8oYSxiKSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU2ludDY0PWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKGdvb2cuYXNzZXJ0cy5hc3NlcnQoYj49LWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MyYmYjxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjMpLHRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NF8oYSxiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVNpbnRIYXNoNjQ9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiZ0aGlzLndyaXRlWmlnemFnVmFyaW50SGFzaDY0XyhhLGIpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTaW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiZ0aGlzLndyaXRlWmlnemFnVmFyaW50NjRTdHJpbmdfKGEsYil9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlRml4ZWQzMj1mdW5jdGlvbihhLGIpe251bGwhPWImJihnb29nLmFzc2VydHMuYXNzZXJ0KDA8PWImJmI8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQzMiksdGhpcy5lbmNvZGVyXy53cml0ZVVpbnQzMihiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUZpeGVkNjQ9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiYoZ29vZy5hc3NlcnRzLmFzc2VydCgwPD1iJiZiPGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182NCksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVaW50NjQoYikpfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiYoYj1qc3BiLmFyaXRoLlVJbnQ2NC5mcm9tU3RyaW5nKGIpLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0KSx0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRGaXhlZDY0KGIubG8sYi5oaSkpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTZml4ZWQzMj1mdW5jdGlvbihhLGIpe251bGwhPWImJihnb29nLmFzc2VydHMuYXNzZXJ0KGI+PS1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEmJmI8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQzMiksdGhpcy5lbmNvZGVyXy53cml0ZUludDMyKGIpKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTZml4ZWQ2ND1mdW5jdGlvbihhLGIpe251bGwhPWImJihnb29nLmFzc2VydHMuYXNzZXJ0KGI+PS1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjMmJmI8anNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NCksdGhpcy5lbmNvZGVyXy53cml0ZUludDY0KGIpKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU2ZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiYoYj1qc3BiLmFyaXRoLkludDY0LmZyb21TdHJpbmcoYiksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdEZpeGVkNjQoYi5sbyxiLmhpKSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlRmxvYXQ9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVEMzIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVGbG9hdChiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZURvdWJsZT1mdW5jdGlvbihhLGIpe251bGwhPWImJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NCksdGhpcy5lbmNvZGVyXy53cml0ZURvdWJsZShiKSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlQm9vbD1mdW5jdGlvbihhLGIpe251bGwhPWImJihnb29nLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIGJ8fFwibnVtYmVyXCI9PT10eXBlb2YgYiksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCksdGhpcy5lbmNvZGVyXy53cml0ZUJvb2woYikpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVFbnVtPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKGdvb2cuYXNzZXJ0cy5hc3NlcnQoYj49LWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSYmYjxqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihiKSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU3RyaW5nPWZ1bmN0aW9uKGEsYil7bnVsbCE9YiYmKGE9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSksdGhpcy5lbmNvZGVyXy53cml0ZVN0cmluZyhiKSx0aGlzLmVuZERlbGltaXRlZF8oYSkpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVCeXRlcz1mdW5jdGlvbihhLGIpe251bGwhPWImJihiPWpzcGIudXRpbHMuYnl0ZVNvdXJjZVRvVWludDhBcnJheShiKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMihiLmxlbmd0aCksdGhpcy5hcHBlbmRVaW50OEFycmF5XyhiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZU1lc3NhZ2U9ZnVuY3Rpb24oYSxiLGMpe251bGwhPWImJihhPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpLGMoYix0aGlzKSx0aGlzLmVuZERlbGltaXRlZF8oYSkpfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VTZXQ9ZnVuY3Rpb24oYSxiLGMpe251bGwhPWImJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKDEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuU1RBUlRfR1JPVVApLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oMixqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihhKSxhPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKDMpLGMoYix0aGlzKSx0aGlzLmVuZERlbGltaXRlZF8oYSksdGhpcy53cml0ZUZpZWxkSGVhZGVyXygxLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkVORF9HUk9VUCkpfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUdyb3VwPWZ1bmN0aW9uKGEsYixjKXtudWxsIT1iJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlNUQVJUX0dST1VQKSxjKGIsdGhpcyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkVORF9HUk9VUCkpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVGaXhlZEhhc2g2ND1mdW5jdGlvbihhLGIpe251bGwhPWImJihnb29nLmFzc2VydHMuYXNzZXJ0KDg9PWIubGVuZ3RoKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NCksdGhpcy5lbmNvZGVyXy53cml0ZUZpeGVkSGFzaDY0KGIpKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oYSxiKXtudWxsIT1iJiYoZ29vZy5hc3NlcnRzLmFzc2VydCg4PT1iLmxlbmd0aCksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCksdGhpcy5lbmNvZGVyXy53cml0ZVZhcmludEhhc2g2NChiKSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVNwbGl0Rml4ZWQ2ND1mdW5jdGlvbihhLGIsYyl7dGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQpO3RoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdEZpeGVkNjQoYixjKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTcGxpdFZhcmludDY0PWZ1bmN0aW9uKGEsYixjKXt0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTt0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRWYXJpbnQ2NChiLGMpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTcGxpdFppZ3phZ1ZhcmludDY0PWZ1bmN0aW9uKGEsYixjKXt0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTt2YXIgZD10aGlzLmVuY29kZXJfO2pzcGIudXRpbHMudG9aaWd6YWc2NChiLGMsZnVuY3Rpb24oYSxiKXtkLndyaXRlU3BsaXRWYXJpbnQ2NChhPj4+MCxiPj4+MCl9KX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZEludDMyPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlU2lnbmVkVmFyaW50MzJfKGEsYltjXSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkSW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVJbnQzMlN0cmluZyhhLGJbY10pfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZEludDY0PWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlU2lnbmVkVmFyaW50NjRfKGEsYltjXSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTcGxpdEZpeGVkNjQ9ZnVuY3Rpb24oYSxiLGMsZCl7aWYobnVsbCE9Yilmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKyl0aGlzLndyaXRlU3BsaXRGaXhlZDY0KGEsYyhiW2VdKSxkKGJbZV0pKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTcGxpdFZhcmludDY0PWZ1bmN0aW9uKGEsYixjLGQpe2lmKG51bGwhPWIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspdGhpcy53cml0ZVNwbGl0VmFyaW50NjQoYSxjKGJbZV0pLGQoYltlXSkpfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFNwbGl0WmlnemFnVmFyaW50NjQ9ZnVuY3Rpb24oYSxiLGMsZCl7aWYobnVsbCE9Yilmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKyl0aGlzLndyaXRlU3BsaXRaaWd6YWdWYXJpbnQ2NChhLGMoYltlXSksZChiW2VdKSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRJbnQ2NFN0cmluZz1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy53cml0ZUludDY0U3RyaW5nKGEsYltjXSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkVWludDMyPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMl8oYSxiW2NdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRVaW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVVaW50MzJTdHJpbmcoYSxiW2NdKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFVpbnQ2ND1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50NjRfKGEsYltjXSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkVWludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlVWludDY0U3RyaW5nKGEsYltjXSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkU2ludDMyPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlWmlnemFnVmFyaW50MzJfKGEsYltjXSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTaW50NjQ9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NF8oYSxiW2NdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTaW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NFN0cmluZ18oYSxiW2NdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTaW50SGFzaDY0PWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlWmlnemFnVmFyaW50SGFzaDY0XyhhLGJbY10pfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkRml4ZWQzMj1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy53cml0ZUZpeGVkMzIoYSxiW2NdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRGaXhlZDY0PWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlRml4ZWQ2NChhLGJbY10pfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZEZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVGaXhlZDY0U3RyaW5nKGEsYltjXSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTZml4ZWQzMj1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy53cml0ZVNmaXhlZDMyKGEsYltjXSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkU2ZpeGVkNjQ9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVTZml4ZWQ2NChhLGJbY10pfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFNmaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlU2ZpeGVkNjRTdHJpbmcoYSxiW2NdKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZEZsb2F0PWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlRmxvYXQoYSxiW2NdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWREb3VibGU9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVEb3VibGUoYSxiW2NdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRCb29sPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9Yilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLndyaXRlQm9vbChhLGJbY10pfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZEVudW09ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVFbnVtKGEsYltjXSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTdHJpbmc9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVTdHJpbmcoYSxiW2NdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRCeXRlcz1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy53cml0ZUJ5dGVzKGEsYltjXSl9O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkTWVzc2FnZT1mdW5jdGlvbihhLGIsYyl7aWYobnVsbCE9Yilmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7YyhiW2RdLHRoaXMpO3RoaXMuZW5kRGVsaW1pdGVkXyhlKX19O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRHcm91cD1mdW5jdGlvbihhLGIsYyl7aWYobnVsbCE9Yilmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyl0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuU1RBUlRfR1JPVVApLGMoYltkXSx0aGlzKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRU5EX0dST1VQKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRGaXhlZEhhc2g2ND1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy53cml0ZUZpeGVkSGFzaDY0KGEsYltjXSl9O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMud3JpdGVWYXJpbnRIYXNoNjQoYSxiW2NdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkSW50MzI9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iJiZiLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmVuY29kZXJfLndyaXRlU2lnbmVkVmFyaW50MzIoYltjXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRJbnQzMlN0cmluZz1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihwYXJzZUludChiW2NdLDEwKSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkSW50NjQ9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iJiZiLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmVuY29kZXJfLndyaXRlU2lnbmVkVmFyaW50NjQoYltjXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRTcGxpdEZpeGVkNjQ9ZnVuY3Rpb24oYSxiLGMsZCl7aWYobnVsbCE9Yil7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKyl0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRGaXhlZDY0KGMoYltlXSksZChiW2VdKSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkU3BsaXRWYXJpbnQ2ND1mdW5jdGlvbihhLGIsYyxkKXtpZihudWxsIT1iKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdFZhcmludDY0KGMoYltlXSksZChiW2VdKSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRTcGxpdFppZ3phZ1ZhcmludDY0PWZ1bmN0aW9uKGEsYixjLGQpe2lmKG51bGwhPWIpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBlPXRoaXMuZW5jb2Rlcl8sZj0wO2Y8Yi5sZW5ndGg7ZisrKWpzcGIudXRpbHMudG9aaWd6YWc2NChjKGJbZl0pLGQoYltmXSksZnVuY3Rpb24oYSxiKXtlLndyaXRlU3BsaXRWYXJpbnQ2NChhPj4+MCxiPj4+MCl9KTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRJbnQ2NFN0cmluZz1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1qc3BiLmFyaXRoLkludDY0LmZyb21TdHJpbmcoYltjXSk7dGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQoZC5sbyxkLmhpKX10aGlzLmVuZERlbGltaXRlZF8oYSl9fTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFVpbnQzMj1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGJbY10pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFVpbnQzMlN0cmluZz1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKHBhcnNlSW50KGJbY10sMTApKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFVpbnQ2ND1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDY0KGJbY10pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19O2pzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFVpbnQ2NFN0cmluZz1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1qc3BiLmFyaXRoLlVJbnQ2NC5mcm9tU3RyaW5nKGJbY10pO3RoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdFZhcmludDY0KGQubG8sZC5oaSl9dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRTaW50MzI9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iJiZiLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50MzIoYltjXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkU2ludDY0PWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9YiYmYi5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDY0KGJbY10pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkU2ludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9YiYmYi5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludEhhc2g2NChqc3BiLnV0aWxzLmRlY2ltYWxTdHJpbmdUb0hhc2g2NChiW2NdKSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkU2ludEhhc2g2ND1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnRIYXNoNjQoYltjXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRGaXhlZDMyPWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9YiYmYi5sZW5ndGgpZm9yKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDQqYi5sZW5ndGgpLGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlVWludDMyKGJbYV0pfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRGaXhlZDY0PWZ1bmN0aW9uKGEsYil7aWYobnVsbCE9YiYmYi5sZW5ndGgpZm9yKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSxqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYi5sZW5ndGgpLGE9MDthPGIubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlVWludDY0KGJbYV0pfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZEZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iJiZiLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpiLmxlbmd0aCksYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1qc3BiLmFyaXRoLlVJbnQ2NC5mcm9tU3RyaW5nKGJbYV0pO3RoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdEZpeGVkNjQoYy5sbyxjLmhpKX19O1xuanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkU2ZpeGVkMzI9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iJiZiLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoNCpiLmxlbmd0aCksYT0wO2E8Yi5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVJbnQzMihiW2FdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkU2ZpeGVkNjQ9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iJiZiLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpiLmxlbmd0aCksYT0wO2E8Yi5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVJbnQ2NChiW2FdKX07XG5qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRTZml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmIubGVuZ3RoKSxhPTA7YTxiLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZUludDY0U3RyaW5nKGJbYV0pfTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRGbG9hdD1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig0KmIubGVuZ3RoKSxhPTA7YTxiLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZUZsb2F0KGJbYV0pfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZERvdWJsZT1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmIubGVuZ3RoKSxhPTA7YTxiLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZURvdWJsZShiW2FdKX07anNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkQm9vbD1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMihiLmxlbmd0aCksYT0wO2E8Yi5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVCb29sKGJbYV0pfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZEVudW09ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iJiZiLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmVuY29kZXJfLndyaXRlRW51bShiW2NdKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTtqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRGaXhlZEhhc2g2ND1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmIubGVuZ3RoKSxhPTA7YTxiLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZUZpeGVkSGFzaDY0KGJbYV0pfTtcbmpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFZhcmludEhhc2g2ND1mdW5jdGlvbihhLGIpe2lmKG51bGwhPWImJmIubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuZW5jb2Rlcl8ud3JpdGVWYXJpbnRIYXNoNjQoYltjXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07anNwYi5FeHBvcnQ9e307ZXhwb3J0cy5NYXA9anNwYi5NYXA7ZXhwb3J0cy5NZXNzYWdlPWpzcGIuTWVzc2FnZTtleHBvcnRzLkJpbmFyeVJlYWRlcj1qc3BiLkJpbmFyeVJlYWRlcjtleHBvcnRzLkJpbmFyeVdyaXRlcj1qc3BiLkJpbmFyeVdyaXRlcjtleHBvcnRzLkV4dGVuc2lvbkZpZWxkSW5mbz1qc3BiLkV4dGVuc2lvbkZpZWxkSW5mbztleHBvcnRzLkV4dGVuc2lvbkZpZWxkQmluYXJ5SW5mbz1qc3BiLkV4dGVuc2lvbkZpZWxkQmluYXJ5SW5mbztleHBvcnRzLmV4cG9ydFN5bWJvbD1nb29nLmV4cG9ydFN5bWJvbDtleHBvcnRzLmluaGVyaXRzPWdvb2cuaW5oZXJpdHM7ZXhwb3J0cy5vYmplY3Q9e2V4dGVuZDpnb29nLm9iamVjdC5leHRlbmR9O2V4cG9ydHMudHlwZU9mPWdvb2cudHlwZU9mO1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgZ3JwYyB9IGZyb20gXCJAaW1wcm9iYWJsZS1lbmcvZ3JwYy13ZWJcIjtcblxuLy8gSW1wb3J0IGNvZGUtZ2VuZXJhdGVkIGRhdGEgc3RydWN0dXJlcy5cbmltcG9ydCB7IFdlYkFwaSwgV2ViQXBpQ2xpZW50IH0gZnJvbSBcIi4vX3Byb3RvL3dlYi1hcGlfcGJfc2VydmljZVwiO1xuaW1wb3J0IHsgVXNlcklkUmVxdWVzdCwgUm9vbXNMaXN0UmVwbHkgfSBmcm9tIFwiLi9fcHJvdG8vd2ViLWFwaV9wYlwiO1xuXG5jb25zdCBsaXN0Um9vbXNSZXF1ZXN0ID0gbmV3IFVzZXJJZFJlcXVlc3QoKTtcbmxpc3RSb29tc1JlcXVlc3Quc2V0VXNlcklkKFwiQHByb2plY3Rtb29uOmFnbm9zLmlzXCIpO1xuZ3JwYy51bmFyeShXZWJBcGkuTGlzdFJvb20sIHtcbiAgICByZXF1ZXN0OiBsaXN0Um9vbXNSZXF1ZXN0LFxuICAgIGhvc3Q6IFwiaHR0cDovL2xvY2FsaG9zdDoxMDAwMFwiLFxuICAgIG9uRW5kOiByZXMgPT4ge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgc3RhdHVzTWVzc2FnZSwgaGVhZGVycywgbWVzc2FnZSwgdHJhaWxlcnMgfSA9IHJlcztcbiAgICAgICAgY29uc29sZS5sb2coc3RhdHVzLCAnLScsIHN0YXR1c01lc3NhZ2UpO1xuICAgICAgICBpZiAoc3RhdHVzID09PSBncnBjLkNvZGUuT0sgJiYgbWVzc2FnZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbGwgb2suIGdvdCByb29tczogXCIsIG1lc3NhZ2UudG9PYmplY3QoKSk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=