js-angusj-clipper
Version:
Polygon and line clipping and offsetting library for Javascript / Typescript - a port of Angus Johnson's clipper to WebAssembly / Asm.JS
146 lines • 16 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PolyNode = void 0;
var PathToNativePath_1 = require("./native/PathToNativePath");
/**
* PolyNodes are encapsulated within a PolyTree container, and together provide a data structure representing the parent-child relationships of polygon
* contours returned by clipping/ofsetting methods.
*
* A PolyNode object represents a single polygon. It's isHole property indicates whether it's an outer or a hole. PolyNodes may own any number of PolyNode
* children (childs), where children of outer polygons are holes, and children of holes are (nested) outer polygons.
*/
var PolyNode = /** @class */ (function () {
function PolyNode() {
this._childs = [];
this._contour = [];
this._isOpen = false;
this._index = 0;
}
Object.defineProperty(PolyNode.prototype, "parent", {
/**
* Returns the parent PolyNode.
*
* The PolyTree object (which is also a PolyNode) does not have a parent and will return undefined.
*/
get: function () {
return this._parent;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PolyNode.prototype, "childs", {
/**
* A read-only list of PolyNode.
* Outer PolyNode childs contain hole PolyNodes, and hole PolyNode childs contain nested outer PolyNodes.
*/
get: function () {
return this._childs;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PolyNode.prototype, "contour", {
/**
* Returns a path list which contains any number of vertices.
*/
get: function () {
return this._contour;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PolyNode.prototype, "isOpen", {
/**
* Returns true when the PolyNode's Contour results from a clipping operation on an open contour (path). Only top-level PolyNodes can contain open contours.
*/
get: function () {
return this._isOpen;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PolyNode.prototype, "index", {
/**
* Index in the parent's child list, or 0 if no parent.
*/
get: function () {
return this._index;
},
enumerable: false,
configurable: true
});
Object.defineProperty(PolyNode.prototype, "isHole", {
/**
* Returns true when the PolyNode's polygon (Contour) is a hole.
*
* Children of outer polygons are always holes, and children of holes are always (nested) outer polygons.
* The isHole property of a PolyTree object is undefined but its children are always top-level outer polygons.
*
* @return {boolean}
*/
get: function () {
if (this._isHole === undefined) {
var result = true;
var node = this._parent;
while (node !== undefined) {
result = !result;
node = node._parent;
}
this._isHole = result;
}
return this._isHole;
},
enumerable: false,
configurable: true
});
/**
* The returned PolyNode will be the first child if any, otherwise the next sibling, otherwise the next sibling of the Parent etc.
*
* A PolyTree can be traversed very easily by calling GetFirst() followed by GetNext() in a loop until the returned object is undefined.
*
* @return {PolyNode | undefined}
*/
PolyNode.prototype.getNext = function () {
if (this._childs.length > 0) {
return this._childs[0];
}
else {
return this.getNextSiblingUp();
}
};
PolyNode.prototype.getNextSiblingUp = function () {
if (this._parent === undefined) {
return undefined;
}
else if (this._index === this._parent._childs.length - 1) {
//noinspection TailRecursionJS
return this._parent.getNextSiblingUp();
}
else {
return this._parent._childs[this._index + 1];
}
};
PolyNode.fillFromNativePolyNode = function (pn, nativeLib, nativePolyNode, parent, childIndex, freeNativePolyNode) {
pn._parent = parent;
var childs = nativePolyNode.childs;
for (var i = 0, max = childs.size(); i < max; i++) {
var newChild = PolyNode.fromNativePolyNode(nativeLib, childs.get(i), pn, i, freeNativePolyNode);
pn._childs.push(newChild);
}
// do we need to clear the object ourselves? for now let's assume so (seems to work)
pn._contour = PathToNativePath_1.nativePathToPath(nativeLib, nativePolyNode.contour, true);
pn._isOpen = nativePolyNode.isOpen();
pn._index = childIndex;
if (freeNativePolyNode) {
nativePolyNode.delete();
}
};
PolyNode.fromNativePolyNode = function (nativeLib, nativePolyNode, parent, childIndex, freeNativePolyNode) {
var pn = new PolyNode();
PolyNode.fillFromNativePolyNode(pn, nativeLib, nativePolyNode, parent, childIndex, freeNativePolyNode);
return pn;
};
return PolyNode;
}());
exports.PolyNode = PolyNode;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9seU5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUG9seU5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsOERBQTZEO0FBRzdEOzs7Ozs7R0FNRztBQUNIO0lBOEZFO1FBbEZVLFlBQU8sR0FBZSxFQUFFLENBQUM7UUFTekIsYUFBUSxHQUFpQixFQUFFLENBQUM7UUFRNUIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQVF6QixXQUFNLEdBQVcsQ0FBQyxDQUFDO0lBeURKLENBQUM7SUF0RjFCLHNCQUFJLDRCQUFNO1FBTFY7Ozs7V0FJRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7OztPQUFBO0lBT0Qsc0JBQUksNEJBQU07UUFKVjs7O1dBR0c7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQU1ELHNCQUFJLDZCQUFPO1FBSFg7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDOzs7T0FBQTtJQU1ELHNCQUFJLDRCQUFNO1FBSFY7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQU1ELHNCQUFJLDJCQUFLO1FBSFQ7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDOzs7T0FBQTtJQVdELHNCQUFJLDRCQUFNO1FBUlY7Ozs7Ozs7V0FPRzthQUNIO1lBQ0UsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtnQkFDOUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixJQUFJLElBQUksR0FBeUIsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDOUMsT0FBTyxJQUFJLEtBQUssU0FBUyxFQUFFO29CQUN6QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7b0JBQ2pCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2lCQUNyQjtnQkFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzthQUN2QjtZQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQUVEOzs7Ozs7T0FNRztJQUNILDBCQUFPLEdBQVA7UUFDRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRVMsbUNBQWdCLEdBQTFCO1FBQ0UsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUM5QixPQUFPLFNBQVMsQ0FBQztTQUNsQjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFELDhCQUE4QjtZQUM5QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN4QzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzlDO0lBQ0gsQ0FBQztJQUlnQiwrQkFBc0IsR0FBdkMsVUFDRSxFQUFZLEVBQ1osU0FBbUMsRUFDbkMsY0FBOEIsRUFDOUIsTUFBNEIsRUFDNUIsVUFBa0IsRUFDbEIsa0JBQTJCO1FBRTNCLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXBCLElBQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pELElBQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FDMUMsU0FBUyxFQUNULE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQ2IsRUFBRSxFQUNGLENBQUMsRUFDRCxrQkFBa0IsQ0FDbkIsQ0FBQztZQUNGLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNCO1FBRUQsb0ZBQW9GO1FBQ3BGLEVBQUUsQ0FBQyxRQUFRLEdBQUcsbUNBQWdCLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEUsRUFBRSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsRUFBRSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFFdkIsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRWdCLDJCQUFrQixHQUFuQyxVQUNFLFNBQW1DLEVBQ25DLGNBQThCLEVBQzlCLE1BQTRCLEVBQzVCLFVBQWtCLEVBQ2xCLGtCQUEyQjtRQUUzQixJQUFNLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxzQkFBc0IsQ0FDN0IsRUFBRSxFQUNGLFNBQVMsRUFDVCxjQUFjLEVBQ2QsTUFBTSxFQUNOLFVBQVUsRUFDVixrQkFBa0IsQ0FDbkIsQ0FBQztRQUNGLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNILGVBQUM7QUFBRCxDQUFDLEFBbEpELElBa0pDO0FBbEpZLDRCQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmF0aXZlQ2xpcHBlckxpYkluc3RhbmNlIH0gZnJvbSBcIi4vbmF0aXZlL05hdGl2ZUNsaXBwZXJMaWJJbnN0YW5jZVwiO1xyXG5pbXBvcnQgeyBOYXRpdmVQb2x5Tm9kZSB9IGZyb20gXCIuL25hdGl2ZS9OYXRpdmVQb2x5Tm9kZVwiO1xyXG5pbXBvcnQgeyBuYXRpdmVQYXRoVG9QYXRoIH0gZnJvbSBcIi4vbmF0aXZlL1BhdGhUb05hdGl2ZVBhdGhcIjtcclxuaW1wb3J0IHsgUmVhZG9ubHlQYXRoIH0gZnJvbSBcIi4vUGF0aFwiO1xyXG5cclxuLyoqXHJcbiAqIFBvbHlOb2RlcyBhcmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhIFBvbHlUcmVlIGNvbnRhaW5lciwgYW5kIHRvZ2V0aGVyIHByb3ZpZGUgYSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIG9mIHBvbHlnb25cclxuICogY29udG91cnMgcmV0dXJuZWQgYnkgY2xpcHBpbmcvb2ZzZXR0aW5nIG1ldGhvZHMuXHJcbiAqXHJcbiAqIEEgUG9seU5vZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgcG9seWdvbi4gSXQncyBpc0hvbGUgcHJvcGVydHkgaW5kaWNhdGVzIHdoZXRoZXIgaXQncyBhbiBvdXRlciBvciBhIGhvbGUuIFBvbHlOb2RlcyBtYXkgb3duIGFueSBudW1iZXIgb2YgUG9seU5vZGVcclxuICogY2hpbGRyZW4gKGNoaWxkcyksIHdoZXJlIGNoaWxkcmVuIG9mIG91dGVyIHBvbHlnb25zIGFyZSBob2xlcywgYW5kIGNoaWxkcmVuIG9mIGhvbGVzIGFyZSAobmVzdGVkKSBvdXRlciBwb2x5Z29ucy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQb2x5Tm9kZSB7XHJcbiAgcHJvdGVjdGVkIF9wYXJlbnQ/OiBQb2x5Tm9kZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgcGFyZW50IFBvbHlOb2RlLlxyXG4gICAqXHJcbiAgICogVGhlIFBvbHlUcmVlIG9iamVjdCAod2hpY2ggaXMgYWxzbyBhIFBvbHlOb2RlKSBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IGFuZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXHJcbiAgICovXHJcbiAgZ2V0IHBhcmVudCgpOiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jaGlsZHM6IFBvbHlOb2RlW10gPSBbXTtcclxuICAvKipcclxuICAgKiBBIHJlYWQtb25seSBsaXN0IG9mIFBvbHlOb2RlLlxyXG4gICAqIE91dGVyIFBvbHlOb2RlIGNoaWxkcyBjb250YWluIGhvbGUgUG9seU5vZGVzLCBhbmQgaG9sZSBQb2x5Tm9kZSBjaGlsZHMgY29udGFpbiBuZXN0ZWQgb3V0ZXIgUG9seU5vZGVzLlxyXG4gICAqL1xyXG4gIGdldCBjaGlsZHMoKTogUG9seU5vZGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jb250b3VyOiBSZWFkb25seVBhdGggPSBbXTtcclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgcGF0aCBsaXN0IHdoaWNoIGNvbnRhaW5zIGFueSBudW1iZXIgb2YgdmVydGljZXMuXHJcbiAgICovXHJcbiAgZ2V0IGNvbnRvdXIoKTogUmVhZG9ubHlQYXRoIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250b3VyO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9pc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgUG9seU5vZGUncyBDb250b3VyIHJlc3VsdHMgZnJvbSBhIGNsaXBwaW5nIG9wZXJhdGlvbiBvbiBhbiBvcGVuIGNvbnRvdXIgKHBhdGgpLiBPbmx5IHRvcC1sZXZlbCBQb2x5Tm9kZXMgY2FuIGNvbnRhaW4gb3BlbiBjb250b3Vycy5cclxuICAgKi9cclxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgLyoqXHJcbiAgICogSW5kZXggaW4gdGhlIHBhcmVudCdzIGNoaWxkIGxpc3QsIG9yIDAgaWYgbm8gcGFyZW50LlxyXG4gICAqL1xyXG4gIGdldCBpbmRleCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9pc0hvbGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBQb2x5Tm9kZSdzIHBvbHlnb24gKENvbnRvdXIpIGlzIGEgaG9sZS5cclxuICAgKlxyXG4gICAqIENoaWxkcmVuIG9mIG91dGVyIHBvbHlnb25zIGFyZSBhbHdheXMgaG9sZXMsIGFuZCBjaGlsZHJlbiBvZiBob2xlcyBhcmUgYWx3YXlzIChuZXN0ZWQpIG91dGVyIHBvbHlnb25zLlxyXG4gICAqIFRoZSBpc0hvbGUgcHJvcGVydHkgb2YgYSBQb2x5VHJlZSBvYmplY3QgaXMgdW5kZWZpbmVkIGJ1dCBpdHMgY2hpbGRyZW4gYXJlIGFsd2F5cyB0b3AtbGV2ZWwgb3V0ZXIgcG9seWdvbnMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xyXG4gIGdldCBpc0hvbGUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5faXNIb2xlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHRydWU7XHJcbiAgICAgIGxldCBub2RlOiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCA9IHRoaXMuX3BhcmVudDtcclxuICAgICAgd2hpbGUgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJlc3VsdCA9ICFyZXN1bHQ7XHJcbiAgICAgICAgbm9kZSA9IG5vZGUuX3BhcmVudDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pc0hvbGUgPSByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2lzSG9sZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSByZXR1cm5lZCBQb2x5Tm9kZSB3aWxsIGJlIHRoZSBmaXJzdCBjaGlsZCBpZiBhbnksIG90aGVyd2lzZSB0aGUgbmV4dCBzaWJsaW5nLCBvdGhlcndpc2UgdGhlIG5leHQgc2libGluZyBvZiB0aGUgUGFyZW50IGV0Yy5cclxuICAgKlxyXG4gICAqIEEgUG9seVRyZWUgY2FuIGJlIHRyYXZlcnNlZCB2ZXJ5IGVhc2lseSBieSBjYWxsaW5nIEdldEZpcnN0KCkgZm9sbG93ZWQgYnkgR2V0TmV4dCgpIGluIGEgbG9vcCB1bnRpbCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIHVuZGVmaW5lZC5cclxuICAgKlxyXG4gICAqIEByZXR1cm4ge1BvbHlOb2RlIHwgdW5kZWZpbmVkfVxyXG4gICAqL1xyXG4gIGdldE5leHQoKTogUG9seU5vZGUgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuX2NoaWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jaGlsZHNbMF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXROZXh0U2libGluZ1VwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TmV4dFNpYmxpbmdVcCgpOiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5faW5kZXggPT09IHRoaXMuX3BhcmVudC5fY2hpbGRzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgLy9ub2luc3BlY3Rpb24gVGFpbFJlY3Vyc2lvbkpTXHJcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuZ2V0TmV4dFNpYmxpbmdVcCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudC5fY2hpbGRzW3RoaXMuX2luZGV4ICsgMV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICBwcm90ZWN0ZWQgc3RhdGljIGZpbGxGcm9tTmF0aXZlUG9seU5vZGUoXHJcbiAgICBwbjogUG9seU5vZGUsXHJcbiAgICBuYXRpdmVMaWI6IE5hdGl2ZUNsaXBwZXJMaWJJbnN0YW5jZSxcclxuICAgIG5hdGl2ZVBvbHlOb2RlOiBOYXRpdmVQb2x5Tm9kZSxcclxuICAgIHBhcmVudDogUG9seU5vZGUgfCB1bmRlZmluZWQsXHJcbiAgICBjaGlsZEluZGV4OiBudW1iZXIsXHJcbiAgICBmcmVlTmF0aXZlUG9seU5vZGU6IGJvb2xlYW5cclxuICApOiB2b2lkIHtcclxuICAgIHBuLl9wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG4gICAgY29uc3QgY2hpbGRzID0gbmF0aXZlUG9seU5vZGUuY2hpbGRzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGNoaWxkcy5zaXplKCk7IGkgPCBtYXg7IGkrKykge1xyXG4gICAgICBjb25zdCBuZXdDaGlsZCA9IFBvbHlOb2RlLmZyb21OYXRpdmVQb2x5Tm9kZShcclxuICAgICAgICBuYXRpdmVMaWIsXHJcbiAgICAgICAgY2hpbGRzLmdldChpKSxcclxuICAgICAgICBwbixcclxuICAgICAgICBpLFxyXG4gICAgICAgIGZyZWVOYXRpdmVQb2x5Tm9kZVxyXG4gICAgICApO1xyXG4gICAgICBwbi5fY2hpbGRzLnB1c2gobmV3Q2hpbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRvIHdlIG5lZWQgdG8gY2xlYXIgdGhlIG9iamVjdCBvdXJzZWx2ZXM/IGZvciBub3cgbGV0J3MgYXNzdW1lIHNvIChzZWVtcyB0byB3b3JrKVxyXG4gICAgcG4uX2NvbnRvdXIgPSBuYXRpdmVQYXRoVG9QYXRoKG5hdGl2ZUxpYiwgbmF0aXZlUG9seU5vZGUuY29udG91ciwgdHJ1ZSk7XHJcbiAgICBwbi5faXNPcGVuID0gbmF0aXZlUG9seU5vZGUuaXNPcGVuKCk7XHJcbiAgICBwbi5faW5kZXggPSBjaGlsZEluZGV4O1xyXG5cclxuICAgIGlmIChmcmVlTmF0aXZlUG9seU5vZGUpIHtcclxuICAgICAgbmF0aXZlUG9seU5vZGUuZGVsZXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3RhdGljIGZyb21OYXRpdmVQb2x5Tm9kZShcclxuICAgIG5hdGl2ZUxpYjogTmF0aXZlQ2xpcHBlckxpYkluc3RhbmNlLFxyXG4gICAgbmF0aXZlUG9seU5vZGU6IE5hdGl2ZVBvbHlOb2RlLFxyXG4gICAgcGFyZW50OiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCxcclxuICAgIGNoaWxkSW5kZXg6IG51bWJlcixcclxuICAgIGZyZWVOYXRpdmVQb2x5Tm9kZTogYm9vbGVhblxyXG4gICk6IFBvbHlOb2RlIHtcclxuICAgIGNvbnN0IHBuID0gbmV3IFBvbHlOb2RlKCk7XHJcbiAgICBQb2x5Tm9kZS5maWxsRnJvbU5hdGl2ZVBvbHlOb2RlKFxyXG4gICAgICBwbixcclxuICAgICAgbmF0aXZlTGliLFxyXG4gICAgICBuYXRpdmVQb2x5Tm9kZSxcclxuICAgICAgcGFyZW50LFxyXG4gICAgICBjaGlsZEluZGV4LFxyXG4gICAgICBmcmVlTmF0aXZlUG9seU5vZGVcclxuICAgICk7XHJcbiAgICByZXR1cm4gcG47XHJcbiAgfVxyXG59XHJcbiJdfQ==