2257 lines
244 KiB
JavaScript
2257 lines
244 KiB
JavaScript
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
|
var Engine;
|
|
|
|
Engine = (function() {
|
|
function Engine(HB, parser) {
|
|
this.HB = HB;
|
|
this.parser = parser;
|
|
this.unprocessed_ops = [];
|
|
}
|
|
|
|
Engine.prototype.parseOperation = function(json) {
|
|
var typeParser;
|
|
typeParser = this.parser[json.type];
|
|
if (typeParser != null) {
|
|
return typeParser(json);
|
|
} else {
|
|
throw new Error("You forgot to specify a parser for type " + json.type + ". The message is " + (JSON.stringify(json)) + ".");
|
|
}
|
|
};
|
|
|
|
Engine.prototype.applyOpsBundle = function(ops_json) {
|
|
var o, ops, _i, _j, _k, _len, _len1, _len2;
|
|
ops = [];
|
|
for (_i = 0, _len = ops_json.length; _i < _len; _i++) {
|
|
o = ops_json[_i];
|
|
ops.push(this.parseOperation(o));
|
|
}
|
|
for (_j = 0, _len1 = ops.length; _j < _len1; _j++) {
|
|
o = ops[_j];
|
|
this.HB.addOperation(o);
|
|
}
|
|
for (_k = 0, _len2 = ops.length; _k < _len2; _k++) {
|
|
o = ops[_k];
|
|
if (!o.execute()) {
|
|
this.unprocessed_ops.push(o);
|
|
}
|
|
}
|
|
return this.tryUnprocessed();
|
|
};
|
|
|
|
Engine.prototype.applyOpsCheckDouble = function(ops_json) {
|
|
var o, _i, _len, _results;
|
|
_results = [];
|
|
for (_i = 0, _len = ops_json.length; _i < _len; _i++) {
|
|
o = ops_json[_i];
|
|
if (this.HB.getOperation(o.uid) == null) {
|
|
_results.push(this.applyOp(o));
|
|
} else {
|
|
_results.push(void 0);
|
|
}
|
|
}
|
|
return _results;
|
|
};
|
|
|
|
Engine.prototype.applyOps = function(ops_json) {
|
|
var o, _i, _len, _results;
|
|
_results = [];
|
|
for (_i = 0, _len = ops_json.length; _i < _len; _i++) {
|
|
o = ops_json[_i];
|
|
_results.push(this.applyOp(o));
|
|
}
|
|
return _results;
|
|
};
|
|
|
|
Engine.prototype.applyOp = function(op_json) {
|
|
var o;
|
|
o = this.parseOperation(op_json);
|
|
this.HB.addToCounter(o);
|
|
if (this.HB.getOperation(o) != null) {
|
|
|
|
} else if (!o.execute()) {
|
|
this.unprocessed_ops.push(o);
|
|
} else {
|
|
this.HB.addOperation(o);
|
|
}
|
|
return this.tryUnprocessed();
|
|
};
|
|
|
|
Engine.prototype.tryUnprocessed = function() {
|
|
var old_length, op, unprocessed, _i, _len, _ref, _results;
|
|
_results = [];
|
|
while (true) {
|
|
old_length = this.unprocessed_ops.length;
|
|
unprocessed = [];
|
|
_ref = this.unprocessed_ops;
|
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|
op = _ref[_i];
|
|
if (this.HB.getOperation(op) != null) {
|
|
|
|
} else if (!op.execute()) {
|
|
unprocessed.push(op);
|
|
} else {
|
|
this.HB.addOperation(op);
|
|
}
|
|
}
|
|
this.unprocessed_ops = unprocessed;
|
|
if (this.unprocessed_ops.length === old_length) {
|
|
break;
|
|
} else {
|
|
_results.push(void 0);
|
|
}
|
|
}
|
|
return _results;
|
|
};
|
|
|
|
return Engine;
|
|
|
|
})();
|
|
|
|
module.exports = Engine;
|
|
|
|
|
|
},{}],2:[function(require,module,exports){
|
|
var Engine, HistoryBuffer, XmlFramework, json_types_uninitialized;
|
|
|
|
json_types_uninitialized = require("../Types/XmlTypes");
|
|
|
|
HistoryBuffer = require("../HistoryBuffer");
|
|
|
|
Engine = require("../Engine");
|
|
|
|
XmlFramework = (function() {
|
|
function XmlFramework(user_id, Connector) {
|
|
var beg, end, type_manager, uid_beg, uid_end;
|
|
this.HB = new HistoryBuffer(user_id);
|
|
type_manager = json_types_uninitialized(this.HB);
|
|
this.types = type_manager.types;
|
|
this.engine = new Engine(this.HB, type_manager.parser);
|
|
this.HB.engine = this.engine;
|
|
this.connector = new Connector(this.engine, this.HB, type_manager.execution_listener, this);
|
|
uid_beg = this.HB.getReservedUniqueIdentifier();
|
|
uid_end = this.HB.getReservedUniqueIdentifier();
|
|
beg = this.HB.addOperation(new this.types.Delimiter(uid_beg, void 0, uid_end)).execute();
|
|
end = this.HB.addOperation(new this.types.Delimiter(uid_end, beg, void 0)).execute();
|
|
this.root_element = new this.types.ReplaceManager(void 0, this.HB.getReservedUniqueIdentifier(), beg, end);
|
|
this.HB.addOperation(this.root_element).execute();
|
|
}
|
|
|
|
XmlFramework.prototype.getSharedObject = function() {
|
|
return this.root_element.val();
|
|
};
|
|
|
|
XmlFramework.prototype.getConnector = function() {
|
|
return this.connector;
|
|
};
|
|
|
|
XmlFramework.prototype.getHistoryBuffer = function() {
|
|
return this.HB;
|
|
};
|
|
|
|
XmlFramework.prototype.setMutableDefault = function(mutable) {
|
|
return this.getSharedObject().setMutableDefault(mutable);
|
|
};
|
|
|
|
XmlFramework.prototype.getUserId = function() {
|
|
return this.HB.getUserId();
|
|
};
|
|
|
|
XmlFramework.prototype.toJson = function() {
|
|
return this.getSharedObject().toJson();
|
|
};
|
|
|
|
XmlFramework.prototype.val = function() {
|
|
var newXml;
|
|
if ((arguments.length === 0) || (typeof arguments[0] === "boolean")) {
|
|
return this.getSharedObject().val(arguments[0]);
|
|
} else if (arguments.length === 1) {
|
|
newXml = new this.types.XmlType(void 0, void 0, void 0, void 0, arguments[0]);
|
|
this.HB.addOperation(newXml).execute();
|
|
this.root_element.replace(newXml);
|
|
return newXml;
|
|
} else {
|
|
throw new Error("can only parse 0, or 1 parameter!");
|
|
}
|
|
};
|
|
|
|
XmlFramework.prototype.on = function() {
|
|
var _ref;
|
|
return (_ref = this.getSharedObject()).on.apply(_ref, arguments);
|
|
};
|
|
|
|
return XmlFramework;
|
|
|
|
})();
|
|
|
|
module.exports = XmlFramework;
|
|
|
|
if (typeof window !== "undefined" && window !== null) {
|
|
if (window.Y == null) {
|
|
window.Y = {};
|
|
}
|
|
window.Y.XmlFramework = XmlFramework;
|
|
}
|
|
|
|
|
|
},{"../Engine":1,"../HistoryBuffer":3,"../Types/XmlTypes":8}],3:[function(require,module,exports){
|
|
var HistoryBuffer,
|
|
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
|
|
|
HistoryBuffer = (function() {
|
|
function HistoryBuffer(user_id) {
|
|
this.user_id = user_id;
|
|
this.emptyGarbage = __bind(this.emptyGarbage, this);
|
|
this.operation_counter = {};
|
|
this.buffer = {};
|
|
this.change_listeners = [];
|
|
this.garbage = [];
|
|
this.trash = [];
|
|
this.performGarbageCollection = true;
|
|
this.garbageCollectTimeout = 1000;
|
|
this.reserved_identifier_counter = 0;
|
|
setTimeout(this.emptyGarbage, this.garbageCollectTimeout);
|
|
}
|
|
|
|
HistoryBuffer.prototype.emptyGarbage = function() {
|
|
var o, _i, _len, _ref;
|
|
_ref = this.garbage;
|
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|
o = _ref[_i];
|
|
if (typeof o.cleanup === "function") {
|
|
o.cleanup();
|
|
}
|
|
}
|
|
this.garbage = this.trash;
|
|
this.trash = [];
|
|
if (this.garbageCollectTimeout !== -1) {
|
|
this.garbageCollectTimeoutId = setTimeout(this.emptyGarbage, this.garbageCollectTimeout);
|
|
}
|
|
return void 0;
|
|
};
|
|
|
|
HistoryBuffer.prototype.getUserId = function() {
|
|
return this.user_id;
|
|
};
|
|
|
|
HistoryBuffer.prototype.addToGarbageCollector = function() {
|
|
var o, _i, _len, _results;
|
|
if (this.performGarbageCollection) {
|
|
_results = [];
|
|
for (_i = 0, _len = arguments.length; _i < _len; _i++) {
|
|
o = arguments[_i];
|
|
if (o != null) {
|
|
_results.push(this.garbage.push(o));
|
|
} else {
|
|
_results.push(void 0);
|
|
}
|
|
}
|
|
return _results;
|
|
}
|
|
};
|
|
|
|
HistoryBuffer.prototype.stopGarbageCollection = function() {
|
|
this.performGarbageCollection = false;
|
|
this.setManualGarbageCollect();
|
|
this.garbage = [];
|
|
return this.trash = [];
|
|
};
|
|
|
|
HistoryBuffer.prototype.setManualGarbageCollect = function() {
|
|
this.garbageCollectTimeout = -1;
|
|
clearTimeout(this.garbageCollectTimeoutId);
|
|
return this.garbageCollectTimeoutId = void 0;
|
|
};
|
|
|
|
HistoryBuffer.prototype.setGarbageCollectTimeout = function(garbageCollectTimeout) {
|
|
this.garbageCollectTimeout = garbageCollectTimeout;
|
|
};
|
|
|
|
HistoryBuffer.prototype.getReservedUniqueIdentifier = function() {
|
|
return {
|
|
creator: '_',
|
|
op_number: "_" + (this.reserved_identifier_counter++),
|
|
doSync: false
|
|
};
|
|
};
|
|
|
|
HistoryBuffer.prototype.getOperationCounter = function(user_id) {
|
|
var ctn, res, user, _ref;
|
|
if (user_id == null) {
|
|
res = {};
|
|
_ref = this.operation_counter;
|
|
for (user in _ref) {
|
|
ctn = _ref[user];
|
|
res[user] = ctn;
|
|
}
|
|
return res;
|
|
} else {
|
|
return this.operation_counter[user_id];
|
|
}
|
|
};
|
|
|
|
HistoryBuffer.prototype._encode = function(state_vector) {
|
|
var json, o, o_json, o_next, o_number, o_prev, u_name, unknown, user, _ref;
|
|
if (state_vector == null) {
|
|
state_vector = {};
|
|
}
|
|
json = [];
|
|
unknown = function(user, o_number) {
|
|
if ((user == null) || (o_number == null)) {
|
|
throw new Error("dah!");
|
|
}
|
|
return (state_vector[user] == null) || state_vector[user] <= o_number;
|
|
};
|
|
_ref = this.buffer;
|
|
for (u_name in _ref) {
|
|
user = _ref[u_name];
|
|
for (o_number in user) {
|
|
o = user[o_number];
|
|
if (o.doSync && unknown(u_name, o_number)) {
|
|
o_json = o._encode();
|
|
if (o.next_cl != null) {
|
|
o_next = o.next_cl;
|
|
while ((o_next.next_cl != null) && unknown(o_next.creator, o_next.op_number)) {
|
|
o_next = o_next.next_cl;
|
|
}
|
|
o_json.next = o_next.getUid();
|
|
} else if (o.prev_cl != null) {
|
|
o_prev = o.prev_cl;
|
|
while ((o_prev.prev_cl != null) && unknown(o_prev.creator, o_prev.op_number)) {
|
|
o_prev = o_prev.prev_cl;
|
|
}
|
|
o_json.prev = o_prev.getUid();
|
|
}
|
|
json.push(o_json);
|
|
}
|
|
}
|
|
}
|
|
return json;
|
|
};
|
|
|
|
HistoryBuffer.prototype.getNextOperationIdentifier = function(user_id) {
|
|
var uid;
|
|
if (user_id == null) {
|
|
user_id = this.user_id;
|
|
}
|
|
if (this.operation_counter[user_id] == null) {
|
|
this.operation_counter[user_id] = 0;
|
|
}
|
|
uid = {
|
|
'creator': user_id,
|
|
'op_number': this.operation_counter[user_id]
|
|
};
|
|
this.operation_counter[user_id]++;
|
|
return uid;
|
|
};
|
|
|
|
HistoryBuffer.prototype.getOperation = function(uid) {
|
|
var _ref;
|
|
if (uid instanceof Object) {
|
|
return (_ref = this.buffer[uid.creator]) != null ? _ref[uid.op_number] : void 0;
|
|
} else if (uid == null) {
|
|
|
|
} else {
|
|
throw new Error("This type of uid is not defined!");
|
|
}
|
|
};
|
|
|
|
HistoryBuffer.prototype.addOperation = function(o) {
|
|
if (this.buffer[o.creator] == null) {
|
|
this.buffer[o.creator] = {};
|
|
}
|
|
if (this.buffer[o.creator][o.op_number] != null) {
|
|
throw new Error("You must not overwrite operations!");
|
|
}
|
|
this.buffer[o.creator][o.op_number] = o;
|
|
if (this.number_of_operations_added_to_HB == null) {
|
|
this.number_of_operations_added_to_HB = 0;
|
|
}
|
|
this.number_of_operations_added_to_HB++;
|
|
return o;
|
|
};
|
|
|
|
HistoryBuffer.prototype.removeOperation = function(o) {
|
|
var _ref;
|
|
return (_ref = this.buffer[o.creator]) != null ? delete _ref[o.op_number] : void 0;
|
|
};
|
|
|
|
HistoryBuffer.prototype.addToCounter = function(o) {
|
|
var _results;
|
|
if (this.operation_counter[o.creator] == null) {
|
|
this.operation_counter[o.creator] = 0;
|
|
}
|
|
if (typeof o.op_number === 'number' && o.creator !== this.getUserId()) {
|
|
if (o.op_number === this.operation_counter[o.creator]) {
|
|
this.operation_counter[o.creator]++;
|
|
_results = [];
|
|
while (this.getOperation({
|
|
creator: o.creator,
|
|
op_number: this.operation_counter[o.creator]
|
|
}) != null) {
|
|
_results.push(this.operation_counter[o.creator]++);
|
|
}
|
|
return _results;
|
|
}
|
|
}
|
|
};
|
|
|
|
return HistoryBuffer;
|
|
|
|
})();
|
|
|
|
module.exports = HistoryBuffer;
|
|
|
|
|
|
},{}],4:[function(require,module,exports){
|
|
var __slice = [].slice,
|
|
__hasProp = {}.hasOwnProperty,
|
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
|
|
|
module.exports = function(HB) {
|
|
var Delete, Delimiter, ImmutableObject, Insert, Operation, execution_listener, parser;
|
|
parser = {};
|
|
execution_listener = [];
|
|
Operation = (function() {
|
|
function Operation(uid) {
|
|
this.is_deleted = false;
|
|
this.doSync = true;
|
|
this.garbage_collected = false;
|
|
if (uid == null) {
|
|
uid = HB.getNextOperationIdentifier();
|
|
}
|
|
if (uid.doSync == null) {
|
|
uid.doSync = !isNaN(parseInt(uid.op_number));
|
|
}
|
|
this.creator = uid['creator'], this.op_number = uid['op_number'], this.doSync = uid['doSync'];
|
|
}
|
|
|
|
Operation.prototype.type = "Insert";
|
|
|
|
Operation.prototype.on = function(events, f) {
|
|
var e, _base, _i, _len, _results;
|
|
if (this.event_listeners == null) {
|
|
this.event_listeners = {};
|
|
}
|
|
if (events.constructor !== [].constructor) {
|
|
events = [events];
|
|
}
|
|
_results = [];
|
|
for (_i = 0, _len = events.length; _i < _len; _i++) {
|
|
e = events[_i];
|
|
if ((_base = this.event_listeners)[e] == null) {
|
|
_base[e] = [];
|
|
}
|
|
_results.push(this.event_listeners[e].push(f));
|
|
}
|
|
return _results;
|
|
};
|
|
|
|
Operation.prototype.deleteListener = function(events, f) {
|
|
var e, _i, _len, _ref, _results;
|
|
if (events.constructor !== [].constructor) {
|
|
events = [events];
|
|
}
|
|
_results = [];
|
|
for (_i = 0, _len = events.length; _i < _len; _i++) {
|
|
e = events[_i];
|
|
if (((_ref = this.event_listeners) != null ? _ref[e] : void 0) != null) {
|
|
_results.push(this.event_listeners[e] = this.event_listeners[e].filter(function(g) {
|
|
return f !== g;
|
|
}));
|
|
} else {
|
|
_results.push(void 0);
|
|
}
|
|
}
|
|
return _results;
|
|
};
|
|
|
|
Operation.prototype.callEvent = function() {
|
|
return this.forwardEvent.apply(this, [this].concat(__slice.call(arguments)));
|
|
};
|
|
|
|
Operation.prototype.forwardEvent = function() {
|
|
var args, event, f, op, _i, _len, _ref, _ref1, _results;
|
|
op = arguments[0], event = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
|
|
if (((_ref = this.event_listeners) != null ? _ref[event] : void 0) != null) {
|
|
_ref1 = this.event_listeners[event];
|
|
_results = [];
|
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
|
f = _ref1[_i];
|
|
_results.push(f.call.apply(f, [op, event].concat(__slice.call(args))));
|
|
}
|
|
return _results;
|
|
}
|
|
};
|
|
|
|
Operation.prototype.isDeleted = function() {
|
|
return this.is_deleted;
|
|
};
|
|
|
|
Operation.prototype.applyDelete = function(garbagecollect) {
|
|
if (garbagecollect == null) {
|
|
garbagecollect = true;
|
|
}
|
|
if (!this.garbage_collected) {
|
|
this.is_deleted = true;
|
|
if (garbagecollect) {
|
|
this.garbage_collected = true;
|
|
return HB.addToGarbageCollector(this);
|
|
}
|
|
}
|
|
};
|
|
|
|
Operation.prototype.cleanup = function() {
|
|
return HB.removeOperation(this);
|
|
};
|
|
|
|
Operation.prototype.setParent = function(parent) {
|
|
this.parent = parent;
|
|
};
|
|
|
|
Operation.prototype.getParent = function() {
|
|
return this.parent;
|
|
};
|
|
|
|
Operation.prototype.getUid = function() {
|
|
return {
|
|
'creator': this.creator,
|
|
'op_number': this.op_number,
|
|
'sync': this.doSync
|
|
};
|
|
};
|
|
|
|
Operation.prototype.dontSync = function() {
|
|
return this.doSync = false;
|
|
};
|
|
|
|
Operation.prototype.execute = function() {
|
|
var l, _i, _len;
|
|
this.is_executed = true;
|
|
for (_i = 0, _len = execution_listener.length; _i < _len; _i++) {
|
|
l = execution_listener[_i];
|
|
l(this._encode());
|
|
}
|
|
return this;
|
|
};
|
|
|
|
Operation.prototype.saveOperation = function(name, op) {
|
|
if ((op != null ? op.execute : void 0) != null) {
|
|
return this[name] = op;
|
|
} else if (op != null) {
|
|
if (this.unchecked == null) {
|
|
this.unchecked = {};
|
|
}
|
|
return this.unchecked[name] = op;
|
|
}
|
|
};
|
|
|
|
Operation.prototype.validateSavedOperations = function() {
|
|
var name, op, op_uid, success, uninstantiated, _ref;
|
|
uninstantiated = {};
|
|
success = this;
|
|
_ref = this.unchecked;
|
|
for (name in _ref) {
|
|
op_uid = _ref[name];
|
|
op = HB.getOperation(op_uid);
|
|
if (op) {
|
|
this[name] = op;
|
|
} else {
|
|
uninstantiated[name] = op_uid;
|
|
success = false;
|
|
}
|
|
}
|
|
delete this.unchecked;
|
|
if (!success) {
|
|
this.unchecked = uninstantiated;
|
|
}
|
|
return success;
|
|
};
|
|
|
|
return Operation;
|
|
|
|
})();
|
|
Delete = (function(_super) {
|
|
__extends(Delete, _super);
|
|
|
|
function Delete(uid, deletes) {
|
|
this.saveOperation('deletes', deletes);
|
|
Delete.__super__.constructor.call(this, uid);
|
|
}
|
|
|
|
Delete.prototype.type = "Delete";
|
|
|
|
Delete.prototype._encode = function() {
|
|
return {
|
|
'type': "Delete",
|
|
'uid': this.getUid(),
|
|
'deletes': this.deletes.getUid()
|
|
};
|
|
};
|
|
|
|
Delete.prototype.execute = function() {
|
|
if (this.validateSavedOperations()) {
|
|
this.deletes.applyDelete(this);
|
|
return Delete.__super__.execute.apply(this, arguments);
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
return Delete;
|
|
|
|
})(Operation);
|
|
parser['Delete'] = function(o) {
|
|
var deletes_uid, uid;
|
|
uid = o['uid'], deletes_uid = o['deletes'];
|
|
return new Delete(uid, deletes_uid);
|
|
};
|
|
Insert = (function(_super) {
|
|
__extends(Insert, _super);
|
|
|
|
function Insert(uid, prev_cl, next_cl, origin) {
|
|
this.saveOperation('prev_cl', prev_cl);
|
|
this.saveOperation('next_cl', next_cl);
|
|
if (origin != null) {
|
|
this.saveOperation('origin', origin);
|
|
} else {
|
|
this.saveOperation('origin', prev_cl);
|
|
}
|
|
Insert.__super__.constructor.call(this, uid);
|
|
}
|
|
|
|
Insert.prototype.type = "Insert";
|
|
|
|
Insert.prototype.applyDelete = function(o) {
|
|
var callLater, garbagecollect, _ref;
|
|
if (this.deleted_by == null) {
|
|
this.deleted_by = [];
|
|
}
|
|
callLater = false;
|
|
if ((this.parent != null) && !this.isDeleted()) {
|
|
callLater = true;
|
|
}
|
|
if (o != null) {
|
|
this.deleted_by.push(o);
|
|
}
|
|
garbagecollect = false;
|
|
if (!((this.prev_cl != null) && (this.next_cl != null)) || this.prev_cl.isDeleted()) {
|
|
garbagecollect = true;
|
|
}
|
|
Insert.__super__.applyDelete.call(this, garbagecollect);
|
|
if (callLater) {
|
|
this.parent.callEvent("delete", this, o);
|
|
}
|
|
if ((_ref = this.next_cl) != null ? _ref.isDeleted() : void 0) {
|
|
return this.next_cl.applyDelete();
|
|
}
|
|
};
|
|
|
|
Insert.prototype.cleanup = function() {
|
|
var d, o, _i, _len, _ref, _ref1;
|
|
if ((_ref = this.prev_cl) != null ? _ref.isDeleted() : void 0) {
|
|
_ref1 = this.deleted_by;
|
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
|
d = _ref1[_i];
|
|
d.cleanup();
|
|
}
|
|
o = this.next_cl;
|
|
while (o.type !== "Delimiter") {
|
|
if (o.origin === this) {
|
|
o.origin = this.prev_cl;
|
|
}
|
|
o = o.next_cl;
|
|
}
|
|
this.prev_cl.next_cl = this.next_cl;
|
|
this.next_cl.prev_cl = this.prev_cl;
|
|
return Insert.__super__.cleanup.apply(this, arguments);
|
|
}
|
|
};
|
|
|
|
Insert.prototype.getDistanceToOrigin = function() {
|
|
var d, o;
|
|
d = 0;
|
|
o = this.prev_cl;
|
|
while (true) {
|
|
if (this.origin === o) {
|
|
break;
|
|
}
|
|
d++;
|
|
o = o.prev_cl;
|
|
}
|
|
return d;
|
|
};
|
|
|
|
Insert.prototype.execute = function(fire_event) {
|
|
var distance_to_origin, i, o, parent, _ref;
|
|
if (fire_event == null) {
|
|
fire_event = true;
|
|
}
|
|
if (!this.validateSavedOperations()) {
|
|
return false;
|
|
} else {
|
|
if (this.prev_cl != null) {
|
|
distance_to_origin = this.getDistanceToOrigin();
|
|
o = this.prev_cl.next_cl;
|
|
i = distance_to_origin;
|
|
while (true) {
|
|
if (o !== this.next_cl) {
|
|
if (o.getDistanceToOrigin() === i) {
|
|
if (o.creator < this.creator) {
|
|
this.prev_cl = o;
|
|
distance_to_origin = i + 1;
|
|
} else {
|
|
|
|
}
|
|
} else if (o.getDistanceToOrigin() < i) {
|
|
if (i - distance_to_origin <= o.getDistanceToOrigin()) {
|
|
this.prev_cl = o;
|
|
distance_to_origin = i + 1;
|
|
} else {
|
|
|
|
}
|
|
} else {
|
|
break;
|
|
}
|
|
i++;
|
|
o = o.next_cl;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
this.next_cl = this.prev_cl.next_cl;
|
|
this.prev_cl.next_cl = this;
|
|
this.next_cl.prev_cl = this;
|
|
}
|
|
parent = (_ref = this.prev_cl) != null ? _ref.getParent() : void 0;
|
|
if ((parent != null) && fire_event) {
|
|
this.setParent(parent);
|
|
this.parent.callEvent("insert", this);
|
|
}
|
|
return Insert.__super__.execute.apply(this, arguments);
|
|
}
|
|
};
|
|
|
|
Insert.prototype.getPosition = function() {
|
|
var position, prev;
|
|
position = 0;
|
|
prev = this.prev_cl;
|
|
while (true) {
|
|
if (prev instanceof Delimiter) {
|
|
break;
|
|
}
|
|
if (!prev.isDeleted()) {
|
|
position++;
|
|
}
|
|
prev = prev.prev_cl;
|
|
}
|
|
return position;
|
|
};
|
|
|
|
return Insert;
|
|
|
|
})(Operation);
|
|
ImmutableObject = (function(_super) {
|
|
__extends(ImmutableObject, _super);
|
|
|
|
function ImmutableObject(uid, content, prev, next, origin) {
|
|
this.content = content;
|
|
ImmutableObject.__super__.constructor.call(this, uid, prev, next, origin);
|
|
}
|
|
|
|
ImmutableObject.prototype.type = "ImmutableObject";
|
|
|
|
ImmutableObject.prototype.val = function() {
|
|
return this.content;
|
|
};
|
|
|
|
ImmutableObject.prototype._encode = function() {
|
|
var json;
|
|
json = {
|
|
'type': "ImmutableObject",
|
|
'uid': this.getUid(),
|
|
'content': this.content
|
|
};
|
|
if (this.prev_cl != null) {
|
|
json['prev'] = this.prev_cl.getUid();
|
|
}
|
|
if (this.next_cl != null) {
|
|
json['next'] = this.next_cl.getUid();
|
|
}
|
|
if (this.origin != null) {
|
|
json["origin"] = this.origin().getUid();
|
|
}
|
|
return json;
|
|
};
|
|
|
|
return ImmutableObject;
|
|
|
|
})(Operation);
|
|
parser['ImmutableObject'] = function(json) {
|
|
var content, next, origin, prev, uid;
|
|
uid = json['uid'], content = json['content'], prev = json['prev'], next = json['next'], origin = json['origin'];
|
|
return new ImmutableObject(uid, content, prev, next, origin);
|
|
};
|
|
Delimiter = (function(_super) {
|
|
__extends(Delimiter, _super);
|
|
|
|
function Delimiter(uid, prev_cl, next_cl, origin) {
|
|
this.saveOperation('prev_cl', prev_cl);
|
|
this.saveOperation('next_cl', next_cl);
|
|
this.saveOperation('origin', prev_cl);
|
|
Delimiter.__super__.constructor.call(this, uid);
|
|
}
|
|
|
|
Delimiter.prototype.type = "Delimiter";
|
|
|
|
Delimiter.prototype.applyDelete = function() {
|
|
var o;
|
|
Delimiter.__super__.applyDelete.call(this);
|
|
o = this.next_cl;
|
|
while (o != null) {
|
|
o.applyDelete();
|
|
o = o.next_cl;
|
|
}
|
|
return void 0;
|
|
};
|
|
|
|
Delimiter.prototype.cleanup = function() {
|
|
return Delimiter.__super__.cleanup.call(this);
|
|
};
|
|
|
|
Delimiter.prototype.execute = function() {
|
|
var _ref, _ref1;
|
|
if (((_ref = this.unchecked) != null ? _ref['next_cl'] : void 0) != null) {
|
|
return Delimiter.__super__.execute.apply(this, arguments);
|
|
} else if ((_ref1 = this.unchecked) != null ? _ref1['prev_cl'] : void 0) {
|
|
if (this.validateSavedOperations()) {
|
|
if (this.prev_cl.next_cl != null) {
|
|
throw new Error("Probably duplicated operations");
|
|
}
|
|
this.prev_cl.next_cl = this;
|
|
delete this.prev_cl.unchecked.next_cl;
|
|
return Delimiter.__super__.execute.apply(this, arguments);
|
|
} else {
|
|
return false;
|
|
}
|
|
} else if ((this.prev_cl != null) && (this.prev_cl.next_cl == null)) {
|
|
delete this.prev_cl.unchecked.next_cl;
|
|
return this.prev_cl.next_cl = this;
|
|
} else if ((this.prev_cl != null) || (this.next_cl != null)) {
|
|
return Delimiter.__super__.execute.apply(this, arguments);
|
|
} else {
|
|
throw new Error("Delimiter is unsufficient defined!");
|
|
}
|
|
};
|
|
|
|
Delimiter.prototype._encode = function() {
|
|
var _ref, _ref1;
|
|
return {
|
|
'type': "Delimiter",
|
|
'uid': this.getUid(),
|
|
'prev': (_ref = this.prev_cl) != null ? _ref.getUid() : void 0,
|
|
'next': (_ref1 = this.next_cl) != null ? _ref1.getUid() : void 0
|
|
};
|
|
};
|
|
|
|
return Delimiter;
|
|
|
|
})(Operation);
|
|
parser['Delimiter'] = function(json) {
|
|
var next, prev, uid;
|
|
uid = json['uid'], prev = json['prev'], next = json['next'];
|
|
return new Delimiter(uid, prev, next);
|
|
};
|
|
return {
|
|
'types': {
|
|
'Delete': Delete,
|
|
'Insert': Insert,
|
|
'Delimiter': Delimiter,
|
|
'Operation': Operation,
|
|
'ImmutableObject': ImmutableObject
|
|
},
|
|
'parser': parser,
|
|
'execution_listener': execution_listener
|
|
};
|
|
};
|
|
|
|
|
|
},{}],5:[function(require,module,exports){
|
|
var text_types_uninitialized,
|
|
__hasProp = {}.hasOwnProperty,
|
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
|
__slice = [].slice;
|
|
|
|
text_types_uninitialized = require("./TextTypes");
|
|
|
|
module.exports = function(HB) {
|
|
var JsonType, createJsonTypeWrapper, parser, text_types, types;
|
|
text_types = text_types_uninitialized(HB);
|
|
types = text_types.types;
|
|
parser = text_types.parser;
|
|
createJsonTypeWrapper = function(_jsonType) {
|
|
var JsonTypeWrapper;
|
|
JsonTypeWrapper = (function() {
|
|
function JsonTypeWrapper(jsonType) {
|
|
var name, obj, _fn, _ref;
|
|
_ref = jsonType.map;
|
|
_fn = function(name, obj) {
|
|
return Object.defineProperty(JsonTypeWrapper.prototype, name, {
|
|
get: function() {
|
|
var x;
|
|
x = obj.val();
|
|
if (x instanceof JsonType) {
|
|
return createJsonTypeWrapper(x);
|
|
} else if (x instanceof types.ImmutableObject) {
|
|
return x.val();
|
|
} else {
|
|
return x;
|
|
}
|
|
},
|
|
set: function(o) {
|
|
var o_name, o_obj, overwrite, _results;
|
|
overwrite = jsonType.val(name);
|
|
if (o.constructor === {}.constructor && overwrite instanceof types.Operation) {
|
|
_results = [];
|
|
for (o_name in o) {
|
|
o_obj = o[o_name];
|
|
_results.push(overwrite.val(o_name, o_obj, 'immutable'));
|
|
}
|
|
return _results;
|
|
} else {
|
|
return jsonType.val(name, o, 'immutable');
|
|
}
|
|
},
|
|
enumerable: true,
|
|
configurable: false
|
|
});
|
|
};
|
|
for (name in _ref) {
|
|
obj = _ref[name];
|
|
_fn(name, obj);
|
|
}
|
|
}
|
|
|
|
return JsonTypeWrapper;
|
|
|
|
})();
|
|
return new JsonTypeWrapper(_jsonType);
|
|
};
|
|
JsonType = (function(_super) {
|
|
__extends(JsonType, _super);
|
|
|
|
function JsonType(uid, initial_value, mutable) {
|
|
var name, o;
|
|
JsonType.__super__.constructor.call(this, uid);
|
|
if (initial_value != null) {
|
|
if (typeof initial_value !== "object") {
|
|
throw new Error("The initial value of JsonTypes must be of type Object! (current type: " + (typeof initial_value) + ")");
|
|
}
|
|
for (name in initial_value) {
|
|
o = initial_value[name];
|
|
this.val(name, o, mutable);
|
|
}
|
|
}
|
|
}
|
|
|
|
JsonType.prototype.type = "JsonType";
|
|
|
|
JsonType.prototype.applyDelete = function() {
|
|
return JsonType.__super__.applyDelete.call(this);
|
|
};
|
|
|
|
JsonType.prototype.cleanup = function() {
|
|
return JsonType.__super__.cleanup.call(this);
|
|
};
|
|
|
|
JsonType.prototype.toJson = function() {
|
|
var json, name, o, val;
|
|
val = this.val();
|
|
json = {};
|
|
for (name in val) {
|
|
o = val[name];
|
|
if (o === null) {
|
|
json[name] = o;
|
|
} else if (o.constructor === {}.constructor) {
|
|
json[name] = this.val(name).toJson();
|
|
} else if (o instanceof types.Operation) {
|
|
while (o instanceof types.Operation) {
|
|
o = o.val();
|
|
}
|
|
json[name] = o;
|
|
} else {
|
|
json[name] = o;
|
|
}
|
|
}
|
|
return json;
|
|
};
|
|
|
|
JsonType.prototype.setReplaceManager = function(replace_manager) {
|
|
this.replace_manager = replace_manager;
|
|
return this.on(['change', 'addProperty'], function() {
|
|
var _ref;
|
|
if (replace_manager.parent != null) {
|
|
return (_ref = replace_manager.parent).forwardEvent.apply(_ref, [this].concat(__slice.call(arguments)));
|
|
}
|
|
});
|
|
};
|
|
|
|
JsonType.prototype.getParent = function() {
|
|
return this.replace_manager.parent;
|
|
};
|
|
|
|
JsonType.prototype.mutable_default = true;
|
|
|
|
JsonType.prototype.setMutableDefault = function(mutable) {
|
|
if (mutable === true || mutable === 'mutable') {
|
|
JsonType.prototype.mutable_default = true;
|
|
} else if (mutable === false || mutable === 'immutable') {
|
|
JsonType.prototype.mutable_default = false;
|
|
} else {
|
|
throw new Error('Set mutable either "mutable" or "immutable"!');
|
|
}
|
|
return 'OK';
|
|
};
|
|
|
|
JsonType.prototype.val = function(name, content, mutable) {
|
|
var json, obj, word;
|
|
if (typeof name === 'object') {
|
|
json = new JsonType(void 0, name, content);
|
|
HB.addOperation(json).execute();
|
|
this.replace_manager.replace(json);
|
|
return this;
|
|
} else if ((name != null) && arguments.length > 1) {
|
|
if (mutable != null) {
|
|
if (mutable === true || mutable === 'mutable') {
|
|
mutable = true;
|
|
} else {
|
|
mutable = false;
|
|
}
|
|
} else {
|
|
mutable = this.mutable_default;
|
|
}
|
|
if (typeof content === 'function') {
|
|
return this;
|
|
} else if ((content == null) || (((!mutable) || typeof content === 'number') && content.constructor !== Object)) {
|
|
obj = HB.addOperation(new types.ImmutableObject(void 0, content)).execute();
|
|
return JsonType.__super__.val.call(this, name, obj);
|
|
} else {
|
|
if (typeof content === 'string') {
|
|
word = HB.addOperation(new types.WordType(void 0)).execute();
|
|
word.insertText(0, content);
|
|
return JsonType.__super__.val.call(this, name, word);
|
|
} else if (content.constructor === Object) {
|
|
json = HB.addOperation(new JsonType(void 0, content, mutable)).execute();
|
|
return JsonType.__super__.val.call(this, name, json);
|
|
} else {
|
|
throw new Error("You must not set " + (typeof content) + "-types in collaborative Json-objects!");
|
|
}
|
|
}
|
|
} else {
|
|
return JsonType.__super__.val.call(this, name, content);
|
|
}
|
|
};
|
|
|
|
Object.defineProperty(JsonType.prototype, 'value', {
|
|
get: function() {
|
|
return createJsonTypeWrapper(this);
|
|
},
|
|
set: function(o) {
|
|
var o_name, o_obj, _results;
|
|
if (o.constructor === {}.constructor) {
|
|
_results = [];
|
|
for (o_name in o) {
|
|
o_obj = o[o_name];
|
|
_results.push(this.val(o_name, o_obj, 'immutable'));
|
|
}
|
|
return _results;
|
|
} else {
|
|
throw new Error("You must only set Object values!");
|
|
}
|
|
}
|
|
});
|
|
|
|
JsonType.prototype._encode = function() {
|
|
return {
|
|
'type': "JsonType",
|
|
'uid': this.getUid()
|
|
};
|
|
};
|
|
|
|
return JsonType;
|
|
|
|
})(types.MapManager);
|
|
parser['JsonType'] = function(json) {
|
|
var uid;
|
|
uid = json['uid'];
|
|
return new JsonType(uid);
|
|
};
|
|
types['JsonType'] = JsonType;
|
|
return text_types;
|
|
};
|
|
|
|
|
|
},{"./TextTypes":7}],6:[function(require,module,exports){
|
|
var basic_types_uninitialized,
|
|
__hasProp = {}.hasOwnProperty,
|
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
|
|
|
basic_types_uninitialized = require("./BasicTypes");
|
|
|
|
module.exports = function(HB) {
|
|
var AddName, ListManager, MapManager, ReplaceManager, Replaceable, basic_types, parser, types;
|
|
basic_types = basic_types_uninitialized(HB);
|
|
types = basic_types.types;
|
|
parser = basic_types.parser;
|
|
MapManager = (function(_super) {
|
|
__extends(MapManager, _super);
|
|
|
|
function MapManager(uid) {
|
|
this.map = {};
|
|
MapManager.__super__.constructor.call(this, uid);
|
|
}
|
|
|
|
MapManager.prototype.type = "MapManager";
|
|
|
|
MapManager.prototype.applyDelete = function() {
|
|
var name, p, _ref;
|
|
_ref = this.map;
|
|
for (name in _ref) {
|
|
p = _ref[name];
|
|
p.applyDelete();
|
|
}
|
|
return MapManager.__super__.applyDelete.call(this);
|
|
};
|
|
|
|
MapManager.prototype.cleanup = function() {
|
|
return MapManager.__super__.cleanup.call(this);
|
|
};
|
|
|
|
MapManager.prototype.val = function(name, content) {
|
|
var o, obj, result, _ref, _ref1;
|
|
if (content != null) {
|
|
if (this.map[name] == null) {
|
|
HB.addOperation(new AddName(void 0, this, name)).execute();
|
|
}
|
|
this.map[name].replace(content);
|
|
return this;
|
|
} else if (name != null) {
|
|
obj = (_ref = this.map[name]) != null ? _ref.val() : void 0;
|
|
if (obj instanceof types.ImmutableObject) {
|
|
return obj.val();
|
|
} else {
|
|
return obj;
|
|
}
|
|
} else {
|
|
result = {};
|
|
_ref1 = this.map;
|
|
for (name in _ref1) {
|
|
o = _ref1[name];
|
|
obj = o.val();
|
|
if (obj instanceof types.ImmutableObject || obj instanceof MapManager) {
|
|
obj = obj.val();
|
|
}
|
|
result[name] = obj;
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
return MapManager;
|
|
|
|
})(types.Operation);
|
|
AddName = (function(_super) {
|
|
__extends(AddName, _super);
|
|
|
|
function AddName(uid, map_manager, name) {
|
|
this.name = name;
|
|
this.saveOperation('map_manager', map_manager);
|
|
AddName.__super__.constructor.call(this, uid);
|
|
}
|
|
|
|
AddName.prototype.type = "AddName";
|
|
|
|
AddName.prototype.applyDelete = function() {
|
|
return AddName.__super__.applyDelete.call(this);
|
|
};
|
|
|
|
AddName.prototype.cleanup = function() {
|
|
return AddName.__super__.cleanup.call(this);
|
|
};
|
|
|
|
AddName.prototype.execute = function() {
|
|
var beg, end, uid_beg, uid_end, uid_r, _base;
|
|
if (!this.validateSavedOperations()) {
|
|
return false;
|
|
} else {
|
|
uid_r = this.map_manager.getUid();
|
|
uid_r.op_number = "_" + uid_r.op_number + "_RM_" + this.name;
|
|
if (HB.getOperation(uid_r) == null) {
|
|
uid_beg = this.map_manager.getUid();
|
|
uid_beg.op_number = "_" + uid_beg.op_number + "_RM_" + this.name + "_beginning";
|
|
uid_end = this.map_manager.getUid();
|
|
uid_end.op_number = "_" + uid_end.op_number + "_RM_" + this.name + "_end";
|
|
beg = HB.addOperation(new types.Delimiter(uid_beg, void 0, uid_end)).execute();
|
|
end = HB.addOperation(new types.Delimiter(uid_end, beg, void 0)).execute();
|
|
this.map_manager.map[this.name] = HB.addOperation(new ReplaceManager(void 0, uid_r, beg, end));
|
|
this.map_manager.map[this.name].setParent(this.map_manager, this.name);
|
|
((_base = this.map_manager.map[this.name]).add_name_ops != null ? _base.add_name_ops : _base.add_name_ops = []).push(this);
|
|
this.map_manager.map[this.name].execute();
|
|
}
|
|
return AddName.__super__.execute.apply(this, arguments);
|
|
}
|
|
};
|
|
|
|
AddName.prototype._encode = function() {
|
|
return {
|
|
'type': "AddName",
|
|
'uid': this.getUid(),
|
|
'map_manager': this.map_manager.getUid(),
|
|
'name': this.name
|
|
};
|
|
};
|
|
|
|
return AddName;
|
|
|
|
})(types.Operation);
|
|
parser['AddName'] = function(json) {
|
|
var map_manager, name, uid;
|
|
map_manager = json['map_manager'], uid = json['uid'], name = json['name'];
|
|
return new AddName(uid, map_manager, name);
|
|
};
|
|
ListManager = (function(_super) {
|
|
__extends(ListManager, _super);
|
|
|
|
function ListManager(uid, beginning, end, prev, next, origin) {
|
|
if ((beginning != null) && (end != null)) {
|
|
this.saveOperation('beginning', beginning);
|
|
this.saveOperation('end', end);
|
|
} else {
|
|
this.beginning = HB.addOperation(new types.Delimiter(void 0, void 0, void 0));
|
|
this.end = HB.addOperation(new types.Delimiter(void 0, this.beginning, void 0));
|
|
this.beginning.next_cl = this.end;
|
|
this.beginning.execute();
|
|
this.end.execute();
|
|
}
|
|
ListManager.__super__.constructor.call(this, uid, prev, next, origin);
|
|
}
|
|
|
|
ListManager.prototype.type = "ListManager";
|
|
|
|
ListManager.prototype.execute = function() {
|
|
if (this.validateSavedOperations()) {
|
|
this.beginning.setParent(this);
|
|
this.end.setParent(this);
|
|
return ListManager.__super__.execute.apply(this, arguments);
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
ListManager.prototype.getLastOperation = function() {
|
|
return this.end.prev_cl;
|
|
};
|
|
|
|
ListManager.prototype.getFirstOperation = function() {
|
|
return this.beginning.next_cl;
|
|
};
|
|
|
|
ListManager.prototype.toArray = function() {
|
|
var o, result;
|
|
o = this.beginning.next_cl;
|
|
result = [];
|
|
while (o !== this.end) {
|
|
result.push(o);
|
|
o = o.next_cl;
|
|
}
|
|
return result;
|
|
};
|
|
|
|
ListManager.prototype.getOperationByPosition = function(position) {
|
|
var o;
|
|
o = this.beginning.next_cl;
|
|
if ((position > 0 || o.isDeleted()) && !(o instanceof types.Delimiter)) {
|
|
while (o.isDeleted() && !(o instanceof types.Delimiter)) {
|
|
o = o.next_cl;
|
|
}
|
|
while (true) {
|
|
if (o instanceof types.Delimiter) {
|
|
break;
|
|
}
|
|
if (position <= 0 && !o.isDeleted()) {
|
|
break;
|
|
}
|
|
o = o.next_cl;
|
|
if (!o.isDeleted()) {
|
|
position -= 1;
|
|
}
|
|
}
|
|
}
|
|
return o;
|
|
};
|
|
|
|
return ListManager;
|
|
|
|
})(types.Operation);
|
|
ReplaceManager = (function(_super) {
|
|
__extends(ReplaceManager, _super);
|
|
|
|
function ReplaceManager(initial_content, uid, beginning, end, prev, next, origin) {
|
|
ReplaceManager.__super__.constructor.call(this, uid, beginning, end, prev, next, origin);
|
|
if (initial_content != null) {
|
|
this.replace(initial_content);
|
|
}
|
|
}
|
|
|
|
ReplaceManager.prototype.type = "ReplaceManager";
|
|
|
|
ReplaceManager.prototype.applyDelete = function() {
|
|
var o, _i, _len, _ref;
|
|
o = this.beginning;
|
|
while (o != null) {
|
|
o.applyDelete();
|
|
o = o.next_cl;
|
|
}
|
|
if (this.add_name_ops != null) {
|
|
_ref = this.add_name_ops;
|
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|
o = _ref[_i];
|
|
o.applyDelete();
|
|
}
|
|
}
|
|
return ReplaceManager.__super__.applyDelete.call(this);
|
|
};
|
|
|
|
ReplaceManager.prototype.cleanup = function() {
|
|
return ReplaceManager.__super__.cleanup.call(this);
|
|
};
|
|
|
|
ReplaceManager.prototype.replace = function(content, replaceable_uid) {
|
|
var o, op;
|
|
o = this.getLastOperation();
|
|
op = new Replaceable(content, this, replaceable_uid, o, o.next_cl);
|
|
HB.addOperation(op).execute();
|
|
return void 0;
|
|
};
|
|
|
|
ReplaceManager.prototype.setParent = function(parent, property_name) {
|
|
var addPropertyListener, repl_manager;
|
|
repl_manager = this;
|
|
this.on('insert', function(event, op) {
|
|
if (op.next_cl instanceof types.Delimiter) {
|
|
return repl_manager.parent.callEvent('change', property_name, op);
|
|
}
|
|
});
|
|
this.on('change', function(event, op) {
|
|
if (repl_manager !== this) {
|
|
return repl_manager.parent.callEvent('change', property_name, op);
|
|
}
|
|
});
|
|
addPropertyListener = function(event, op) {
|
|
repl_manager.deleteListener('addProperty', addPropertyListener);
|
|
return repl_manager.parent.callEvent('addProperty', property_name, op);
|
|
};
|
|
this.on('insert', addPropertyListener);
|
|
return ReplaceManager.__super__.setParent.call(this, parent);
|
|
};
|
|
|
|
ReplaceManager.prototype.val = function() {
|
|
var o;
|
|
o = this.getLastOperation();
|
|
return typeof o.val === "function" ? o.val() : void 0;
|
|
};
|
|
|
|
ReplaceManager.prototype._encode = function() {
|
|
var json;
|
|
json = {
|
|
'type': "ReplaceManager",
|
|
'uid': this.getUid(),
|
|
'beginning': this.beginning.getUid(),
|
|
'end': this.end.getUid()
|
|
};
|
|
if ((this.prev_cl != null) && (this.next_cl != null)) {
|
|
json['prev'] = this.prev_cl.getUid();
|
|
json['next'] = this.next_cl.getUid();
|
|
}
|
|
if (this.origin != null) {
|
|
json["origin"] = this.origin().getUid();
|
|
}
|
|
return json;
|
|
};
|
|
|
|
return ReplaceManager;
|
|
|
|
})(ListManager);
|
|
parser["ReplaceManager"] = function(json) {
|
|
var beginning, content, end, next, origin, prev, uid;
|
|
content = json['content'], uid = json['uid'], prev = json['prev'], next = json['next'], origin = json['origin'], beginning = json['beginning'], end = json['end'];
|
|
return new ReplaceManager(content, uid, beginning, end, prev, next, origin);
|
|
};
|
|
Replaceable = (function(_super) {
|
|
__extends(Replaceable, _super);
|
|
|
|
function Replaceable(content, parent, uid, prev, next, origin) {
|
|
this.saveOperation('content', content);
|
|
this.saveOperation('parent', parent);
|
|
if (!((prev != null) && (next != null))) {
|
|
throw new Error("You must define prev, and next for Replaceable-types!");
|
|
}
|
|
Replaceable.__super__.constructor.call(this, uid, prev, next, origin);
|
|
}
|
|
|
|
Replaceable.prototype.type = "Replaceable";
|
|
|
|
Replaceable.prototype.val = function() {
|
|
return this.content;
|
|
};
|
|
|
|
Replaceable.prototype.replace = function(content) {
|
|
return this.parent.replace(content);
|
|
};
|
|
|
|
Replaceable.prototype.applyDelete = function() {
|
|
if (this.content != null) {
|
|
this.content.applyDelete();
|
|
this.content.dontSync();
|
|
}
|
|
this.content = null;
|
|
return Replaceable.__super__.applyDelete.apply(this, arguments);
|
|
};
|
|
|
|
Replaceable.prototype.cleanup = function() {
|
|
return Replaceable.__super__.cleanup.apply(this, arguments);
|
|
};
|
|
|
|
Replaceable.prototype.execute = function() {
|
|
var ins_result, _ref;
|
|
if (!this.validateSavedOperations()) {
|
|
return false;
|
|
} else {
|
|
if ((_ref = this.content) != null) {
|
|
if (typeof _ref.setReplaceManager === "function") {
|
|
_ref.setReplaceManager(this.parent);
|
|
}
|
|
}
|
|
ins_result = Replaceable.__super__.execute.call(this, this.content != null);
|
|
if (ins_result) {
|
|
if (this.next_cl.type === "Delimiter" && this.prev_cl.type !== "Delimiter") {
|
|
this.prev_cl.applyDelete();
|
|
} else if (this.next_cl.type !== "Delimiter") {
|
|
this.applyDelete();
|
|
}
|
|
}
|
|
return ins_result;
|
|
}
|
|
};
|
|
|
|
Replaceable.prototype._encode = function() {
|
|
var json, _ref;
|
|
json = {
|
|
'type': "Replaceable",
|
|
'content': (_ref = this.content) != null ? _ref.getUid() : void 0,
|
|
'ReplaceManager': this.parent.getUid(),
|
|
'prev': this.prev_cl.getUid(),
|
|
'next': this.next_cl.getUid(),
|
|
'uid': this.getUid()
|
|
};
|
|
if ((this.origin != null) && this.origin !== this.prev_cl) {
|
|
json["origin"] = this.origin.getUid();
|
|
}
|
|
return json;
|
|
};
|
|
|
|
return Replaceable;
|
|
|
|
})(types.Insert);
|
|
parser["Replaceable"] = function(json) {
|
|
var content, next, origin, parent, prev, uid;
|
|
content = json['content'], parent = json['ReplaceManager'], uid = json['uid'], prev = json['prev'], next = json['next'], origin = json['origin'];
|
|
return new Replaceable(content, parent, uid, prev, next, origin);
|
|
};
|
|
types['ListManager'] = ListManager;
|
|
types['MapManager'] = MapManager;
|
|
types['ReplaceManager'] = ReplaceManager;
|
|
types['Replaceable'] = Replaceable;
|
|
return basic_types;
|
|
};
|
|
|
|
|
|
},{"./BasicTypes":4}],7:[function(require,module,exports){
|
|
var structured_types_uninitialized,
|
|
__hasProp = {}.hasOwnProperty,
|
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
|
|
|
structured_types_uninitialized = require("./StructuredTypes");
|
|
|
|
module.exports = function(HB) {
|
|
var TextDelete, TextInsert, WordType, parser, structured_types, types;
|
|
structured_types = structured_types_uninitialized(HB);
|
|
types = structured_types.types;
|
|
parser = structured_types.parser;
|
|
TextDelete = (function(_super) {
|
|
__extends(TextDelete, _super);
|
|
|
|
function TextDelete() {
|
|
return TextDelete.__super__.constructor.apply(this, arguments);
|
|
}
|
|
|
|
return TextDelete;
|
|
|
|
})(types.Delete);
|
|
parser["TextDelete"] = parser["Delete"];
|
|
TextInsert = (function(_super) {
|
|
__extends(TextInsert, _super);
|
|
|
|
function TextInsert(content, uid, prev, next, origin) {
|
|
if ((content != null ? content.creator : void 0) != null) {
|
|
this.saveOperation('content', content);
|
|
} else {
|
|
this.content = content;
|
|
}
|
|
if (!((prev != null) && (next != null))) {
|
|
throw new Error("You must define prev, and next for TextInsert-types!");
|
|
}
|
|
TextInsert.__super__.constructor.call(this, uid, prev, next, origin);
|
|
}
|
|
|
|
TextInsert.prototype.type = "TextInsert";
|
|
|
|
TextInsert.prototype.getLength = function() {
|
|
if (this.isDeleted()) {
|
|
return 0;
|
|
} else {
|
|
return this.content.length;
|
|
}
|
|
};
|
|
|
|
TextInsert.prototype.applyDelete = function() {
|
|
TextInsert.__super__.applyDelete.apply(this, arguments);
|
|
if (this.content instanceof types.Operation) {
|
|
this.content.applyDelete();
|
|
}
|
|
return this.content = null;
|
|
};
|
|
|
|
TextInsert.prototype.execute = function() {
|
|
if (!this.validateSavedOperations()) {
|
|
return false;
|
|
} else {
|
|
if (this.content instanceof types.Operation) {
|
|
this.content.insert_parent = this;
|
|
}
|
|
return TextInsert.__super__.execute.call(this);
|
|
}
|
|
};
|
|
|
|
TextInsert.prototype.val = function(current_position) {
|
|
if (this.isDeleted() || (this.content == null)) {
|
|
return "";
|
|
} else {
|
|
return this.content;
|
|
}
|
|
};
|
|
|
|
TextInsert.prototype._encode = function() {
|
|
var json, _ref;
|
|
json = {
|
|
'type': "TextInsert",
|
|
'uid': this.getUid(),
|
|
'prev': this.prev_cl.getUid(),
|
|
'next': this.next_cl.getUid()
|
|
};
|
|
if (((_ref = this.content) != null ? _ref.getUid : void 0) != null) {
|
|
json['content'] = this.content.getUid();
|
|
} else {
|
|
json['content'] = this.content;
|
|
}
|
|
if (this.origin !== this.prev_cl) {
|
|
json["origin"] = this.origin.getUid();
|
|
}
|
|
return json;
|
|
};
|
|
|
|
return TextInsert;
|
|
|
|
})(types.Insert);
|
|
parser["TextInsert"] = function(json) {
|
|
var content, next, origin, prev, uid;
|
|
content = json['content'], uid = json['uid'], prev = json['prev'], next = json['next'], origin = json['origin'];
|
|
return new TextInsert(content, uid, prev, next, origin);
|
|
};
|
|
WordType = (function(_super) {
|
|
__extends(WordType, _super);
|
|
|
|
function WordType(uid, beginning, end, prev, next, origin) {
|
|
WordType.__super__.constructor.call(this, uid, beginning, end, prev, next, origin);
|
|
}
|
|
|
|
WordType.prototype.type = "WordType";
|
|
|
|
WordType.prototype.applyDelete = function() {
|
|
var o;
|
|
o = this.beginning;
|
|
while (o != null) {
|
|
o.applyDelete();
|
|
o = o.next_cl;
|
|
}
|
|
return WordType.__super__.applyDelete.call(this);
|
|
};
|
|
|
|
WordType.prototype.cleanup = function() {
|
|
return WordType.__super__.cleanup.call(this);
|
|
};
|
|
|
|
WordType.prototype.push = function(content) {
|
|
return this.insertAfter(this.end.prev_cl, content);
|
|
};
|
|
|
|
WordType.prototype.insertAfter = function(left, content) {
|
|
var c, op, right, _i, _len;
|
|
while (left.isDeleted()) {
|
|
left = left.prev_cl;
|
|
}
|
|
right = left.next_cl;
|
|
if (content.type != null) {
|
|
op = new TextInsert(content, void 0, left, right);
|
|
HB.addOperation(op).execute();
|
|
} else {
|
|
for (_i = 0, _len = content.length; _i < _len; _i++) {
|
|
c = content[_i];
|
|
op = new TextInsert(c, void 0, left, right);
|
|
HB.addOperation(op).execute();
|
|
left = op;
|
|
}
|
|
}
|
|
return this;
|
|
};
|
|
|
|
WordType.prototype.insertText = function(position, content) {
|
|
var ith, left;
|
|
ith = this.getOperationByPosition(position);
|
|
left = ith.prev_cl;
|
|
return this.insertAfter(left, content);
|
|
};
|
|
|
|
WordType.prototype.deleteText = function(position, length) {
|
|
var d, delete_ops, i, o, _i;
|
|
o = this.getOperationByPosition(position);
|
|
delete_ops = [];
|
|
for (i = _i = 0; 0 <= length ? _i < length : _i > length; i = 0 <= length ? ++_i : --_i) {
|
|
if (o instanceof types.Delimiter) {
|
|
break;
|
|
}
|
|
d = HB.addOperation(new TextDelete(void 0, o)).execute();
|
|
o = o.next_cl;
|
|
while (!(o instanceof types.Delimiter) && o.isDeleted()) {
|
|
o = o.next_cl;
|
|
}
|
|
delete_ops.push(d._encode());
|
|
}
|
|
return this;
|
|
};
|
|
|
|
WordType.prototype.replaceText = function(text) {
|
|
var word;
|
|
if (this.replace_manager != null) {
|
|
word = HB.addOperation(new WordType(void 0)).execute();
|
|
word.insertText(0, text);
|
|
this.replace_manager.replace(word);
|
|
return word;
|
|
} else {
|
|
throw new Error("This type is currently not maintained by a ReplaceManager!");
|
|
}
|
|
};
|
|
|
|
WordType.prototype.val = function() {
|
|
var c, o;
|
|
c = (function() {
|
|
var _i, _len, _ref, _results;
|
|
_ref = this.toArray();
|
|
_results = [];
|
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|
o = _ref[_i];
|
|
if (o.val != null) {
|
|
_results.push(o.val());
|
|
} else {
|
|
_results.push("");
|
|
}
|
|
}
|
|
return _results;
|
|
}).call(this);
|
|
return c.join('');
|
|
};
|
|
|
|
WordType.prototype.toString = function() {
|
|
return this.val();
|
|
};
|
|
|
|
WordType.prototype.setReplaceManager = function(op) {
|
|
this.saveOperation('replace_manager', op);
|
|
this.validateSavedOperations();
|
|
this.on('insert', (function(_this) {
|
|
return function(event, ins) {
|
|
var _ref;
|
|
return (_ref = _this.replace_manager) != null ? _ref.forwardEvent(_this, 'change', ins) : void 0;
|
|
};
|
|
})(this));
|
|
return this.on('delete', (function(_this) {
|
|
return function(event, ins, del) {
|
|
var _ref;
|
|
return (_ref = _this.replace_manager) != null ? _ref.forwardEvent(_this, 'change', del) : void 0;
|
|
};
|
|
})(this));
|
|
};
|
|
|
|
WordType.prototype.bind = function(textfield) {
|
|
var word;
|
|
word = this;
|
|
textfield.value = this.val();
|
|
this.on("insert", function(event, op) {
|
|
var fix, left, o_pos, right;
|
|
o_pos = op.getPosition();
|
|
fix = function(cursor) {
|
|
if (cursor <= o_pos) {
|
|
return cursor;
|
|
} else {
|
|
cursor += 1;
|
|
return cursor;
|
|
}
|
|
};
|
|
left = fix(textfield.selectionStart);
|
|
right = fix(textfield.selectionEnd);
|
|
textfield.value = word.val();
|
|
return textfield.setSelectionRange(left, right);
|
|
});
|
|
this.on("delete", function(event, op) {
|
|
var fix, left, o_pos, right;
|
|
o_pos = op.getPosition();
|
|
fix = function(cursor) {
|
|
if (cursor < o_pos) {
|
|
return cursor;
|
|
} else {
|
|
cursor -= 1;
|
|
return cursor;
|
|
}
|
|
};
|
|
left = fix(textfield.selectionStart);
|
|
right = fix(textfield.selectionEnd);
|
|
textfield.value = word.val();
|
|
return textfield.setSelectionRange(left, right);
|
|
});
|
|
textfield.onkeypress = function(event) {
|
|
var char, diff, new_pos, pos;
|
|
char = null;
|
|
if (event.key != null) {
|
|
if (event.charCode === 32) {
|
|
char = " ";
|
|
} else if (event.keyCode === 13) {
|
|
char = '\n';
|
|
} else {
|
|
char = event.key;
|
|
}
|
|
} else {
|
|
char = String.fromCharCode(event.keyCode);
|
|
}
|
|
if (char.length > 0) {
|
|
pos = Math.min(textfield.selectionStart, textfield.selectionEnd);
|
|
diff = Math.abs(textfield.selectionEnd - textfield.selectionStart);
|
|
word.deleteText(pos, diff);
|
|
word.insertText(pos, char);
|
|
new_pos = pos + char.length;
|
|
textfield.setSelectionRange(new_pos, new_pos);
|
|
return event.preventDefault();
|
|
} else {
|
|
return event.preventDefault();
|
|
}
|
|
};
|
|
textfield.onpaste = function(event) {
|
|
return event.preventDefault();
|
|
};
|
|
textfield.oncut = function(event) {
|
|
return event.preventDefault();
|
|
};
|
|
return textfield.onkeydown = function(event) {
|
|
var del_length, diff, new_pos, pos, val;
|
|
pos = Math.min(textfield.selectionStart, textfield.selectionEnd);
|
|
diff = Math.abs(textfield.selectionEnd - textfield.selectionStart);
|
|
if ((event.keyCode != null) && event.keyCode === 8) {
|
|
if (diff > 0) {
|
|
word.deleteText(pos, diff);
|
|
textfield.setSelectionRange(pos, pos);
|
|
} else {
|
|
if ((event.ctrlKey != null) && event.ctrlKey) {
|
|
val = textfield.value;
|
|
new_pos = pos;
|
|
del_length = 0;
|
|
if (pos > 0) {
|
|
new_pos--;
|
|
del_length++;
|
|
}
|
|
while (new_pos > 0 && val[new_pos] !== " " && val[new_pos] !== '\n') {
|
|
new_pos--;
|
|
del_length++;
|
|
}
|
|
word.deleteText(new_pos, pos - new_pos);
|
|
textfield.setSelectionRange(new_pos, new_pos);
|
|
} else {
|
|
word.deleteText(pos - 1, 1);
|
|
}
|
|
}
|
|
return event.preventDefault();
|
|
} else if ((event.keyCode != null) && event.keyCode === 46) {
|
|
if (diff > 0) {
|
|
word.deleteText(pos, diff);
|
|
textfield.setSelectionRange(pos, pos);
|
|
} else {
|
|
word.deleteText(pos, 1);
|
|
textfield.setSelectionRange(pos, pos);
|
|
}
|
|
return event.preventDefault();
|
|
}
|
|
};
|
|
};
|
|
|
|
WordType.prototype._encode = function() {
|
|
var json;
|
|
json = {
|
|
'type': "WordType",
|
|
'uid': this.getUid(),
|
|
'beginning': this.beginning.getUid(),
|
|
'end': this.end.getUid()
|
|
};
|
|
if (this.prev_cl != null) {
|
|
json['prev'] = this.prev_cl.getUid();
|
|
}
|
|
if (this.next_cl != null) {
|
|
json['next'] = this.next_cl.getUid();
|
|
}
|
|
if (this.origin != null) {
|
|
json["origin"] = this.origin().getUid();
|
|
}
|
|
return json;
|
|
};
|
|
|
|
return WordType;
|
|
|
|
})(types.ListManager);
|
|
parser['WordType'] = function(json) {
|
|
var beginning, end, next, origin, prev, uid;
|
|
uid = json['uid'], beginning = json['beginning'], end = json['end'], prev = json['prev'], next = json['next'], origin = json['origin'];
|
|
return new WordType(uid, beginning, end, prev, next, origin);
|
|
};
|
|
types['TextInsert'] = TextInsert;
|
|
types['TextDelete'] = TextDelete;
|
|
types['WordType'] = WordType;
|
|
return structured_types;
|
|
};
|
|
|
|
|
|
},{"./StructuredTypes":6}],8:[function(require,module,exports){
|
|
var dont_proxy, json_types_uninitialized, proxy_token, _proxy,
|
|
__hasProp = {}.hasOwnProperty,
|
|
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
|
|
|
json_types_uninitialized = require("./JsonTypes");
|
|
|
|
proxy_token = false;
|
|
|
|
dont_proxy = function(f) {
|
|
var e;
|
|
proxy_token = true;
|
|
try {
|
|
f();
|
|
} catch (_error) {
|
|
e = _error;
|
|
proxy_token = false;
|
|
throw new Error(e);
|
|
}
|
|
return proxy_token = false;
|
|
};
|
|
|
|
_proxy = function(f_name, f) {
|
|
var old_f;
|
|
old_f = this[f_name];
|
|
if (old_f != null) {
|
|
return this[f_name] = function() {
|
|
var args, that, _ref;
|
|
if (!proxy_token && !((_ref = this._yatta) != null ? _ref.isDeleted() : void 0)) {
|
|
that = this;
|
|
args = arguments;
|
|
return dont_proxy(function() {
|
|
f.apply(that, args);
|
|
return old_f.apply(that, args);
|
|
});
|
|
} else {
|
|
return old_f.apply(this, arguments);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
|
|
if (typeof Element !== "undefined" && Element !== null) {
|
|
Element.prototype._proxy = _proxy;
|
|
}
|
|
|
|
module.exports = function(HB) {
|
|
var TextNodeType, XmlType, json_types, parser, types;
|
|
json_types = json_types_uninitialized(HB);
|
|
types = json_types.types;
|
|
parser = json_types.parser;
|
|
XmlType = (function(_super) {
|
|
__extends(XmlType, _super);
|
|
|
|
function XmlType(uid, tagname, attributes, elements, xml) {
|
|
var attr, d, element, i, n, word, _i, _j, _len, _ref, _ref1, _ref2;
|
|
this.tagname = tagname;
|
|
this.xml = xml;
|
|
|
|
/* In case you make this instanceof Insert again
|
|
if prev? and (not next?) and prev.type?
|
|
* adjust what you actually mean. you want to insert after prev, then
|
|
* next is not defined. but we only insert after non-deleted elements.
|
|
* This is also handled in TextInsert.
|
|
while prev.isDeleted()
|
|
prev = prev.prev_cl
|
|
next = prev.next_cl
|
|
*/
|
|
XmlType.__super__.constructor.call(this, uid);
|
|
if (((_ref = this.xml) != null ? _ref._yatta : void 0) != null) {
|
|
d = new types.Delete(void 0, this.xml._yatta);
|
|
HB.addOperation(d).execute();
|
|
this.xml._yatta = null;
|
|
}
|
|
if ((attributes != null) && (elements != null)) {
|
|
this.saveOperation('attributes', attributes);
|
|
this.saveOperation('elements', elements);
|
|
} else if ((attributes == null) && (elements == null)) {
|
|
this.attributes = new types.JsonType();
|
|
this.attributes.setMutableDefault('immutable');
|
|
HB.addOperation(this.attributes).execute();
|
|
this.elements = new types.WordType();
|
|
this.elements.parent = this;
|
|
HB.addOperation(this.elements).execute();
|
|
} else {
|
|
throw new Error("Either define attribute and elements both, or none of them");
|
|
}
|
|
if (this.xml != null) {
|
|
this.tagname = this.xml.tagName;
|
|
for (i = _i = 0, _ref1 = this.xml.attributes.length; 0 <= _ref1 ? _i < _ref1 : _i > _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
|
|
attr = xml.attributes[i];
|
|
this.attributes.val(attr.name, attr.value);
|
|
}
|
|
_ref2 = this.xml.childNodes;
|
|
for (_j = 0, _len = _ref2.length; _j < _len; _j++) {
|
|
n = _ref2[_j];
|
|
if (n.nodeType === n.TEXT_NODE) {
|
|
word = new TextNodeType(void 0, n);
|
|
HB.addOperation(word).execute();
|
|
this.elements.push(word);
|
|
} else if (n.nodeType === n.ELEMENT_NODE) {
|
|
element = new XmlType(void 0, void 0, void 0, void 0, n);
|
|
HB.addOperation(element).execute();
|
|
this.elements.push(element);
|
|
} else {
|
|
throw new Error("I don't know Node-type " + n.nodeType + "!!");
|
|
}
|
|
}
|
|
this.setXmlProxy();
|
|
}
|
|
void 0;
|
|
}
|
|
|
|
XmlType.prototype.type = "XmlType";
|
|
|
|
XmlType.prototype.applyDelete = function(op) {
|
|
if ((this.insert_parent != null) && !this.insert_parent.isDeleted()) {
|
|
return this.insert_parent.applyDelete(op);
|
|
} else {
|
|
this.attributes.applyDelete();
|
|
this.elements.applyDelete();
|
|
return XmlType.__super__.applyDelete.apply(this, arguments);
|
|
}
|
|
};
|
|
|
|
XmlType.prototype.cleanup = function() {
|
|
return XmlType.__super__.cleanup.call(this);
|
|
};
|
|
|
|
XmlType.prototype.setXmlProxy = function() {
|
|
var findNode, insertBefore, removeChild, renewClassList, that;
|
|
this.xml._yatta = this;
|
|
that = this;
|
|
this.elements.on('insert', function(event, op) {
|
|
var newNode, right, rightNode;
|
|
if (op.creator !== HB.getUserId() && this === that.elements) {
|
|
newNode = op.content.val();
|
|
right = op.next_cl;
|
|
while ((right != null) && right.isDeleted()) {
|
|
right = right.next_cl;
|
|
}
|
|
rightNode = null;
|
|
if (right.type !== 'Delimiter') {
|
|
rightNode = right.val().val();
|
|
}
|
|
return dont_proxy(function() {
|
|
return that.xml.insertBefore(newNode, rightNode);
|
|
});
|
|
}
|
|
});
|
|
this.elements.on('delete', function(event, op) {
|
|
var del_op, deleted;
|
|
del_op = op.deleted_by[0];
|
|
if ((del_op != null) && del_op.creator !== HB.getUserId() && this === that.elements) {
|
|
deleted = op.content.val();
|
|
return dont_proxy(function() {
|
|
return that.xml.removeChild(deleted);
|
|
});
|
|
}
|
|
});
|
|
this.attributes.on(['addProperty', 'change'], function(event, property_name, op) {
|
|
if (op.creator !== HB.getUserId() && this === that.attributes) {
|
|
return dont_proxy(function() {
|
|
var newval;
|
|
newval = op.val().val();
|
|
if (newval != null) {
|
|
return that.xml.setAttribute(property_name, op.val().val());
|
|
} else {
|
|
return that.xml.removeAttribute(property_name);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
findNode = function(child) {
|
|
var elem;
|
|
if (child == null) {
|
|
throw new Error("you must specify a parameter!");
|
|
}
|
|
child = child._yatta;
|
|
elem = that.elements.beginning.next_cl;
|
|
while (elem.type !== 'Delimiter' && elem.content !== child) {
|
|
elem = elem.next_cl;
|
|
}
|
|
if (elem.type === 'Delimiter') {
|
|
return false;
|
|
} else {
|
|
return elem;
|
|
}
|
|
};
|
|
insertBefore = function(insertedNode_s, adjacentNode) {
|
|
var child, element, inserted_nodes, next, prev, _results;
|
|
next = null;
|
|
if (adjacentNode != null) {
|
|
next = findNode(adjacentNode);
|
|
}
|
|
prev = null;
|
|
if (next) {
|
|
prev = next.prev_cl;
|
|
} else {
|
|
prev = this._yatta.elements.end.prev_cl;
|
|
while (prev.isDeleted()) {
|
|
prev = prev.prev_cl;
|
|
}
|
|
}
|
|
inserted_nodes = null;
|
|
if (insertedNode_s.nodeType === insertedNode_s.DOCUMENT_FRAGMENT_NODE) {
|
|
child = insertedNode_s.lastChild;
|
|
_results = [];
|
|
while (child != null) {
|
|
element = new XmlType(void 0, void 0, void 0, void 0, child);
|
|
HB.addOperation(element).execute();
|
|
that.elements.insertAfter(prev, element);
|
|
_results.push(child = child.previousSibling);
|
|
}
|
|
return _results;
|
|
} else {
|
|
element = new XmlType(void 0, void 0, void 0, void 0, insertedNode_s);
|
|
HB.addOperation(element).execute();
|
|
return that.elements.insertAfter(prev, element);
|
|
}
|
|
};
|
|
this.xml._proxy('insertBefore', insertBefore);
|
|
this.xml._proxy('appendChild', insertBefore);
|
|
this.xml._proxy('removeAttribute', function(name) {
|
|
return that.attributes.val(name, void 0);
|
|
});
|
|
this.xml._proxy('setAttribute', function(name, value) {
|
|
return that.attributes.val(name, value);
|
|
});
|
|
renewClassList = function(newclass) {
|
|
var dont_do_it, elem, value, _i, _len;
|
|
dont_do_it = false;
|
|
if (newclass != null) {
|
|
for (_i = 0, _len = this.length; _i < _len; _i++) {
|
|
elem = this[_i];
|
|
if (newclass === elem) {
|
|
dont_do_it = true;
|
|
}
|
|
}
|
|
}
|
|
value = Array.prototype.join.call(this, " ");
|
|
if ((newclass != null) && !dont_do_it) {
|
|
value += " " + newclass;
|
|
}
|
|
return that.attributes.val('class', value);
|
|
};
|
|
_proxy.call(this.xml.classList, 'add', renewClassList);
|
|
_proxy.call(this.xml.classList, 'remove', renewClassList);
|
|
this.xml.__defineSetter__('className', function(val) {
|
|
return this.setAttribute('class', val);
|
|
});
|
|
this.xml.__defineGetter__('className', function() {
|
|
return that.attributes.val('class');
|
|
});
|
|
this.xml.__defineSetter__('textContent', function(val) {
|
|
var elem, remove, text_node;
|
|
elem = that.xml.firstChild;
|
|
while (elem != null) {
|
|
remove = elem;
|
|
elem = elem.nextSibling;
|
|
that.xml.removeChild(remove);
|
|
}
|
|
if (val !== "") {
|
|
text_node = document.createTextNode(val);
|
|
return that.xml.appendChild(text_node);
|
|
}
|
|
});
|
|
removeChild = function(node) {
|
|
var d, elem;
|
|
elem = findNode(node);
|
|
if (!elem) {
|
|
throw new Error("You are only allowed to delete existing (direct) child elements!");
|
|
}
|
|
d = new types.Delete(void 0, elem);
|
|
HB.addOperation(d).execute();
|
|
return node._yatta = null;
|
|
};
|
|
this.xml._proxy('removeChild', removeChild);
|
|
return this.xml._proxy('replaceChild', function(insertedNode, replacedNode) {
|
|
insertBefore.call(this, insertedNode, replacedNode);
|
|
return removeChild.call(this, replacedNode);
|
|
});
|
|
};
|
|
|
|
XmlType.prototype.val = function(enforce) {
|
|
var a, attr, attr_name, e, n, text_node, value;
|
|
if (enforce == null) {
|
|
enforce = false;
|
|
}
|
|
if (typeof document !== "undefined" && document !== null) {
|
|
if ((this.xml == null) || enforce) {
|
|
this.xml = document.createElement(this.tagname);
|
|
attr = this.attributes.val();
|
|
for (attr_name in attr) {
|
|
value = attr[attr_name];
|
|
if (value != null) {
|
|
a = document.createAttribute(attr_name);
|
|
a.value = value;
|
|
this.xml.setAttributeNode(a);
|
|
}
|
|
}
|
|
e = this.elements.beginning.next_cl;
|
|
while (e.type !== "Delimiter") {
|
|
n = e.content;
|
|
if (!e.isDeleted() && (e.content != null)) {
|
|
if (n.type === "XmlType") {
|
|
this.xml.appendChild(n.val(enforce));
|
|
} else if (n.type === "TextNodeType") {
|
|
text_node = n.val();
|
|
this.xml.appendChild(text_node);
|
|
} else {
|
|
throw new Error("Internal structure cannot be transformed to dom");
|
|
}
|
|
}
|
|
e = e.next_cl;
|
|
}
|
|
}
|
|
this.setXmlProxy();
|
|
return this.xml;
|
|
}
|
|
};
|
|
|
|
XmlType.prototype.execute = function() {
|
|
return XmlType.__super__.execute.call(this);
|
|
};
|
|
|
|
|
|
/*
|
|
if not @validateSavedOperations()
|
|
return false
|
|
else
|
|
|
|
return true
|
|
*/
|
|
|
|
XmlType.prototype.getParent = function() {
|
|
return this.parent;
|
|
};
|
|
|
|
XmlType.prototype._encode = function() {
|
|
var json;
|
|
json = {
|
|
'type': this.type,
|
|
'attributes': this.attributes.getUid(),
|
|
'elements': this.elements.getUid(),
|
|
'tagname': this.tagname,
|
|
'uid': this.getUid()
|
|
};
|
|
return json;
|
|
};
|
|
|
|
return XmlType;
|
|
|
|
})(types.Insert);
|
|
parser['XmlType'] = function(json) {
|
|
var attributes, elements, tagname, uid;
|
|
uid = json['uid'], attributes = json['attributes'], elements = json['elements'], tagname = json['tagname'];
|
|
return new XmlType(uid, tagname, attributes, elements, void 0);
|
|
};
|
|
TextNodeType = (function(_super) {
|
|
__extends(TextNodeType, _super);
|
|
|
|
function TextNodeType(uid, content) {
|
|
var d;
|
|
if (content._yatta != null) {
|
|
d = new types.Delete(void 0, content._yatta);
|
|
HB.addOperation(d).execute();
|
|
content._yatta = null;
|
|
}
|
|
content._yatta = this;
|
|
TextNodeType.__super__.constructor.call(this, uid, content);
|
|
}
|
|
|
|
TextNodeType.prototype.applyDelete = function(op) {
|
|
if ((this.insert_parent != null) && !this.insert_parent.isDeleted()) {
|
|
return this.insert_parent.applyDelete(op);
|
|
} else {
|
|
return TextNodeType.__super__.applyDelete.apply(this, arguments);
|
|
}
|
|
};
|
|
|
|
TextNodeType.prototype.type = "TextNodeType";
|
|
|
|
TextNodeType.prototype._encode = function() {
|
|
var json;
|
|
json = {
|
|
'type': this.type,
|
|
'uid': this.getUid(),
|
|
'content': this.content.textContent
|
|
};
|
|
return json;
|
|
};
|
|
|
|
return TextNodeType;
|
|
|
|
})(types.ImmutableObject);
|
|
parser['TextNodeType'] = function(json) {
|
|
var content, textnode, uid;
|
|
uid = json['uid'], content = json['content'];
|
|
textnode = document.createTextNode(content);
|
|
return new TextNodeType(uid, textnode);
|
|
};
|
|
types['XmlType'] = XmlType;
|
|
return json_types;
|
|
};
|
|
|
|
|
|
},{"./JsonTypes":5}]},{},[2])
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3VidW50dS93b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzL2d1bHAtYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiL2hvbWUvdWJ1bnR1L3dvcmtzcGFjZS9saWIvRW5naW5lLmNvZmZlZSIsIi9ob21lL3VidW50dS93b3Jrc3BhY2UvbGliL0ZyYW1ld29ya3MvWG1sRnJhbWV3b3JrLmNvZmZlZSIsIi9ob21lL3VidW50dS93b3Jrc3BhY2UvbGliL0hpc3RvcnlCdWZmZXIuY29mZmVlIiwiL2hvbWUvdWJ1bnR1L3dvcmtzcGFjZS9saWIvVHlwZXMvQmFzaWNUeXBlcy5jb2ZmZWUiLCIvaG9tZS91YnVudHUvd29ya3NwYWNlL2xpYi9UeXBlcy9Kc29uVHlwZXMuY29mZmVlIiwiL2hvbWUvdWJ1bnR1L3dvcmtzcGFjZS9saWIvVHlwZXMvU3RydWN0dXJlZFR5cGVzLmNvZmZlZSIsIi9ob21lL3VidW50dS93b3Jrc3BhY2UvbGliL1R5cGVzL1RleHRUeXBlcy5jb2ZmZWUiLCIvaG9tZS91YnVudHUvd29ya3NwYWNlL2xpYi9UeXBlcy9YbWxUeXBlcy5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNLQSxJQUFBLE1BQUE7O0FBQUE7QUFNZSxFQUFBLGdCQUFFLEVBQUYsRUFBTyxNQUFQLEdBQUE7QUFDWCxJQURZLElBQUMsQ0FBQSxLQUFBLEVBQ2IsQ0FBQTtBQUFBLElBRGlCLElBQUMsQ0FBQSxTQUFBLE1BQ2xCLENBQUE7QUFBQSxJQUFBLElBQUMsQ0FBQSxlQUFELEdBQW1CLEVBQW5CLENBRFc7RUFBQSxDQUFiOztBQUFBLG1CQU1BLGNBQUEsR0FBZ0IsU0FBQyxJQUFELEdBQUE7QUFDZCxRQUFBLFVBQUE7QUFBQSxJQUFBLFVBQUEsR0FBYSxJQUFDLENBQUEsTUFBTyxDQUFBLElBQUksQ0FBQyxJQUFMLENBQXJCLENBQUE7QUFDQSxJQUFBLElB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QUssQ0FBQSxhQUFhLENBQUMsU0FBZixDQUFBLENBQTNCO2VBQ0UsSUFBQyxDQUFBLGFBQWEsQ0FBQyxXQUFmLENBQTJCLEVBQTNCLEVBREY7T0FBQSxNQUFBO2VBR0UsK0NBQUEsU0FBQSxFQUhGO09BRFc7SUFBQSxDQVJiLENBQUE7O0FBQUEsMkJBZUEsSUFBQSxHQUFNLGNBZk4sQ0FBQTs7QUFBQSwyQkFvQkEsT0FBQSxHQUFTLFNBQUEsR0FBQTtBQUNQLFVBQUEsSUFBQTtBQUFBLE1BQUEsSUFBQSxHQUFPO0FBQUEsUUFDTCxNQUFBLEVBQVEsSUFBQyxDQUFBLElBREo7QUFBQSxRQUVMLEtBQUEsRUFBUSxJQUFDLENBQUEsTUFBRCxDQUFBLENBRkg7QUFBQSxRQUdMLFNBQUEsRUFBWSxJQUFDLENBQUEsT0FBTyxDQUFDLFdBSGhCO09BQVAsQ0FBQTthQUtBLEtBTk87SUFBQSxDQXBCVCxDQUFBOzt3QkFBQTs7S0FOeUIsS0FBSyxDQUFDLGdCQS9SakMsQ0FBQTtBQUFBLEVBaVVBLE1BQU8sQ0FBQSxjQUFBLENBQVAsR0FBeUIsU0FBQyxJQUFELEdBQUE7QUFDdkIsUUFBQSxzQkFBQTtBQUFBLElBQ1UsV0FBUixNQURGLEVBRWMsZUFBWixVQUZGLENBQUE7QUFBQSxJQUlBLFFBQUEsR0FBVyxRQUFRLENBQUMsY0FBVCxDQUF3QixPQUF4QixDQUpYLENBQUE7V0FLSSxJQUFBLFlBQUEsQ0FBYSxHQUFiLEVBQWtCLFFBQWxCLEVBTm1CO0VBQUEsQ0FqVXpCLENBQUE7QUFBQSxFQXlVQSxLQUFNLENBQUEsU0FBQSxDQUFOLEdBQW1CLE9BelVuQixDQUFBO1NBMlVBLFdBNVVlO0FBQUEsQ0FoQ2pCLENBQUEiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKX12YXIgZj1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwoZi5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxmLGYuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXHJcbiNcclxuIyBAbm9kb2NcclxuIyBUaGUgRW5naW5lIGhhbmRsZXMgaG93IGFuZCBpbiB3aGljaCBvcmRlciB0byBleGVjdXRlIG9wZXJhdGlvbnMgYW5kIGFkZCBvcGVyYXRpb25zIHRvIHRoZSBIaXN0b3J5QnVmZmVyLlxyXG4jXHJcbmNsYXNzIEVuZ2luZVxyXG5cclxuICAjXHJcbiAgIyBAcGFyYW0ge0hpc3RvcnlCdWZmZXJ9IEhCXHJcbiAgIyBAcGFyYW0ge0FycmF5fSBwYXJzZXIgRGVmaW5lcyBob3cgdG8gcGFyc2UgZW5jb2RlZCBtZXNzYWdlcy5cclxuICAjXHJcbiAgY29uc3RydWN0b3I6IChASEIsIEBwYXJzZXIpLT5cclxuICAgIEB1bnByb2Nlc3NlZF9vcHMgPSBbXVxyXG5cclxuICAjXHJcbiAgIyBQYXJzZXMgYW4gb3BlcmF0aW8gZnJvbSB0aGUganNvbiBmb3JtYXQuIEl0IHVzZXMgdGhlIHNwZWNpZmllZCBwYXJzZXIgaW4geW91ciBPcGVyYXRpb25UeXBlIG1vZHVsZS5cclxuICAjXHJcbiAgcGFyc2VPcGVyYXRpb246IChqc29uKS0+XHJcbiAgICB0eXBlUGFyc2VyID0gQHBhcnNlcltqc29uLnR5cGVdXHJcbiAgICBpZiB0eXBlUGFyc2VyP1xyXG4gICAgICB0eXBlUGFyc2VyIGpzb25cclxuICAgIGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEVycm9yIFwiWW91IGZvcmdvdCB0byBzcGVjaWZ5IGEgcGFyc2VyIGZvciB0eXBlICN7anNvbi50eXBlfS4gVGhlIG1lc3NhZ2UgaXMgI3tKU09OLnN0cmluZ2lmeSBqc29ufS5cIlxyXG5cclxuICAjXHJcbiAgIyBBcHBseSBhIHNldCBvZiBvcGVyYXRpb25zLiBFLmcuIHRoZSBvcGVyYXRpb25zIHlvdSByZWNlaXZlZCBmcm9tIGFub3RoZXIgdXNlcnMgSEIuX2VuY29kZSgpLlxyXG4gICMgQG5vdGUgWW91IG11c3Qgbm90IHVzZSB0aGlzIG1ldGhvZCB3aGVuIHlvdSBhbHJlYWR5IGhhdmUgb3BzIGluIHlvdXIgSEIhXHJcbiAgI1xyXG4gIGFwcGx5T3BzQnVuZGxlOiAob3BzX2pzb24pLT5cclxuICAgIG9wcyA9IFtdXHJcbiAgICBmb3IgbyBpbiBvcHNfanNvblxyXG4gICAgICBvcHMucHVzaCBAcGFyc2VPcGVyYXRpb24gb1xyXG4gICAgZm9yIG8gaW4gb3BzXHJcbiAgICAgIEBIQi5hZGRPcGVyYXRpb24gb1xyXG4gICAgZm9yIG8gaW4gb3BzXHJcbiAgICAgIGlmIG5vdCBvLmV4ZWN1dGUoKVxyXG4gICAgICAgIEB1bnByb2Nlc3NlZF9vcHMucHVzaCBvXHJcbiAgICBAdHJ5VW5wcm9jZXNzZWQoKVxyXG5cclxuICAjXHJcbiAgIyBTYW1lIGFzIGFwcGx5T3BzIGJ1dCBvcGVyYXRpb25zIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIEhCIGFyZSBub3QgYXBwbGllZC5cclxuICAjIEBzZWUgRW5naW5lLmFwcGx5T3BzXHJcbiAgI1xyXG4gIGFwcGx5T3BzQ2hlY2tEb3VibGU6IChvcHNfanNvbiktPlxyXG4gICAgZm9yIG8gaW4gb3BzX2pzb25cclxuICAgICAgaWYgbm90IEBIQi5nZXRPcGVyYXRpb24oby51aWQpP1xyXG4gICAgICAgIEBhcHBseU9wIG9cclxuXHJcbiAgI1xyXG4gICMgQXBwbHkgYSBzZXQgb2Ygb3BlcmF0aW9ucy4gKEhlbHBlciBmb3IgdXNpbmcgYXBwbHlPcCBvbiBBcnJheXMpXHJcbiAgIyBAc2VlIEVuZ2luZS5hcHBseU9wXHJcbiAgYXBwbHlPcHM6IChvcHNfanNvbiktPlxyXG4gICAgZm9yIG8gaW4gb3BzX2pzb25cclxuICAgICAgQGFwcGx5T3Agb1xyXG5cclxuICAjXHJcbiAgIyBBcHBseSBhbiBvcGVyYXRpb24gdGhhdCB5b3UgcmVjZWl2ZWQgZnJvbSBhbm90aGVyIHBlZXIuXHJcbiAgI1xyXG4gIGFwcGx5T3A6IChvcF9qc29uKS0+XHJcbiAgICAjICRwYXJzZV9hbmRfZXhlY3V0ZSB3aWxsIHJldHVybiBmYWxzZSBpZiAkb19qc29uIHdhcyBwYXJzZWQgYW5kIGV4ZWN1dGVkLCBvdGhlcndpc2UgdGhlIHBhcnNlZCBvcGVyYWRpb25cclxuICAgIG8gPSBAcGFyc2VPcGVyYXRpb24gb3BfanNvblxyXG4gICAgQEhCLmFkZFRvQ291bnRlciBvXHJcbiAgICAjIEBIQi5hZGRPcGVyYXRpb24gb1xyXG4gICAgaWYgQEhCLmdldE9wZXJhdGlvbihvKT9cclxuICAgIGVsc2UgaWYgbm90IG8uZXhlY3V0ZSgpXHJcbiAgICAgIEB1bnByb2Nlc3NlZF9vcHMucHVzaCBvXHJcbiAgICBlbHNlXHJcbiAgICAgIEBIQi5hZGRPcGVyYXRpb24gb1xyXG4gICAgQHRyeVVucHJvY2Vzc2VkKClcclxuXHJcbiAgI1xyXG4gICMgQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIHlvdSBhcHBsaWVkIGEgbmV3IG9wZXJhdGlvbi5cclxuICAjIEl0IGNoZWNrcyBpZiBvcGVyYXRpb25zIHRoYXQgd2VyZSBwcmV2aW91c2x5IG5vdCBleGVjdXRhYmxlIGFyZSBub3cgZXhlY3V0YWJsZS5cclxuICAjXHJcbiAgdHJ5VW5wcm9jZXNzZWQ6ICgpLT5cclxuICAgIHdoaWxlIHRydWVcclxuICAgICAgb2xkX2xlbmd0aCA9IEB1bnByb2Nlc3NlZF9vcHMubGVuZ3RoXHJcbiAgICAgIHVucHJvY2Vzc2VkID0gW11cclxuICAgICAgZm9yIG9wIGluIEB1bnByb2Nlc3NlZF9vcHNcclxuICAgICAgICBpZiBASEIuZ2V0T3BlcmF0aW9uKG9wKT9cclxuICAgICAgICBlbHNlIGlmIG5vdCBvcC5leGVjdXRlKClcclxuICAgICAgICAgIHVucHJvY2Vzc2VkLnB1c2ggb3BcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBASEIuYWRkT3BlcmF0aW9uIG9wXHJcbiAgICAgIEB1bnByb2Nlc3NlZF9vcHMgPSB1bnByb2Nlc3NlZFxyXG4gICAgICBpZiBAdW5wcm9jZXNzZWRfb3BzLmxlbmd0aCBpcyBvbGRfbGVuZ3RoXHJcbiAgICAgICAgYnJlYWtcclxuXHJcblxyXG5cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRW5naW5lXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiIsIlxuanNvbl90eXBlc191bmluaXRpYWxpemVkID0gcmVxdWlyZSBcIi4uL1R5cGVzL1htbFR5cGVzXCJcbkhpc3RvcnlCdWZmZXIgPSByZXF1aXJlIFwiLi4vSGlzdG9yeUJ1ZmZlclwiXG5FbmdpbmUgPSByZXF1aXJlIFwiLi4vRW5naW5lXCJcblxuI1xuIyBGcmFtZXdvcmsgZm9yIFhtbC1saWtlIGRhdGEtc3RydWN0dXJlcy5cbiMgS25vd24gdmFsdWVzIHRoYXQgYXJlIHN1cHBvcnRlZDpcbiNcbmNsYXNzIFhtbEZyYW1ld29ya1xuXG4gICNcbiAgIyBAcGFyYW0ge1N0cmluZ30gdXNlcl9pZCBVbmlxdWUgaWQgb2YgdGhlIHBlZXIuXG4gICMgQHBhcmFtIHtDb25uZWN0b3J9IENvbm5lY3RvciB0aGUgY29ubmVjdG9yIGNsYXNzLlxuICAjXG4gIGNvbnN0cnVjdG9yOiAodXNlcl9pZCwgQ29ubmVjdG9yKS0+XG4gICAgQEhCID0gbmV3IEhpc3RvcnlCdWZmZXIgdXNlcl9pZFxuICAgIHR5cGVfbWFuYWdlciA9IGpzb25fdHlwZXNfdW5pbml0aWFsaXplZCBASEJcbiAgICBAdHlwZXMgPSB0eXBlX21hbmFnZXIudHlwZXNcbiAgICBAZW5naW5lID0gbmV3IEVuZ2luZSBASEIsIHR5cGVfbWFuYWdlci5wYXJzZXJcbiAgICBASEIuZW5naW5lID0gQGVuZ2luZSAjIFRPRE86ICEhIG9ubHkgZm9yIGRlYnVnZ2luZ1xuICAgIEBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yIEBlbmdpbmUsIEBIQiwgdHlwZV9tYW5hZ2VyLmV4ZWN1dGlvbl9saXN0ZW5lciwgQFxuICAgICNmaXJzdF93b3JkID0gbmV3IEB0eXBlcy5YbWxUeXBlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNoYXJlZFwiKSlcbiAgICAjQEhCLmFkZE9wZXJhdGlvbihmaXJzdF93b3JkKS5leGVjdXRlKClcblxuICAgIHVpZF9iZWcgPSBASEIuZ2V0UmVzZXJ2ZWRVbmlxdWVJZGVudGlmaWVyKClcbiAgICB1aWRfZW5kID0gQEhCLmdldFJlc2VydmVkVW5pcXVlSWRlbnRpZmllcigpXG4gICAgYmVnID0gQEhCLmFkZE9wZXJhdGlvbihuZXcgQHR5cGVzLkRlbGltaXRlciB1aWRfYmVnLCB1bmRlZmluZWQsIHVpZF9lbmQpLmV4ZWN1dGUoKVxuICAgIGVuZCA9IEBIQi5hZGRPcGVyYXRpb24obmV3IEB0eXBlcy5EZWxpbWl0ZXIgdWlkX2VuZCwgYmVnLCB1bmRlZmluZWQpLmV4ZWN1dGUoKVxuXG4gICAgQHJvb3RfZWxlbWVudCA9IG5ldyBAdHlwZXMuUmVwbGFjZU1hbmFnZXIgdW5kZWZpbmVkLCBASEIuZ2V0UmVzZXJ2ZWRVbmlxdWVJZGVudGlmaWVyKCksIGJlZywgZW5kXG4gICAgQEhCLmFkZE9wZXJhdGlvbihAcm9vdF9lbGVtZW50KS5leGVjdXRlKClcbiAgICAjQHJvb3RfZWxlbWVudC5yZXBsYWNlIGZpcnN0X3dvcmRcblxuICAjXG4gICMgQHJldHVybiBKc29uVHlwZVxuICAjXG4gIGdldFNoYXJlZE9iamVjdDogKCktPlxuICAgIEByb290X2VsZW1lbnQudmFsKClcblxuICAjXG4gICMgR2V0IHRoZSBpbml0aWFsaXplZCBjb25uZWN0b3IuXG4gICNcbiAgZ2V0Q29ubmVjdG9yOiAoKS0+XG4gICAgQGNvbm5lY3RvclxuXG4gICNcbiAgIyBAc2VlIEhpc3RvcnlCdWZmZXJcbiAgI1xuICBnZXRIaXN0b3J5QnVmZmVyOiAoKS0+XG4gICAgQEhCXG5cbiAgI1xuICAjIEBzZWUgSnNvblR5cGUuc2V0TXV0YWJsZURlZmF1bHRcbiAgI1xuICBzZXRNdXRhYmxlRGVmYXVsdDogKG11dGFibGUpLT5cbiAgICBAZ2V0U2hhcmVkT2JqZWN0KCkuc2V0TXV0YWJsZURlZmF1bHQobXV0YWJsZSlcblxuICAjXG4gICMgR2V0IHRoZSBVc2VySWQgZnJvbSB0aGUgSGlzdG9yeUJ1ZmZlciBvYmplY3QuXG4gICMgSW4gbW9zdCBjYXNlcyB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHVzZXJfaWQgdmFsdWUgd2l0aCB3aGljaFxuICAjIEpzb25GcmFtZXdvcmsgd2FzIGluaXRpYWxpemVkIChEZXBlbmRpbmcgb24gdGhlIEhpc3RvcnlCdWZmZXIgaW1wbGVtZW50YXRpb24pLlxuICAjXG4gIGdldFVzZXJJZDogKCktPlxuICAgIEBIQi5nZXRVc2VySWQoKVxuXG4gICNcbiAgIyBAc2VlIEpzb25UeXBlLnRvSnNvblxuICAjXG4gIHRvSnNvbiA6ICgpLT5cbiAgICBAZ2V0U2hhcmVkT2JqZWN0KCkudG9Kc29uKClcblxuICAjXG4gICMgQHNlZSBKc29uVHlwZS52YWxcbiAgI1xuICB2YWwgOiAoKS0+XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggaXMgMCkgb3IgKHR5cGVvZiBhcmd1bWVudHNbMF0gaXMgXCJib29sZWFuXCIpXG4gICAgICBAZ2V0U2hhcmVkT2JqZWN0KCkudmFsKGFyZ3VtZW50c1swXSlcbiAgICBlbHNlIGlmIGFyZ3VtZW50cy5sZW5ndGggaXMgMVxuICAgICAgbmV3WG1sID0gbmV3IEB0eXBlcy5YbWxUeXBlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJndW1lbnRzWzBdKVxuICAgICAgQEhCLmFkZE9wZXJhdGlvbihuZXdYbWwpLmV4ZWN1dGUoKVxuICAgICAgQHJvb3RfZWxlbWVudC5yZXBsYWNlIG5ld1htbFxuICAgICAgbmV3WG1sXG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yIFwiY2FuIG9ubHkgcGFyc2UgMCwgb3IgMSBwYXJhbWV0ZXIhXCJcblxuXG4gICNcbiAgIyBAc2VlIE9wZXJhdGlvbi5vblxuICAjXG4gIG9uOiAoKS0+XG4gICAgQGdldFNoYXJlZE9iamVjdCgpLm9uIGFyZ3VtZW50cy4uLlxuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBYbWxGcmFtZXdvcmtcbmlmIHdpbmRvdz9cbiAgaWYgbm90IHdpbmRvdy5ZP1xuICAgIHdpbmRvdy5ZID0ge31cbiAgd2luZG93LlkuWG1sRnJhbWV3b3JrID0gWG1sRnJhbWV3b3JrXG4iLCJcbiNcbiMgQG5vZG9jXG4jIEFuIG9iamVjdCB0aGF0IGhvbGRzIGFsbCBhcHBsaWVkIG9wZXJhdGlvbnMuXG4jXG4jIEBub3RlIFRoZSBIaXN0b3J5QnVmZmVyIGlzIGNvbW1vbmx5IGFiYnJldmlhdGVkIHRvIEhCLlxuI1xuY2xhc3MgSGlzdG9yeUJ1ZmZlclxuXG5cblxuICAjXG4gICMgQ3JlYXRlcyBhbiBlbXB0eSBIQi5cbiAgIyBAcGFyYW0ge09iamVjdH0gdXNlcl9pZCBDcmVhdG9yIG9mIHRoZSBIQi5cbiAgI1xuICBjb25zdHJ1Y3RvcjogKEB1c2VyX2lkKS0+XG4gICAgQG9wZXJhdGlvbl9jb3VudGVyID0ge31cbiAgICBAYnVmZmVyID0ge31cbiAgICBAY2hhbmdlX2xpc3RlbmVycyA9IFtdXG4gICAgQGdhcmJhZ2UgPSBbXSAjIFdpbGwgYmUgY2xlYW5lZCBvbiBuZXh0IGNhbGwgb2YgZ2FyYmFnZUNvbGxlY3RvclxuICAgIEB0cmFzaCA9IFtdICMgSXMgZGVsZXRlZC4gV2FpdCB1bnRpbCBpdCBpcyBub3QgdXNlZCBhbnltb3JlLlxuICAgIEBwZXJmb3JtR2FyYmFnZUNvbGxlY3Rpb24gPSB0cnVlXG4gICAgQGdhcmJhZ2VDb2xsZWN0VGltZW91dCA9IDEwMDBcbiAgICBAcmVzZXJ2ZWRfaWRlbnRpZmllcl9jb3VudGVyID0gMFxuICAgIHNldFRpbWVvdXQgQGVtcHR5R2FyYmFnZSwgQGdhcmJhZ2VDb2xsZWN0VGltZW91dFxuXG4gIGVtcHR5R2FyYmFnZTogKCk9PlxuICAgIGZvciBvIGluIEBnYXJiYWdlXG4gICAgICAjaWYgQGdldE9wZXJhdGlvbkNvdW50ZXIoby5jcmVhdG9yKSA+IG8ub3BfbnVtYmVyXG4gICAgICBvLmNsZWFudXA/KClcblxuICAgIEBnYXJiYWdlID0gQHRyYXNoXG4gICAgQHRyYXNoID0gW11cbiAgICBpZiBAZ2FyYmFnZUNvbGxlY3RUaW1lb3V0IGlzbnQgLTFcbiAgICAgIEBnYXJiYWdlQ29sbGVjdFRpbWVvdXRJZCA9IHNldFRpbWVvdXQgQGVtcHR5R2FyYmFnZSwgQGdhcmJhZ2VDb2xsZWN0VGltZW91dFxuICAgIHVuZGVmaW5lZFxuXG4gICNcbiAgIyBHZXQgdGhlIHVzZXIgaWQgd2l0aCB3aWNoIHRoZSBIaXN0b3J5IEJ1ZmZlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICNcbiAgZ2V0VXNlcklkOiAoKS0+XG4gICAgQHVzZXJfaWRcblxuICBhZGRUb0dhcmJhZ2VDb2xsZWN0b3I6ICgpLT5cbiAgICBpZiBAcGVyZm9ybUdhcmJhZ2VDb2xsZWN0aW9uXG4gICAgICBmb3IgbyBpbiBhcmd1bWVudHNcbiAgICAgICAgaWYgbz9cbiAgICAgICAgICBAZ2FyYmFnZS5wdXNoIG9cblxuICBzdG9wR2FyYmFnZUNvbGxlY3Rpb246ICgpLT5cbiAgICBAcGVyZm9ybUdhcmJhZ2VDb2xsZWN0aW9uID0gZmFsc2VcbiAgICBAc2V0TWFudWFsR2FyYmFnZUNvbGxlY3QoKVxuICAgIEBnYXJiYWdlID0gW11cbiAgICBAdHJhc2ggPSBbXVxuXG4gIHNldE1hbnVhbEdhcmJhZ2VDb2xsZWN0OiAoKS0+XG4gICAgQGdhcmJhZ2VDb2xsZWN0VGltZW91dCA9IC0xXG4gICAgY2xlYXJUaW1lb3V0IEBnYXJiYWdlQ29sbGVjdFRpbWVvdXRJZFxuICAgIEBnYXJiYWdlQ29sbGVjdFRpbWVvdXRJZCA9IHVuZGVmaW5lZFxuXG4gIHNldEdhcmJhZ2VDb2xsZWN0VGltZW91dDogKEBnYXJiYWdlQ29sbGVjdFRpbWVvdXQpLT5cblxuICAjXG4gICMgSSBwcm9wb3NlIHRvIHVzZSBpdCBpbiB5b3VyIEZyYW1ld29yaywgdG8gY3JlYXRlIHNvbWV0aGluZyBsaWtlIGEgcm9vdCBlbGVtZW50LlxuICAjIEFuIG9wZXJhdGlvbiB3aXRoIHRoaXMgaWRlbnRpZmllciBpcyBub3QgcHJvcGFnYXRlZCB0byBvdGhlciBjbGllbnRzLlxuICAjIFRoaXMgaXMgd2h5IGV2ZXJ5Ym9kZSBtdXN0IGNyZWF0ZSB0aGUgc2FtZSBvcGVyYXRpb24gd2l0aCB0aGlzIHVpZC5cbiAgI1xuICBnZXRSZXNlcnZlZFVuaXF1ZUlkZW50aWZpZXI6ICgpLT5cbiAgICB7XG4gICAgICBjcmVhdG9yIDogJ18nXG4gICAgICBvcF9udW1iZXIgOiBcIl8je0ByZXNlcnZlZF9pZGVudGlmaWVyX2NvdW50ZXIrK31cIlxuICAgICAgZG9TeW5jOiBmYWxzZVxuICAgIH1cblxuICAjXG4gICMgR2V0IHRoZSBvcGVyYXRpb24gY291bnRlciB0aGF0IGRlc2NyaWJlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQuXG4gICNcbiAgZ2V0T3BlcmF0aW9uQ291bnRlcjogKHVzZXJfaWQpLT5cbiAgICBpZiBub3QgdXNlcl9pZD9cbiAgICAgIHJlcyA9IHt9XG4gICAgICBmb3IgdXNlcixjdG4gb2YgQG9wZXJhdGlvbl9jb3VudGVyXG4gICAgICAgIHJlc1t1c2VyXSA9IGN0blxuICAgICAgcmVzXG4gICAgZWxzZVxuICAgICAgQG9wZXJhdGlvbl9jb3VudGVyW3VzZXJfaWRdXG5cblxuICAjXG4gICMgRW5jb2RlIHRoaXMgb3BlcmF0aW9uIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4gYmUgcGFyc2VkIGJ5IHJlbW90ZSBwZWVycy5cbiAgIyBUT0RPOiBNYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQhXG4gIF9lbmNvZGU6IChzdGF0ZV92ZWN0b3I9e30pLT5cbiAgICBqc29uID0gW11cbiAgICB1bmtub3duID0gKHVzZXIsIG9fbnVtYmVyKS0+XG4gICAgICBpZiAobm90IHVzZXI/KSBvciAobm90IG9fbnVtYmVyPylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiZGFoIVwiXG4gICAgICBub3Qgc3RhdGVfdmVjdG9yW3VzZXJdPyBvciBzdGF0ZV92ZWN0b3JbdXNlcl0gPD0gb19udW1iZXJcblxuICAgIGZvciB1X25hbWUsdXNlciBvZiBAYnVmZmVyXG4gICAgICAjIFRPRE8gbmV4dCwgaWYgQHN0YXRlX3ZlY3Rvclt1c2VyXSA8PSBzdGF0ZV92ZWN0b3JbdXNlcl1cbiAgICAgIGZvciBvX251bWJlcixvIG9mIHVzZXJcbiAgICAgICAgaWYgby5kb1N5bmMgYW5kIHVua25vd24odV9uYW1lLCBvX251bWJlcilcbiAgICAgICAgICAjIGl0cyBuZWNlc3NhcnkgdG8gc2VuZCBpdCwgYW5kIG5vdCBrbm93biBpbiBzdGF0ZV92ZWN0b3JcbiAgICAgICAgICBvX2pzb24gPSBvLl9lbmNvZGUoKVxuICAgICAgICAgIGlmIG8ubmV4dF9jbD8gIyBhcHBsaWVzIGZvciBhbGwgb3BzIGJ1dCB0aGUgbW9zdCByaWdodCBkZWxpbWl0ZXIhXG4gICAgICAgICAgICAjIHNlYXJjaCBmb3IgdGhlIG5leHQgX2tub3duXyBvcGVyYXRpb24uIChXaGVuIHN0YXRlX3ZlY3RvciBpcyB7fSB0aGVuIHRoaXMgaXMgdGhlIERlbGltaXRlcilcbiAgICAgICAgICAgIG9fbmV4dCA9IG8ubmV4dF9jbFxuICAgICAgICAgICAgd2hpbGUgb19uZXh0Lm5leHRfY2w/IGFuZCB1bmtub3duKG9fbmV4dC5jcmVhdG9yLCBvX25leHQub3BfbnVtYmVyKVxuICAgICAgICAgICAgICBvX25leHQgPSBvX25leHQubmV4dF9jbFxuICAgICAgICAgICAgb19qc29uLm5leHQgPSBvX25leHQuZ2V0VWlkKClcbiAgICAgICAgICBlbHNlIGlmIG8ucHJldl9jbD8gIyBtb3N0IHJpZ2h0IGRlbGltaXRlciBvbmx5IVxuICAgICAgICAgICAgIyBzYW1lIGFzIHRoZSBhYm92ZSB3aXRoIHByZXYuXG4gICAgICAgICAgICBvX3ByZXYgPSBvLnByZXZfY2xcbiAgICAgICAgICAgIHdoaWxlIG9fcHJldi5wcmV2X2NsPyBhbmQgdW5rbm93bihvX3ByZXYuY3JlYXRvciwgb19wcmV2Lm9wX251bWJlcilcbiAgICAgICAgICAgICAgb19wcmV2ID0gb19wcmV2LnByZXZfY2xcbiAgICAgICAgICAgIG9fanNvbi5wcmV2ID0gb19wcmV2LmdldFVpZCgpXG4gICAgICAgICAganNvbi5wdXNoIG9fanNvblxuXG4gICAganNvblxuXG4gICNcbiAgIyBHZXQgdGhlIG51bWJlciBvZiBvcGVyYXRpb25zIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IGEgdXNlci5cbiAgIyBBY2NvcmRpbmdseSB5b3Ugd2lsbCBnZXQgdGhlIG5leHQgb3BlcmF0aW9uIG51bWJlciB0aGF0IGlzIGV4cGVjdGVkIGZyb20gdGhhdCB1c2VyLlxuICAjIFRoaXMgd2lsbCBpbmNyZW1lbnQgdGhlIG9wZXJhdGlvbiBjb3VudGVyLlxuICAjXG4gIGdldE5leHRPcGVyYXRpb25JZGVudGlmaWVyOiAodXNlcl9pZCktPlxuICAgIGlmIG5vdCB1c2VyX2lkP1xuICAgICAgdXNlcl9pZCA9IEB1c2VyX2lkXG4gICAgaWYgbm90IEBvcGVyYXRpb25fY291bnRlclt1c2VyX2lkXT9cbiAgICAgIEBvcGVyYXRpb25fY291bnRlclt1c2VyX2lkXSA9IDBcbiAgICB1aWQgPVxuICAgICAgJ2NyZWF0b3InIDogdXNlcl9pZFxuICAgICAgJ29wX251bWJlcicgOiBAb3BlcmF0aW9uX2NvdW50ZXJbdXNlcl9pZF1cbiAgICBAb3BlcmF0aW9uX2NvdW50ZXJbdXNlcl9pZF0rK1xuICAgIHVpZFxuXG4gICNcbiAgIyBSZXRyaWV2ZSBhbiBvcGVyYXRpb24gZnJvbSBhIHVuaXF1ZSBpZC5cbiAgI1xuICBnZXRPcGVyYXRpb246ICh1aWQpLT5cbiAgICBpZiB1aWQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgIEBidWZmZXJbdWlkLmNyZWF0b3JdP1t1aWQub3BfbnVtYmVyXVxuICAgIGVsc2UgaWYgbm90IHVpZD9cbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IgXCJUaGlzIHR5cGUgb2YgdWlkIGlzIG5vdCBkZWZpbmVkIVwiXG4gICNcbiAgIyBBZGQgYW4gb3BlcmF0aW9uIHRvIHRoZSBIQi4gTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgbGluayBpdCBhZ2FpbnN0XG4gICMgb3RoZXIgb3BlcmF0aW9ucyAoaXQgd29udCBleGVjdXRlZClcbiAgI1xuICBhZGRPcGVyYXRpb246IChvKS0+XG4gICAgaWYgbm90IEBidWZmZXJbby5jcmVhdG9yXT9cbiAgICAgIEBidWZmZXJbby5jcmVhdG9yXSA9IHt9XG4gICAgaWYgQGJ1ZmZlcltvLmNyZWF0b3JdW28ub3BfbnVtYmVyXT9cbiAgICAgIHRocm93IG5ldyBFcnJvciBcIllvdSBtdXN0IG5vdCBvdmVyd3JpdGUgb3BlcmF0aW9ucyFcIlxuICAgIEBidWZmZXJbby5jcmVhdG9yXVtvLm9wX251bWJlcl0gPSBvXG4gICAgQG51bWJlcl9vZl9vcGVyYXRpb25zX2FkZGVkX3RvX0hCID89IDAgIyBUT0RPOiBEZWJ1ZywgcmVtb3ZlIHRoaXNcbiAgICBAbnVtYmVyX29mX29wZXJhdGlvbnNfYWRkZWRfdG9fSEIrK1xuICAgIG9cblxuICByZW1vdmVPcGVyYXRpb246IChvKS0+XG4gICAgZGVsZXRlIEBidWZmZXJbby5jcmVhdG9yXT9bby5vcF9udW1iZXJdXG5cbiAgI1xuICAjIEluY3JlbWVudCB0aGUgb3BlcmF0aW9uX2NvdW50ZXIgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBFbmdpbmUuXG4gICNcbiAgYWRkVG9Db3VudGVyOiAobyktPlxuICAgIGlmIG5vdCBAb3BlcmF0aW9uX2NvdW50ZXJbby5jcmVhdG9yXT9cbiAgICAgIEBvcGVyYXRpb25fY291bnRlcltvLmNyZWF0b3JdID0gMFxuICAgIGlmIHR5cGVvZiBvLm9wX251bWJlciBpcyAnbnVtYmVyJyBhbmQgby5jcmVhdG9yIGlzbnQgQGdldFVzZXJJZCgpXG4gICAgICAjIFRPRE86IGZpeCB0aGlzIGlzc3VlIGJldHRlci5cbiAgICAgICMgT3BlcmF0aW9ucyBzaG91bGQgaW5jb21lIGluIG9yZGVyXG4gICAgICAjIFRoZW4geW91IGRvbid0IGhhdmUgdG8gZG8gdGhpcy4uXG4gICAgICBpZiBvLm9wX251bWJlciBpcyBAb3BlcmF0aW9uX2NvdW50ZXJbby5jcmVhdG9yXVxuICAgICAgICBAb3BlcmF0aW9uX2NvdW50ZXJbby5jcmVhdG9yXSsrXG4gICAgICAgIHdoaWxlIEBnZXRPcGVyYXRpb24oe2NyZWF0b3I6by5jcmVhdG9yLCBvcF9udW1iZXI6IEBvcGVyYXRpb25fY291bnRlcltvLmNyZWF0b3JdfSk/XG4gICAgICAgICAgQG9wZXJhdGlvbl9jb3VudGVyW28uY3JlYXRvcl0rK1xuXG4gICAgI2lmIEBvcGVyYXRpb25fY291bnRlcltvLmNyZWF0b3JdIGlzbnQgKG8ub3BfbnVtYmVyICsgMSlcbiAgICAgICNjb25zb2xlLmxvZyAoQG9wZXJhdGlvbl9jb3VudGVyW28uY3JlYXRvcl0gLSAoby5vcF9udW1iZXIgKyAxKSlcbiAgICAgICNjb25zb2xlLmxvZyBvXG4gICAgICAjdGhyb3cgbmV3IEVycm9yIFwiWW91IGRvbid0IHJlY2VpdmUgb3BlcmF0aW9ucyBpbiB0aGUgcHJvcGVyIG9yZGVyLiBUcnkgY291bnRpbmcgbGlrZSB0aGlzIDAsMSwyLDMsNCwuLiA7KVwiXG5cbm1vZHVsZS5leHBvcnRzID0gSGlzdG9yeUJ1ZmZlclxuIiwibW9kdWxlLmV4cG9ydHMgPSAoSEIpLT5cbiAgIyBAc2VlIEVuZ2luZS5wYXJzZVxuICBwYXJzZXIgPSB7fVxuICBleGVjdXRpb25fbGlzdGVuZXIgPSBbXVxuXG4gICNcbiAgIyBAcHJpdmF0ZVxuICAjIEBhYnN0cmFjdFxuICAjIEBub2RvY1xuICAjIEEgZ2VuZXJpYyBpbnRlcmZhY2UgdG8gb3BlcmF0aW9ucy5cbiAgI1xuICAjIEFuIG9wZXJhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOlxuICAjICogX2VuY29kZTogZW5jb2RlcyBhbiBvcGVyYXRpb24gKG5lZWRlZCBvbmx5IGlmIGluc3RhbmNlIG9mIHRoaXMgb3BlcmF0aW9uIGlzIHNlbnQpLlxuICAjICogZXhlY3V0ZTogZXhlY3V0ZSB0aGUgZWZmZWN0cyBvZiB0aGlzIG9wZXJhdGlvbnMuIEdvb2QgZXhhbXBsZXMgYXJlIEluc2VydC10eXBlIGFuZCBBZGROYW1lLXR5cGVcbiAgIyAqIHZhbDogaW4gdGhlIGNhc2UgdGhhdCB0aGUgb3BlcmF0aW9uIGhvbGRzIGEgdmFsdWVcbiAgI1xuICAjIEZ1cnRoZXJtb3JlIGFuIGVuY29kYWJsZSBvcGVyYXRpb24gaGFzIGEgcGFyc2VyLiBXZSBleHRlbmQgdGhlIHBhcnNlciBvYmplY3QgaW4gb3JkZXIgdG8gcGFyc2UgZW5jb2RlZCBvcGVyYXRpb25zLlxuICAjXG4gIGNsYXNzIE9wZXJhdGlvblxuXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHNlZSBIaXN0b3J5QnVmZmVyLmdldE5leHRPcGVyYXRpb25JZGVudGlmaWVyXG4gICAgI1xuICAgIGNvbnN0cnVjdG9yOiAodWlkKS0+XG4gICAgICBAaXNfZGVsZXRlZCA9IGZhbHNlXG4gICAgICBAZG9TeW5jID0gdHJ1ZVxuICAgICAgQGdhcmJhZ2VfY29sbGVjdGVkID0gZmFsc2VcbiAgICAgIGlmIG5vdCB1aWQ/XG4gICAgICAgIHVpZCA9IEhCLmdldE5leHRPcGVyYXRpb25JZGVudGlmaWVyKClcbiAgICAgIGlmIG5vdCB1aWQuZG9TeW5jP1xuICAgICAgICB1aWQuZG9TeW5jID0gbm90IGlzTmFOKHBhcnNlSW50KHVpZC5vcF9udW1iZXIpKVxuICAgICAge1xuICAgICAgICAnY3JlYXRvcic6IEBjcmVhdG9yXG4gICAgICAgICdvcF9udW1iZXInIDogQG9wX251bWJlclxuICAgICAgICAnZG9TeW5jJyA6IEBkb1N5bmNcbiAgICAgIH0gPSB1aWRcblxuICAgIHR5cGU6IFwiSW5zZXJ0XCJcblxuICAgICNcbiAgICAjIEFkZCBhbiBldmVudCBsaXN0ZW5lci4gSXQgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW9uIHdoaWNoIGV2ZW50cyBhcmUgc3VwcG9ydGVkLlxuICAgICMgQHBhcmFtIHtTdHJpbmd9IGV2ZW50IE5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICMgQHBhcmFtIHtGdW5jdGlvbn0gZiBmIGlzIGV4ZWN1dGVkIGluIGNhc2UgdGhlIGV2ZW50IGZpcmVzLlxuICAgICNcbiAgICBvbjogKGV2ZW50cywgZiktPlxuICAgICAgQGV2ZW50X2xpc3RlbmVycyA/PSB7fVxuICAgICAgaWYgZXZlbnRzLmNvbnN0cnVjdG9yIGlzbnQgW10uY29uc3RydWN0b3JcbiAgICAgICAgZXZlbnRzID0gW2V2ZW50c11cbiAgICAgIGZvciBlIGluIGV2ZW50c1xuICAgICAgICBAZXZlbnRfbGlzdGVuZXJzW2VdID89IFtdXG4gICAgICAgIEBldmVudF9saXN0ZW5lcnNbZV0ucHVzaCBmXG5cbiAgICAjXG4gICAgIyBEZWxldGVzIGEgZnVuY3Rpb24gZnJvbSBhbiBldmVudCAvIGxpc3Qgb2YgZXZlbnRzLlxuICAgICMgQHNlZSBPcGVyYXRpb24ub25cbiAgICAjXG4gICAgIyBAb3ZlcmxvYWQgZGVsZXRlTGlzdGVuZXIoZXZlbnQsIGYpXG4gICAgIyAgIEBwYXJhbSBldmVudCB7U3RyaW5nfSBBbiBldmVudCBuYW1lXG4gICAgIyAgIEBwYXJhbSBmICAgICB7RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0aGF0IHlvdSB3YW50IHRvIGRlbGV0ZSBmcm9tIHRoZXNlIGV2ZW50c1xuICAgICMgQG92ZXJsb2FkIGRlbGV0ZUxpc3RlbmVyKGV2ZW50cywgZilcbiAgICAjICAgQHBhcmFtIGV2ZW50cyB7QXJyYXk8U3RyaW5nPn0gQSBsaXN0IG9mIGV2ZW50IG5hbWVzXG4gICAgIyAgIEBwYXJhbSBmICAgICAge0Z1bmN0aW9ufSBUaGUgZnVuY3Rpb24gdGhhdCB5b3Ugd2FudCB0byBkZWxldGUgZnJvbSB0aGVzZSBldmVudHMuXG4gICAgZGVsZXRlTGlzdGVuZXI6IChldmVudHMsIGYpLT5cbiAgICAgIGlmIGV2ZW50cy5jb25zdHJ1Y3RvciBpc250IFtdLmNvbnN0cnVjdG9yXG4gICAgICAgIGV2ZW50cyA9IFtldmVudHNdXG4gICAgICBmb3IgZSBpbiBldmVudHNcbiAgICAgICAgaWYgQGV2ZW50X2xpc3RlbmVycz9bZV0/XG4gICAgICAgICAgQGV2ZW50X2xpc3RlbmVyc1tlXSA9IEBldmVudF9saXN0ZW5lcnNbZV0uZmlsdGVyIChnKS0+XG4gICAgICAgICAgICBmIGlzbnQgZ1xuXG4gICAgI1xuICAgICMgRmlyZSBhbiBldmVudC5cbiAgICAjIFRPRE86IERvIHNvbWV0aGluZyB3aXRoIHRpbWVvdXRzLiBZb3UgZG9uJ3Qgd2FudCB0aGlzIHRvIGZpcmUgZm9yIGV2ZXJ5IG9wZXJhdGlvbiAoZS5nLiBpbnNlcnQpLlxuICAgICNcbiAgICBjYWxsRXZlbnQ6ICgpLT5cbiAgICAgIEBmb3J3YXJkRXZlbnQgQCwgYXJndW1lbnRzLi4uXG5cbiAgICAjXG4gICAgIyBGaXJlIGFuIGV2ZW50IGFuZCBzcGVjaWZ5IGluIHdoaWNoIGNvbnRleHQgdGhlIGxpc3RlbmVyIGlzIGNhbGxlZCAoc2V0ICd0aGlzJykuXG4gICAgI1xuICAgIGZvcndhcmRFdmVudDogKG9wLCBldmVudCwgYXJncy4uLiktPlxuICAgICAgaWYgQGV2ZW50X2xpc3RlbmVycz9bZXZlbnRdP1xuICAgICAgICBmb3IgZiBpbiBAZXZlbnRfbGlzdGVuZXJzW2V2ZW50XVxuICAgICAgICAgIGYuY2FsbCBvcCwgZXZlbnQsIGFyZ3MuLi5cblxuICAgIGlzRGVsZXRlZDogKCktPlxuICAgICAgQGlzX2RlbGV0ZWRcblxuICAgIGFwcGx5RGVsZXRlOiAoZ2FyYmFnZWNvbGxlY3QgPSB0cnVlKS0+XG4gICAgICBpZiBub3QgQGdhcmJhZ2VfY29sbGVjdGVkXG4gICAgICAgICNjb25zb2xlLmxvZyBcImFwcGx5RGVsZXRlOiAje0B0eXBlfVwiXG4gICAgICAgIEBpc19kZWxldGVkID0gdHJ1ZVxuICAgICAgICBpZiBnYXJiYWdlY29sbGVjdFxuICAgICAgICAgIEBnYXJiYWdlX2NvbGxlY3RlZCA9IHRydWVcbiAgICAgICAgICBIQi5hZGRUb0dhcmJhZ2VDb2xsZWN0b3IgQFxuXG4gICAgY2xlYW51cDogKCktPlxuICAgICAgI2NvbnNvbGUubG9nIFwiY2xlYW51cDogI3tAdHlwZX1cIlxuICAgICAgSEIucmVtb3ZlT3BlcmF0aW9uIEBcblxuICAgICNcbiAgICAjIFNldCB0aGUgcGFyZW50IG9mIHRoaXMgb3BlcmF0aW9uLlxuICAgICNcbiAgICBzZXRQYXJlbnQ6IChAcGFyZW50KS0+XG5cbiAgICAjXG4gICAgIyBHZXQgdGhlIHBhcmVudCBvZiB0aGlzIG9wZXJhdGlvbi5cbiAgICAjXG4gICAgZ2V0UGFyZW50OiAoKS0+XG4gICAgICBAcGFyZW50XG5cbiAgICAjXG4gICAgIyBDb21wdXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyICh1aWQpIHRoYXQgaWRlbnRpZmllcyB0aGlzIG9wZXJhdGlvbi5cbiAgICAjXG4gICAgZ2V0VWlkOiAoKS0+XG4gICAgICB7ICdjcmVhdG9yJzogQGNyZWF0b3IsICdvcF9udW1iZXInOiBAb3BfbnVtYmVyICwgJ3N5bmMnOiBAZG9TeW5jfVxuXG4gICAgZG9udFN5bmM6ICgpLT5cbiAgICAgIEBkb1N5bmMgPSBmYWxzZVxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjIE5vdGlmeSB0aGUgYWxsIHRoZSBsaXN0ZW5lcnMuXG4gICAgI1xuICAgIGV4ZWN1dGU6ICgpLT5cbiAgICAgIEBpc19leGVjdXRlZCA9IHRydWVcbiAgICAgIGZvciBsIGluIGV4ZWN1dGlvbl9saXN0ZW5lclxuICAgICAgICBsIEBfZW5jb2RlKClcbiAgICAgIEBcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBPcGVyYXRpb25zIG1heSBkZXBlbmQgb24gb3RoZXIgb3BlcmF0aW9ucyAobGlua2VkIGxpc3RzLCBldGMuKS5cbiAgICAjIFRoZSBzYXZlT3BlcmF0aW9uIGFuZCB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucyBtZXRob2RzIHByb3ZpZGVcbiAgICAjIGFuIGVhc3kgd2F5IHRvIHJlZmVyIHRvIHRoZXNlIG9wZXJhdGlvbnMgdmlhIGFuIHVpZCBvciBvYmplY3QgcmVmZXJlbmNlLlxuICAgICNcbiAgICAjIEZvciBleGFtcGxlOiBXZSBjYW4gY3JlYXRlIGEgbmV3IERlbGV0ZSBvcGVyYXRpb24gdGhhdCBkZWxldGVzIHRoZSBvcGVyYXRpb24gJG8gbGlrZSB0aGlzXG4gICAgIyAgICAgLSB2YXIgZCA9IG5ldyBEZWxldGUodWlkLCAkbyk7ICAgb3JcbiAgICAjICAgICAtIHZhciBkID0gbmV3IERlbGV0ZSh1aWQsICRvLmdldFVpZCgpKTtcbiAgICAjIEVpdGhlciB3YXkgd2Ugd2FudCB0byBhY2Nlc3MgJG8gdmlhIGQuZGVsZXRlcy4gSW4gdGhlIHNlY29uZCBjYXNlIHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zIG11c3QgYmUgY2FsbGVkIGZpcnN0LlxuICAgICNcbiAgICAjIEBvdmVybG9hZCBzYXZlT3BlcmF0aW9uKG5hbWUsIG9wX3VpZClcbiAgICAjICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi4gQWZ0ZXIgdmFsaWRhdGluZyAod2l0aCB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucykgdGhlIGluc3RhbnRpYXRlZCBvcGVyYXRpb24gd2lsbCBiZSBhY2Nlc3NpYmxlIHZpYSB0aGlzW25hbWVdLlxuICAgICMgICBAcGFyYW0ge09iamVjdH0gb3BfdWlkIEEgdWlkIHRoYXQgcmVmZXJzIHRvIGFuIG9wZXJhdGlvblxuICAgICMgQG92ZXJsb2FkIHNhdmVPcGVyYXRpb24obmFtZSwgb3ApXG4gICAgIyAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBvcCBpcyBhY2Nlc3NpYmxlIHZpYSB0aGlzW25hbWVdLlxuICAgICMgICBAcGFyYW0ge09wZXJhdGlvbn0gb3AgQW4gT3BlcmF0aW9uIG9iamVjdFxuICAgICNcbiAgICBzYXZlT3BlcmF0aW9uOiAobmFtZSwgb3ApLT5cblxuICAgICAgI1xuICAgICAgIyBFdmVyeSBpbnN0YW5jZSBvZiAkT3BlcmF0aW9uIG11c3QgaGF2ZSBhbiAkZXhlY3V0ZSBmdW5jdGlvbi5cbiAgICAgICMgV2UgdXNlIGR1Y2stdHlwaW5nIHRvIGNoZWNrIGlmIG9wIGlzIGluc3RhbnRpYXRlZCBzaW5jZSB0aGVyZVxuICAgICAgIyBjb3VsZCBleGlzdCBtdWx0aXBsZSBjbGFzc2VzIG9mICRPcGVyYXRpb25cbiAgICAgICNcbiAgICAgIGlmIG9wPy5leGVjdXRlP1xuICAgICAgICAjIGlzIGluc3RhbnRpYXRlZFxuICAgICAgICBAW25hbWVdID0gb3BcbiAgICAgIGVsc2UgaWYgb3A/XG4gICAgICAgICMgbm90IGluaXRpYWxpemVkLiBEbyBpdCB3aGVuIGNhbGxpbmcgJHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zKClcbiAgICAgICAgQHVuY2hlY2tlZCA/PSB7fVxuICAgICAgICBAdW5jaGVja2VkW25hbWVdID0gb3BcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBBZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYWxsIG5vdCBpbnN0YW50aWF0ZWQgb3BlcmF0aW9ucyB3aWxsIGJlIGFjY2Vzc2libGUuXG4gICAgIyBAc2VlIE9wZXJhdGlvbi5zYXZlT3BlcmF0aW9uXG4gICAgI1xuICAgICMgQHJldHVybiBbQm9vbGVhbl0gV2hldGhlciBpdCB3YXMgcG9zc2libGUgdG8gaW5zdGFudGlhdGUgYWxsIG9wZXJhdGlvbnMuXG4gICAgI1xuICAgIHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zOiAoKS0+XG4gICAgICB1bmluc3RhbnRpYXRlZCA9IHt9XG4gICAgICBzdWNjZXNzID0gQFxuICAgICAgZm9yIG5hbWUsIG9wX3VpZCBvZiBAdW5jaGVja2VkXG4gICAgICAgIG9wID0gSEIuZ2V0T3BlcmF0aW9uIG9wX3VpZFxuICAgICAgICBpZiBvcFxuICAgICAgICAgIEBbbmFtZV0gPSBvcFxuICAgICAgICBlbHNlXG4gICAgICAgICAgdW5pbnN0YW50aWF0ZWRbbmFtZV0gPSBvcF91aWRcbiAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgIGRlbGV0ZSBAdW5jaGVja2VkXG4gICAgICBpZiBub3Qgc3VjY2Vzc1xuICAgICAgICBAdW5jaGVja2VkID0gdW5pbnN0YW50aWF0ZWRcbiAgICAgIHN1Y2Nlc3NcblxuXG5cbiAgI1xuICAjIEBub2RvY1xuICAjIEEgc2ltcGxlIERlbGV0ZS10eXBlIG9wZXJhdGlvbiB0aGF0IGRlbGV0ZXMgYW4gb3BlcmF0aW9uLlxuICAjXG4gIGNsYXNzIERlbGV0ZSBleHRlbmRzIE9wZXJhdGlvblxuXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHBhcmFtIHtPYmplY3R9IGRlbGV0ZXMgVUlEIG9yIHJlZmVyZW5jZSBvZiB0aGUgb3BlcmF0aW9uIHRoYXQgdGhpcyB0byBiZSBkZWxldGVkLlxuICAgICNcbiAgICBjb25zdHJ1Y3RvcjogKHVpZCwgZGVsZXRlcyktPlxuICAgICAgQHNhdmVPcGVyYXRpb24gJ2RlbGV0ZXMnLCBkZWxldGVzXG4gICAgICBzdXBlciB1aWRcblxuICAgIHR5cGU6IFwiRGVsZXRlXCJcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBDb252ZXJ0IGFsbCByZWxldmFudCBpbmZvcm1hdGlvbiBvZiB0aGlzIG9wZXJhdGlvbiB0byB0aGUganNvbi1mb3JtYXQuXG4gICAgIyBUaGlzIHJlc3VsdCBjYW4gYmUgc2VudCB0byBvdGhlciBjbGllbnRzLlxuICAgICNcbiAgICBfZW5jb2RlOiAoKS0+XG4gICAgICB7XG4gICAgICAgICd0eXBlJzogXCJEZWxldGVcIlxuICAgICAgICAndWlkJzogQGdldFVpZCgpXG4gICAgICAgICdkZWxldGVzJzogQGRlbGV0ZXMuZ2V0VWlkKClcbiAgICAgIH1cblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBBcHBseSB0aGUgZGVsZXRpb24uXG4gICAgI1xuICAgIGV4ZWN1dGU6ICgpLT5cbiAgICAgIGlmIEB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucygpXG4gICAgICAgIEBkZWxldGVzLmFwcGx5RGVsZXRlIEBcbiAgICAgICAgc3VwZXJcbiAgICAgIGVsc2VcbiAgICAgICAgZmFsc2VcblxuICAjXG4gICMgRGVmaW5lIGhvdyB0byBwYXJzZSBEZWxldGUgb3BlcmF0aW9ucy5cbiAgI1xuICBwYXJzZXJbJ0RlbGV0ZSddID0gKG8pLT5cbiAgICB7XG4gICAgICAndWlkJyA6IHVpZFxuICAgICAgJ2RlbGV0ZXMnOiBkZWxldGVzX3VpZFxuICAgIH0gPSBvXG4gICAgbmV3IERlbGV0ZSB1aWQsIGRlbGV0ZXNfdWlkXG5cbiAgI1xuICAjIEBub2RvY1xuICAjIEEgc2ltcGxlIGluc2VydC10eXBlIG9wZXJhdGlvbi5cbiAgI1xuICAjIEFuIGluc2VydCBvcGVyYXRpb24gaXMgYWx3YXlzIHBvc2l0aW9uZWQgYmV0d2VlbiB0d28gb3RoZXIgaW5zZXJ0IG9wZXJhdGlvbnMuXG4gICMgSW50ZXJuYWxseSB0aGlzIGlzIHJlYWxpemVkIGFzIGFzc29jaWF0aXZlIGxpc3RzLCB3aGVyZWJ5IGVhY2ggaW5zZXJ0IG9wZXJhdGlvbiBoYXMgYSBwcmVkZWNlc3NvciBhbmQgYSBzdWNjZXNzb3IuXG4gICMgRm9yIHRoZSBzYWtlIG9mIGVmZmljaWVuY3kgd2UgbWFpbnRhaW4gdHdvIGxpc3RzOlxuICAjICAgLSBUaGUgc2hvcnQtbGlzdCAoYWJicmV2LiBzbCkgbWFpbnRhaW5zIG9ubHkgdGhlIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IGRlbGV0ZWRcbiAgIyAgIC0gVGhlIGNvbXBsZXRlLWxpc3QgKGFiYnJldi4gY2wpIG1haW50YWlucyBhbGwgb3BlcmF0aW9uc1xuICAjXG4gIGNsYXNzIEluc2VydCBleHRlbmRzIE9wZXJhdGlvblxuXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHBhcmFtIHtPcGVyYXRpb259IHByZXZfY2wgVGhlIHByZWRlY2Vzc29yIG9mIHRoaXMgb3BlcmF0aW9uIGluIHRoZSBjb21wbGV0ZS1saXN0IChjbClcbiAgICAjIEBwYXJhbSB7T3BlcmF0aW9ufSBuZXh0X2NsIFRoZSBzdWNjZXNzb3Igb2YgdGhpcyBvcGVyYXRpb24gaW4gdGhlIGNvbXBsZXRlLWxpc3QgKGNsKVxuICAgICNcbiAgICAjIEBzZWUgSGlzdG9yeUJ1ZmZlci5nZXROZXh0T3BlcmF0aW9uSWRlbnRpZmllclxuICAgICNcbiAgICBjb25zdHJ1Y3RvcjogKHVpZCwgcHJldl9jbCwgbmV4dF9jbCwgb3JpZ2luKS0+XG4gICAgICBAc2F2ZU9wZXJhdGlvbiAncHJldl9jbCcsIHByZXZfY2xcbiAgICAgIEBzYXZlT3BlcmF0aW9uICduZXh0X2NsJywgbmV4dF9jbFxuICAgICAgaWYgb3JpZ2luP1xuICAgICAgICBAc2F2ZU9wZXJhdGlvbiAnb3JpZ2luJywgb3JpZ2luXG4gICAgICBlbHNlXG4gICAgICAgIEBzYXZlT3BlcmF0aW9uICdvcmlnaW4nLCBwcmV2X2NsXG4gICAgICBzdXBlciB1aWRcblxuICAgIHR5cGU6IFwiSW5zZXJ0XCJcblxuICAgICNcbiAgICAjIHNldCBjb250ZW50IHRvIG51bGwgYW5kIG90aGVyIHN0dWZmXG4gICAgIyBAcHJpdmF0ZVxuICAgICNcbiAgICBhcHBseURlbGV0ZTogKG8pLT5cbiAgICAgIEBkZWxldGVkX2J5ID89IFtdXG4gICAgICBjYWxsTGF0ZXIgPSBmYWxzZVxuICAgICAgaWYgQHBhcmVudD8gYW5kIG5vdCBAaXNEZWxldGVkKClcbiAgICAgICAgIyBjYWxsIGlmZiB3YXNuJ3QgZGVsZXRlZCBlYXJseWVyXG4gICAgICAgIGNhbGxMYXRlciA9IHRydWVcbiAgICAgIGlmIG8/XG4gICAgICAgIEBkZWxldGVkX2J5LnB1c2ggb1xuICAgICAgZ2FyYmFnZWNvbGxlY3QgPSBmYWxzZVxuICAgICAgaWYgbm90IChAcHJldl9jbD8gYW5kIEBuZXh0X2NsPykgb3IgQHByZXZfY2wuaXNEZWxldGVkKClcbiAgICAgICAgZ2FyYmFnZWNvbGxlY3QgPSB0cnVlXG4gICAgICBzdXBlciBnYXJiYWdlY29sbGVjdFxuICAgICAgaWYgY2FsbExhdGVyXG4gICAgICAgIEBwYXJlbnQuY2FsbEV2ZW50IFwiZGVsZXRlXCIsIEAsIG9cbiAgICAgIGlmIEBuZXh0X2NsPy5pc0RlbGV0ZWQoKVxuICAgICAgICAjIGdhcmJhZ2UgY29sbGVjdCBuZXh0X2NsXG4gICAgICAgIEBuZXh0X2NsLmFwcGx5RGVsZXRlKClcblxuICAgIGNsZWFudXA6ICgpLT5cbiAgICAgICMgVE9ETzogRGVidWdnaW5nXG4gICAgICBpZiBAcHJldl9jbD8uaXNEZWxldGVkKClcbiAgICAgICAgIyBkZWxldGUgYWxsIG9wcyB0aGF0IGRlbGV0ZSB0aGlzIGluc2VydGlvblxuICAgICAgICBmb3IgZCBpbiBAZGVsZXRlZF9ieVxuICAgICAgICAgIGQuY2xlYW51cCgpXG5cbiAgICAgICAgIyB0aHJvdyBuZXcgRXJyb3IgXCJsZWZ0IGlzIG5vdCBkZWxldGVkLiBpbmNvbnNpc3RlbmN5ISwgd3JhcmFyYXJcIlxuICAgICAgICAjIGRlbGV0ZSBvcmlnaW4gcmVmZXJlbmNlcyB0byB0aGUgcmlnaHRcbiAgICAgICAgbyA9IEBuZXh0X2NsXG4gICAgICAgIHdoaWxlIG8udHlwZSBpc250IFwiRGVsaW1pdGVyXCJcbiAgICAgICAgICBpZiBvLm9yaWdpbiBpcyBAXG4gICAgICAgICAgICBvLm9yaWdpbiA9IEBwcmV2X2NsXG4gICAgICAgICAgbyA9IG8ubmV4dF9jbFxuICAgICAgICAjIHJlY29ubmVjdCBsZWZ0L3JpZ2h0XG4gICAgICAgIEBwcmV2X2NsLm5leHRfY2wgPSBAbmV4dF9jbFxuICAgICAgICBAbmV4dF9jbC5wcmV2X2NsID0gQHByZXZfY2xcbiAgICAgICAgc3VwZXJcblxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjIFRoZSBhbW91bnQgb2YgcG9zaXRpb25zIHRoYXQgJHRoaXMgb3BlcmF0aW9uIHdhcyBtb3ZlZCB0byB0aGUgcmlnaHQuXG4gICAgI1xuICAgIGdldERpc3RhbmNlVG9PcmlnaW46ICgpLT5cbiAgICAgIGQgPSAwXG4gICAgICBvID0gQHByZXZfY2xcbiAgICAgIHdoaWxlIHRydWVcbiAgICAgICAgaWYgQG9yaWdpbiBpcyBvXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZCsrXG4gICAgICAgIG8gPSBvLnByZXZfY2xcbiAgICAgIGRcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBJbmNsdWRlIHRoaXMgb3BlcmF0aW9uIGluIHRoZSBhc3NvY2lhdGl2ZSBsaXN0cy5cbiAgICAjIEBwYXJhbSBmaXJlX2V2ZW50IHtib29sZWFufSBXaGV0aGVyIHRvIGZpcmUgdGhlIGluc2VydC1ldmVudC5cbiAgICBleGVjdXRlOiAoZmlyZV9ldmVudCA9IHRydWUpLT5cbiAgICAgIGlmIG5vdCBAdmFsaWRhdGVTYXZlZE9wZXJhdGlvbnMoKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIGVsc2VcbiAgICAgICAgaWYgQHByZXZfY2w/XG4gICAgICAgICAgZGlzdGFuY2VfdG9fb3JpZ2luID0gQGdldERpc3RhbmNlVG9PcmlnaW4oKSAjIG1vc3QgY2FzZXM6IDBcbiAgICAgICAgICBvID0gQHByZXZfY2wubmV4dF9jbFxuICAgICAgICAgIGkgPSBkaXN0YW5jZV90b19vcmlnaW4gIyBsb29wIGNvdW50ZXJcblxuICAgICAgICAgICMgJHRoaXMgaGFzIHRvIGZpbmQgYSB1bmlxdWUgcG9zaXRpb24gYmV0d2VlbiBvcmlnaW4gYW5kIHRoZSBuZXh0IGtub3duIGNoYXJhY3RlclxuICAgICAgICAgICMgY2FzZSAxOiAkb3JpZ2luIGVxdWFscyAkby5vcmlnaW46IHRoZSAkY3JlYXRvciBwYXJhbWV0ZXIgZGVjaWRlcyBpZiBsZWZ0IG9yIHJpZ2h0XG4gICAgICAgICAgIyAgICAgICAgIGxldCAkT0w9IFtvMSxvMixvMyxvNF0sIHdoZXJlYnkgJHRoaXMgaXMgdG8gYmUgaW5zZXJ0ZWQgYmV0d2VlbiBvMSBhbmQgbzRcbiAgICAgICAgICAjICAgICAgICAgbzIsbzMgYW5kIG80IG9yaWdpbiBpcyAxICh0aGUgcG9zaXRpb24gb2YgbzIpXG4gICAgICAgICAgIyAgICAgICAgIHRoZXJlIGlzIHRoZSBjYXNlIHRoYXQgJHRoaXMuY3JlYXRvciA8IG8yLmNyZWF0b3IsIGJ1dCBvMy5jcmVhdG9yIDwgJHRoaXMuY3JlYXRvclxuICAgICAgICAgICMgICAgICAgICB0aGVuIG8yIGtub3dzIG8zLiBTaW5jZSBvbiBhbm90aGVyIGNsaWVudCAkT0wgY291bGQgYmUgW28xLG8zLG80XSB0aGUgcHJvYmxlbSBpcyBjb21wbGV4XG4gICAgICAgICAgIyAgICAgICAgIHRoZXJlZm9yZSAkdGhpcyB3b3VsZCBiZSBhbHdheXMgdG8gdGhlIHJpZ2h0IG9mIG8zXG4gICAgICAgICAgIyBjYXNlIDI6ICRvcmlnaW4gPCAkby5vcmlnaW5cbiAgICAgICAgICAjICAgICAgICAgaWYgY3VycmVudCAkdGhpcyBpbnNlcnRfcG9zaXRpb24gPiAkbyBvcmlnaW46ICR0aGlzIGluc1xuICAgICAgICAgICMgICAgICAgICBlbHNlICRpbnNlcnRfcG9zaXRpb24gd2lsbCBub3QgY2hhbmdlIChtYXliZSB3ZSBlbmNvdW50ZXIgY2FzZSAxIGxhdGVyLCB0aGVuIHRoaXMgd2lsbCBiZSB0byB0aGUgcmlnaHQgb2YgJG8pXG4gICAgICAgICAgIyBjYXNlIDM6ICRvcmlnaW4gPiAkby5vcmlnaW5cbiAgICAgICAgICAjICAgICAgICAgJHRoaXMgaW5zZXJ0X3Bvc2l0aW9uIGlzIHRvIHRoZSBsZWZ0IG9mICRvIChmb3JldmVyISlcbiAgICAgICAgICB3aGlsZSB0cnVlXG4gICAgICAgICAgICBpZiBvIGlzbnQgQG5leHRfY2xcbiAgICAgICAgICAgICAgIyAkbyBoYXBwZW5lZCBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgaWYgby5nZXREaXN0YW5jZVRvT3JpZ2luKCkgaXMgaVxuICAgICAgICAgICAgICAgICMgY2FzZSAxXG4gICAgICAgICAgICAgICAgaWYgby5jcmVhdG9yIDwgQGNyZWF0b3JcbiAgICAgICAgICAgICAgICAgIEBwcmV2X2NsID0gb1xuICAgICAgICAgICAgICAgICAgZGlzdGFuY2VfdG9fb3JpZ2luID0gaSArIDFcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAjIG5vcFxuICAgICAgICAgICAgICBlbHNlIGlmIG8uZ2V0RGlzdGFuY2VUb09yaWdpbigpIDwgaVxuICAgICAgICAgICAgICAgICMgY2FzZSAyXG4gICAgICAgICAgICAgICAgaWYgaSAtIGRpc3RhbmNlX3RvX29yaWdpbiA8PSBvLmdldERpc3RhbmNlVG9PcmlnaW4oKVxuICAgICAgICAgICAgICAgICAgQHByZXZfY2wgPSBvXG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZV90b19vcmlnaW4gPSBpICsgMVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICNub3BcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICMgY2FzZSAzXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICAgIG8gPSBvLm5leHRfY2xcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgIyAkdGhpcyBrbm93cyB0aGF0ICRvIGV4aXN0cyxcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAjIG5vdyByZWNvbm5lY3QgZXZlcnl0aGluZ1xuICAgICAgICAgIEBuZXh0X2NsID0gQHByZXZfY2wubmV4dF9jbFxuICAgICAgICAgIEBwcmV2X2NsLm5leHRfY2wgPSBAXG4gICAgICAgICAgQG5leHRfY2wucHJldl9jbCA9IEBcblxuICAgICAgICBwYXJlbnQgPSBAcHJldl9jbD8uZ2V0UGFyZW50KClcbiAgICAgICAgaWYgcGFyZW50PyBhbmQgZmlyZV9ldmVudFxuICAgICAgICAgIEBzZXRQYXJlbnQgcGFyZW50XG4gICAgICAgICAgQHBhcmVudC5jYWxsRXZlbnQgXCJpbnNlcnRcIiwgQFxuICAgICAgICBzdXBlciAjIG5vdGlmeSB0aGUgZXhlY3V0aW9uX2xpc3RlbmVyc1xuXG4gICAgI1xuICAgICMgQ29tcHV0ZSB0aGUgcG9zaXRpb24gb2YgdGhpcyBvcGVyYXRpb24uXG4gICAgI1xuICAgIGdldFBvc2l0aW9uOiAoKS0+XG4gICAgICBwb3NpdGlvbiA9IDBcbiAgICAgIHByZXYgPSBAcHJldl9jbFxuICAgICAgd2hpbGUgdHJ1ZVxuICAgICAgICBpZiBwcmV2IGluc3RhbmNlb2YgRGVsaW1pdGVyXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgaWYgbm90IHByZXYuaXNEZWxldGVkKClcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHByZXYgPSBwcmV2LnByZXZfY2xcbiAgICAgIHBvc2l0aW9uXG5cbiAgI1xuICAjIEBub2RvY1xuICAjIERlZmluZXMgYW4gb2JqZWN0IHRoYXQgaXMgY2Fubm90IGJlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgdG8gc2V0IGFuIGltbXV0YWJsZSBzdHJpbmcsIG9yIGEgbnVtYmVyLlxuICAjXG4gIGNsYXNzIEltbXV0YWJsZU9iamVjdCBleHRlbmRzIE9wZXJhdGlvblxuXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHBhcmFtIHtPYmplY3R9IGNvbnRlbnRcbiAgICAjXG4gICAgY29uc3RydWN0b3I6ICh1aWQsIEBjb250ZW50LCBwcmV2LCBuZXh0LCBvcmlnaW4pLT5cbiAgICAgIHN1cGVyIHVpZCwgcHJldiwgbmV4dCwgb3JpZ2luXG5cbiAgICB0eXBlOiBcIkltbXV0YWJsZU9iamVjdFwiXG5cbiAgICAjXG4gICAgIyBAcmV0dXJuIFtTdHJpbmddIFRoZSBjb250ZW50IG9mIHRoaXMgb3BlcmF0aW9uLlxuICAgICNcbiAgICB2YWwgOiAoKS0+XG4gICAgICBAY29udGVudFxuXG4gICAgI1xuICAgICMgRW5jb2RlIHRoaXMgb3BlcmF0aW9uIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4gYmUgcGFyc2VkIGJ5IHJlbW90ZSBwZWVycy5cbiAgICAjXG4gICAgX2VuY29kZTogKCktPlxuICAgICAganNvbiA9IHtcbiAgICAgICAgJ3R5cGUnOiBcIkltbXV0YWJsZU9iamVjdFwiXG4gICAgICAgICd1aWQnIDogQGdldFVpZCgpXG4gICAgICAgICdjb250ZW50JyA6IEBjb250ZW50XG4gICAgICB9XG4gICAgICBpZiBAcHJldl9jbD9cbiAgICAgICAganNvblsncHJldiddID0gQHByZXZfY2wuZ2V0VWlkKClcbiAgICAgIGlmIEBuZXh0X2NsP1xuICAgICAgICBqc29uWyduZXh0J10gPSBAbmV4dF9jbC5nZXRVaWQoKVxuICAgICAgaWYgQG9yaWdpbj8gIyBhbmQgQG9yaWdpbiBpc250IEBwcmV2X2NsXG4gICAgICAgIGpzb25bXCJvcmlnaW5cIl0gPSBAb3JpZ2luKCkuZ2V0VWlkKClcbiAgICAgIGpzb25cblxuICBwYXJzZXJbJ0ltbXV0YWJsZU9iamVjdCddID0gKGpzb24pLT5cbiAgICB7XG4gICAgICAndWlkJyA6IHVpZFxuICAgICAgJ2NvbnRlbnQnIDogY29udGVudFxuICAgICAgJ3ByZXYnOiBwcmV2XG4gICAgICAnbmV4dCc6IG5leHRcbiAgICAgICdvcmlnaW4nIDogb3JpZ2luXG4gICAgfSA9IGpzb25cbiAgICBuZXcgSW1tdXRhYmxlT2JqZWN0IHVpZCwgY29udGVudCwgcHJldiwgbmV4dCwgb3JpZ2luXG5cbiAgI1xuICAjIEBub2RvY1xuICAjIEEgZGVsaW1pdGVyIGlzIHBsYWNlZCBhdCB0aGUgZW5kIGFuZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhc3NvY2lhdGl2ZSBsaXN0cy5cbiAgIyBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBoYXZlIGEgYmVnaW5uaW5nIGFuZCBhbiBlbmQgZXZlbiBpZiB0aGUgY29udGVudFxuICAjIG9mIHRoZSBFbmdpbmUgaXMgZW1wdHkuXG4gICNcbiAgY2xhc3MgRGVsaW1pdGVyIGV4dGVuZHMgT3BlcmF0aW9uXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHBhcmFtIHtPcGVyYXRpb259IHByZXZfY2wgVGhlIHByZWRlY2Vzc29yIG9mIHRoaXMgb3BlcmF0aW9uIGluIHRoZSBjb21wbGV0ZS1saXN0IChjbClcbiAgICAjIEBwYXJhbSB7T3BlcmF0aW9ufSBuZXh0X2NsIFRoZSBzdWNjZXNzb3Igb2YgdGhpcyBvcGVyYXRpb24gaW4gdGhlIGNvbXBsZXRlLWxpc3QgKGNsKVxuICAgICNcbiAgICAjIEBzZWUgSGlzdG9yeUJ1ZmZlci5nZXROZXh0T3BlcmF0aW9uSWRlbnRpZmllclxuICAgICNcbiAgICBjb25zdHJ1Y3RvcjogKHVpZCwgcHJldl9jbCwgbmV4dF9jbCwgb3JpZ2luKS0+XG4gICAgICBAc2F2ZU9wZXJhdGlvbiAncHJldl9jbCcsIHByZXZfY2xcbiAgICAgIEBzYXZlT3BlcmF0aW9uICduZXh0X2NsJywgbmV4dF9jbFxuICAgICAgQHNhdmVPcGVyYXRpb24gJ29yaWdpbicsIHByZXZfY2xcbiAgICAgIHN1cGVyIHVpZFxuXG4gICAgdHlwZTogXCJEZWxpbWl0ZXJcIlxuXG4gICAgYXBwbHlEZWxldGU6ICgpLT5cbiAgICAgIHN1cGVyKClcbiAgICAgIG8gPSBAbmV4dF9jbFxuICAgICAgd2hpbGUgbz9cbiAgICAgICAgby5hcHBseURlbGV0ZSgpXG4gICAgICAgIG8gPSBvLm5leHRfY2xcbiAgICAgIHVuZGVmaW5lZFxuXG4gICAgY2xlYW51cDogKCktPlxuICAgICAgc3VwZXIoKVxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjXG4gICAgZXhlY3V0ZTogKCktPlxuICAgICAgaWYgQHVuY2hlY2tlZD9bJ25leHRfY2wnXT9cbiAgICAgICAgc3VwZXJcbiAgICAgIGVsc2UgaWYgQHVuY2hlY2tlZD9bJ3ByZXZfY2wnXVxuICAgICAgICBpZiBAdmFsaWRhdGVTYXZlZE9wZXJhdGlvbnMoKVxuICAgICAgICAgIGlmIEBwcmV2X2NsLm5leHRfY2w/XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgXCJQcm9iYWJseSBkdXBsaWNhdGVkIG9wZXJhdGlvbnNcIlxuICAgICAgICAgIEBwcmV2X2NsLm5leHRfY2wgPSBAXG4gICAgICAgICAgZGVsZXRlIEBwcmV2X2NsLnVuY2hlY2tlZC5uZXh0X2NsXG4gICAgICAgICAgc3VwZXJcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGZhbHNlXG4gICAgICBlbHNlIGlmIEBwcmV2X2NsPyBhbmQgbm90IEBwcmV2X2NsLm5leHRfY2w/XG4gICAgICAgIGRlbGV0ZSBAcHJldl9jbC51bmNoZWNrZWQubmV4dF9jbFxuICAgICAgICBAcHJldl9jbC5uZXh0X2NsID0gQFxuICAgICAgZWxzZSBpZiBAcHJldl9jbD8gb3IgQG5leHRfY2w/XG4gICAgICAgIHN1cGVyXG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvciBcIkRlbGltaXRlciBpcyB1bnN1ZmZpY2llbnQgZGVmaW5lZCFcIlxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjXG4gICAgX2VuY29kZTogKCktPlxuICAgICAge1xuICAgICAgICAndHlwZScgOiBcIkRlbGltaXRlclwiXG4gICAgICAgICd1aWQnIDogQGdldFVpZCgpXG4gICAgICAgICdwcmV2JyA6IEBwcmV2X2NsPy5nZXRVaWQoKVxuICAgICAgICAnbmV4dCcgOiBAbmV4dF9jbD8uZ2V0VWlkKClcbiAgICAgIH1cblxuICBwYXJzZXJbJ0RlbGltaXRlciddID0gKGpzb24pLT5cbiAgICB7XG4gICAgJ3VpZCcgOiB1aWRcbiAgICAncHJldicgOiBwcmV2XG4gICAgJ25leHQnIDogbmV4dFxuICAgIH0gPSBqc29uXG4gICAgbmV3IERlbGltaXRlciB1aWQsIHByZXYsIG5leHRcblxuICAjIFRoaXMgaXMgd2hhdCB0aGlzIG1vZHVsZSBleHBvcnRzIGFmdGVyIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBIaXN0b3J5QnVmZmVyXG4gIHtcbiAgICAndHlwZXMnIDpcbiAgICAgICdEZWxldGUnIDogRGVsZXRlXG4gICAgICAnSW5zZXJ0JyA6IEluc2VydFxuICAgICAgJ0RlbGltaXRlcic6IERlbGltaXRlclxuICAgICAgJ09wZXJhdGlvbic6IE9wZXJhdGlvblxuICAgICAgJ0ltbXV0YWJsZU9iamVjdCcgOiBJbW11dGFibGVPYmplY3RcbiAgICAncGFyc2VyJyA6IHBhcnNlclxuICAgICdleGVjdXRpb25fbGlzdGVuZXInIDogZXhlY3V0aW9uX2xpc3RlbmVyXG4gIH1cblxuXG5cblxuIiwidGV4dF90eXBlc191bmluaXRpYWxpemVkID0gcmVxdWlyZSBcIi4vVGV4dFR5cGVzXCJcblxubW9kdWxlLmV4cG9ydHMgPSAoSEIpLT5cbiAgdGV4dF90eXBlcyA9IHRleHRfdHlwZXNfdW5pbml0aWFsaXplZCBIQlxuICB0eXBlcyA9IHRleHRfdHlwZXMudHlwZXNcbiAgcGFyc2VyID0gdGV4dF90eXBlcy5wYXJzZXJcblxuICBjcmVhdGVKc29uVHlwZVdyYXBwZXIgPSAoX2pzb25UeXBlKS0+XG5cbiAgICAjXG4gICAgIyBAbm90ZSBFWFBFUklNRU5UQUxcbiAgICAjXG4gICAgIyBBIEpzb25UeXBlV3JhcHBlciB3YXMgaW50ZW5kZWQgdG8gYmUgYSBjb252ZW5pZW50IHdyYXBwZXIgZm9yIHRoZSBKc29uVHlwZS5cbiAgICAjIEJ1dCBpdCBjYW4gbWFrZSB0aGluZ3MgbW9yZSBkaWZmaWN1bHQgdGhhbiB0aGV5IGFyZS5cbiAgICAjIEBzZWUgSnNvblR5cGVcbiAgICAjXG4gICAgIyBAZXhhbXBsZSBjcmVhdGUgYSBKc29uVHlwZVdyYXBwZXJcbiAgICAjICAgIyBZb3UgZ2V0IGEgSnNvblR5cGVXcmFwcGVyIGZyb20gYSBKc29uVHlwZSBieSBjYWxsaW5nXG4gICAgIyAgIHcgPSB5YXR0YS52YWx1ZVxuICAgICNcbiAgICAjIEl0IGNyZWF0ZXMgSmF2YXNjcmlwdHMgLWdldHRlciBhbmQgLXNldHRlciBtZXRob2RzIGZvciBlYWNoIHByb3BlcnR5IHRoYXQgSnNvblR5cGUgbWFpbnRhaW5zLlxuICAgICMgQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvZGVmaW5lUHJvcGVydHlcbiAgICAjXG4gICAgIyBAZXhhbXBsZSBHZXR0ZXIgRXhhbXBsZVxuICAgICMgICAjIHlvdSBjYW4gYWNjZXNzIHRoZSB4IHByb3BlcnR5IG9mIHlhdHRhIGJ5IGNhbGxpbmdcbiAgICAjICAgdy54XG4gICAgIyAgICMgaW5zdGVhZCBvZlxuICAgICMgICB5YXR0YS52YWwoJ3gnKVxuICAgICNcbiAgICAjIEBub3RlIFlvdSBjYW4gb25seSBvdmVyd3JpdGUgZXhpc3RpbmcgdmFsdWVzISBTZXR0aW5nIGEgbmV3IHByb3BlcnR5IHdvbid0IGhhdmUgYW55IGVmZmVjdCFcbiAgICAjXG4gICAgIyBAZXhhbXBsZSBTZXR0ZXIgRXhhbXBsZVxuICAgICMgICAjIHlvdSBjYW4gc2V0IGFuIGV4aXN0aW5nIHggcHJvcGVydHkgb2YgeWF0dGEgYnkgY2FsbGluZ1xuICAgICMgICB3LnggPSBcInRleHRcIlxuICAgICMgICAjIGluc3RlYWQgb2ZcbiAgICAjICAgeWF0dGEudmFsKCd4JywgXCJ0ZXh0XCIpXG4gICAgI1xuICAgICMgSW4gb3JkZXIgdG8gc2V0IGEgbmV3IHByb3BlcnR5IHlvdSBoYXZlIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBwcm9wZXJ0eS5cbiAgICAjIFRoZXJlZm9yZSB0aGUgSnNvblR5cGVXcmFwcGVyIHN1cHBvcnRzIGEgc3BlY2lhbCBmZWF0dXJlIHRoYXQgc2hvdWxkIG1ha2UgdGhpbmdzIG1vcmUgY29udmVuaWVudFxuICAgICMgKHdlIGNhbiBhcmd1ZSBhYm91dCB0aGF0LCB1c2UgdGhlIEpzb25UeXBlIGlmIHlvdSBkb24ndCBsaWtlIGl0IDspLlxuICAgICMgSWYgeW91IG92ZXJ3cml0ZSBhbiBvYmplY3QgcHJvcGVydHkgb2YgdGhlIEpzb25UeXBlV3JhcHBlciB3aXRoIGEgbmV3IG9iamVjdCwgaXQgd2lsbCByZXN1bHQgaW4gYSBtZXJnZWQgdmVyc2lvbiBvZiB0aGUgb2JqZWN0cy5cbiAgICAjIExldCBgeWF0dGEudmFsdWUucGAgdGhlIHByb3BlcnR5IHRoYXQgaXMgdG8gYmUgb3ZlcndyaXR0ZW4gYW5kIG8gdGhlIG5ldyB2YWx1ZS4gRS5nLiBgeWF0dGEudmFsdWUucCA9IG9gXG4gICAgIyAqIFRoZSByZXN1bHQgaGFzIGFsbCBwcm9wZXJ0aWVzIG9mIG9cbiAgICAjICogVGhlIHJlc3VsdCBoYXMgYWxsIHByb3BlcnRpZXMgb2Ygdy5wIGlmIHRoZXkgZG9uJ3Qgb2NjdXIgdW5kZXIgdGhlIHNhbWUgcHJvcGVydHktbmFtZSBpbiBvLlxuICAgICNcbiAgICAjIEBleGFtcGxlIENvbmZsaWN0IEV4YW1wbGVcbiAgICAjICAgeWF0dGEudmFsdWUgPSB7YSA6IFwic3RyaW5nXCJ9XG4gICAgIyAgIHcgPSB5YXR0YS52YWx1ZVxuICAgICMgICBjb25zb2xlLmxvZyh3KSAjIHthIDogXCJzdHJpbmdcIn1cbiAgICAjICAgdy5hID0ge2EgOiB7YiA6IFwic3RyaW5nXCJ9fVxuICAgICMgICBjb25zb2xlLmxvZyh3KSAjIHthIDoge2IgOiBcIlN0cmluZ1wifX1cbiAgICAjICAgdy5hID0ge2EgOiB7YyA6IDR9fVxuICAgICMgICBjb25zb2xlLmxvZyh3KSAjIHthIDoge2IgOiBcIlN0cmluZ1wiLCBjIDogNH19XG4gICAgI1xuICAgICMgQGV4YW1wbGUgQ29tbW9uIFBpdGZhbGxzXG4gICAgIyAgIHcgPSB5YXR0YS52YWx1ZVxuICAgICMgICAjIFNldHRpbmcgYSBuZXcgcHJvcGVydHlcbiAgICAjICAgdy5uZXdQcm9wZXJ0eSA9IFwiQXdlc29tZVwiXG4gICAgIyAgIGNvbnNvbGUubG9nKHcubmV3UHJvcGVydHkgPT0gXCJBd2Vzb21lXCIpICMgZmFsc2UsIHcubmV3UHJvcGVydHkgaXMgdW5kZWZpbmVkXG4gICAgIyAgICMgb3ZlcndyaXRlIHRoZSB3IG9iamVjdFxuICAgICMgICB3ID0ge25ld1Byb3BlcnR5IDogXCJBd2Vzb21lXCJ9XG4gICAgIyAgIGNvbnNvbGUubG9nKHcubmV3UHJvcGVydHkgPT0gXCJBd2Vzb21lXCIpICMgdHJ1ZSEsIGJ1dCAuLlxuICAgICMgICBjb25zb2xlLmxvZyh5YXR0YS52YWx1ZS5uZXdQcm9wZXJ0eSA9PSBcIkF3ZXNvbWVcIikgIyBmYWxzZSwgeW91IGFyZSBvbmx5IGFsbG93ZWQgdG8gc2V0IHByb3BlcnRpZXMhXG4gICAgIyAgICMgVGhlIHNvbHV0aW9uXG4gICAgIyAgIHlhdHRhLnZhbHVlID0ge25ld1Byb3BlcnR5IDogXCJBd2Vzb21lXCJ9XG4gICAgIyAgIGNvbnNvbGUubG9nKHcubmV3UHJvcGVydHkgPT0gXCJBd2Vzb21lXCIpICMgdHJ1ZSFcbiAgICAjXG4gICAgY2xhc3MgSnNvblR5cGVXcmFwcGVyXG5cbiAgICAgICNcbiAgICAgICMgQHBhcmFtIHtKc29uVHlwZX0ganNvblR5cGUgSW5zdGFuY2Ugb2YgdGhlIEpzb25UeXBlIHRoYXQgdGhpcyBjbGFzcyB3cmFwcGVzLlxuICAgICAgI1xuICAgICAgY29uc3RydWN0b3I6IChqc29uVHlwZSktPlxuICAgICAgICBmb3IgbmFtZSwgb2JqIG9mIGpzb25UeXBlLm1hcFxuICAgICAgICAgIGRvIChuYW1lLCBvYmopLT5cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBKc29uVHlwZVdyYXBwZXIucHJvdG90eXBlLCBuYW1lLFxuICAgICAgICAgICAgICBnZXQgOiAtPlxuICAgICAgICAgICAgICAgIHggPSBvYmoudmFsKClcbiAgICAgICAgICAgICAgICBpZiB4IGluc3RhbmNlb2YgSnNvblR5cGVcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUpzb25UeXBlV3JhcHBlciB4XG4gICAgICAgICAgICAgICAgZWxzZSBpZiB4IGluc3RhbmNlb2YgdHlwZXMuSW1tdXRhYmxlT2JqZWN0XG4gICAgICAgICAgICAgICAgICB4LnZhbCgpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgeFxuICAgICAgICAgICAgICBzZXQgOiAobyktPlxuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZSA9IGpzb25UeXBlLnZhbChuYW1lKVxuICAgICAgICAgICAgICAgIGlmIG8uY29uc3RydWN0b3IgaXMge30uY29uc3RydWN0b3IgYW5kIG92ZXJ3cml0ZSBpbnN0YW5jZW9mIHR5cGVzLk9wZXJhdGlvblxuICAgICAgICAgICAgICAgICAgZm9yIG9fbmFtZSxvX29iaiBvZiBvXG4gICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZS52YWwob19uYW1lLCBvX29iaiwgJ2ltbXV0YWJsZScpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAganNvblR5cGUudmFsKG5hbWUsIG8sICdpbW11dGFibGUnKVxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICBuZXcgSnNvblR5cGVXcmFwcGVyIF9qc29uVHlwZVxuXG4gICNcbiAgIyBNYW5hZ2VzIE9iamVjdC1saWtlIHZhbHVlcy5cbiAgI1xuICBjbGFzcyBKc29uVHlwZSBleHRlbmRzIHR5cGVzLk1hcE1hbmFnZXJcblxuICAgICNcbiAgICAjIEBwYXJhbSB7T2JqZWN0fSB1aWQgQSB1bmlxdWUgaWRlbnRpZmllci4gSWYgdWlkIGlzIHVuZGVmaW5lZCwgYSBuZXcgdWlkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAjIEBwYXJhbSB7T2JqZWN0fSBpbml0aWFsX3ZhbHVlIENyZWF0ZSB0aGlzIG9wZXJhdGlvbiB3aXRoIGFuIGluaXRpYWwgdmFsdWUuXG4gICAgIyBAcGFyYW0ge1N0cmluZ3xCb29sZWFufSBXaGV0aGVyIHRoZSBpbml0aWFsX3ZhbHVlIHNob3VsZCBiZSBjcmVhdGVkIGFzIG11dGFibGUuIChPcHRpb25hbCAtIHNlZSBzZXRNdXRhYmxlRGVmYXVsdClcbiAgICAjXG4gICAgY29uc3RydWN0b3I6ICh1aWQsIGluaXRpYWxfdmFsdWUsIG11dGFibGUpLT5cbiAgICAgIHN1cGVyIHVpZFxuICAgICAgaWYgaW5pdGlhbF92YWx1ZT9cbiAgICAgICAgaWYgdHlwZW9mIGluaXRpYWxfdmFsdWUgaXNudCBcIm9iamVjdFwiXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiVGhlIGluaXRpYWwgdmFsdWUgb2YgSnNvblR5cGVzIG11c3QgYmUgb2YgdHlwZSBPYmplY3QhIChjdXJyZW50IHR5cGU6ICN7dHlwZW9mIGluaXRpYWxfdmFsdWV9KVwiXG4gICAgICAgIGZvciBuYW1lLG8gb2YgaW5pdGlhbF92YWx1ZVxuICAgICAgICAgIEB2YWwgbmFtZSwgbywgbXV0YWJsZVxuXG4gICAgI1xuICAgICMgSWRlbnRpZmllcyB0aGlzIGNsYXNzLlxuICAgICMgVXNlIGl0IHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIGpzb24tdHlwZSBvciBzb21ldGhpbmcgZWxzZS5cbiAgICAjXG4gICAgIyBAZXhhbXBsZVxuICAgICMgICB2YXIgeCA9IHlhdHRhLnZhbCgndW5rbm93bicpXG4gICAgIyAgIGlmICh4LnR5cGUgPT09IFwiSnNvblR5cGVcIikge1xuICAgICMgICAgIGNvbnNvbGUubG9nIEpTT04uc3RyaW5naWZ5KHgudG9Kc29uKCkpXG4gICAgIyAgIH1cbiAgICAjXG4gICAgdHlwZTogXCJKc29uVHlwZVwiXG5cbiAgICBhcHBseURlbGV0ZTogKCktPlxuICAgICAgc3VwZXIoKVxuXG4gICAgY2xlYW51cDogKCktPlxuICAgICAgc3VwZXIoKVxuICAgICNcbiAgICAjIFRyYW5zZm9ybSB0aGlzIHRvIGEgSnNvbiBhbmQgbG9vc2UgYWxsIHRoZSBzaGFyaW5nLWFiaWxpdGllcyAodGhlIG5ldyBvYmplY3Qgd2lsbCBiZSBhIGRlZXAgY2xvbmUpIVxuICAgICMgQHJldHVybiB7SnNvbn1cbiAgICAjXG4gICAgdG9Kc29uOiAoKS0+XG4gICAgICB2YWwgPSBAdmFsKClcbiAgICAgIGpzb24gPSB7fVxuICAgICAgZm9yIG5hbWUsIG8gb2YgdmFsXG4gICAgICAgIGlmIG8gaXMgbnVsbFxuICAgICAgICAgIGpzb25bbmFtZV0gPSBvXG4gICAgICAgIGVsc2UgaWYgby5jb25zdHJ1Y3RvciBpcyB7fS5jb25zdHJ1Y3RvclxuICAgICAgICAgIGpzb25bbmFtZV0gPSBAdmFsKG5hbWUpLnRvSnNvbigpXG4gICAgICAgIGVsc2UgaWYgbyBpbnN0YW5jZW9mIHR5cGVzLk9wZXJhdGlvblxuICAgICAgICAgIHdoaWxlIG8gaW5zdGFuY2VvZiB0eXBlcy5PcGVyYXRpb25cbiAgICAgICAgICAgIG8gPSBvLnZhbCgpXG4gICAgICAgICAganNvbltuYW1lXSA9IG9cbiAgICAgICAgZWxzZVxuICAgICAgICAgIGpzb25bbmFtZV0gPSBvXG4gICAgICBqc29uXG5cbiAgICAjXG4gICAgIyBAc2VlIFdvcmRUeXBlLnNldFJlcGxhY2VNYW5hZ2VyXG4gICAgIyBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyBKc29uVHlwZSBvYmplY3QuXG4gICAgI1xuICAgIHNldFJlcGxhY2VNYW5hZ2VyOiAocmVwbGFjZV9tYW5hZ2VyKS0+XG4gICAgICBAcmVwbGFjZV9tYW5hZ2VyID0gcmVwbGFjZV9tYW5hZ2VyXG4gICAgICBAb24gWydjaGFuZ2UnLCdhZGRQcm9wZXJ0eSddLCAoKS0+XG4gICAgICAgIGlmIHJlcGxhY2VfbWFuYWdlci5wYXJlbnQ/XG4gICAgICAgICAgcmVwbGFjZV9tYW5hZ2VyLnBhcmVudC5mb3J3YXJkRXZlbnQgdGhpcywgYXJndW1lbnRzLi4uXG5cbiAgICAjXG4gICAgIyBHZXQgdGhlIHBhcmVudCBvZiB0aGlzIEpzb25UeXBlLlxuICAgICMgQHJldHVybiB7SnNvblR5cGV9XG4gICAgI1xuICAgIGdldFBhcmVudDogKCktPlxuICAgICAgQHJlcGxhY2VfbWFuYWdlci5wYXJlbnRcblxuICAgICNcbiAgICAjIFdoZXRoZXIgdGhlIGRlZmF1bHQgaXMgJ211dGFibGUnICh0cnVlKSBvciAnaW1tdXRhYmxlJyAoZmFsc2UpXG4gICAgI1xuICAgIG11dGFibGVfZGVmYXVsdDpcbiAgICAgIHRydWVcblxuICAgICNcbiAgICAjIFNldCBpZiB0aGUgZGVmYXVsdCBpcyAnbXV0YWJsZScgb3IgJ2ltbXV0YWJsZSdcbiAgICAjIEBwYXJhbSB7U3RyaW5nfEJvb2xlYW59IG11dGFibGUgU2V0IGVpdGhlciAnbXV0YWJsZScgLyB0cnVlIG9yICdpbW11dGFibGUnIC8gZmFsc2VcbiAgICBzZXRNdXRhYmxlRGVmYXVsdDogKG11dGFibGUpLT5cbiAgICAgIGlmIG11dGFibGUgaXMgdHJ1ZSBvciBtdXRhYmxlIGlzICdtdXRhYmxlJ1xuICAgICAgICBKc29uVHlwZS5wcm90b3R5cGUubXV0YWJsZV9kZWZhdWx0ID0gdHJ1ZVxuICAgICAgZWxzZSBpZiBtdXRhYmxlIGlzIGZhbHNlIG9yIG11dGFibGUgaXMgJ2ltbXV0YWJsZSdcbiAgICAgICAgSnNvblR5cGUucHJvdG90eXBlLm11dGFibGVfZGVmYXVsdCA9IGZhbHNlXG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvciAnU2V0IG11dGFibGUgZWl0aGVyIFwibXV0YWJsZVwiIG9yIFwiaW1tdXRhYmxlXCIhJ1xuICAgICAgJ09LJ1xuXG4gICAgI1xuICAgICMgQG92ZXJsb2FkIHZhbCgpXG4gICAgIyAgIEdldCB0aGlzIGFzIGEgSnNvbiBvYmplY3QuXG4gICAgIyAgIEByZXR1cm4gW0pzb25dXG4gICAgI1xuICAgICMgQG92ZXJsb2FkIHZhbChuYW1lKVxuICAgICMgICBHZXQgdmFsdWUgb2YgYSBwcm9wZXJ0eS5cbiAgICAjICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICMgICBAcmV0dXJuIFtKc29uVHlwZXxXb3JkVHlwZXxTdHJpbmd8T2JqZWN0XSBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gSWYgbXV0YWJsZSBpdCB3aWxsIHJldHVybiBhIE9wZXJhdGlvbi10eXBlIG9iamVjdCwgaWYgaW1tdXRhYmxlIGl0IHdpbGwgcmV0dXJuIFN0cmluZy9PYmplY3QuXG4gICAgI1xuICAgICMgQG92ZXJsb2FkIHZhbChuYW1lLCBjb250ZW50KVxuICAgICMgICBTZXQgYSBuZXcgcHJvcGVydHkuXG4gICAgIyAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAjICAgQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBjb250ZW50IENvbnRlbnQgb2YgdGhlIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAjICAgQHJldHVybiBbSnNvblR5cGVdIFRoaXMgb2JqZWN0LiAoc3VwcG9ydHMgY2hhaW5pbmcpXG4gICAgI1xuICAgIHZhbDogKG5hbWUsIGNvbnRlbnQsIG11dGFibGUpLT5cbiAgICAgIGlmIHR5cGVvZiBuYW1lIGlzICdvYmplY3QnXG4gICAgICAgICMgU3BlY2lhbCBjYXNlLiBGaXJzdCBhcmd1bWVudCBpcyBhbiBvYmplY3QuIFRoZW4gdGhlIHNlY29uZCBhcmcgaXMgbXV0YWJsZS5cbiAgICAgICAgIyBLZWVwIHRoYXQgaW4gbWluZCB3aGVuIHJlYWRpbmcgdGhlIGZvbGxvd2luZy4uXG4gICAgICAgIGpzb24gPSBuZXcgSnNvblR5cGUgdW5kZWZpbmVkLCBuYW1lLCBjb250ZW50XG4gICAgICAgIEhCLmFkZE9wZXJhdGlvbihqc29uKS5leGVjdXRlKClcbiAgICAgICAgQHJlcGxhY2VfbWFuYWdlci5yZXBsYWNlIGpzb25cbiAgICAgICAgQFxuICAgICAgZWxzZSBpZiBuYW1lPyBhbmQgYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgICAgaWYgbXV0YWJsZT9cbiAgICAgICAgICBpZiBtdXRhYmxlIGlzIHRydWUgb3IgbXV0YWJsZSBpcyAnbXV0YWJsZSdcbiAgICAgICAgICAgIG11dGFibGUgPSB0cnVlXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXV0YWJsZSA9IGZhbHNlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBtdXRhYmxlID0gQG11dGFibGVfZGVmYXVsdFxuICAgICAgICBpZiB0eXBlb2YgY29udGVudCBpcyAnZnVuY3Rpb24nXG4gICAgICAgICAgQCAjIEp1c3QgZG8gbm90aGluZ1xuICAgICAgICBlbHNlIGlmIChub3QgY29udGVudD8pIG9yICgoKG5vdCBtdXRhYmxlKSBvciB0eXBlb2YgY29udGVudCBpcyAnbnVtYmVyJykgYW5kIGNvbnRlbnQuY29uc3RydWN0b3IgaXNudCBPYmplY3QpXG4gICAgICAgICAgb2JqID0gSEIuYWRkT3BlcmF0aW9uKG5ldyB0eXBlcy5JbW11dGFibGVPYmplY3QgdW5kZWZpbmVkLCBjb250ZW50KS5leGVjdXRlKClcbiAgICAgICAgICBzdXBlciBuYW1lLCBvYmpcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGlmIHR5cGVvZiBjb250ZW50IGlzICdzdHJpbmcnXG4gICAgICAgICAgICB3b3JkID0gSEIuYWRkT3BlcmF0aW9uKG5ldyB0eXBlcy5Xb3JkVHlwZSB1bmRlZmluZWQpLmV4ZWN1dGUoKVxuICAgICAgICAgICAgd29yZC5pbnNlcnRUZXh0IDAsIGNvbnRlbnRcbiAgICAgICAgICAgIHN1cGVyIG5hbWUsIHdvcmRcbiAgICAgICAgICBlbHNlIGlmIGNvbnRlbnQuY29uc3RydWN0b3IgaXMgT2JqZWN0XG4gICAgICAgICAgICBqc29uID0gSEIuYWRkT3BlcmF0aW9uKG5ldyBKc29uVHlwZSB1bmRlZmluZWQsIGNvbnRlbnQsIG11dGFibGUpLmV4ZWN1dGUoKVxuICAgICAgICAgICAgc3VwZXIgbmFtZSwganNvblxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciBcIllvdSBtdXN0IG5vdCBzZXQgI3t0eXBlb2YgY29udGVudH0tdHlwZXMgaW4gY29sbGFib3JhdGl2ZSBKc29uLW9iamVjdHMhXCJcbiAgICAgIGVsc2VcbiAgICAgICAgc3VwZXIgbmFtZSwgY29udGVudFxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5IEpzb25UeXBlLnByb3RvdHlwZSwgJ3ZhbHVlJyxcbiAgICAgIGdldCA6IC0+IGNyZWF0ZUpzb25UeXBlV3JhcHBlciBAXG4gICAgICBzZXQgOiAobyktPlxuICAgICAgICBpZiBvLmNvbnN0cnVjdG9yIGlzIHt9LmNvbnN0cnVjdG9yXG4gICAgICAgICAgZm9yIG9fbmFtZSxvX29iaiBvZiBvXG4gICAgICAgICAgICBAdmFsKG9fbmFtZSwgb19vYmosICdpbW11dGFibGUnKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiWW91IG11c3Qgb25seSBzZXQgT2JqZWN0IHZhbHVlcyFcIlxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjXG4gICAgX2VuY29kZTogKCktPlxuICAgICAge1xuICAgICAgICAndHlwZScgOiBcIkpzb25UeXBlXCJcbiAgICAgICAgJ3VpZCcgOiBAZ2V0VWlkKClcbiAgICAgIH1cblxuICBwYXJzZXJbJ0pzb25UeXBlJ10gPSAoanNvbiktPlxuICAgIHtcbiAgICAgICd1aWQnIDogdWlkXG4gICAgfSA9IGpzb25cbiAgICBuZXcgSnNvblR5cGUgdWlkXG5cblxuXG5cbiAgdHlwZXNbJ0pzb25UeXBlJ10gPSBKc29uVHlwZVxuXG4gIHRleHRfdHlwZXNcblxuXG4iLCJiYXNpY190eXBlc191bmluaXRpYWxpemVkID0gcmVxdWlyZSBcIi4vQmFzaWNUeXBlc1wiXG5cbm1vZHVsZS5leHBvcnRzID0gKEhCKS0+XG4gIGJhc2ljX3R5cGVzID0gYmFzaWNfdHlwZXNfdW5pbml0aWFsaXplZCBIQlxuICB0eXBlcyA9IGJhc2ljX3R5cGVzLnR5cGVzXG4gIHBhcnNlciA9IGJhc2ljX3R5cGVzLnBhcnNlclxuXG4gICNcbiAgIyBAbm9kb2NcbiAgIyBNYW5hZ2VzIG1hcCBsaWtlIG9iamVjdHMuIEUuZy4gSnNvbi1UeXBlIGFuZCBYTUwgYXR0cmlidXRlcy5cbiAgI1xuICBjbGFzcyBNYXBNYW5hZ2VyIGV4dGVuZHMgdHlwZXMuT3BlcmF0aW9uXG5cbiAgICAjXG4gICAgIyBAcGFyYW0ge09iamVjdH0gdWlkIEEgdW5pcXVlIGlkZW50aWZpZXIuIElmIHVpZCBpcyB1bmRlZmluZWQsIGEgbmV3IHVpZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgI1xuICAgIGNvbnN0cnVjdG9yOiAodWlkKS0+XG4gICAgICBAbWFwID0ge31cbiAgICAgIHN1cGVyIHVpZFxuXG4gICAgdHlwZTogXCJNYXBNYW5hZ2VyXCJcblxuICAgIGFwcGx5RGVsZXRlOiAoKS0+XG4gICAgICBmb3IgbmFtZSxwIG9mIEBtYXBcbiAgICAgICAgcC5hcHBseURlbGV0ZSgpXG4gICAgICBzdXBlcigpXG5cbiAgICBjbGVhbnVwOiAoKS0+XG4gICAgICBzdXBlcigpXG5cbiAgICAjXG4gICAgIyBAc2VlIEpzb25UeXBlcy52YWxcbiAgICAjXG4gICAgdmFsOiAobmFtZSwgY29udGVudCktPlxuICAgICAgaWYgY29udGVudD9cbiAgICAgICAgaWYgbm90IEBtYXBbbmFtZV0/XG4gICAgICAgICAgSEIuYWRkT3BlcmF0aW9uKG5ldyBBZGROYW1lIHVuZGVmaW5lZCwgQCwgbmFtZSkuZXhlY3V0ZSgpXG4gICAgICAgIEBtYXBbbmFtZV0ucmVwbGFjZSBjb250ZW50XG4gICAgICAgIEBcbiAgICAgIGVsc2UgaWYgbmFtZT9cbiAgICAgICAgb2JqID0gQG1hcFtuYW1lXT8udmFsKClcbiAgICAgICAgaWYgb2JqIGluc3RhbmNlb2YgdHlwZXMuSW1tdXRhYmxlT2JqZWN0XG4gICAgICAgICAgb2JqLnZhbCgpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvYmpcbiAgICAgIGVsc2VcbiAgICAgICAgcmVzdWx0ID0ge31cbiAgICAgICAgZm9yIG5hbWUsbyBvZiBAbWFwXG4gICAgICAgICAgb2JqID0gby52YWwoKVxuICAgICAgICAgIGlmIG9iaiBpbnN0YW5jZW9mIHR5cGVzLkltbXV0YWJsZU9iamVjdCBvciBvYmogaW5zdGFuY2VvZiBNYXBNYW5hZ2VyXG4gICAgICAgICAgICBvYmogPSBvYmoudmFsKClcbiAgICAgICAgICByZXN1bHRbbmFtZV0gPSBvYmpcbiAgICAgICAgcmVzdWx0XG5cbiAgI1xuICAjIEBub2RvY1xuICAjIFdoZW4gYSBuZXcgcHJvcGVydHkgaW4gYSBtYXAgbWFuYWdlciBpcyBjcmVhdGVkLCB0aGVuIHRoZSB1aWRzIG9mIHRoZSBpbnNlcnRlZCBPcGVyYXRpb25zXG4gICMgbXVzdCBiZSB1bmlxdWUgKHRoaW5rIGFib3V0IGNvbmN1cnJlbnQgb3BlcmF0aW9ucykuIFRoZXJlZm9yZSBvbmx5IGFuIEFkZE5hbWUgb3BlcmF0aW9uIGlzIGFsbG93ZWQgdG9cbiAgIyBhZGQgYSBwcm9wZXJ0eSBpbiBhIE1hcE1hbmFnZXIuIElmIHR3byBBZGROYW1lIG9wZXJhdGlvbnMgb24gdGhlIHNhbWUgTWFwTWFuYWdlciBuYW1lIGhhcHBlbiBjb25jdXJyZW50bHlcbiAgIyBvbmx5IG9uZSB3aWxsIEFkZE5hbWUgb3BlcmF0aW9uIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICNcbiAgY2xhc3MgQWRkTmFtZSBleHRlbmRzIHR5cGVzLk9wZXJhdGlvblxuXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHBhcmFtIHtPYmplY3R9IG1hcF9tYW5hZ2VyIFVpZCBvciByZWZlcmVuY2UgdG8gdGhlIE1hcE1hbmFnZXIuXG4gICAgIyBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYWRkZWQuXG4gICAgI1xuICAgIGNvbnN0cnVjdG9yOiAodWlkLCBtYXBfbWFuYWdlciwgQG5hbWUpLT5cbiAgICAgIEBzYXZlT3BlcmF0aW9uICdtYXBfbWFuYWdlcicsIG1hcF9tYW5hZ2VyXG4gICAgICBzdXBlciB1aWRcblxuICAgIHR5cGU6IFwiQWRkTmFtZVwiXG5cbiAgICBhcHBseURlbGV0ZTogKCktPlxuICAgICAgc3VwZXIoKVxuXG4gICAgY2xlYW51cDogKCktPlxuICAgICAgc3VwZXIoKVxuXG4gICAgI1xuICAgICMgSWYgbWFwX21hbmFnZXIgZG9lc24ndCBoYXZlIHRoZSBwcm9wZXJ0eSBuYW1lLCB0aGVuIGFkZCBpdC5cbiAgICAjIFRoZSBSZXBsYWNlTWFuYWdlciB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gb24gdGhlIHByb3BlcnR5IGlzIHVuaXF1ZVxuICAgICMgaW4gc3VjaCBhIHdheSB0aGF0IGlmIEFkZE5hbWUgaXMgZXhlY3V0ZWQgKGZyb20gYW5vdGhlciBwZWVyKSBpdCB3aWxsXG4gICAgIyBhbHdheXMgaGF2ZSB0aGUgc2FtZSByZXN1bHQgKFJlcGxhY2VNYW5hZ2VyLCBhbmQgaXRzIGJlZ2lubmluZyBhbmQgZW5kIGFyZSB0aGUgc2FtZSlcbiAgICAjXG4gICAgZXhlY3V0ZTogKCktPlxuICAgICAgaWYgbm90IEB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucygpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgZWxzZVxuICAgICAgICB1aWRfciA9IEBtYXBfbWFuYWdlci5nZXRVaWQoKVxuICAgICAgICB1aWRfci5vcF9udW1iZXIgPSBcIl8je3VpZF9yLm9wX251bWJlcn1fUk1fI3tAbmFtZX1cIlxuICAgICAgICBpZiBub3QgSEIuZ2V0T3BlcmF0aW9uKHVpZF9yKT9cbiAgICAgICAgICB1aWRfYmVnID0gQG1hcF9tYW5hZ2VyLmdldFVpZCgpXG4gICAgICAgICAgdWlkX2JlZy5vcF9udW1iZXIgPSBcIl8je3VpZF9iZWcub3BfbnVtYmVyfV9STV8je0BuYW1lfV9iZWdpbm5pbmdcIlxuICAgICAgICAgIHVpZF9lbmQgPSBAbWFwX21hbmFnZXIuZ2V0VWlkKClcbiAgICAgICAgICB1aWRfZW5kLm9wX251bWJlciA9IFwiXyN7dWlkX2VuZC5vcF9udW1iZXJ9X1JNXyN7QG5hbWV9X2VuZFwiXG4gICAgICAgICAgYmVnID0gSEIuYWRkT3BlcmF0aW9uKG5ldyB0eXBlcy5EZWxpbWl0ZXIgdWlkX2JlZywgdW5kZWZpbmVkLCB1aWRfZW5kKS5leGVjdXRlKClcbiAgICAgICAgICBlbmQgPSBIQi5hZGRPcGVyYXRpb24obmV3IHR5cGVzLkRlbGltaXRlciB1aWRfZW5kLCBiZWcsIHVuZGVmaW5lZCkuZXhlY3V0ZSgpXG4gICAgICAgICAgQG1hcF9tYW5hZ2VyLm1hcFtAbmFtZV0gPSBIQi5hZGRPcGVyYXRpb24obmV3IFJlcGxhY2VNYW5hZ2VyIHVuZGVmaW5lZCwgdWlkX3IsIGJlZywgZW5kKVxuICAgICAgICAgIEBtYXBfbWFuYWdlci5tYXBbQG5hbWVdLnNldFBhcmVudCBAbWFwX21hbmFnZXIsIEBuYW1lXG4gICAgICAgICAgKEBtYXBfbWFuYWdlci5tYXBbQG5hbWVdLmFkZF9uYW1lX29wcyA/PSBbXSkucHVzaCBAXG4gICAgICAgICAgQG1hcF9tYW5hZ2VyLm1hcFtAbmFtZV0uZXhlY3V0ZSgpXG4gICAgICAgIHN1cGVyXG5cbiAgICAjXG4gICAgIyBFbmNvZGUgdGhpcyBvcGVyYXRpb24gaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBwYXJzZWQgYnkgcmVtb3RlIHBlZXJzLlxuICAgICNcbiAgICBfZW5jb2RlOiAoKS0+XG4gICAgICB7XG4gICAgICAgICd0eXBlJyA6IFwiQWRkTmFtZVwiXG4gICAgICAgICd1aWQnIDogQGdldFVpZCgpXG4gICAgICAgICdtYXBfbWFuYWdlcicgOiBAbWFwX21hbmFnZXIuZ2V0VWlkKClcbiAgICAgICAgJ25hbWUnIDogQG5hbWVcbiAgICAgIH1cblxuICBwYXJzZXJbJ0FkZE5hbWUnXSA9IChqc29uKS0+XG4gICAge1xuICAgICAgJ21hcF9tYW5hZ2VyJyA6IG1hcF9tYW5hZ2VyXG4gICAgICAndWlkJyA6IHVpZFxuICAgICAgJ25hbWUnIDogbmFtZVxuICAgIH0gPSBqc29uXG4gICAgbmV3IEFkZE5hbWUgdWlkLCBtYXBfbWFuYWdlciwgbmFtZVxuXG4gICNcbiAgIyBAbm9kb2NcbiAgIyBNYW5hZ2VzIGEgbGlzdCBvZiBJbnNlcnQtdHlwZSBvcGVyYXRpb25zLlxuICAjXG4gIGNsYXNzIExpc3RNYW5hZ2VyIGV4dGVuZHMgdHlwZXMuT3BlcmF0aW9uXG5cbiAgICAjXG4gICAgIyBBIExpc3RNYW5hZ2VyIG1haW50YWlucyBhIG5vbi1lbXB0eSBsaXN0IHRoYXQgaGFzIGEgYmVnaW5uaW5nIGFuZCBhbiBlbmQgKGJvdGggRGVsaW1pdGVycyEpXG4gICAgIyBAcGFyYW0ge09iamVjdH0gdWlkIEEgdW5pcXVlIGlkZW50aWZpZXIuIElmIHVpZCBpcyB1bmRlZmluZWQsIGEgbmV3IHVpZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgIyBAcGFyYW0ge0RlbGltaXRlcn0gYmVnaW5uaW5nIFJlZmVyZW5jZSBvciBPYmplY3QuXG4gICAgIyBAcGFyYW0ge0RlbGltaXRlcn0gZW5kIFJlZmVyZW5jZSBvciBPYmplY3QuXG4gICAgY29uc3RydWN0b3I6ICh1aWQsIGJlZ2lubmluZywgZW5kLCBwcmV2LCBuZXh0LCBvcmlnaW4pLT5cbiAgICAgIGlmIGJlZ2lubmluZz8gYW5kIGVuZD9cbiAgICAgICAgQHNhdmVPcGVyYXRpb24gJ2JlZ2lubmluZycsIGJlZ2lubmluZ1xuICAgICAgICBAc2F2ZU9wZXJhdGlvbiAnZW5kJywgZW5kXG4gICAgICBlbHNlXG4gICAgICAgIEBiZWdpbm5pbmcgPSBIQi5hZGRPcGVyYXRpb24gbmV3IHR5cGVzLkRlbGltaXRlciB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkXG4gICAgICAgIEBlbmQgPSAgICAgICBIQi5hZGRPcGVyYXRpb24gbmV3IHR5cGVzLkRlbGltaXRlciB1bmRlZmluZWQsIEBiZWdpbm5pbmcsIHVuZGVmaW5lZFxuICAgICAgICBAYmVnaW5uaW5nLm5leHRfY2wgPSBAZW5kXG4gICAgICAgIEBiZWdpbm5pbmcuZXhlY3V0ZSgpXG4gICAgICAgIEBlbmQuZXhlY3V0ZSgpXG4gICAgICBzdXBlciB1aWQsIHByZXYsIG5leHQsIG9yaWdpblxuXG4gICAgdHlwZTogXCJMaXN0TWFuYWdlclwiXG5cbiAgICAjXG4gICAgIyBAcHJpdmF0ZVxuICAgICMgQHNlZSBPcGVyYXRpb24uZXhlY3V0ZVxuICAgICNcbiAgICBleGVjdXRlOiAoKS0+XG4gICAgICBpZiBAdmFsaWRhdGVTYXZlZE9wZXJhdGlvbnMoKVxuICAgICAgICBAYmVnaW5uaW5nLnNldFBhcmVudCBAXG4gICAgICAgIEBlbmQuc2V0UGFyZW50IEBcbiAgICAgICAgc3VwZXJcbiAgICAgIGVsc2VcbiAgICAgICAgZmFsc2VcblxuICAgICMgR2V0IHRoZSBlbGVtZW50IHByZXZpb3VzIHRvIHRoZSBkZWxlbWl0ZXIgYXQgdGhlIGVuZFxuICAgIGdldExhc3RPcGVyYXRpb246ICgpLT5cbiAgICAgIEBlbmQucHJldl9jbFxuXG4gICAgIyBzaW1pbGFyIHRvIHRoZSBhYm92ZVxuICAgIGdldEZpcnN0T3BlcmF0aW9uOiAoKS0+XG4gICAgICBAYmVnaW5uaW5nLm5leHRfY2xcblxuICAgICMgVHJhbnNmb3JtcyB0aGUgdGhlIGxpc3QgdG8gYW4gYXJyYXlcbiAgICAjIERvZXNuJ3QgcmV0dXJuIGxlZnQtcmlnaHQgZGVsaW1pdGVyLlxuICAgIHRvQXJyYXk6ICgpLT5cbiAgICAgIG8gPSBAYmVnaW5uaW5nLm5leHRfY2xcbiAgICAgIHJlc3VsdCA9IFtdXG4gICAgICB3aGlsZSBvIGlzbnQgQGVuZFxuICAgICAgICByZXN1bHQucHVzaCBvXG4gICAgICAgIG8gPSBvLm5leHRfY2xcbiAgICAgIHJlc3VsdFxuXG4gICAgI1xuICAgICMgUmV0cmlldmVzIHRoZSB4LXRoIG5vdCBkZWxldGVkIGVsZW1lbnQuXG4gICAgI1xuICAgIGdldE9wZXJhdGlvbkJ5UG9zaXRpb246IChwb3NpdGlvbiktPlxuICAgICAgbyA9IEBiZWdpbm5pbmcubmV4dF9jbFxuICAgICAgaWYgKHBvc2l0aW9uID4gMCBvciBvLmlzRGVsZXRlZCgpKSBhbmQgbm90IChvIGluc3RhbmNlb2YgdHlwZXMuRGVsaW1pdGVyKVxuICAgICAgICB3aGlsZSBvLmlzRGVsZXRlZCgpIGFuZCBub3QgKG8gaW5zdGFuY2VvZiB0eXBlcy5EZWxpbWl0ZXIpXG4gICAgICAgICAgIyBmaW5kIGZpcnN0IG5vbiBkZWxldGVkIG9wXG4gICAgICAgICAgbyA9IG8ubmV4dF9jbFxuICAgICAgICB3aGlsZSB0cnVlXG4gICAgICAgICAgIyBmaW5kIHRoZSBpLXRoIG9wXG4gICAgICAgICAgaWYgbyBpbnN0YW5jZW9mIHR5cGVzLkRlbGltaXRlclxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBpZiBwb3NpdGlvbiA8PSAwIGFuZCBub3Qgby5pc0RlbGV0ZWQoKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBvID0gby5uZXh0X2NsXG4gICAgICAgICAgaWYgbm90IG8uaXNEZWxldGVkKClcbiAgICAgICAgICAgIHBvc2l0aW9uIC09IDFcbiAgICAgIG9cblxuICAjXG4gICMgQG5vZG9jXG4gICMgQWRkcyBzdXBwb3J0IGZvciByZXBsYWNlLiBUaGUgUmVwbGFjZU1hbmFnZXIgbWFuYWdlcyBSZXBsYWNlYWJsZSBvcGVyYXRpb25zLlxuICAjIEVhY2ggUmVwbGFjZWFibGUgaG9sZHMgYSB2YWx1ZSB0aGF0IGlzIG5vdyByZXBsYWNlYWJsZS5cbiAgI1xuICAjIFRoZSBXb3JkVHlwZS10eXBlIGhhcyBpbXBsZW1lbnRlZCBzdXBwb3J0IGZvciByZXBsYWNlXG4gICMgQHNlZSBXb3JkVHlwZVxuICAjXG4gIGNsYXNzIFJlcGxhY2VNYW5hZ2VyIGV4dGVuZHMgTGlzdE1hbmFnZXJcbiAgICAjXG4gICAgIyBAcGFyYW0ge09wZXJhdGlvbn0gaW5pdGlhbF9jb250ZW50IEluaXRpYWxpemUgdGhpcyB3aXRoIGEgUmVwbGFjZWFibGUgdGhhdCBob2xkcyB0aGUgaW5pdGlhbF9jb250ZW50LlxuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHBhcmFtIHtEZWxpbWl0ZXJ9IGJlZ2lubmluZyBSZWZlcmVuY2Ugb3IgT2JqZWN0LlxuICAgICMgQHBhcmFtIHtEZWxpbWl0ZXJ9IGVuZCBSZWZlcmVuY2Ugb3IgT2JqZWN0LlxuICAgIGNvbnN0cnVjdG9yOiAoaW5pdGlhbF9jb250ZW50LCB1aWQsIGJlZ2lubmluZywgZW5kLCBwcmV2LCBuZXh0LCBvcmlnaW4pLT5cbiAgICAgIHN1cGVyIHVpZCwgYmVnaW5uaW5nLCBlbmQsIHByZXYsIG5leHQsIG9yaWdpblxuICAgICAgaWYgaW5pdGlhbF9jb250ZW50P1xuICAgICAgICBAcmVwbGFjZSBpbml0aWFsX2NvbnRlbnRcblxuICAgIHR5cGU6IFwiUmVwbGFjZU1hbmFnZXJcIlxuXG4gICAgYXBwbHlEZWxldGU6ICgpLT5cbiAgICAgIG8gPSBAYmVnaW5uaW5nXG4gICAgICB3aGlsZSBvP1xuICAgICAgICBvLmFwcGx5RGVsZXRlKClcbiAgICAgICAgbyA9IG8ubmV4dF9jbFxuICAgICAgIyBpZiB0aGlzIHdhcyBjcmVhdGVkIGJ5IGFuIEFkZE5hbWUgb3BlcmF0aW9uLCBkZWxldGUgaXQgdG9vXG4gICAgICBpZiBAYWRkX25hbWVfb3BzP1xuICAgICAgICBmb3IgbyBpbiBAYWRkX25hbWVfb3BzXG4gICAgICAgICAgby5hcHBseURlbGV0ZSgpXG4gICAgICBzdXBlcigpXG5cbiAgICBjbGVhbnVwOiAoKS0+XG4gICAgICBzdXBlcigpXG5cbiAgICAjXG4gICAgIyBSZXBsYWNlIHRoZSBleGlzdGluZyB3b3JkIHdpdGggYSBuZXcgd29yZC5cbiAgICAjXG4gICAgIyBAcGFyYW0gY29udGVudCB7T3BlcmF0aW9ufSBUaGUgbmV3IHZhbHVlIG9mIHRoaXMgUmVwbGFjZU1hbmFnZXIuXG4gICAgIyBAcGFyYW0gcmVwbGFjZWFibGVfdWlkIHtVSUR9IE9wdGlvbmFsOiBVbmlxdWUgaWQgb2YgdGhlIFJlcGxhY2VhYmxlIHRoYXQgaXMgY3JlYXRlZFxuICAgICNcbiAgICByZXBsYWNlOiAoY29udGVudCwgcmVwbGFjZWFibGVfdWlkKS0+XG4gICAgICBvID0gQGdldExhc3RPcGVyYXRpb24oKVxuICAgICAgb3AgPSBuZXcgUmVwbGFjZWFibGUgY29udGVudCwgQCwgcmVwbGFjZWFibGVfdWlkLCBvLCBvLm5leHRfY2xcbiAgICAgIEhCLmFkZE9wZXJhdGlvbihvcCkuZXhlY3V0ZSgpXG4gICAgICB1bmRlZmluZWRcblxuICAgICNcbiAgICAjIEFkZCBjaGFuZ2UgbGlzdGVuZXJzIGZvciBwYXJlbnQuXG4gICAgI1xuICAgIHNldFBhcmVudDogKHBhcmVudCwgcHJvcGVydHlfbmFtZSktPlxuICAgICAgcmVwbF9tYW5hZ2VyID0gdGhpc1xuICAgICAgQG9uICdpbnNlcnQnLCAoZXZlbnQsIG9wKS0+XG4gICAgICAgIGlmIG9wLm5leHRfY2wgaW5zdGFuY2VvZiB0eXBlcy5EZWxpbWl0ZXJcbiAgICAgICAgICByZXBsX21hbmFnZXIucGFyZW50LmNhbGxFdmVudCAnY2hhbmdlJywgcHJvcGVydHlfbmFtZSwgb3BcbiAgICAgIEBvbiAnY2hhbmdlJywgKGV2ZW50LCBvcCktPlxuICAgICAgICBpZiByZXBsX21hbmFnZXIgaXNudCB0aGlzXG4gICAgICAgICAgcmVwbF9tYW5hZ2VyLnBhcmVudC5jYWxsRXZlbnQgJ2NoYW5nZScsIHByb3BlcnR5X25hbWUsIG9wXG4gICAgICAjIENhbGwgdGhpcywgd2hlbiB0aGUgZmlyc3QgZWxlbWVudCBpcyBpbnNlcnRlZC4gVGhlbiBkZWxldGUgdGhlIGxpc3RlbmVyLlxuICAgICAgYWRkUHJvcGVydHlMaXN0ZW5lciA9IChldmVudCwgb3ApLT5cbiAgICAgICAgcmVwbF9tYW5hZ2VyLmRlbGV0ZUxpc3RlbmVyICdhZGRQcm9wZXJ0eScsIGFkZFByb3BlcnR5TGlzdGVuZXJcbiAgICAgICAgcmVwbF9tYW5hZ2VyLnBhcmVudC5jYWxsRXZlbnQgJ2FkZFByb3BlcnR5JywgcHJvcGVydHlfbmFtZSwgb3BcbiAgICAgIEBvbiAnaW5zZXJ0JywgYWRkUHJvcGVydHlMaXN0ZW5lclxuICAgICAgc3VwZXIgcGFyZW50XG5cbiAgICAjXG4gICAgIyBHZXQgdGhlIHZhbHVlIG9mIHRoaXMgV29yZFR5cGVcbiAgICAjIEByZXR1cm4ge1N0cmluZ31cbiAgICAjXG4gICAgdmFsOiAoKS0+XG4gICAgICBvID0gQGdldExhc3RPcGVyYXRpb24oKVxuICAgICAgI2lmIG8gaW5zdGFuY2VvZiB0eXBlcy5EZWxpbWl0ZXJcbiAgICAgICAgIyB0aHJvdyBuZXcgRXJyb3IgXCJSZXBsYWNlIE1hbmFnZXIgZG9lc24ndCBjb250YWluIGFueXRoaW5nLlwiXG4gICAgICBvLnZhbD8oKSAjID8gLSBmb3IgdGhlIGNhc2UgdGhhdCAoY3VycmVudGx5KSB0aGUgUk0gZG9lcyBub3QgY29udGFpbiBhbnl0aGluZyAodGhlbiBvIGlzIGEgRGVsaW1pdGVyKVxuXG4gICAgI1xuICAgICMgRW5jb2RlIHRoaXMgb3BlcmF0aW9uIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4gYmUgcGFyc2VkIGJ5IHJlbW90ZSBwZWVycy5cbiAgICAjXG4gICAgX2VuY29kZTogKCktPlxuICAgICAganNvbiA9XG4gICAgICAgIHtcbiAgICAgICAgICAndHlwZSc6IFwiUmVwbGFjZU1hbmFnZXJcIlxuICAgICAgICAgICd1aWQnIDogQGdldFVpZCgpXG4gICAgICAgICAgJ2JlZ2lubmluZycgOiBAYmVnaW5uaW5nLmdldFVpZCgpXG4gICAgICAgICAgJ2VuZCcgOiBAZW5kLmdldFVpZCgpXG4gICAgICAgIH1cbiAgICAgIGlmIEBwcmV2X2NsPyBhbmQgQG5leHRfY2w/XG4gICAgICAgIGpzb25bJ3ByZXYnXSA9IEBwcmV2X2NsLmdldFVpZCgpXG4gICAgICAgIGpzb25bJ25leHQnXSA9IEBuZXh0X2NsLmdldFVpZCgpXG4gICAgICBpZiBAb3JpZ2luPyAjIGFuZCBAb3JpZ2luIGlzbnQgQHByZXZfY2xcbiAgICAgICAganNvbltcIm9yaWdpblwiXSA9IEBvcmlnaW4oKS5nZXRVaWQoKVxuICAgICAganNvblxuXG4gIHBhcnNlcltcIlJlcGxhY2VNYW5hZ2VyXCJdID0gKGpzb24pLT5cbiAgICB7XG4gICAgICAnY29udGVudCcgOiBjb250ZW50XG4gICAgICAndWlkJyA6IHVpZFxuICAgICAgJ3ByZXYnOiBwcmV2XG4gICAgICAnbmV4dCc6IG5leHRcbiAgICAgICdvcmlnaW4nIDogb3JpZ2luXG4gICAgICAnYmVnaW5uaW5nJyA6IGJlZ2lubmluZ1xuICAgICAgJ2VuZCcgOiBlbmRcbiAgICB9ID0ganNvblxuICAgIG5ldyBSZXBsYWNlTWFuYWdlciBjb250ZW50LCB1aWQsIGJlZ2lubmluZywgZW5kLCBwcmV2LCBuZXh0LCBvcmlnaW5cblxuXG4gICNcbiAgIyBAbm9kb2NcbiAgIyBUaGUgUmVwbGFjZU1hbmFnZXIgbWFuYWdlcyBSZXBsYWNlYWJsZXMuXG4gICMgQHNlZSBSZXBsYWNlTWFuYWdlclxuICAjXG4gIGNsYXNzIFJlcGxhY2VhYmxlIGV4dGVuZHMgdHlwZXMuSW5zZXJ0XG5cbiAgICAjXG4gICAgIyBAcGFyYW0ge09wZXJhdGlvbn0gY29udGVudCBUaGUgdmFsdWUgdGhhdCB0aGlzIFJlcGxhY2VhYmxlIGhvbGRzLlxuICAgICMgQHBhcmFtIHtSZXBsYWNlTWFuYWdlcn0gcGFyZW50IFVzZWQgdG8gcmVwbGFjZSB0aGlzIFJlcGxhY2VhYmxlIHdpdGggYW5vdGhlciBvbmUuXG4gICAgIyBAcGFyYW0ge09iamVjdH0gdWlkIEEgdW5pcXVlIGlkZW50aWZpZXIuIElmIHVpZCBpcyB1bmRlZmluZWQsIGEgbmV3IHVpZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgI1xuICAgIGNvbnN0cnVjdG9yOiAoY29udGVudCwgcGFyZW50LCB1aWQsIHByZXYsIG5leHQsIG9yaWdpbiktPlxuICAgICAgQHNhdmVPcGVyYXRpb24gJ2NvbnRlbnQnLCBjb250ZW50XG4gICAgICBAc2F2ZU9wZXJhdGlvbiAncGFyZW50JywgcGFyZW50XG4gICAgICBpZiBub3QgKHByZXY/IGFuZCBuZXh0PylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiWW91IG11c3QgZGVmaW5lIHByZXYsIGFuZCBuZXh0IGZvciBSZXBsYWNlYWJsZS10eXBlcyFcIlxuICAgICAgc3VwZXIgdWlkLCBwcmV2LCBuZXh0LCBvcmlnaW5cblxuICAgIHR5cGU6IFwiUmVwbGFjZWFibGVcIlxuXG4gICAgI1xuICAgICMgUmV0dXJuIHRoZSBjb250ZW50IHRoYXQgdGhpcyBvcGVyYXRpb24gaG9sZHMuXG4gICAgI1xuICAgIHZhbDogKCktPlxuICAgICAgQGNvbnRlbnRcblxuICAgICNcbiAgICAjIFJlcGxhY2UgdGhlIGNvbnRlbnQgb2YgdGhpcyByZXBsYWNlYWJsZSB3aXRoIG5ldyBjb250ZW50LlxuICAgICNcbiAgICByZXBsYWNlOiAoY29udGVudCktPlxuICAgICAgQHBhcmVudC5yZXBsYWNlIGNvbnRlbnRcblxuICAgIGFwcGx5RGVsZXRlOiAoKS0+XG4gICAgICBpZiBAY29udGVudD9cbiAgICAgICAgQGNvbnRlbnQuYXBwbHlEZWxldGUoKVxuICAgICAgICBAY29udGVudC5kb250U3luYygpXG4gICAgICBAY29udGVudCA9IG51bGxcbiAgICAgIHN1cGVyXG5cbiAgICBjbGVhbnVwOiAoKS0+XG4gICAgICBzdXBlclxuXG4gICAgI1xuICAgICMgSWYgcG9zc2libGUgc2V0IHRoZSByZXBsYWNlIG1hbmFnZXIgaW4gdGhlIGNvbnRlbnQuXG4gICAgIyBAc2VlIFdvcmRUeXBlLnNldFJlcGxhY2VNYW5hZ2VyXG4gICAgI1xuICAgIGV4ZWN1dGU6ICgpLT5cbiAgICAgIGlmIG5vdCBAdmFsaWRhdGVTYXZlZE9wZXJhdGlvbnMoKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIGVsc2VcbiAgICAgICAgQGNvbnRlbnQ/LnNldFJlcGxhY2VNYW5hZ2VyPyhAcGFyZW50KVxuICAgICAgICAjIG9ubHkgZmlyZSAnaW5zZXJ0LWV2ZW50JyAod2hpY2ggd2lsbCByZXN1bHQgaW4gYWRkUHJvcGVydHkgYW5kIGNoYW5nZSBldmVudHMpLFxuICAgICAgICAjIHdoZW4gY29udGVudCBpcyBhZGRlZC4gSW4gY2FzZSBvZiBKc29uLCBlbXB0eSBjb250ZW50IG1lYW5zIHRoYXQgdGhpcyBpcyBub3QgdGhlIGxhc3QgdXBkYXRlLFxuICAgICAgICAjIHNpbmNlIGNvbnRlbnQgaXMgZGVsZXRlZCB3aGVuICdhcHBseURlbGV0ZScgd2FzIGV4ZWN0dXRlZC5cbiAgICAgICAgaW5zX3Jlc3VsdCA9IHN1cGVyKEBjb250ZW50PykgIyBAY29udGVudD8gd2hldGhlciB0byBmaXJlIG9yIG5vdFxuICAgICAgICBpZiBpbnNfcmVzdWx0XG4gICAgICAgICAgaWYgQG5leHRfY2wudHlwZSBpcyBcIkRlbGltaXRlclwiIGFuZCBAcHJldl9jbC50eXBlIGlzbnQgXCJEZWxpbWl0ZXJcIlxuICAgICAgICAgICAgQHByZXZfY2wuYXBwbHlEZWxldGUoKVxuICAgICAgICAgIGVsc2UgaWYgQG5leHRfY2wudHlwZSBpc250IFwiRGVsaW1pdGVyXCJcbiAgICAgICAgICAgIEBhcHBseURlbGV0ZSgpXG5cbiAgICAgICAgcmV0dXJuIGluc19yZXN1bHRcblxuICAgICNcbiAgICAjIEVuY29kZSB0aGlzIG9wZXJhdGlvbiBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuIGJlIHBhcnNlZCBieSByZW1vdGUgcGVlcnMuXG4gICAgI1xuICAgIF9lbmNvZGU6ICgpLT5cbiAgICAgIGpzb24gPVxuICAgICAgICB7XG4gICAgICAgICAgJ3R5cGUnOiBcIlJlcGxhY2VhYmxlXCJcbiAgICAgICAgICAnY29udGVudCc6IEBjb250ZW50Py5nZXRVaWQoKVxuICAgICAgICAgICdSZXBsYWNlTWFuYWdlcicgOiBAcGFyZW50LmdldFVpZCgpXG4gICAgICAgICAgJ3ByZXYnOiBAcHJldl9jbC5nZXRVaWQoKVxuICAgICAgICAgICduZXh0JzogQG5leHRfY2wuZ2V0VWlkKClcbiAgICAgICAgICAndWlkJyA6IEBnZXRVaWQoKVxuICAgICAgICB9XG4gICAgICBpZiBAb3JpZ2luPyBhbmQgQG9yaWdpbiBpc250IEBwcmV2X2NsXG4gICAgICAgIGpzb25bXCJvcmlnaW5cIl0gPSBAb3JpZ2luLmdldFVpZCgpXG4gICAgICBqc29uXG5cbiAgcGFyc2VyW1wiUmVwbGFjZWFibGVcIl0gPSAoanNvbiktPlxuICAgIHtcbiAgICAgICdjb250ZW50JyA6IGNvbnRlbnRcbiAgICAgICdSZXBsYWNlTWFuYWdlcicgOiBwYXJlbnRcbiAgICAgICd1aWQnIDogdWlkXG4gICAgICAncHJldic6IHByZXZcbiAgICAgICduZXh0JzogbmV4dFxuICAgICAgJ29yaWdpbicgOiBvcmlnaW5cbiAgICB9ID0ganNvblxuICAgIG5ldyBSZXBsYWNlYWJsZSBjb250ZW50LCBwYXJlbnQsIHVpZCwgcHJldiwgbmV4dCwgb3JpZ2luXG5cbiAgdHlwZXNbJ0xpc3RNYW5hZ2VyJ10gPSBMaXN0TWFuYWdlclxuICB0eXBlc1snTWFwTWFuYWdlciddID0gTWFwTWFuYWdlclxuICB0eXBlc1snUmVwbGFjZU1hbmFnZXInXSA9IFJlcGxhY2VNYW5hZ2VyXG4gIHR5cGVzWydSZXBsYWNlYWJsZSddID0gUmVwbGFjZWFibGVcblxuICBiYXNpY190eXBlc1xuXG5cblxuXG5cblxuIiwic3RydWN0dXJlZF90eXBlc191bmluaXRpYWxpemVkID0gcmVxdWlyZSBcIi4vU3RydWN0dXJlZFR5cGVzXCJcblxubW9kdWxlLmV4cG9ydHMgPSAoSEIpLT5cbiAgc3RydWN0dXJlZF90eXBlcyA9IHN0cnVjdHVyZWRfdHlwZXNfdW5pbml0aWFsaXplZCBIQlxuICB0eXBlcyA9IHN0cnVjdHVyZWRfdHlwZXMudHlwZXNcbiAgcGFyc2VyID0gc3RydWN0dXJlZF90eXBlcy5wYXJzZXJcblxuICAjXG4gICMgQG5vZG9jXG4gICMgQXQgdGhlIG1vbWVudCBUZXh0RGVsZXRlIHR5cGUgZXF1YWxzIHRoZSBEZWxldGUgdHlwZSBpbiBCYXNpY1R5cGVzLlxuICAjIEBzZWUgQmFzaWNUeXBlcy5EZWxldGVcbiAgI1xuICBjbGFzcyBUZXh0RGVsZXRlIGV4dGVuZHMgdHlwZXMuRGVsZXRlXG4gIHBhcnNlcltcIlRleHREZWxldGVcIl0gPSBwYXJzZXJbXCJEZWxldGVcIl1cblxuICAjXG4gICMgQG5vZG9jXG4gICMgRXh0ZW5kcyB0aGUgYmFzaWMgSW5zZXJ0IHR5cGUgdG8gYW4gb3BlcmF0aW9uIHRoYXQgaG9sZHMgYSB0ZXh0IHZhbHVlXG4gICNcbiAgY2xhc3MgVGV4dEluc2VydCBleHRlbmRzIHR5cGVzLkluc2VydFxuICAgICNcbiAgICAjIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50IFRoZSBjb250ZW50IG9mIHRoaXMgSW5zZXJ0LXR5cGUgT3BlcmF0aW9uLiBVc3VhbGx5IHlvdSByZXN0cmljdCB0aGUgbGVuZ3RoIG9mIGNvbnRlbnQgdG8gc2l6ZSAxXG4gICAgIyBAcGFyYW0ge09iamVjdH0gdWlkIEEgdW5pcXVlIGlkZW50aWZpZXIuIElmIHVpZCBpcyB1bmRlZmluZWQsIGEgbmV3IHVpZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgI1xuICAgIGNvbnN0cnVjdG9yOiAoY29udGVudCwgdWlkLCBwcmV2LCBuZXh0LCBvcmlnaW4pLT5cbiAgICAgIGlmIGNvbnRlbnQ/LmNyZWF0b3I/XG4gICAgICAgIEBzYXZlT3BlcmF0aW9uICdjb250ZW50JywgY29udGVudFxuICAgICAgZWxzZVxuICAgICAgICBAY29udGVudCA9IGNvbnRlbnRcbiAgICAgIGlmIG5vdCAocHJldj8gYW5kIG5leHQ/KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IgXCJZb3UgbXVzdCBkZWZpbmUgcHJldiwgYW5kIG5leHQgZm9yIFRleHRJbnNlcnQtdHlwZXMhXCJcbiAgICAgIHN1cGVyIHVpZCwgcHJldiwgbmV4dCwgb3JpZ2luXG5cbiAgICB0eXBlOiBcIlRleHRJbnNlcnRcIlxuXG4gICAgI1xuICAgICMgUmV0cmlldmUgdGhlIGVmZmVjdGl2ZSBsZW5ndGggb2YgdGhlICRjb250ZW50IG9mIHRoaXMgb3BlcmF0aW9uLlxuICAgICNcbiAgICBnZXRMZW5ndGg6ICgpLT5cbiAgICAgIGlmIEBpc0RlbGV0ZWQoKVxuICAgICAgICAwXG4gICAgICBlbHNlXG4gICAgICAgIEBjb250ZW50Lmxlbmd0aFxuXG4gICAgYXBwbHlEZWxldGU6ICgpLT5cbiAgICAgIHN1cGVyICMgbm8gYnJhY2VzIGluZGVlZCFcbiAgICAgIGlmIEBjb250ZW50IGluc3RhbmNlb2YgdHlwZXMuT3BlcmF0aW9uXG4gICAgICAgIEBjb250ZW50LmFwcGx5RGVsZXRlKClcbiAgICAgIEBjb250ZW50ID0gbnVsbFxuXG4gICAgZXhlY3V0ZTogKCktPlxuICAgICAgaWYgbm90IEB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucygpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgZWxzZVxuICAgICAgICBpZiBAY29udGVudCBpbnN0YW5jZW9mIHR5cGVzLk9wZXJhdGlvblxuICAgICAgICAgIEBjb250ZW50Lmluc2VydF9wYXJlbnQgPSBAXG4gICAgICAgIHN1cGVyKClcblxuICAgICNcbiAgICAjIFRoZSByZXN1bHQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgcmVzdWx0cyBmcm9tIHRoZSBvdGhlciBpbnNlcnQgb3BlcmF0aW9uc1xuICAgICMgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgdGhlIGVuZ2luZS5cbiAgICAjIEBzZWUgSGlzdG9yeUJ1ZmZlci50b0V4ZWN1dGVkQXJyYXlcbiAgICAjXG4gICAgdmFsOiAoY3VycmVudF9wb3NpdGlvbiktPlxuICAgICAgaWYgQGlzRGVsZXRlZCgpIG9yIG5vdCBAY29udGVudD9cbiAgICAgICAgXCJcIlxuICAgICAgZWxzZVxuICAgICAgICBAY29udGVudFxuXG4gICAgI1xuICAgICMgQ29udmVydCBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24gb2YgdGhpcyBvcGVyYXRpb24gdG8gdGhlIGpzb24tZm9ybWF0LlxuICAgICMgVGhpcyByZXN1bHQgY2FuIGJlIHNlbmQgdG8gb3RoZXIgY2xpZW50cy5cbiAgICAjXG4gICAgX2VuY29kZTogKCktPlxuICAgICAganNvbiA9XG4gICAgICAgIHtcbiAgICAgICAgICAndHlwZSc6IFwiVGV4dEluc2VydFwiXG4gICAgICAgICAgJ3VpZCcgOiBAZ2V0VWlkKClcbiAgICAgICAgICAncHJldic6IEBwcmV2X2NsLmdldFVpZCgpXG4gICAgICAgICAgJ25leHQnOiBAbmV4dF9jbC5nZXRVaWQoKVxuICAgICAgICB9XG4gICAgICBpZiBAY29udGVudD8uZ2V0VWlkP1xuICAgICAgICBqc29uWydjb250ZW50J10gPSBAY29udGVudC5nZXRVaWQoKVxuICAgICAgZWxzZVxuICAgICAgICBqc29uWydjb250ZW50J10gPSBAY29udGVudFxuICAgICAgaWYgQG9yaWdpbiBpc250IEBwcmV2X2NsXG4gICAgICAgIGpzb25bXCJvcmlnaW5cIl0gPSBAb3JpZ2luLmdldFVpZCgpXG4gICAgICBqc29uXG5cbiAgcGFyc2VyW1wiVGV4dEluc2VydFwiXSA9IChqc29uKS0+XG4gICAge1xuICAgICAgJ2NvbnRlbnQnIDogY29udGVudFxuICAgICAgJ3VpZCcgOiB1aWRcbiAgICAgICdwcmV2JzogcHJldlxuICAgICAgJ25leHQnOiBuZXh0XG4gICAgICAnb3JpZ2luJyA6IG9yaWdpblxuICAgIH0gPSBqc29uXG4gICAgbmV3IFRleHRJbnNlcnQgY29udGVudCwgdWlkLCBwcmV2LCBuZXh0LCBvcmlnaW5cblxuICAjXG4gICMgSGFuZGxlcyBhIFdvcmRUeXBlLWxpa2UgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggc3VwcG9ydCBmb3IgaW5zZXJ0VGV4dC9kZWxldGVUZXh0IGF0IGEgd29yZC1wb3NpdGlvbi5cbiAgIyBAbm90ZSBDdXJyZW50bHksIG9ubHkgVGV4dCBpcyBzdXBwb3J0ZWQhXG4gICNcbiAgY2xhc3MgV29yZFR5cGUgZXh0ZW5kcyB0eXBlcy5MaXN0TWFuYWdlclxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjIEBwYXJhbSB7T2JqZWN0fSB1aWQgQSB1bmlxdWUgaWRlbnRpZmllci4gSWYgdWlkIGlzIHVuZGVmaW5lZCwgYSBuZXcgdWlkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAjXG4gICAgY29uc3RydWN0b3I6ICh1aWQsIGJlZ2lubmluZywgZW5kLCBwcmV2LCBuZXh0LCBvcmlnaW4pLT5cbiAgICAgIHN1cGVyIHVpZCwgYmVnaW5uaW5nLCBlbmQsIHByZXYsIG5leHQsIG9yaWdpblxuXG4gICAgI1xuICAgICMgSWRlbnRpZmllcyB0aGlzIGNsYXNzLlxuICAgICMgVXNlIGl0IHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIHdvcmQtdHlwZSBvciBzb21ldGhpbmcgZWxzZS5cbiAgICAjXG4gICAgIyBAZXhhbXBsZVxuICAgICMgICB2YXIgeCA9IHlhdHRhLnZhbCgndW5rbm93bicpXG4gICAgIyAgIGlmICh4LnR5cGUgPT09IFwiV29yZFR5cGVcIikge1xuICAgICMgICAgIGNvbnNvbGUubG9nIEpTT04uc3RyaW5naWZ5KHgudG9Kc29uKCkpXG4gICAgIyAgIH1cbiAgICAjXG4gICAgdHlwZTogXCJXb3JkVHlwZVwiXG5cbiAgICBhcHBseURlbGV0ZTogKCktPlxuICAgICAgbyA9IEBiZWdpbm5pbmdcbiAgICAgIHdoaWxlIG8/XG4gICAgICAgIG8uYXBwbHlEZWxldGUoKVxuICAgICAgICBvID0gby5uZXh0X2NsXG4gICAgICBzdXBlcigpXG5cbiAgICBjbGVhbnVwOiAoKS0+XG4gICAgICBzdXBlcigpXG5cbiAgICBwdXNoOiAoY29udGVudCktPlxuICAgICAgQGluc2VydEFmdGVyIEBlbmQucHJldl9jbCwgY29udGVudFxuXG4gICAgaW5zZXJ0QWZ0ZXI6IChsZWZ0LCBjb250ZW50KS0+XG4gICAgICB3aGlsZSBsZWZ0LmlzRGVsZXRlZCgpXG4gICAgICAgIGxlZnQgPSBsZWZ0LnByZXZfY2wgIyBmaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gdGhlIGxlZnQsIHRoYXQgaXMgbm90IGRlbGV0ZWQuIENhc2UgcG9zaXRpb24gaXMgMCwgaXRzIHRoZSBEZWxpbWl0ZXIuXG4gICAgICByaWdodCA9IGxlZnQubmV4dF9jbFxuICAgICAgaWYgY29udGVudC50eXBlP1xuICAgICAgICBvcCA9IG5ldyBUZXh0SW5zZXJ0IGNvbnRlbnQsIHVuZGVmaW5lZCwgbGVmdCwgcmlnaHRcbiAgICAgICAgSEIuYWRkT3BlcmF0aW9uKG9wKS5leGVjdXRlKClcbiAgICAgIGVsc2VcbiAgICAgICAgZm9yIGMgaW4gY29udGVudFxuICAgICAgICAgIG9wID0gbmV3IFRleHRJbnNlcnQgYywgdW5kZWZpbmVkLCBsZWZ0LCByaWdodFxuICAgICAgICAgIEhCLmFkZE9wZXJhdGlvbihvcCkuZXhlY3V0ZSgpXG4gICAgICAgICAgbGVmdCA9IG9wXG4gICAgICBAXG4gICAgI1xuICAgICMgSW5zZXJ0cyBhIHN0cmluZyBpbnRvIHRoZSB3b3JkLlxuICAgICNcbiAgICAjIEByZXR1cm4ge1dvcmRUeXBlfSBUaGlzIFdvcmRUeXBlIG9iamVjdC5cbiAgICAjXG4gICAgaW5zZXJ0VGV4dDogKHBvc2l0aW9uLCBjb250ZW50KS0+XG4gICAgICAjIFRPRE86IGdldE9wZXJhdGlvbkJ5UG9zaXRpb24gc2hvdWxkIHJldHVybiBcIihpLTIpdGhcIiBjaGFyYWN0ZXJcbiAgICAgIGl0aCA9IEBnZXRPcGVyYXRpb25CeVBvc2l0aW9uIHBvc2l0aW9uICMgdGhlIChpLTEpdGggY2hhcmFjdGVyLiBlLmcuIFwiYWJjXCIgYSBpcyB0aGUgMHRoIGNoYXJhY3RlclxuICAgICAgbGVmdCA9IGl0aC5wcmV2X2NsICMgbGVmdCBpcyB0aGUgbm9uLWRlbGV0ZWQgY2hhcmF0aGVyIHRvIHRoZSBsZWZ0IG9mIGl0aFxuICAgICAgQGluc2VydEFmdGVyIGxlZnQsIGNvbnRlbnRcblxuICAgICNcbiAgICAjIERlbGV0ZXMgYSBwYXJ0IG9mIHRoZSB3b3JkLlxuICAgICNcbiAgICAjIEByZXR1cm4ge1dvcmRUeXBlfSBUaGlzIFdvcmRUeXBlIG9iamVjdFxuICAgICNcbiAgICBkZWxldGVUZXh0OiAocG9zaXRpb24sIGxlbmd0aCktPlxuICAgICAgbyA9IEBnZXRPcGVyYXRpb25CeVBvc2l0aW9uIHBvc2l0aW9uXG5cbiAgICAgIGRlbGV0ZV9vcHMgPSBbXVxuICAgICAgZm9yIGkgaW4gWzAuLi5sZW5ndGhdXG4gICAgICAgIGlmIG8gaW5zdGFuY2VvZiB0eXBlcy5EZWxpbWl0ZXJcbiAgICAgICAgICBicmVha1xuICAgICAgICBkID0gSEIuYWRkT3BlcmF0aW9uKG5ldyBUZXh0RGVsZXRlIHVuZGVmaW5lZCwgbykuZXhlY3V0ZSgpXG4gICAgICAgIG8gPSBvLm5leHRfY2xcbiAgICAgICAgd2hpbGUgbm90IChvIGluc3RhbmNlb2YgdHlwZXMuRGVsaW1pdGVyKSBhbmQgby5pc0RlbGV0ZWQoKVxuICAgICAgICAgIG8gPSBvLm5leHRfY2xcbiAgICAgICAgZGVsZXRlX29wcy5wdXNoIGQuX2VuY29kZSgpXG4gICAgICBAXG5cbiAgICAjXG4gICAgIyBSZXBsYWNlIHRoZSBjb250ZW50IG9mIHRoaXMgd29yZCB3aXRoIGFub3RoZXIgb25lLiBDb25jdXJyZW50IHJlcGxhY2VtZW50cyBhcmUgbm90IG1lcmdlZCFcbiAgICAjIE9ubHkgb25lIG9mIHRoZSByZXBsYWNlbWVudHMgd2lsbCBiZSB1c2VkLlxuICAgICNcbiAgICAjIEByZXR1cm4ge1dvcmRUeXBlfSBSZXR1cm5zIHRoZSBuZXcgV29yZFR5cGUgb2JqZWN0LlxuICAgICNcbiAgICByZXBsYWNlVGV4dDogKHRleHQpLT5cbiAgICAgICMgQ2FuIG9ubHkgYmUgdXNlZCBpZiB0aGUgUmVwbGFjZU1hbmFnZXIgd2FzIHNldCFcbiAgICAgICMgQHNlZSBXb3JkVHlwZS5zZXRSZXBsYWNlTWFuYWdlclxuICAgICAgaWYgQHJlcGxhY2VfbWFuYWdlcj9cbiAgICAgICAgd29yZCA9IEhCLmFkZE9wZXJhdGlvbihuZXcgV29yZFR5cGUgdW5kZWZpbmVkKS5leGVjdXRlKClcbiAgICAgICAgd29yZC5pbnNlcnRUZXh0IDAsIHRleHRcbiAgICAgICAgQHJlcGxhY2VfbWFuYWdlci5yZXBsYWNlKHdvcmQpXG4gICAgICAgIHdvcmRcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiVGhpcyB0eXBlIGlzIGN1cnJlbnRseSBub3QgbWFpbnRhaW5lZCBieSBhIFJlcGxhY2VNYW5hZ2VyIVwiXG5cbiAgICAjXG4gICAgIyBHZXQgdGhlIFN0cmluZy1yZXByZXNlbnRhdGlvbiBvZiB0aGlzIHdvcmQuXG4gICAgIyBAcmV0dXJuIHtTdHJpbmd9IFRoZSBTdHJpbmctcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuXG4gICAgI1xuICAgIHZhbDogKCktPlxuICAgICAgYyA9IGZvciBvIGluIEB0b0FycmF5KClcbiAgICAgICAgaWYgby52YWw/XG4gICAgICAgICAgby52YWwoKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgXCJcIlxuICAgICAgYy5qb2luKCcnKVxuXG4gICAgI1xuICAgICMgU2FtZSBhcyBXb3JkVHlwZS52YWxcbiAgICAjIEBzZWUgV29yZFR5cGUudmFsXG4gICAgI1xuICAgIHRvU3RyaW5nOiAoKS0+XG4gICAgICBAdmFsKClcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBJbiBtb3N0IGNhc2VzIHlvdSB3b3VsZCBlbWJlZCBhIFdvcmRUeXBlIGluIGEgUmVwbGFjZWFibGUsIHdpY2ggaXMgaGFuZGxlZCBieSB0aGUgUmVwbGFjZU1hbmFnZXIgaW4gb3JkZXJcbiAgICAjIHRvIHByb3ZpZGUgcmVwbGFjZSBmdW5jdGlvbmFsaXR5LlxuICAgICNcbiAgICBzZXRSZXBsYWNlTWFuYWdlcjogKG9wKS0+XG4gICAgICBAc2F2ZU9wZXJhdGlvbiAncmVwbGFjZV9tYW5hZ2VyJywgb3BcbiAgICAgIEB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucygpXG4gICAgICBAb24gJ2luc2VydCcsIChldmVudCwgaW5zKT0+XG4gICAgICAgIEByZXBsYWNlX21hbmFnZXI/LmZvcndhcmRFdmVudCBALCAnY2hhbmdlJywgaW5zXG4gICAgICBAb24gJ2RlbGV0ZScsIChldmVudCwgaW5zLCBkZWwpPT5cbiAgICAgICAgQHJlcGxhY2VfbWFuYWdlcj8uZm9yd2FyZEV2ZW50IEAsICdjaGFuZ2UnLCBkZWxcbiAgICAjXG4gICAgIyBCaW5kIHRoaXMgV29yZFR5cGUgdG8gYSB0ZXh0ZmllbGQgb3IgaW5wdXQgZmllbGQuXG4gICAgI1xuICAgICMgQGV4YW1wbGVcbiAgICAjICAgdmFyIHRleHRib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRleHRmaWVsZFwiKTtcbiAgICAjICAgeWF0dGEuYmluZCh0ZXh0Ym94KTtcbiAgICAjXG4gICAgYmluZDogKHRleHRmaWVsZCktPlxuICAgICAgd29yZCA9IEBcbiAgICAgIHRleHRmaWVsZC52YWx1ZSA9IEB2YWwoKVxuXG4gICAgICBAb24gXCJpbnNlcnRcIiwgKGV2ZW50LCBvcCktPlxuICAgICAgICBvX3BvcyA9IG9wLmdldFBvc2l0aW9uKClcbiAgICAgICAgZml4ID0gKGN1cnNvciktPlxuICAgICAgICAgIGlmIGN1cnNvciA8PSBvX3Bvc1xuICAgICAgICAgICAgY3Vyc29yXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgY3Vyc29yICs9IDFcbiAgICAgICAgICAgIGN1cnNvclxuICAgICAgICBsZWZ0ID0gZml4IHRleHRmaWVsZC5zZWxlY3Rpb25TdGFydFxuICAgICAgICByaWdodCA9IGZpeCB0ZXh0ZmllbGQuc2VsZWN0aW9uRW5kXG5cbiAgICAgICAgdGV4dGZpZWxkLnZhbHVlID0gd29yZC52YWwoKVxuICAgICAgICB0ZXh0ZmllbGQuc2V0U2VsZWN0aW9uUmFuZ2UgbGVmdCwgcmlnaHRcblxuXG4gICAgICBAb24gXCJkZWxldGVcIiwgKGV2ZW50LCBvcCktPlxuICAgICAgICBvX3BvcyA9IG9wLmdldFBvc2l0aW9uKClcbiAgICAgICAgZml4ID0gKGN1cnNvciktPlxuICAgICAgICAgIGlmIGN1cnNvciA8IG9fcG9zXG4gICAgICAgICAgICBjdXJzb3JcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBjdXJzb3IgLT0gMVxuICAgICAgICAgICAgY3Vyc29yXG4gICAgICAgIGxlZnQgPSBmaXggdGV4dGZpZWxkLnNlbGVjdGlvblN0YXJ0XG4gICAgICAgIHJpZ2h0ID0gZml4IHRleHRmaWVsZC5zZWxlY3Rpb25FbmRcblxuICAgICAgICB0ZXh0ZmllbGQudmFsdWUgPSB3b3JkLnZhbCgpXG4gICAgICAgIHRleHRmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZSBsZWZ0LCByaWdodFxuXG4gICAgICAjIGNvbnN1bWUgYWxsIHRleHQtaW5zZXJ0IGNoYW5nZXMuXG4gICAgICB0ZXh0ZmllbGQub25rZXlwcmVzcyA9IChldmVudCktPlxuICAgICAgICBjaGFyID0gbnVsbFxuICAgICAgICBpZiBldmVudC5rZXk/XG4gICAgICAgICAgaWYgZXZlbnQuY2hhckNvZGUgaXMgMzJcbiAgICAgICAgICAgIGNoYXIgPSBcIiBcIlxuICAgICAgICAgIGVsc2UgaWYgZXZlbnQua2V5Q29kZSBpcyAxM1xuICAgICAgICAgICAgY2hhciA9ICdcXG4nXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgY2hhciA9IGV2ZW50LmtleVxuICAgICAgICBlbHNlXG4gICAgICAgICAgY2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUgZXZlbnQua2V5Q29kZVxuICAgICAgICBpZiBjaGFyLmxlbmd0aCA+IDBcbiAgICAgICAgICBwb3MgPSBNYXRoLm1pbiB0ZXh0ZmllbGQuc2VsZWN0aW9uU3RhcnQsIHRleHRmaWVsZC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICBkaWZmID0gTWF0aC5hYnModGV4dGZpZWxkLnNlbGVjdGlvbkVuZCAtIHRleHRmaWVsZC5zZWxlY3Rpb25TdGFydClcbiAgICAgICAgICB3b3JkLmRlbGV0ZVRleHQgKHBvcyksIGRpZmZcbiAgICAgICAgICB3b3JkLmluc2VydFRleHQgcG9zLCBjaGFyXG4gICAgICAgICAgbmV3X3BvcyA9IHBvcyArIGNoYXIubGVuZ3RoXG4gICAgICAgICAgdGV4dGZpZWxkLnNldFNlbGVjdGlvblJhbmdlIG5ld19wb3MsIG5ld19wb3NcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgIHRleHRmaWVsZC5vbnBhc3RlID0gKGV2ZW50KS0+XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHRleHRmaWVsZC5vbmN1dCA9IChldmVudCktPlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICNcbiAgICAgICMgY29uc3VtZSBkZWxldGVzLiBOb3RlIHRoYXRcbiAgICAgICMgICBjaHJvbWU6IHdvbid0IGNvbnN1bWUgZGVsZXRpb25zIG9uIGtleXByZXNzIGV2ZW50LlxuICAgICAgIyAgIGtleUNvZGUgaXMgZGVwcmVjYXRlZC4gQlVUOiBJIGRvbid0IHNlZSBhbm90aGVyIHdheS5cbiAgICAgICMgICAgIHNpbmNlIGV2ZW50LmtleSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBjaHJvbWUuXG4gICAgICAjICAgICBFdmVyeSBicm93c2VyIHN1cHBvcnRzIGtleUNvZGUuIExldCdzIHN0aWNrIHdpdGggaXQgZm9yIG5vdy4uXG4gICAgICAjXG4gICAgICB0ZXh0ZmllbGQub25rZXlkb3duID0gKGV2ZW50KS0+XG4gICAgICAgIHBvcyA9IE1hdGgubWluIHRleHRmaWVsZC5zZWxlY3Rpb25TdGFydCwgdGV4dGZpZWxkLnNlbGVjdGlvbkVuZFxuICAgICAgICBkaWZmID0gTWF0aC5hYnModGV4dGZpZWxkLnNlbGVjdGlvbkVuZCAtIHRleHRmaWVsZC5zZWxlY3Rpb25TdGFydClcbiAgICAgICAgaWYgZXZlbnQua2V5Q29kZT8gYW5kIGV2ZW50LmtleUNvZGUgaXMgOCAjIEJhY2tzcGFjZVxuICAgICAgICAgIGlmIGRpZmYgPiAwXG4gICAgICAgICAgICB3b3JkLmRlbGV0ZVRleHQgcG9zLCBkaWZmXG4gICAgICAgICAgICB0ZXh0ZmllbGQuc2V0U2VsZWN0aW9uUmFuZ2UgcG9zLCBwb3NcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBpZiBldmVudC5jdHJsS2V5PyBhbmQgZXZlbnQuY3RybEtleVxuICAgICAgICAgICAgICB2YWwgPSB0ZXh0ZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgbmV3X3BvcyA9IHBvc1xuICAgICAgICAgICAgICBkZWxfbGVuZ3RoID0gMFxuICAgICAgICAgICAgICBpZiBwb3MgPiAwXG4gICAgICAgICAgICAgICAgbmV3X3Bvcy0tXG4gICAgICAgICAgICAgICAgZGVsX2xlbmd0aCsrXG4gICAgICAgICAgICAgIHdoaWxlIG5ld19wb3MgPiAwIGFuZCB2YWxbbmV3X3Bvc10gaXNudCBcIiBcIiBhbmQgdmFsW25ld19wb3NdIGlzbnQgJ1xcbidcbiAgICAgICAgICAgICAgICBuZXdfcG9zLS1cbiAgICAgICAgICAgICAgICBkZWxfbGVuZ3RoKytcbiAgICAgICAgICAgICAgd29yZC5kZWxldGVUZXh0IG5ld19wb3MsIChwb3MtbmV3X3BvcylcbiAgICAgICAgICAgICAgdGV4dGZpZWxkLnNldFNlbGVjdGlvblJhbmdlIG5ld19wb3MsIG5ld19wb3NcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgd29yZC5kZWxldGVUZXh0IChwb3MtMSksIDFcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIGVsc2UgaWYgZXZlbnQua2V5Q29kZT8gYW5kIGV2ZW50LmtleUNvZGUgaXMgNDYgIyBEZWxldGVcbiAgICAgICAgICBpZiBkaWZmID4gMFxuICAgICAgICAgICAgd29yZC5kZWxldGVUZXh0IHBvcywgZGlmZlxuICAgICAgICAgICAgdGV4dGZpZWxkLnNldFNlbGVjdGlvblJhbmdlIHBvcywgcG9zXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgd29yZC5kZWxldGVUZXh0IHBvcywgMVxuICAgICAgICAgICAgdGV4dGZpZWxkLnNldFNlbGVjdGlvblJhbmdlIHBvcywgcG9zXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG5cblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBFbmNvZGUgdGhpcyBvcGVyYXRpb24gaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBwYXJzZWQgYnkgcmVtb3RlIHBlZXJzLlxuICAgICNcbiAgICBfZW5jb2RlOiAoKS0+XG4gICAgICBqc29uID0ge1xuICAgICAgICAndHlwZSc6IFwiV29yZFR5cGVcIlxuICAgICAgICAndWlkJyA6IEBnZXRVaWQoKVxuICAgICAgICAnYmVnaW5uaW5nJyA6IEBiZWdpbm5pbmcuZ2V0VWlkKClcbiAgICAgICAgJ2VuZCcgOiBAZW5kLmdldFVpZCgpXG4gICAgICB9XG4gICAgICBpZiBAcHJldl9jbD9cbiAgICAgICAganNvblsncHJldiddID0gQHByZXZfY2wuZ2V0VWlkKClcbiAgICAgIGlmIEBuZXh0X2NsP1xuICAgICAgICBqc29uWyduZXh0J10gPSBAbmV4dF9jbC5nZXRVaWQoKVxuICAgICAgaWYgQG9yaWdpbj8gIyBhbmQgQG9yaWdpbiBpc250IEBwcmV2X2NsXG4gICAgICAgIGpzb25bXCJvcmlnaW5cIl0gPSBAb3JpZ2luKCkuZ2V0VWlkKClcbiAgICAgIGpzb25cblxuICBwYXJzZXJbJ1dvcmRUeXBlJ10gPSAoanNvbiktPlxuICAgIHtcbiAgICAgICd1aWQnIDogdWlkXG4gICAgICAnYmVnaW5uaW5nJyA6IGJlZ2lubmluZ1xuICAgICAgJ2VuZCcgOiBlbmRcbiAgICAgICdwcmV2JzogcHJldlxuICAgICAgJ25leHQnOiBuZXh0XG4gICAgICAnb3JpZ2luJyA6IG9yaWdpblxuICAgIH0gPSBqc29uXG4gICAgbmV3IFdvcmRUeXBlIHVpZCwgYmVnaW5uaW5nLCBlbmQsIHByZXYsIG5leHQsIG9yaWdpblxuXG4gIHR5cGVzWydUZXh0SW5zZXJ0J10gPSBUZXh0SW5zZXJ0XG4gIHR5cGVzWydUZXh0RGVsZXRlJ10gPSBUZXh0RGVsZXRlXG4gIHR5cGVzWydXb3JkVHlwZSddID0gV29yZFR5cGVcbiAgc3RydWN0dXJlZF90eXBlc1xuXG5cbiIsIlxuanNvbl90eXBlc191bmluaXRpYWxpemVkID0gcmVxdWlyZSBcIi4vSnNvblR5cGVzXCJcblxuIyBzb21lIGRvbSBpbXBsZW1lbnRhdGlvbnMgbWF5IGNhbGwgYW5vdGhlciBkb20ubWV0aG9kIHRoYXQgc2ltdWxhdGVzIHRoZSBiZWhhdmlvciBvZiBhbm90aGVyLlxuIyBGb3IgZXhhbXBsZSB4bWwuaW5zZXJ0Q2hpbGQoZG9tKSAsIHdpY2ggaW5zZXJ0cyBhbiBlbGVtZW50IGF0IHRoZSBlbmQsIGFuZCB4bWwuaW5zZXJ0QWZ0ZXIoZG9tLG51bGwpIHdpY2ggZG9lcyB0aGUgc2FtZVxuIyBCdXQgeWF0dGEncyBwcm94eSBtYXkgYmUgY2FsbGVkIG9ubHkgb25jZSFcbnByb3h5X3Rva2VuID0gZmFsc2VcbmRvbnRfcHJveHkgPSAoZiktPlxuICBwcm94eV90b2tlbiA9IHRydWVcbiAgdHJ5XG4gICAgZigpXG4gIGNhdGNoIGVcbiAgICBwcm94eV90b2tlbiA9IGZhbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yIGVcbiAgcHJveHlfdG9rZW4gPSBmYWxzZVxuXG5fcHJveHkgPSAoZl9uYW1lLCBmKS0+XG4gIG9sZF9mID0gQFtmX25hbWVdXG4gIGlmIG9sZF9mP1xuICAgIEBbZl9uYW1lXSA9ICgpLT5cbiAgICAgIGlmIG5vdCBwcm94eV90b2tlbiBhbmQgbm90IEBfeWF0dGE/LmlzRGVsZXRlZCgpXG4gICAgICAgIHRoYXQgPSB0aGlzXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHNcbiAgICAgICAgZG9udF9wcm94eSAoKS0+XG4gICAgICAgICAgZi5hcHBseSB0aGF0LCBhcmdzXG4gICAgICAgICAgb2xkX2YuYXBwbHkgdGhhdCwgYXJnc1xuICAgICAgZWxzZVxuICAgICAgICBvbGRfZi5hcHBseSB0aGlzLCBhcmd1bWVudHNcbiAgI2Vsc2VcbiAgIyAgQFtmX25hbWVdID0gZlxuRWxlbWVudD8ucHJvdG90eXBlLl9wcm94eSA9IF9wcm94eVxuXG5cbm1vZHVsZS5leHBvcnRzID0gKEhCKS0+XG4gIGpzb25fdHlwZXMgPSBqc29uX3R5cGVzX3VuaW5pdGlhbGl6ZWQgSEJcbiAgdHlwZXMgPSBqc29uX3R5cGVzLnR5cGVzXG4gIHBhcnNlciA9IGpzb25fdHlwZXMucGFyc2VyXG5cbiAgI1xuICAjIE1hbmFnZXMgWE1MIHR5cGVzXG4gICMgTm90IHN1cHBvcnRlZDpcbiAgIyAqIEF0dHJpYnV0ZSBub2Rlc1xuICAjICogUmVhbCByZXBsYWNlIG9mIGNoaWxkIGVsZW1lbnRzICh0byBtdWNoIG92ZXJoZWFkKS4gQ3VycmVudGx5LCB0aGUgbmV3IGVsZW1lbnQgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlICdyZXBsYWNlZCcgZWxlbWVudCwgYW5kIHRoZW4gaXQgaXMgZGVsZXRlZC5cbiAgIyAqIE5hbWVzcGFjZXMgKCpOUylcbiAgIyAqIEJyb3dzZXIgc3BlY2lmaWMgbWV0aG9kcyAod2Via2l0LSogb3BlcmF0aW9ucylcbiAgY2xhc3MgWG1sVHlwZSBleHRlbmRzIHR5cGVzLkluc2VydFxuXG4gICAgY29uc3RydWN0b3I6ICh1aWQsIEB0YWduYW1lLCBhdHRyaWJ1dGVzLCBlbGVtZW50cywgQHhtbCktPlxuICAgICAgIyMjIEluIGNhc2UgeW91IG1ha2UgdGhpcyBpbnN0YW5jZW9mIEluc2VydCBhZ2FpblxuICAgICAgaWYgcHJldj8gYW5kIChub3QgbmV4dD8pIGFuZCBwcmV2LnR5cGU/XG4gICAgICAgICMgYWRqdXN0IHdoYXQgeW91IGFjdHVhbGx5IG1lYW4uIHlvdSB3YW50IHRvIGluc2VydCBhZnRlciBwcmV2LCB0aGVuXG4gICAgICAgICMgbmV4dCBpcyBub3QgZGVmaW5lZC4gYnV0IHdlIG9ubHkgaW5zZXJ0IGFmdGVyIG5vbi1kZWxldGVkIGVsZW1lbnRzLlxuICAgICAgICAjIFRoaXMgaXMgYWxzbyBoYW5kbGVkIGluIFRleHRJbnNlcnQuXG4gICAgICAgIHdoaWxlIHByZXYuaXNEZWxldGVkKClcbiAgICAgICAgICBwcmV2ID0gcHJldi5wcmV2X2NsXG4gICAgICAgIG5leHQgPSBwcmV2Lm5leHRfY2xcbiAgICAgICMjI1xuXG4gICAgICBzdXBlcih1aWQpXG5cblxuICAgICAgaWYgQHhtbD8uX3lhdHRhP1xuICAgICAgICBkID0gbmV3IHR5cGVzLkRlbGV0ZSB1bmRlZmluZWQsIEB4bWwuX3lhdHRhXG4gICAgICAgIEhCLmFkZE9wZXJhdGlvbihkKS5leGVjdXRlKClcbiAgICAgICAgQHhtbC5feWF0dGEgPSBudWxsXG5cbiAgICAgIGlmIGF0dHJpYnV0ZXM/IGFuZCBlbGVtZW50cz9cbiAgICAgICAgQHNhdmVPcGVyYXRpb24gJ2F0dHJpYnV0ZXMnLCBhdHRyaWJ1dGVzXG4gICAgICAgIEBzYXZlT3BlcmF0aW9uICdlbGVtZW50cycsIGVsZW1lbnRzXG4gICAgICBlbHNlIGlmIChub3QgYXR0cmlidXRlcz8pIGFuZCAobm90IGVsZW1lbnRzPylcbiAgICAgICAgQGF0dHJpYnV0ZXMgPSBuZXcgdHlwZXMuSnNvblR5cGUoKVxuICAgICAgICBAYXR0cmlidXRlcy5zZXRNdXRhYmxlRGVmYXVsdCAnaW1tdXRhYmxlJ1xuICAgICAgICBIQi5hZGRPcGVyYXRpb24oQGF0dHJpYnV0ZXMpLmV4ZWN1dGUoKVxuICAgICAgICBAZWxlbWVudHMgPSBuZXcgdHlwZXMuV29yZFR5cGUoKVxuICAgICAgICBAZWxlbWVudHMucGFyZW50ID0gQFxuICAgICAgICBIQi5hZGRPcGVyYXRpb24oQGVsZW1lbnRzKS5leGVjdXRlKClcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiRWl0aGVyIGRlZmluZSBhdHRyaWJ1dGUgYW5kIGVsZW1lbnRzIGJvdGgsIG9yIG5vbmUgb2YgdGhlbVwiXG5cbiAgICAgIGlmIEB4bWw/XG4gICAgICAgIEB0YWduYW1lID0gQHhtbC50YWdOYW1lXG4gICAgICAgIGZvciBpIGluIFswLi4uQHhtbC5hdHRyaWJ1dGVzLmxlbmd0aF1cbiAgICAgICAgICBhdHRyID0geG1sLmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgICBAYXR0cmlidXRlcy52YWwoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgICBmb3IgbiBpbiBAeG1sLmNoaWxkTm9kZXNcbiAgICAgICAgICBpZiBuLm5vZGVUeXBlIGlzIG4uVEVYVF9OT0RFXG4gICAgICAgICAgICB3b3JkID0gbmV3IFRleHROb2RlVHlwZSh1bmRlZmluZWQsIG4pXG4gICAgICAgICAgICBIQi5hZGRPcGVyYXRpb24od29yZCkuZXhlY3V0ZSgpXG4gICAgICAgICAgICBAZWxlbWVudHMucHVzaCB3b3JkXG4gICAgICAgICAgZWxzZSBpZiBuLm5vZGVUeXBlIGlzIG4uRUxFTUVOVF9OT0RFXG4gICAgICAgICAgICBlbGVtZW50ID0gbmV3IFhtbFR5cGUgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBuXG4gICAgICAgICAgICBIQi5hZGRPcGVyYXRpb24oZWxlbWVudCkuZXhlY3V0ZSgpXG4gICAgICAgICAgICBAZWxlbWVudHMucHVzaCBlbGVtZW50XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiSSBkb24ndCBrbm93IE5vZGUtdHlwZSAje24ubm9kZVR5cGV9ISFcIlxuICAgICAgICBAc2V0WG1sUHJveHkoKVxuICAgICAgdW5kZWZpbmVkXG5cbiAgICAjXG4gICAgIyBJZGVudGlmaWVzIHRoaXMgY2xhc3MuXG4gICAgIyBVc2UgaXQgaW4gb3JkZXIgdG8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGFuIHhtbC10eXBlIG9yIHNvbWV0aGluZyBlbHNlLlxuICAgICNcbiAgICB0eXBlOiBcIlhtbFR5cGVcIlxuXG4gICAgYXBwbHlEZWxldGU6IChvcCktPlxuICAgICAgaWYgQGluc2VydF9wYXJlbnQ/IGFuZCBub3QgQGluc2VydF9wYXJlbnQuaXNEZWxldGVkKClcbiAgICAgICAgQGluc2VydF9wYXJlbnQuYXBwbHlEZWxldGUgb3BcbiAgICAgIGVsc2VcbiAgICAgICAgQGF0dHJpYnV0ZXMuYXBwbHlEZWxldGUoKVxuICAgICAgICBAZWxlbWVudHMuYXBwbHlEZWxldGUoKVxuICAgICAgICBzdXBlclxuXG4gICAgY2xlYW51cDogKCktPlxuICAgICAgc3VwZXIoKVxuXG4gICAgc2V0WG1sUHJveHk6ICgpLT5cbiAgICAgIEB4bWwuX3lhdHRhID0gQFxuICAgICAgdGhhdCA9IEBcblxuICAgICAgQGVsZW1lbnRzLm9uICdpbnNlcnQnLCAoZXZlbnQsIG9wKS0+XG4gICAgICAgIGlmIG9wLmNyZWF0b3IgaXNudCBIQi5nZXRVc2VySWQoKSBhbmQgdGhpcyBpcyB0aGF0LmVsZW1lbnRzXG4gICAgICAgICAgbmV3Tm9kZSA9IG9wLmNvbnRlbnQudmFsKClcbiAgICAgICAgICByaWdodCA9IG9wLm5leHRfY2xcbiAgICAgICAgICB3aGlsZSByaWdodD8gYW5kIHJpZ2h0LmlzRGVsZXRlZCgpXG4gICAgICAgICAgICByaWdodCA9IHJpZ2h0Lm5leHRfY2xcbiAgICAgICAgICByaWdodE5vZGUgPSBudWxsXG4gICAgICAgICAgaWYgcmlnaHQudHlwZSBpc250ICdEZWxpbWl0ZXInXG4gICAgICAgICAgICByaWdodE5vZGUgPSByaWdodC52YWwoKS52YWwoKVxuICAgICAgICAgIGRvbnRfcHJveHkgKCktPlxuICAgICAgICAgICAgdGhhdC54bWwuaW5zZXJ0QmVmb3JlIG5ld05vZGUsIHJpZ2h0Tm9kZVxuICAgICAgQGVsZW1lbnRzLm9uICdkZWxldGUnLCAoZXZlbnQsIG9wKS0+XG4gICAgICAgIGRlbF9vcCA9IG9wLmRlbGV0ZWRfYnlbMF1cbiAgICAgICAgaWYgZGVsX29wPyBhbmQgZGVsX29wLmNyZWF0b3IgaXNudCBIQi5nZXRVc2VySWQoKSBhbmQgdGhpcyBpcyB0aGF0LmVsZW1lbnRzXG4gICAgICAgICAgZGVsZXRlZCA9IG9wLmNvbnRlbnQudmFsKClcbiAgICAgICAgICBkb250X3Byb3h5ICgpLT5cbiAgICAgICAgICAgIHRoYXQueG1sLnJlbW92ZUNoaWxkIGRlbGV0ZWRcblxuICAgICAgQGF0dHJpYnV0ZXMub24gWydhZGRQcm9wZXJ0eScsICdjaGFuZ2UnXSwgKGV2ZW50LCBwcm9wZXJ0eV9uYW1lLCBvcCktPlxuICAgICAgICBpZiBvcC5jcmVhdG9yIGlzbnQgSEIuZ2V0VXNlcklkKCkgYW5kIHRoaXMgaXMgdGhhdC5hdHRyaWJ1dGVzXG4gICAgICAgICAgZG9udF9wcm94eSAoKS0+XG4gICAgICAgICAgICBuZXd2YWwgPSBvcC52YWwoKS52YWwoKVxuICAgICAgICAgICAgaWYgbmV3dmFsP1xuICAgICAgICAgICAgICB0aGF0LnhtbC5zZXRBdHRyaWJ1dGUocHJvcGVydHlfbmFtZSwgb3AudmFsKCkudmFsKCkpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIHRoYXQueG1sLnJlbW92ZUF0dHJpYnV0ZShwcm9wZXJ0eV9uYW1lKVxuXG5cblxuXG5cblxuXG5cbiAgICAgICMjIEhlcmUgYXJlIGFsbCBtZXRob2RzIHRoYXQgcHJveHkgdGhlIGJlaGF2aW9yIG9mIHRoZSB4bWxcblxuICAgICAgIyB5b3Ugd2FudCB0byBmaW5kIGEgc3BlY2lmaWMgY2hpbGQgZWxlbWVudC4gU2luY2UgdGhleSBhcmUgY2FycmllZCBieSBhbiBJbnNlcnQtVHlwZSwgeW91IHdhbnQgdG8gZmluZCB0aGF0IEluc2VydC1PcGVyYXRpb24uXG4gICAgICAjIEBwYXJhbSBjaGlsZCB7RG9tRWxlbWVudH0gRG9tIGVsZW1lbnQuXG4gICAgICAjIEByZXR1cm4ge0luc2VydFR5cGV9IFRoaXMgY2FycmllcyB0aGUgWG1sVHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIERvbUVsZW1lbnQgKGNoaWxkKS4gZmFsc2UgaWYgaSBjb3VsZG4ndCBmaW5kIGl0LlxuICAgICAgI1xuICAgICAgZmluZE5vZGUgPSAoY2hpbGQpLT5cbiAgICAgICAgaWYgbm90IGNoaWxkP1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvciBcInlvdSBtdXN0IHNwZWNpZnkgYSBwYXJhbWV0ZXIhXCJcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5feWF0dGFcbiAgICAgICAgZWxlbSA9IHRoYXQuZWxlbWVudHMuYmVnaW5uaW5nLm5leHRfY2xcbiAgICAgICAgd2hpbGUgZWxlbS50eXBlIGlzbnQgJ0RlbGltaXRlcicgYW5kIGVsZW0uY29udGVudCBpc250IGNoaWxkXG4gICAgICAgICAgZWxlbSA9IGVsZW0ubmV4dF9jbFxuICAgICAgICBpZiBlbGVtLnR5cGUgaXMgJ0RlbGltaXRlcidcbiAgICAgICAgICBmYWxzZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgZWxlbVxuXG4gICAgICBpbnNlcnRCZWZvcmUgPSAoaW5zZXJ0ZWROb2RlX3MsIGFkamFjZW50Tm9kZSktPlxuICAgICAgICBuZXh0ID0gbnVsbFxuICAgICAgICBpZiBhZGphY2VudE5vZGU/XG4gICAgICAgICAgbmV4dCA9IGZpbmROb2RlIGFkamFjZW50Tm9kZVxuICAgICAgICBwcmV2ID0gbnVsbFxuICAgICAgICBpZiBuZXh0XG4gICAgICAgICAgcHJldiA9IG5leHQucHJldl9jbFxuICAgICAgICBlbHNlXG4gICAgICAgICAgcHJldiA9IEBfeWF0dGEuZWxlbWVudHMuZW5kLnByZXZfY2xcbiAgICAgICAgICB3aGlsZSBwcmV2LmlzRGVsZXRlZCgpXG4gICAgICAgICAgICBwcmV2ID0gcHJldi5wcmV2X2NsXG4gICAgICAgIGluc2VydGVkX25vZGVzID0gbnVsbFxuICAgICAgICBpZiBpbnNlcnRlZE5vZGVfcy5ub2RlVHlwZSBpcyBpbnNlcnRlZE5vZGVfcy5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFXG4gICAgICAgICAgY2hpbGQgPSBpbnNlcnRlZE5vZGVfcy5sYXN0Q2hpbGRcbiAgICAgICAgICB3aGlsZSBjaGlsZD9cbiAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgWG1sVHlwZSB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNoaWxkXG4gICAgICAgICAgICBIQi5hZGRPcGVyYXRpb24oZWxlbWVudCkuZXhlY3V0ZSgpXG4gICAgICAgICAgICB0aGF0LmVsZW1lbnRzLmluc2VydEFmdGVyIHByZXYsIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQucHJldmlvdXNTaWJsaW5nXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBlbGVtZW50ID0gbmV3IFhtbFR5cGUgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBpbnNlcnRlZE5vZGVfc1xuICAgICAgICAgIEhCLmFkZE9wZXJhdGlvbihlbGVtZW50KS5leGVjdXRlKClcbiAgICAgICAgICB0aGF0LmVsZW1lbnRzLmluc2VydEFmdGVyIHByZXYsIGVsZW1lbnRcblxuICAgICAgQHhtbC5fcHJveHkgJ2luc2VydEJlZm9yZScsIGluc2VydEJlZm9yZVxuICAgICAgQHhtbC5fcHJveHkgJ2FwcGVuZENoaWxkJywgaW5zZXJ0QmVmb3JlXG4gICAgICBAeG1sLl9wcm94eSAncmVtb3ZlQXR0cmlidXRlJywgKG5hbWUpLT5cbiAgICAgICAgdGhhdC5hdHRyaWJ1dGVzLnZhbChuYW1lLCB1bmRlZmluZWQpXG4gICAgICBAeG1sLl9wcm94eSAnc2V0QXR0cmlidXRlJywgKG5hbWUsIHZhbHVlKS0+XG4gICAgICAgIHRoYXQuYXR0cmlidXRlcy52YWwgbmFtZSwgdmFsdWVcblxuICAgICAgcmVuZXdDbGFzc0xpc3QgPSAobmV3Y2xhc3MpLT5cbiAgICAgICAgZG9udF9kb19pdCA9IGZhbHNlXG4gICAgICAgIGlmIG5ld2NsYXNzP1xuICAgICAgICAgIGZvciBlbGVtIGluIHRoaXNcbiAgICAgICAgICAgIGlmIG5ld2NsYXNzIGlzIGVsZW1cbiAgICAgICAgICAgICAgZG9udF9kb19pdCA9IHRydWVcbiAgICAgICAgdmFsdWUgPSBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsIHRoaXMsIFwiIFwiXG4gICAgICAgIGlmIG5ld2NsYXNzPyBhbmQgbm90IGRvbnRfZG9faXRcbiAgICAgICAgICB2YWx1ZSArPSBcIiBcIituZXdjbGFzc1xuICAgICAgICB0aGF0LmF0dHJpYnV0ZXMudmFsKCdjbGFzcycsIHZhbHVlIClcbiAgICAgIF9wcm94eS5jYWxsIEB4bWwuY2xhc3NMaXN0LCAnYWRkJywgcmVuZXdDbGFzc0xpc3RcbiAgICAgIF9wcm94eS5jYWxsIEB4bWwuY2xhc3NMaXN0LCAncmVtb3ZlJywgcmVuZXdDbGFzc0xpc3RcbiAgICAgIEB4bWwuX19kZWZpbmVTZXR0ZXJfXyAnY2xhc3NOYW1lJywgKHZhbCktPlxuICAgICAgICBAc2V0QXR0cmlidXRlKCdjbGFzcycsIHZhbClcbiAgICAgIEB4bWwuX19kZWZpbmVHZXR0ZXJfXyAnY2xhc3NOYW1lJywgKCktPlxuICAgICAgICB0aGF0LmF0dHJpYnV0ZXMudmFsKCdjbGFzcycpXG4gICAgICBAeG1sLl9fZGVmaW5lU2V0dGVyX18gJ3RleHRDb250ZW50JywgKHZhbCktPlxuICAgICAgICAjIHJlbW92ZSBhbGwgbm9kZXNcbiAgICAgICAgZWxlbSA9IHRoYXQueG1sLmZpcnN0Q2hpbGRcbiAgICAgICAgd2hpbGUgZWxlbT9cbiAgICAgICAgICByZW1vdmUgPSBlbGVtXG4gICAgICAgICAgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmdcbiAgICAgICAgICB0aGF0LnhtbC5yZW1vdmVDaGlsZCByZW1vdmVcblxuICAgICAgICAjIGluc2VydCB3b3JkIGNvbnRlbnRcbiAgICAgICAgaWYgdmFsIGlzbnQgXCJcIlxuICAgICAgICAgIHRleHRfbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlIHZhbFxuICAgICAgICAgIHRoYXQueG1sLmFwcGVuZENoaWxkIHRleHRfbm9kZVxuXG4gICAgICByZW1vdmVDaGlsZCA9IChub2RlKS0+XG4gICAgICAgIGVsZW0gPSBmaW5kTm9kZSBub2RlXG4gICAgICAgIGlmIG5vdCBlbGVtXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiWW91IGFyZSBvbmx5IGFsbG93ZWQgdG8gZGVsZXRlIGV4aXN0aW5nIChkaXJlY3QpIGNoaWxkIGVsZW1lbnRzIVwiXG4gICAgICAgIGQgPSBuZXcgdHlwZXMuRGVsZXRlIHVuZGVmaW5lZCwgZWxlbVxuICAgICAgICBIQi5hZGRPcGVyYXRpb24oZCkuZXhlY3V0ZSgpXG4gICAgICAgIG5vZGUuX3lhdHRhID0gbnVsbFxuICAgICAgQHhtbC5fcHJveHkgJ3JlbW92ZUNoaWxkJywgcmVtb3ZlQ2hpbGRcbiAgICAgIEB4bWwuX3Byb3h5ICdyZXBsYWNlQ2hpbGQnLCAoaW5zZXJ0ZWROb2RlLCByZXBsYWNlZE5vZGUpLT5cbiAgICAgICAgaW5zZXJ0QmVmb3JlLmNhbGwgdGhpcywgaW5zZXJ0ZWROb2RlLCByZXBsYWNlZE5vZGVcbiAgICAgICAgcmVtb3ZlQ2hpbGQuY2FsbCB0aGlzLCByZXBsYWNlZE5vZGVcblxuXG5cbiAgICB2YWw6IChlbmZvcmNlID0gZmFsc2UpLT5cbiAgICAgIGlmIGRvY3VtZW50P1xuICAgICAgICBpZiAobm90IEB4bWw/KSBvciBlbmZvcmNlXG4gICAgICAgICAgQHhtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgQHRhZ25hbWVcblxuICAgICAgICAgIGF0dHIgPSBAYXR0cmlidXRlcy52YWwoKVxuICAgICAgICAgIGZvciBhdHRyX25hbWUsIHZhbHVlIG9mIGF0dHJcbiAgICAgICAgICAgIGlmIHZhbHVlP1xuICAgICAgICAgICAgICBhID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlIGF0dHJfbmFtZVxuICAgICAgICAgICAgICBhLnZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgQHhtbC5zZXRBdHRyaWJ1dGVOb2RlIGFcblxuICAgICAgICAgIGUgPSBAZWxlbWVudHMuYmVnaW5uaW5nLm5leHRfY2xcbiAgICAgICAgICB3aGlsZSBlLnR5cGUgaXNudCBcIkRlbGltaXRlclwiXG4gICAgICAgICAgICBuID0gZS5jb250ZW50XG4gICAgICAgICAgICBpZiBub3QgZS5pc0RlbGV0ZWQoKSBhbmQgZS5jb250ZW50PyAjIFRPRE86IGhvdyBjYW4gdGhpcyBoYXBwZW4/ICBQcm9iYWJseSBiZWNhdXNlIGxpc3RlbmVyc1xuICAgICAgICAgICAgICBpZiBuLnR5cGUgaXMgXCJYbWxUeXBlXCJcbiAgICAgICAgICAgICAgICBAeG1sLmFwcGVuZENoaWxkIG4udmFsKGVuZm9yY2UpXG4gICAgICAgICAgICAgIGVsc2UgaWYgbi50eXBlIGlzIFwiVGV4dE5vZGVUeXBlXCJcbiAgICAgICAgICAgICAgICB0ZXh0X25vZGUgPSBuLnZhbCgpXG4gICAgICAgICAgICAgICAgQHhtbC5hcHBlbmRDaGlsZCB0ZXh0X25vZGVcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciBcIkludGVybmFsIHN0cnVjdHVyZSBjYW5ub3QgYmUgdHJhbnNmb3JtZWQgdG8gZG9tXCJcbiAgICAgICAgICAgIGUgPSBlLm5leHRfY2xcbiAgICAgICAgQHNldFhtbFByb3h5KClcbiAgICAgICAgQHhtbFxuXG5cbiAgICBleGVjdXRlOiAoKS0+XG4gICAgICBzdXBlcigpXG4gICAgIyMjXG4gICAgICBpZiBub3QgQHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zKClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICBlbHNlXG5cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAjIyNcblxuICAgICNcbiAgICAjIEdldCB0aGUgcGFyZW50IG9mIHRoaXMgSnNvblR5cGUuXG4gICAgIyBAcmV0dXJuIHtYbWxUeXBlfVxuICAgICNcbiAgICBnZXRQYXJlbnQ6ICgpLT5cbiAgICAgIEBwYXJlbnRcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgI1xuICAgICMgQ29udmVydCBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24gb2YgdGhpcyBvcGVyYXRpb24gdG8gdGhlIGpzb24tZm9ybWF0LlxuICAgICMgVGhpcyByZXN1bHQgY2FuIGJlIHNlbmQgdG8gb3RoZXIgY2xpZW50cy5cbiAgICAjXG4gICAgX2VuY29kZTogKCktPlxuICAgICAganNvbiA9XG4gICAgICAgIHtcbiAgICAgICAgICAndHlwZScgOiBAdHlwZVxuICAgICAgICAgICdhdHRyaWJ1dGVzJyA6IEBhdHRyaWJ1dGVzLmdldFVpZCgpXG4gICAgICAgICAgJ2VsZW1lbnRzJyA6IEBlbGVtZW50cy5nZXRVaWQoKVxuICAgICAgICAgICd0YWduYW1lJyA6IEB0YWduYW1lXG4gICAgICAgICAgJ3VpZCcgOiBAZ2V0VWlkKClcbiAgICAgICAgfVxuICAgICAganNvblxuXG4gIHBhcnNlclsnWG1sVHlwZSddID0gKGpzb24pLT5cbiAgICB7XG4gICAgICAndWlkJyA6IHVpZFxuICAgICAgJ2F0dHJpYnV0ZXMnIDogYXR0cmlidXRlc1xuICAgICAgJ2VsZW1lbnRzJyA6IGVsZW1lbnRzXG4gICAgICAndGFnbmFtZScgOiB0YWduYW1lXG4gICAgfSA9IGpzb25cblxuICAgIG5ldyBYbWxUeXBlIHVpZCwgdGFnbmFtZSwgYXR0cmlidXRlcywgZWxlbWVudHMsIHVuZGVmaW5lZFxuXG4jXG4gICMgQG5vZG9jXG4gICMgRGVmaW5lcyBhbiBvYmplY3QgdGhhdCBpcyBjYW5ub3QgYmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgdGhpcyB0byBzZXQgYW4gaW1tdXRhYmxlIHN0cmluZywgb3IgYSBudW1iZXIuXG4gICNcbiAgY2xhc3MgVGV4dE5vZGVUeXBlIGV4dGVuZHMgdHlwZXMuSW1tdXRhYmxlT2JqZWN0XG5cbiAgICAjXG4gICAgIyBAcGFyYW0ge09iamVjdH0gdWlkIEEgdW5pcXVlIGlkZW50aWZpZXIuIElmIHVpZCBpcyB1bmRlZmluZWQsIGEgbmV3IHVpZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgIyBAcGFyYW0ge09iamVjdH0gY29udGVudFxuICAgICNcbiAgICBjb25zdHJ1Y3RvcjogKHVpZCwgY29udGVudCktPlxuICAgICAgaWYgY29udGVudC5feWF0dGE/XG4gICAgICAgIGQgPSBuZXcgdHlwZXMuRGVsZXRlIHVuZGVmaW5lZCwgY29udGVudC5feWF0dGFcbiAgICAgICAgSEIuYWRkT3BlcmF0aW9uKGQpLmV4ZWN1dGUoKVxuICAgICAgICBjb250ZW50Ll95YXR0YSA9IG51bGxcbiAgICAgIGNvbnRlbnQuX3lhdHRhID0gQFxuICAgICAgc3VwZXIgdWlkLCBjb250ZW50XG5cbiAgICBhcHBseURlbGV0ZTogKG9wKS0+XG4gICAgICBpZiBAaW5zZXJ0X3BhcmVudD8gYW5kIG5vdCBAaW5zZXJ0X3BhcmVudC5pc0RlbGV0ZWQoKVxuICAgICAgICBAaW5zZXJ0X3BhcmVudC5hcHBseURlbGV0ZSBvcFxuICAgICAgZWxzZVxuICAgICAgICBzdXBlclxuXG5cbiAgICB0eXBlOiBcIlRleHROb2RlVHlwZVwiXG5cbiAgICAjXG4gICAgIyBFbmNvZGUgdGhpcyBvcGVyYXRpb24gaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBwYXJzZWQgYnkgcmVtb3RlIHBlZXJzLlxuICAgICNcbiAgICBfZW5jb2RlOiAoKS0+XG4gICAgICBqc29uID0ge1xuICAgICAgICAndHlwZSc6IEB0eXBlXG4gICAgICAgICd1aWQnIDogQGdldFVpZCgpXG4gICAgICAgICdjb250ZW50JyA6IEBjb250ZW50LnRleHRDb250ZW50XG4gICAgICB9XG4gICAgICBqc29uXG5cbiAgcGFyc2VyWydUZXh0Tm9kZVR5cGUnXSA9IChqc29uKS0+XG4gICAge1xuICAgICAgJ3VpZCcgOiB1aWRcbiAgICAgICdjb250ZW50JyA6IGNvbnRlbnRcbiAgICB9ID0ganNvblxuICAgIHRleHRub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUgY29udGVudFxuICAgIG5ldyBUZXh0Tm9kZVR5cGUgdWlkLCB0ZXh0bm9kZVxuXG4gIHR5cGVzWydYbWxUeXBlJ10gPSBYbWxUeXBlXG5cbiAganNvbl90eXBlc1xuIl19
|