react-image-markup
Version:
Markup Image with ReactJS (customizable)
200 lines (175 loc) • 24.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _fabric = require("fabric");
var _canvasHistory = _interopRequireDefault(require("./canvasHistory"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var _default = function () {
var disabled = false;
var object;
var src;
var drag;
var clipRect, rect, rectRed;
var overlay = {};
var properties;
function CropImage(canvas) {
var draggable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var apply = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var cancel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
var params = arguments.length > 4 ? arguments[4] : undefined;
this.canvas = canvas;
if (cancel) {
this.canvas.remove(clipRect);
this.canvas.remove(rect);
this.canvas.remove(rectRed);
}
if (!draggable) {
drag = false;
return CropImage;
}
drag = draggable;
disabled = false;
properties = params;
canvas.backgroundColor = "#fff";
src = canvas.toDataURL('image/jpeg');
_fabric.fabric.util.loadImage(src, function (img) {
object = new _fabric.fabric.Image(img);
object.selectable = false;
});
if (drag && apply) {
canvas.clear();
var overlayCropped = overlay.toDataURL();
_fabric.fabric.util.loadImage(overlayCropped, function (img) {
var clippedImage = new _fabric.fabric.Image(img);
clippedImage.selectable = false;
canvas.setBackgroundImage(clippedImage, canvas.renderAll.bind(canvas), {
scaleX: canvas.width / clippedImage.width,
scaleY: canvas.height / clippedImage.height
});
});
drag = false;
apply = false;
var croppedImage = {
json: canvas.toJSON(),
croppedImage: overlayCropped
};
new _canvasHistory["default"](this.canvas, croppedImage);
return CropImage;
}
this.bindEvents();
this.canvas.selectable = false;
this.canvas.renderAll();
var inst = this;
new _fabric.fabric.Image.fromURL(src, function (oImg) {
rect = new _fabric.fabric.Rect({
left: 0,
top: 0,
width: oImg.width,
height: oImg.height,
fill: properties.overlayColor,
selectable: false,
opacity: properties.overlayOpacity
});
inst.canvas.add(rect);
_fabric.fabric.Image.fromURL(src, function (oImg1) {
rectRed = new _fabric.fabric.Rect({
left: (oImg1.width - properties.width) / 2,
top: (oImg1.height - properties.height) / 2,
width: properties.width,
height: properties.height,
fill: '',
imageWidth: oImg1.width,
imageHeight: oImg1.height,
cornerSize: properties.cornerSize,
hasControls: properties.hasControls,
borderColor: properties.borderColor,
cornerColor: properties.cornerColor,
cornerStyle: properties.cornerStyle,
transparentCorners: properties.transparentCorners,
hasRotatingPoint: properties.hasRotatingPoint,
lockUniScaling: true,
noScaleCache: false,
strokeUniform: true,
clipTo: function clipTo(context) {
context.translate(-this.width / 2, -this.height / 2);
for (var x = 0; x <= this.width; x += this.width / 3) {
context.moveTo(x, 0);
context.lineTo(x, this.height);
}
for (var y = 0; y <= this.height; y += this.height / 3) {
context.moveTo(0, y);
context.lineTo(this.width, y);
}
context.strokeStyle = "rgba(0,0,0,0.4)";
context.stroke();
}
});
clipRect = new _fabric.fabric.Rect({
left: -(properties.width / 2),
top: -(properties.height / 2),
width: properties.width,
height: properties.height,
fill: '',
selectable: false
});
oImg1.set({
clipPath: clipRect,
selectable: false
});
inst.canvas.add(oImg1);
overlay = inst.canvas._objects[inst.canvas._objects.length - 1];
inst.canvas.add(rectRed);
inst.canvas.bringToFront(rectRed);
inst.canvas.setActiveObject(rectRed);
});
});
this.canvas.renderAll();
}
;
CropImage.prototype.bindEvents = function () {
var inst = this;
inst.canvas.on("mouse:down", function (o) {
inst.onMouseDown(o);
});
inst.canvas.on("object:scaling", function (e) {
var target = e.target;
clipRect = new _fabric.fabric.Rect({
left: target.left - overlay.width / 2,
top: target.top - overlay.height / 2,
width: target.width,
height: target.height,
fill: '',
scaleX: target.scaleX,
scaleY: target.scaleY
});
overlay.set("clipPath", clipRect);
inst.canvas.renderAll();
});
inst.canvas.on('object:moving', function (e) {
var target = e.target;
clipRect = new _fabric.fabric.Rect({
left: target.left - overlay.width / 2,
top: target.top - overlay.height / 2,
width: target.width,
height: target.height,
fill: '',
scaleX: target.scaleX,
scaleY: target.scaleY
});
overlay.set("clipPath", clipRect);
inst.canvas.renderAll();
});
CropImage.prototype.onMouseDown = function (event) {
var inst = this;
if (disabled || !drag) {
return CropImage;
}
inst.canvas.setActiveObject(rectRed);
};
};
return CropImage;
}();
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hc3NldHMvanMvY3JvcC5qcyJdLCJuYW1lcyI6WyJkaXNhYmxlZCIsIm9iamVjdCIsInNyYyIsImRyYWciLCJjbGlwUmVjdCIsInJlY3QiLCJyZWN0UmVkIiwib3ZlcmxheSIsInByb3BlcnRpZXMiLCJDcm9wSW1hZ2UiLCJjYW52YXMiLCJkcmFnZ2FibGUiLCJhcHBseSIsImNhbmNlbCIsInBhcmFtcyIsInJlbW92ZSIsImJhY2tncm91bmRDb2xvciIsInRvRGF0YVVSTCIsImZhYnJpYyIsInV0aWwiLCJsb2FkSW1hZ2UiLCJpbWciLCJJbWFnZSIsInNlbGVjdGFibGUiLCJjbGVhciIsIm92ZXJsYXlDcm9wcGVkIiwiY2xpcHBlZEltYWdlIiwic2V0QmFja2dyb3VuZEltYWdlIiwicmVuZGVyQWxsIiwiYmluZCIsInNjYWxlWCIsIndpZHRoIiwic2NhbGVZIiwiaGVpZ2h0IiwiY3JvcHBlZEltYWdlIiwianNvbiIsInRvSlNPTiIsIkNhbnZhc0hpc3RvcnkiLCJiaW5kRXZlbnRzIiwiaW5zdCIsImZyb21VUkwiLCJvSW1nIiwiUmVjdCIsImxlZnQiLCJ0b3AiLCJmaWxsIiwib3ZlcmxheUNvbG9yIiwib3BhY2l0eSIsIm92ZXJsYXlPcGFjaXR5IiwiYWRkIiwib0ltZzEiLCJpbWFnZVdpZHRoIiwiaW1hZ2VIZWlnaHQiLCJjb3JuZXJTaXplIiwiaGFzQ29udHJvbHMiLCJib3JkZXJDb2xvciIsImNvcm5lckNvbG9yIiwiY29ybmVyU3R5bGUiLCJ0cmFuc3BhcmVudENvcm5lcnMiLCJoYXNSb3RhdGluZ1BvaW50IiwibG9ja1VuaVNjYWxpbmciLCJub1NjYWxlQ2FjaGUiLCJzdHJva2VVbmlmb3JtIiwiY2xpcFRvIiwiY29udGV4dCIsInRyYW5zbGF0ZSIsIngiLCJtb3ZlVG8iLCJsaW5lVG8iLCJ5Iiwic3Ryb2tlU3R5bGUiLCJzdHJva2UiLCJzZXQiLCJjbGlwUGF0aCIsIl9vYmplY3RzIiwibGVuZ3RoIiwiYnJpbmdUb0Zyb250Iiwic2V0QWN0aXZlT2JqZWN0IiwicHJvdG90eXBlIiwib24iLCJvIiwib25Nb3VzZURvd24iLCJlIiwidGFyZ2V0IiwiZXZlbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7OztlQUVnQixZQUFZO0FBRXhCLE1BQUlBLFFBQVEsR0FBRyxLQUFmO0FBQ0EsTUFBSUMsTUFBSjtBQUNBLE1BQUlDLEdBQUo7QUFDQSxNQUFJQyxJQUFKO0FBQ0EsTUFBSUMsUUFBSixFQUFhQyxJQUFiLEVBQWtCQyxPQUFsQjtBQUNBLE1BQUlDLE9BQU8sR0FBRyxFQUFkO0FBQ0EsTUFBSUMsVUFBSjs7QUFDQSxXQUFTQyxTQUFULENBQW1CQyxNQUFuQixFQUFpRjtBQUFBLFFBQXZEQyxTQUF1RCx1RUFBM0MsS0FBMkM7QUFBQSxRQUFyQ0MsS0FBcUMsdUVBQTdCLEtBQTZCO0FBQUEsUUFBdkJDLE1BQXVCLHVFQUFkLEtBQWM7QUFBQSxRQUFSQyxNQUFRO0FBRTdFLFNBQUtKLE1BQUwsR0FBY0EsTUFBZDs7QUFDQSxRQUFHRyxNQUFILEVBQVU7QUFDTixXQUFLSCxNQUFMLENBQVlLLE1BQVosQ0FBbUJYLFFBQW5CO0FBQ0EsV0FBS00sTUFBTCxDQUFZSyxNQUFaLENBQW1CVixJQUFuQjtBQUNBLFdBQUtLLE1BQUwsQ0FBWUssTUFBWixDQUFtQlQsT0FBbkI7QUFDSDs7QUFDRCxRQUFHLENBQUNLLFNBQUosRUFBYztBQUNWUixNQUFBQSxJQUFJLEdBQUcsS0FBUDtBQUNBLGFBQU9NLFNBQVA7QUFDSDs7QUFDRE4sSUFBQUEsSUFBSSxHQUFHUSxTQUFQO0FBQ0FYLElBQUFBLFFBQVEsR0FBRyxLQUFYO0FBQ0FRLElBQUFBLFVBQVUsR0FBR00sTUFBYjtBQUNBSixJQUFBQSxNQUFNLENBQUNNLGVBQVAsR0FBeUIsTUFBekI7QUFDQWQsSUFBQUEsR0FBRyxHQUFHUSxNQUFNLENBQUNPLFNBQVAsQ0FBaUIsWUFBakIsQ0FBTjs7QUFDQUMsbUJBQU9DLElBQVAsQ0FBWUMsU0FBWixDQUFzQmxCLEdBQXRCLEVBQTJC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QUl2QyxRQUFRLElBQUksQ0FBQ0csSUFBakIsRUFBdUI7QUFDbkIsZUFBT00sU0FBUDtBQUNIOztBQUNEOEIsTUFBQUEsSUFBSSxDQUFDN0IsTUFBTCxDQUFZbUUsZUFBWixDQUE0QnZFLE9BQTVCO0FBQ0gsS0FORDtBQU9ILEdBMUNEOztBQTRDQSxTQUFPRyxTQUFQO0FBQ0gsQ0F0S2UsRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZmFicmljfSBmcm9tIFwiZmFicmljXCI7XHJcbmltcG9ydCBDYW52YXNIaXN0b3J5IGZyb20gXCIuL2NhbnZhc0hpc3RvcnlcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7XHJcbiAgICBcclxuICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgbGV0IG9iamVjdDtcclxuICAgIGxldCBzcmM7XHJcbiAgICBsZXQgZHJhZztcclxuICAgIGxldCBjbGlwUmVjdCxyZWN0LHJlY3RSZWQ7XHJcbiAgICBsZXQgb3ZlcmxheSA9IHt9O1xyXG4gICAgbGV0IHByb3BlcnRpZXNcclxuICAgIGZ1bmN0aW9uIENyb3BJbWFnZShjYW52YXMsZHJhZ2dhYmxlID0gZmFsc2UsYXBwbHkgPSBmYWxzZSxjYW5jZWwgPSBmYWxzZSxwYXJhbXMpIHtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcclxuICAgICAgICBpZihjYW5jZWwpe1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoY2xpcFJlY3QpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUocmVjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZShyZWN0UmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIWRyYWdnYWJsZSl7XHJcbiAgICAgICAgICAgIGRyYWcgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIENyb3BJbWFnZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJhZyA9IGRyYWdnYWJsZTtcclxuICAgICAgICBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHByb3BlcnRpZXMgPSBwYXJhbXM7XHJcbiAgICAgICAgY2FudmFzLmJhY2tncm91bmRDb2xvciA9IFwiI2ZmZlwiO1xyXG4gICAgICAgIHNyYyA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnKTsgIFxyXG4gICAgICAgIGZhYnJpYy51dGlsLmxvYWRJbWFnZShzcmMsIGZ1bmN0aW9uIChpbWcpIHtcclxuICAgICAgICAgICAgb2JqZWN0ID0gbmV3IGZhYnJpYy5JbWFnZShpbWcpOyAgICBcclxuICAgICAgICAgICAgb2JqZWN0LnNlbGVjdGFibGUgPSBmYWxzZTsgICBcclxuICAgICAgICB9KSBcclxuICAgICAgXHJcbiAgICAgICAgaWYoZHJhZyAmJiBhcHBseSl7ICAgXHJcbiAgICAgICAgICAgIGNhbnZhcy5jbGVhcigpO1xyXG4gICAgICAgICAgICBsZXQgb3ZlcmxheUNyb3BwZWQgPSBvdmVybGF5LnRvRGF0YVVSTCgpOyAgICAgXHJcbiAgICAgICAgICAgIGZhYnJpYy51dGlsLmxvYWRJbWFnZShvdmVybGF5Q3JvcHBlZCwgZnVuY3Rpb24gKGltZykge1xyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGNsaXBwZWRJbWFnZSA9IG5ldyBmYWJyaWMuSW1hZ2UoaW1nKTsgICAgXHJcbiAgICAgICAgICAgICAgICBjbGlwcGVkSW1hZ2Uuc2VsZWN0YWJsZSA9IGZhbHNlOyAgIFxyXG4gICAgICAgICAgICAgICAgY2FudmFzLnNldEJhY2tncm91bmRJbWFnZShjbGlwcGVkSW1hZ2UsIGNhbnZhcy5yZW5kZXJBbGwuYmluZChjYW52YXMpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVYOiBjYW52YXMud2lkdGggLyBjbGlwcGVkSW1hZ2Uud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVZOiBjYW52YXMuaGVpZ2h0IC8gY2xpcHBlZEltYWdlLmhlaWdodFxyXG4gICAgICAgICAgICAgICAgfSk7ICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgfSkgXHJcblxyXG4gICAgICAgICAgICBkcmFnID0gZmFsc2U7IFxyXG4gICAgICAgICAgICBhcHBseT0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBjcm9wcGVkSW1hZ2UgPSB7IGpzb246IGNhbnZhcy50b0pTT04oKSwgY3JvcHBlZEltYWdlOiBvdmVybGF5Q3JvcHBlZH07XHJcbiAgICAgICAgICAgIG5ldyBDYW52YXNIaXN0b3J5KHRoaXMuY2FudmFzLGNyb3BwZWRJbWFnZSlcclxuICAgICAgICAgICAgcmV0dXJuIENyb3BJbWFnZTtcclxuICAgICAgICB9XHJcbiBcclxuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTsgIFxyXG4gICAgICAgIHRoaXMuY2FudmFzLnNlbGVjdGFibGUgPSBmYWxzZTsgICAgXHJcbiAgICAgXHJcbiAgICAgICAgdGhpcy5jYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgICAgbGV0IGluc3QgPSB0aGlzO1xyXG4gICAgICAgIG5ldyBmYWJyaWMuSW1hZ2UuZnJvbVVSTChzcmMsIGZ1bmN0aW9uKG9JbWcpIHtcclxuICAgICAgICAgICAgIHJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiBvSW1nLndpZHRoLFxyXG4gICAgICAgICAgICAgIGhlaWdodDogb0ltZy5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgZmlsbDogcHJvcGVydGllcy5vdmVybGF5Q29sb3IsXHJcbiAgICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgb3BhY2l0eTpwcm9wZXJ0aWVzLm92ZXJsYXlPcGFjaXR5XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpbnN0LmNhbnZhcy5hZGQocmVjdCk7XHJcbiAgICAgICAgICAgIGZhYnJpYy5JbWFnZS5mcm9tVVJMKHNyYywgZnVuY3Rpb24ob0ltZzEpIHtcclxuICAgICAgICAgICAgICAgcmVjdFJlZCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICAgICAgICBsZWZ0OiAgKG9JbWcxLndpZHRoIC0gcHJvcGVydGllcy53aWR0aCkvIDIsXHJcbiAgICAgICAgICAgICAgICB0b3A6ICAob0ltZzEuaGVpZ2h0IC0gcHJvcGVydGllcy5oZWlnaHQpLyAyLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHByb3BlcnRpZXMud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHByb3BlcnRpZXMuaGVpZ2h0LCAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBmaWxsOiAnJyxcclxuICAgICAgICAgICAgICAgIGltYWdlV2lkdGg6IG9JbWcxLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaW1hZ2VIZWlnaHQ6IG9JbWcxLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGNvcm5lclNpemU6cHJvcGVydGllcy5jb3JuZXJTaXplLCBcclxuICAgICAgICAgICAgICAgIGhhc0NvbnRyb2xzOiBwcm9wZXJ0aWVzLmhhc0NvbnRyb2xzLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHByb3BlcnRpZXMuYm9yZGVyQ29sb3IsXHJcbiAgICAgICAgICAgICAgICBjb3JuZXJDb2xvcjogcHJvcGVydGllcy5jb3JuZXJDb2xvcixcclxuICAgICAgICAgICAgICAgIGNvcm5lclN0eWxlOiBwcm9wZXJ0aWVzLmNvcm5lclN0eWxlLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRDb3JuZXJzOiBwcm9wZXJ0aWVzLnRyYW5zcGFyZW50Q29ybmVycyxcclxuICAgICAgICAgICAgICAgIGhhc1JvdGF0aW5nUG9pbnQ6IHByb3BlcnRpZXMuaGFzUm90YXRpbmdQb2ludCxcclxuICAgICAgICAgICAgICAgIGxvY2tVbmlTY2FsaW5nOnRydWUsXHJcbiAgICAgICAgICAgICAgICBub1NjYWxlQ2FjaGU6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzdHJva2VVbmlmb3JtOnRydWUsXHJcbiAgICAgICAgICAgICAgICBjbGlwVG86IGZ1bmN0aW9uKGNvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgY29udGV4dC50cmFuc2xhdGUoLSB0aGlzLndpZHRoLzIsIC0gdGhpcy5oZWlnaHQvMik7XHJcbiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8PSB0aGlzLndpZHRoOyB4ICs9IHRoaXMud2lkdGgvMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tb3ZlVG8oeCAsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lVG8oeCwgdGhpcy5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8PSB0aGlzLmhlaWdodDsgeSArPSB0aGlzLmhlaWdodC8zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm1vdmVUbygwLCB5KTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZVRvKHRoaXMud2lkdGgsIHkpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYmEoMCwwLDAsMC40KVwiO1xyXG4gICAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpOyAgIFxyXG4gICAgICAgICAgICAgIH0gICAgXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgY2xpcFJlY3QgPSBuZXcgZmFicmljLlJlY3Qoe1xyXG4gICAgICAgICAgICAgICAgbGVmdDogLShwcm9wZXJ0aWVzLndpZHRoIC8yKSxcclxuICAgICAgICAgICAgICAgIHRvcDogLShwcm9wZXJ0aWVzLmhlaWdodC8yKSxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wZXJ0aWVzLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBwcm9wZXJ0aWVzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGZpbGw6ICcnLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTpmYWxzZSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBvSW1nMS5zZXQoe2NsaXBQYXRoOmNsaXBSZWN0LCBzZWxlY3RhYmxlOiBmYWxzZX0pXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIGluc3QuY2FudmFzLmFkZChvSW1nMSk7XHJcbiAgICAgICAgICAgICAgb3ZlcmxheSA9IGluc3QuY2FudmFzLl9vYmplY3RzW2luc3QuY2FudmFzLl9vYmplY3RzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgIGluc3QuY2FudmFzLmFkZChyZWN0UmVkKTtcclxuICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5icmluZ1RvRnJvbnQocmVjdFJlZClcclxuICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5zZXRBY3RpdmVPYmplY3QocmVjdFJlZClcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTsgIFxyXG4gICAgfTtcclxuICAgIENyb3BJbWFnZS5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgaW5zdCA9IHRoaXM7XHJcbiAgICAgICAgaW5zdC5jYW52YXMub24oXCJtb3VzZTpkb3duXCIsIGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgICAgIGluc3Qub25Nb3VzZURvd24obyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaW5zdC5jYW52YXMub24oXCJvYmplY3Q6c2NhbGluZ1wiLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICBjbGlwUmVjdCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICAgICAgbGVmdDogdGFyZ2V0LmxlZnQgLSAob3ZlcmxheS53aWR0aCAvIDIpLFxyXG4gICAgICAgICAgICAgIHRvcDogdGFyZ2V0LnRvcCAtIChvdmVybGF5LmhlaWdodCAvIDIpLFxyXG4gICAgICAgICAgICAgIHdpZHRoOiB0YXJnZXQud2lkdGgsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0OiB0YXJnZXQuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgIGZpbGw6ICcnLFxyXG4gICAgICAgICAgICAgIHNjYWxlWDogdGFyZ2V0LnNjYWxlWCxcclxuICAgICAgICAgICAgICBzY2FsZVk6IHRhcmdldC5zY2FsZVksICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTsgICAgICAgICAgIFxyXG4gICAgICAgICAgb3ZlcmxheS5zZXQoXCJjbGlwUGF0aFwiLGNsaXBSZWN0KVxyXG4gICAgICAgICAgaW5zdC5jYW52YXMucmVuZGVyQWxsKCkgICAgICAgXHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGluc3QuY2FudmFzLm9uKCdvYmplY3Q6bW92aW5nJywgZnVuY3Rpb24gKGUpIHsgICAgICBcclxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xyXG4gICAgICAgICAgICBjbGlwUmVjdCA9IG5ldyBmYWJyaWMuUmVjdCh7XHJcbiAgICAgICAgICAgICAgICBsZWZ0OiB0YXJnZXQubGVmdCAtIChvdmVybGF5LndpZHRoIC8gMiksXHJcbiAgICAgICAgICAgICAgICB0b3A6IHRhcmdldC50b3AgLSAob3ZlcmxheS5oZWlnaHQgLyAyKSxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB0YXJnZXQud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRhcmdldC5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiAnJyxcclxuICAgICAgICAgICAgICAgIHNjYWxlWDogdGFyZ2V0LnNjYWxlWCxcclxuICAgICAgICAgICAgICAgIHNjYWxlWTogdGFyZ2V0LnNjYWxlWSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgb3ZlcmxheS5zZXQoXCJjbGlwUGF0aFwiLGNsaXBSZWN0KVxyXG4gICAgICAgICAgICBpbnN0LmNhbnZhcy5yZW5kZXJBbGwoKVxyXG4gICAgICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIENyb3BJbWFnZS5wcm90b3R5cGUub25Nb3VzZURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgbGV0IGluc3QgID0gdGhpcztcclxuICAgICAgICAgICAgaWYgKGRpc2FibGVkIHx8ICFkcmFnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQ3JvcEltYWdlXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGluc3QuY2FudmFzLnNldEFjdGl2ZU9iamVjdChyZWN0UmVkKTtcclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIENyb3BJbWFnZTtcclxufSgpKTsiXX0=