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 • 15.4 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 = (0, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9seU5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUG9seU5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsOERBQTZEO0FBRzdEOzs7Ozs7R0FNRztBQUNIO0lBQUE7UUFZWSxZQUFPLEdBQWUsRUFBRSxDQUFDO1FBU3pCLGFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBUTVCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFRaEIsV0FBTSxHQUFHLENBQUMsQ0FBQztJQTJHdkIsQ0FBQztJQXhJQyxzQkFBSSw0QkFBTTtRQUxWOzs7O1dBSUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQU9ELHNCQUFJLDRCQUFNO1FBSlY7OztXQUdHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQzs7O09BQUE7SUFNRCxzQkFBSSw2QkFBTztRQUhYOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQzs7O09BQUE7SUFNRCxzQkFBSSw0QkFBTTtRQUhWOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQzs7O09BQUE7SUFNRCxzQkFBSSwyQkFBSztRQUhUOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsQ0FBQzs7O09BQUE7SUFXRCxzQkFBSSw0QkFBTTtRQVJWOzs7Ozs7O1dBT0c7YUFDSDtZQUNFLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQzlCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbEIsSUFBSSxJQUFJLEdBQXlCLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzlDLE9BQU8sSUFBSSxLQUFLLFNBQVMsRUFBRTtvQkFDekIsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUNqQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztpQkFDckI7Z0JBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7YUFDdkI7WUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQzs7O09BQUE7SUFFRDs7Ozs7O09BTUc7SUFDSCwwQkFBTyxHQUFQO1FBQ0UsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hCO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVTLG1DQUFnQixHQUExQjtRQUNFLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDOUIsT0FBTyxTQUFTLENBQUM7U0FDbEI7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRCw4QkFBOEI7WUFDOUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDeEM7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM5QztJQUNILENBQUM7SUFFZ0IsK0JBQXNCLEdBQXZDLFVBQ0UsRUFBWSxFQUNaLFNBQW1DLEVBQ25DLGNBQThCLEVBQzlCLE1BQTRCLEVBQzVCLFVBQWtCLEVBQ2xCLGtCQUEyQjtRQUUzQixFQUFFLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUVwQixJQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1FBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqRCxJQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQzFDLFNBQVMsRUFDVCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNiLEVBQUUsRUFDRixDQUFDLEVBQ0Qsa0JBQWtCLENBQ25CLENBQUM7WUFDRixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzQjtRQUVELG9GQUFvRjtRQUNwRixFQUFFLENBQUMsUUFBUSxHQUFHLElBQUEsbUNBQWdCLEVBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEUsRUFBRSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsRUFBRSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFFdkIsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRWdCLDJCQUFrQixHQUFuQyxVQUNFLFNBQW1DLEVBQ25DLGNBQThCLEVBQzlCLE1BQTRCLEVBQzVCLFVBQWtCLEVBQ2xCLGtCQUEyQjtRQUUzQixJQUFNLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxzQkFBc0IsQ0FDN0IsRUFBRSxFQUNGLFNBQVMsRUFDVCxjQUFjLEVBQ2QsTUFBTSxFQUNOLFVBQVUsRUFDVixrQkFBa0IsQ0FDbkIsQ0FBQztRQUNGLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNILGVBQUM7QUFBRCxDQUFDLEFBaEpELElBZ0pDO0FBaEpZLDRCQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmF0aXZlQ2xpcHBlckxpYkluc3RhbmNlIH0gZnJvbSBcIi4vbmF0aXZlL05hdGl2ZUNsaXBwZXJMaWJJbnN0YW5jZVwiO1xuaW1wb3J0IHsgTmF0aXZlUG9seU5vZGUgfSBmcm9tIFwiLi9uYXRpdmUvTmF0aXZlUG9seU5vZGVcIjtcbmltcG9ydCB7IG5hdGl2ZVBhdGhUb1BhdGggfSBmcm9tIFwiLi9uYXRpdmUvUGF0aFRvTmF0aXZlUGF0aFwiO1xuaW1wb3J0IHsgUmVhZG9ubHlQYXRoIH0gZnJvbSBcIi4vUGF0aFwiO1xuXG4vKipcbiAqIFBvbHlOb2RlcyBhcmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhIFBvbHlUcmVlIGNvbnRhaW5lciwgYW5kIHRvZ2V0aGVyIHByb3ZpZGUgYSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIG9mIHBvbHlnb25cbiAqIGNvbnRvdXJzIHJldHVybmVkIGJ5IGNsaXBwaW5nL29mc2V0dGluZyBtZXRob2RzLlxuICpcbiAqIEEgUG9seU5vZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgcG9seWdvbi4gSXQncyBpc0hvbGUgcHJvcGVydHkgaW5kaWNhdGVzIHdoZXRoZXIgaXQncyBhbiBvdXRlciBvciBhIGhvbGUuIFBvbHlOb2RlcyBtYXkgb3duIGFueSBudW1iZXIgb2YgUG9seU5vZGVcbiAqIGNoaWxkcmVuIChjaGlsZHMpLCB3aGVyZSBjaGlsZHJlbiBvZiBvdXRlciBwb2x5Z29ucyBhcmUgaG9sZXMsIGFuZCBjaGlsZHJlbiBvZiBob2xlcyBhcmUgKG5lc3RlZCkgb3V0ZXIgcG9seWdvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2x5Tm9kZSB7XG4gIHByb3RlY3RlZCBfcGFyZW50PzogUG9seU5vZGU7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBhcmVudCBQb2x5Tm9kZS5cbiAgICpcbiAgICogVGhlIFBvbHlUcmVlIG9iamVjdCAod2hpY2ggaXMgYWxzbyBhIFBvbHlOb2RlKSBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IGFuZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqL1xuICBnZXQgcGFyZW50KCk6IFBvbHlOb2RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jaGlsZHM6IFBvbHlOb2RlW10gPSBbXTtcbiAgLyoqXG4gICAqIEEgcmVhZC1vbmx5IGxpc3Qgb2YgUG9seU5vZGUuXG4gICAqIE91dGVyIFBvbHlOb2RlIGNoaWxkcyBjb250YWluIGhvbGUgUG9seU5vZGVzLCBhbmQgaG9sZSBQb2x5Tm9kZSBjaGlsZHMgY29udGFpbiBuZXN0ZWQgb3V0ZXIgUG9seU5vZGVzLlxuICAgKi9cbiAgZ2V0IGNoaWxkcygpOiBQb2x5Tm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRzO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jb250b3VyOiBSZWFkb25seVBhdGggPSBbXTtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYXRoIGxpc3Qgd2hpY2ggY29udGFpbnMgYW55IG51bWJlciBvZiB2ZXJ0aWNlcy5cbiAgICovXG4gIGdldCBjb250b3VyKCk6IFJlYWRvbmx5UGF0aCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRvdXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2lzT3BlbiA9IGZhbHNlO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIFBvbHlOb2RlJ3MgQ29udG91ciByZXN1bHRzIGZyb20gYSBjbGlwcGluZyBvcGVyYXRpb24gb24gYW4gb3BlbiBjb250b3VyIChwYXRoKS4gT25seSB0b3AtbGV2ZWwgUG9seU5vZGVzIGNhbiBjb250YWluIG9wZW4gY29udG91cnMuXG4gICAqL1xuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICBwcm90ZWN0ZWQgX2luZGV4ID0gMDtcbiAgLyoqXG4gICAqIEluZGV4IGluIHRoZSBwYXJlbnQncyBjaGlsZCBsaXN0LCBvciAwIGlmIG5vIHBhcmVudC5cbiAgICovXG4gIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfaXNIb2xlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBQb2x5Tm9kZSdzIHBvbHlnb24gKENvbnRvdXIpIGlzIGEgaG9sZS5cbiAgICpcbiAgICogQ2hpbGRyZW4gb2Ygb3V0ZXIgcG9seWdvbnMgYXJlIGFsd2F5cyBob2xlcywgYW5kIGNoaWxkcmVuIG9mIGhvbGVzIGFyZSBhbHdheXMgKG5lc3RlZCkgb3V0ZXIgcG9seWdvbnMuXG4gICAqIFRoZSBpc0hvbGUgcHJvcGVydHkgb2YgYSBQb2x5VHJlZSBvYmplY3QgaXMgdW5kZWZpbmVkIGJ1dCBpdHMgY2hpbGRyZW4gYXJlIGFsd2F5cyB0b3AtbGV2ZWwgb3V0ZXIgcG9seWdvbnMuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNIb2xlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9pc0hvbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgICBsZXQgbm9kZTogUG9seU5vZGUgfCB1bmRlZmluZWQgPSB0aGlzLl9wYXJlbnQ7XG4gICAgICB3aGlsZSAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCA9ICFyZXN1bHQ7XG4gICAgICAgIG5vZGUgPSBub2RlLl9wYXJlbnQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc0hvbGUgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2lzSG9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuZWQgUG9seU5vZGUgd2lsbCBiZSB0aGUgZmlyc3QgY2hpbGQgaWYgYW55LCBvdGhlcndpc2UgdGhlIG5leHQgc2libGluZywgb3RoZXJ3aXNlIHRoZSBuZXh0IHNpYmxpbmcgb2YgdGhlIFBhcmVudCBldGMuXG4gICAqXG4gICAqIEEgUG9seVRyZWUgY2FuIGJlIHRyYXZlcnNlZCB2ZXJ5IGVhc2lseSBieSBjYWxsaW5nIEdldEZpcnN0KCkgZm9sbG93ZWQgYnkgR2V0TmV4dCgpIGluIGEgbG9vcCB1bnRpbCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHJldHVybiB7UG9seU5vZGUgfCB1bmRlZmluZWR9XG4gICAqL1xuICBnZXROZXh0KCk6IFBvbHlOb2RlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fY2hpbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGlsZHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5leHRTaWJsaW5nVXAoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dFNpYmxpbmdVcCgpOiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX3BhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5faW5kZXggPT09IHRoaXMuX3BhcmVudC5fY2hpbGRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vbm9pbnNwZWN0aW9uIFRhaWxSZWN1cnNpb25KU1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudC5nZXROZXh0U2libGluZ1VwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuX2NoaWxkc1t0aGlzLl9pbmRleCArIDFdO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgZmlsbEZyb21OYXRpdmVQb2x5Tm9kZShcbiAgICBwbjogUG9seU5vZGUsXG4gICAgbmF0aXZlTGliOiBOYXRpdmVDbGlwcGVyTGliSW5zdGFuY2UsXG4gICAgbmF0aXZlUG9seU5vZGU6IE5hdGl2ZVBvbHlOb2RlLFxuICAgIHBhcmVudDogUG9seU5vZGUgfCB1bmRlZmluZWQsXG4gICAgY2hpbGRJbmRleDogbnVtYmVyLFxuICAgIGZyZWVOYXRpdmVQb2x5Tm9kZTogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBwbi5fcGFyZW50ID0gcGFyZW50O1xuXG4gICAgY29uc3QgY2hpbGRzID0gbmF0aXZlUG9seU5vZGUuY2hpbGRzO1xuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBjaGlsZHMuc2l6ZSgpOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgIGNvbnN0IG5ld0NoaWxkID0gUG9seU5vZGUuZnJvbU5hdGl2ZVBvbHlOb2RlKFxuICAgICAgICBuYXRpdmVMaWIsXG4gICAgICAgIGNoaWxkcy5nZXQoaSksXG4gICAgICAgIHBuLFxuICAgICAgICBpLFxuICAgICAgICBmcmVlTmF0aXZlUG9seU5vZGVcbiAgICAgICk7XG4gICAgICBwbi5fY2hpbGRzLnB1c2gobmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIC8vIGRvIHdlIG5lZWQgdG8gY2xlYXIgdGhlIG9iamVjdCBvdXJzZWx2ZXM/IGZvciBub3cgbGV0J3MgYXNzdW1lIHNvIChzZWVtcyB0byB3b3JrKVxuICAgIHBuLl9jb250b3VyID0gbmF0aXZlUGF0aFRvUGF0aChuYXRpdmVMaWIsIG5hdGl2ZVBvbHlOb2RlLmNvbnRvdXIsIHRydWUpO1xuICAgIHBuLl9pc09wZW4gPSBuYXRpdmVQb2x5Tm9kZS5pc09wZW4oKTtcbiAgICBwbi5faW5kZXggPSBjaGlsZEluZGV4O1xuXG4gICAgaWYgKGZyZWVOYXRpdmVQb2x5Tm9kZSkge1xuICAgICAgbmF0aXZlUG9seU5vZGUuZGVsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBmcm9tTmF0aXZlUG9seU5vZGUoXG4gICAgbmF0aXZlTGliOiBOYXRpdmVDbGlwcGVyTGliSW5zdGFuY2UsXG4gICAgbmF0aXZlUG9seU5vZGU6IE5hdGl2ZVBvbHlOb2RlLFxuICAgIHBhcmVudDogUG9seU5vZGUgfCB1bmRlZmluZWQsXG4gICAgY2hpbGRJbmRleDogbnVtYmVyLFxuICAgIGZyZWVOYXRpdmVQb2x5Tm9kZTogYm9vbGVhblxuICApOiBQb2x5Tm9kZSB7XG4gICAgY29uc3QgcG4gPSBuZXcgUG9seU5vZGUoKTtcbiAgICBQb2x5Tm9kZS5maWxsRnJvbU5hdGl2ZVBvbHlOb2RlKFxuICAgICAgcG4sXG4gICAgICBuYXRpdmVMaWIsXG4gICAgICBuYXRpdmVQb2x5Tm9kZSxcbiAgICAgIHBhcmVudCxcbiAgICAgIGNoaWxkSW5kZXgsXG4gICAgICBmcmVlTmF0aXZlUG9seU5vZGVcbiAgICApO1xuICAgIHJldHVybiBwbjtcbiAgfVxufVxuIl19