UNPKG

cytoscape-angular

Version:
182 lines 24.1 kB
class BaseLayoutOptionsImpl { ready(e) { // tslint:disable-next-line:no-console console.debug(`layout ready, cytoscape.LayoutEventObject: ${JSON.stringify(e)}`); // on layoutready } stop(e) { // tslint:disable-next-line:no-console console.debug(`layout stop, cytoscape.LayoutEventObject: ${JSON.stringify(e)}`); // on layoutstop } } export class NullLayoutOptionsImpl extends BaseLayoutOptionsImpl { constructor() { super(...arguments); this.name = 'null'; } } export class AnimateLayoutOptionsImpl extends BaseLayoutOptionsImpl { constructor() { super(...arguments); // the zoom level to set (prob want fit = false if set) this.zoom = null; // the pan level to set (prob want fit = false if set) this.pan = null; // whether to transition the node positions this.animate = false; // duration of animation in ms if enabled this.animationDuration = 500; // easing of animation if enabled this.animationEasing = undefined; // a function that determines whether the node should be animated. // All nodes animated by default on animate enabled. Non-animated nodes are // positioned immediately when the layout starts this.animateFilter = (node, i) => true; } } export class PresetLayoutOptionsImpl extends AnimateLayoutOptionsImpl { constructor() { super(...arguments); this.name = 'preset'; // transform a given node position. Useful for changing flow direction in discrete layouts this.transform = (node, position) => position; } } export class ShapedLayoutOptionsImpl extends AnimateLayoutOptionsImpl { constructor() { super(...arguments); // whether to fit to viewport this.fit = true; // fit padding this.padding = 30; // constrain layout bounds this.boundingBox = null; // prevents node overlap, may overflow boundingBox if not enough space this.avoidOverlap = true; // Excludes the label when calculating node bounding boxes for the layout algorithm this.nodeDimensionsIncludeLabels = false; // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up this.spacingFactor = 1.75; // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } this.sort = null; // transform a given node position. Useful for changing flow direction in discrete layouts this.transform = (node, position) => position; } } export class GridLayoutOptionsImpl extends ShapedLayoutOptionsImpl { constructor() { super(...arguments); this.name = 'grid'; // extra spacing around nodes when avoidOverlap: true this.avoidOverlapPadding = 10; // uses all available space on false, uses minimal space on true this.condense = false; // force num of rows in the grid this.rows = null; // force num of columns in the grid this.cols = null; // returns { row, col } for element // (node: NodeSingular) => return { row: number; col: number; } this.position = null; } } export class RandomLayoutOptionsImpl extends AnimateLayoutOptionsImpl { constructor() { super(...arguments); this.name = 'random'; this.fit = true; this.padding = 20; // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } this.boundingBox = null; // transform a given node position. Useful for changing flow direction in discrete layouts this.transform = (node, position) => position; } } export class CircleLayoutOptionsImpl extends ShapedLayoutOptionsImpl { constructor() { super(...arguments); this.name = 'circle'; this.startAngle = 3 / 2 * Math.PI; // where nodes start in radians this.sweep = null; // how many radians should be between the first and last node (defaults to full circle) } } // Note: "radius" is not part of concentric, imperfect extension export class ConcentricLayoutOptionsImpl { constructor() { this.name = 'concentric'; // where nodes start in radians, e.g. 3 / 2 * Math.PI, this.startAngle = 3 / 2 * Math.PI; // height of layout area (overrides container height) this.height = null; // width of layout area (overrides container width) this.width = null; } concentric(node) { return 0; } levelWidth(node) { return 0; } } export class BreadthFirstLayoutOptionsImpl extends ShapedLayoutOptionsImpl { constructor() { super(...arguments); this.name = 'breadthfirst'; // whether the tree is directed downwards (or edges can point in any direction if false) this.directed = false; // put depths in concentric circles if true, put depths top down if false this.circle = false; // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only) this.maximal = false; this.grid = false; // whether to create an even grid into which the DAG is placed (circle:false only) } } export class CoseLayoutOptionsImpl extends ShapedLayoutOptionsImpl { constructor() { super(...arguments); this.name = 'cose'; // Number of iterations between consecutive screen positions update this.refresh = 20; // Randomize the initial positions of the nodes (true) or use existing positions (false) this.randomize = false; // Extra spacing between components in non-compound graphs this.componentSpacing = 40; // Node repulsion (overlapping) multiplier this.nodeOverlap = 4; // Nesting factor (multiplier) to compute ideal edge length for nested edges this.nestingFactor = 1.2; // Gravity force (constant) this.gravity = 1; // Maximum number of iterations to perform this.numIter = 1000; // Initial temperature (maximum node displacement) this.initialTemp = 1000; // Cooling factor (how the temperature is reduced between consecutive iterations this.coolingFactor = 0.99; // Lower temperature threshold (below this point the layout will end) this.minTemp = 1.0; // Node repulsion (non overlapping) multiplier this.nodeRepulsion = (node) => 2048; // Ideal edge (non nested) length this.idealEdgeLength = (edge) => 32; // Divisor to compute edge forces this.edgeElasticity = (edge) => 32; } } export class DagreLayoutOptionsImpl extends ShapedLayoutOptionsImpl { constructor() { super(); this.name = 'dagre'; this.nodeSep = null; // the separation between adjacent nodes in the same rank this.edgeSep = null; // the separation between adjacent edges in the same rank this.rankSep = null; // the separation between each rank in the layout // TB for top to bottom flow, 'LR' for left to right this.rankDir = 'TB'; // Type of algorithm to assign a rank to each node in the input graph. // Possible values: 'network-simplex', 'tight-tree' or 'longest-path' this.ranker = null; // number of ranks to keep between the source and target of the edge this.minLen = (edge) => 1; this.edgeWeight = (edge) => 1; // higher weight edges are generally made shorter and straighter than lower weight edges } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW9wdGlvbnMtaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N5dG9zY2FwZS1hbmd1bGFyL3NyYy9saWIvbGF5b3V0L2xheW91dC1vcHRpb25zLWltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsTUFBTSxxQkFBcUI7SUFFekIsS0FBSyxDQUFDLENBQThCO1FBQ2xDLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLGlCQUFpQjtJQUNwRyxDQUFDO0lBRUQsSUFBSSxDQUFDLENBQThCO1FBQ2pDLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLGdCQUFnQjtJQUNsRyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8scUJBQXNCLFNBQVEscUJBQXFCO0lBQWhFOztRQUNFLFNBQUksR0FBRyxNQUFNLENBQUE7SUFDZixDQUFDO0NBQUE7QUFFRCxNQUFNLE9BQU8sd0JBQTBCLFNBQVEscUJBQXFCO0lBQXBFOztRQUVFLHVEQUF1RDtRQUN2RCxTQUFJLEdBQVksSUFBSSxDQUFBO1FBQ3BCLHNEQUFzRDtRQUN0RCxRQUFHLEdBQVksSUFBSSxDQUFBO1FBQ25CLDJDQUEyQztRQUMzQyxZQUFPLEdBQUcsS0FBSyxDQUFBO1FBQ2YseUNBQXlDO1FBQ3pDLHNCQUFpQixHQUFHLEdBQUcsQ0FBQTtRQUN2QixpQ0FBaUM7UUFDakMsb0JBQWUsR0FBRyxTQUFTLENBQUE7UUFDM0Isa0VBQWtFO1FBQ2xFLDRFQUE0RTtRQUM1RSxnREFBZ0Q7UUFDaEQsa0JBQWEsR0FBRyxDQUFFLElBQUksRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTtJQUNyQyxDQUFD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VyxJQUFJLENBQUEsQ0FBQyxpREFBaUQ7UUFDeEUsb0RBQW9EO1FBQ3BELFlBQU8sR0FBWSxJQUFJLENBQUE7UUFDdkIsc0VBQXNFO1FBQ3RFLHFFQUFxRTtRQUNyRSxXQUFNLEdBQVcsSUFBSSxDQUFBO1FBQ3JCLG9FQUFvRTtRQUNwRSxXQUFNLEdBQUcsQ0FBRSxJQUFJLEVBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUN0QixlQUFVLEdBQUcsQ0FBRSxJQUFJLEVBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQSxDQUFDLHdGQUF3RjtJQWRuSCxDQUFDO0NBZUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBbmltYXRlZExheW91dE9wdGlvbnMsXG4gIEJvdW5kaW5nQm94MTIsXG4gIEJvdW5kaW5nQm94V0gsXG4gIFNvcnRpbmdGdW5jdGlvblxufSBmcm9tICdjeXRvc2NhcGUnXG5cbmNsYXNzIEJhc2VMYXlvdXRPcHRpb25zSW1wbCB7XG5cbiAgcmVhZHkoZTogY3l0b3NjYXBlLkxheW91dEV2ZW50T2JqZWN0KTogdm9pZCB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmRlYnVnKGBsYXlvdXQgcmVhZHksIGN5dG9zY2FwZS5MYXlvdXRFdmVudE9iamVjdDogJHtKU09OLnN0cmluZ2lmeShlKX1gKSAvLyBvbiBsYXlvdXRyZWFkeVxuICB9XG5cbiAgc3RvcChlOiBjeXRvc2NhcGUuTGF5b3V0RXZlbnRPYmplY3QpOiB2b2lkIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgIGNvbnNvbGUuZGVidWcoYGxheW91dCBzdG9wLCBjeXRvc2NhcGUuTGF5b3V0RXZlbnRPYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCkgLy8gb24gbGF5b3V0c3RvcFxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWxsTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBCYXNlTGF5b3V0T3B0aW9uc0ltcGwge1xuICBuYW1lID0gJ251bGwnXG59XG5cbmV4cG9ydCBjbGFzcyBBbmltYXRlTGF5b3V0T3B0aW9uc0ltcGwgIGV4dGVuZHMgQmFzZUxheW91dE9wdGlvbnNJbXBsIGltcGxlbWVudHMgQW5pbWF0ZWRMYXlvdXRPcHRpb25zICB7XG5cbiAgLy8gdGhlIHpvb20gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICB6b29tOiBudW1iZXIgPSAgbnVsbFxuICAvLyB0aGUgcGFuIGxldmVsIHRvIHNldCAocHJvYiB3YW50IGZpdCA9IGZhbHNlIGlmIHNldClcbiAgcGFuOiBudW1iZXIgPSAgbnVsbFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGUgPSBmYWxzZVxuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25EdXJhdGlvbiA9IDUwMFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nID0gdW5kZWZpbmVkXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLlxuICAvLyBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWQuICBOb24tYW5pbWF0ZWQgbm9kZXMgYXJlXG4gIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IHN0YXJ0c1xuICBhbmltYXRlRmlsdGVyID0gKCBub2RlLCBpICkgPT4gdHJ1ZVxufVxuXG5leHBvcnQgY2xhc3MgUHJlc2V0TGF5b3V0T3B0aW9uc0ltcGwgIGV4dGVuZHMgQW5pbWF0ZUxheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdwcmVzZXQnXG5cbiAgZml0PzogYm9vbGVhblxuICBwYWRkaW5nPzogbnVtYmVyXG5cbiAgLy8gbWFwIG9mIChub2RlIGlkKSA9PiAocG9zaXRpb24gb2JqKTsgb3IgZnVuY3Rpb24obm9kZSl7IHJldHVybiBzb21Qb3M7IH1cbiAgcG9zaXRpb25zOiBudWxsXG4gIC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xuICB0cmFuc2Zvcm0gPSAobm9kZSwgcG9zaXRpb24gKSA9PiBwb3NpdGlvblxufVxuXG5leHBvcnQgY2xhc3MgU2hhcGVkTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBBbmltYXRlTGF5b3V0T3B0aW9uc0ltcGwge1xuXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIGZpdCA9IHRydWVcbiAgLy8gZml0IHBhZGRpbmdcbiAgcGFkZGluZyA9IDMwXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzXG4gIGJvdW5kaW5nQm94PzogQm91bmRpbmdCb3gxMiB8IEJvdW5kaW5nQm94V0ggfCB1bmRlZmluZWQgPSBudWxsXG5cbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBhdm9pZE92ZXJsYXAgPSB0cnVlXG5cbiAgLy8gRXhjbHVkZXMgdGhlIGxhYmVsIHdoZW4gY2FsY3VsYXRpbmcgbm9kZSBib3VuZGluZyBib3hlcyBmb3IgdGhlIGxheW91dCBhbGdvcml0aG1cbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzID0gZmFsc2VcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgc3BhY2luZ0ZhY3RvciA9IDEuNzVcblxuICAvLyBhIHNvcnRpbmcgZnVuY3Rpb24gdG8gb3JkZXIgdGhlIG5vZGVzOyBlLmcuIGZ1bmN0aW9uKGEsIGIpeyByZXR1cm4gYS5kYXRhKCd3ZWlnaHQnKSAtIGIuZGF0YSgnd2VpZ2h0JykgfVxuICBzb3J0PzogU29ydGluZ0Z1bmN0aW9uID0gbnVsbFxuICAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHNcbiAgdHJhbnNmb3JtID0gKG5vZGUsIHBvc2l0aW9uICkgPT4gcG9zaXRpb25cbn1cblxuXG5leHBvcnQgY2xhc3MgR3JpZExheW91dE9wdGlvbnNJbXBsICBleHRlbmRzIFNoYXBlZExheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdncmlkJ1xuXG4gIC8vIGV4dHJhIHNwYWNpbmcgYXJvdW5kIG5vZGVzIHdoZW4gYXZvaWRPdmVybGFwOiB0cnVlXG4gIGF2b2lkT3ZlcmxhcFBhZGRpbmcgPSAxMFxuICAvLyB1c2VzIGFsbCBhdmFpbGFibGUgc3BhY2Ugb24gZmFsc2UsIHVzZXMgbWluaW1hbCBzcGFjZSBvbiB0cnVlXG4gIGNvbmRlbnNlID0gZmFsc2VcbiAgLy8gZm9yY2UgbnVtIG9mIHJvd3MgaW4gdGhlIGdyaWRcbiAgcm93cz86IG51bWJlciB8IHVuZGVmaW5lZCA9IG51bGxcbiAgLy8gZm9yY2UgbnVtIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWRcbiAgY29scz86IG51bWJlciB8IHVuZGVmaW5lZCA9IG51bGxcbiAgLy8gcmV0dXJucyB7IHJvdywgY29sIH0gZm9yIGVsZW1lbnRcbiAgLy8gKG5vZGU6IE5vZGVTaW5ndWxhcikgPT4gcmV0dXJuIHsgcm93OiBudW1iZXI7IGNvbDogbnVtYmVyOyB9XG4gIHBvc2l0aW9uID0gbnVsbFxufVxuXG5leHBvcnQgY2xhc3MgUmFuZG9tTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBBbmltYXRlTGF5b3V0T3B0aW9uc0ltcGwge1xuICBuYW1lID0gJ3JhbmRvbSdcblxuICBmaXQgPSB0cnVlXG4gIHBhZGRpbmcgPSAyMFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYm91bmRpbmdCb3g6IGN5dG9zY2FwZS5Cb3VuZGluZ0JveDEyIHwgY3l0b3NjYXBlLkJvdW5kaW5nQm94V0ggfCB1bmRlZmluZWQgPSBudWxsXG4gIC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xuICB0cmFuc2Zvcm0gPSAobm9kZSwgcG9zaXRpb24gKSA9PiBwb3NpdGlvblxufVxuXG5leHBvcnQgY2xhc3MgQ2lyY2xlTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBTaGFwZWRMYXlvdXRPcHRpb25zSW1wbCB7XG4gIG5hbWUgPSAgJ2NpcmNsZSdcblxuICByYWRpdXM6IG51bWJlciAvLyB0aGUgcmFkaXVzIG9mIHRoZSBjaXJjbGVcbiAgc3RhcnRBbmdsZTogbnVtYmVyID0gMyAvIDIgKiBNYXRoLlBJIC8vIHdoZXJlIG5vZGVzIHN0YXJ0IGluIHJhZGlhbnNcbiAgc3dlZXA6IG51bWJlciA9IG51bGwgLy8gaG93IG1hbnkgcmFkaWFucyBzaG91bGQgYmUgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZSAoZGVmYXVsdHMgdG8gZnVsbCBjaXJjbGUpXG4gIGNsb2Nrd2lzZTogdHJ1ZSAvLyB3aGV0aGVyIHRoZSBsYXlvdXQgc2hvdWxkIGdvIGNsb2Nrd2lzZSAodHJ1ZSkgb3IgY291bnRlcmNsb2Nrd2lzZS9hbnRpY2xvY2t3aXNlIChmYWxzZSlcbn1cblxuLy8gTm90ZTogXCJyYWRpdXNcIiBpcyBub3QgcGFydCBvZiBjb25jZW50cmljLCBpbXBlcmZlY3QgZXh0ZW5zaW9uXG5leHBvcnQgY2xhc3MgQ29uY2VudHJpY0xheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdjb25jZW50cmljJ1xuICAvLyBob3cgbWFueSByYWRpYW5zIHNob3VsZCBiZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIChkZWZhdWx0cyB0byBmdWxsIGNpcmNsZSlcbiAgc3dlZXA/OiBudW1iZXJcbiAgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG4gIGNsb2Nrd2lzZT86IGJvb2xlYW5cbiAgLy8gd2hlcmUgbm9kZXMgc3RhcnQgaW4gcmFkaWFucywgZS5nLiAzIC8gMiAqIE1hdGguUEksXG4gIHN0YXJ0QW5nbGU6IG51bWJlciA9IDMgLyAyICogTWF0aC5QSVxuICBmaXQ6IGJvb2xlYW5cbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiB0cnVlXG4gIGVxdWlkaXN0YW50OiBmYWxzZSAvLyB3aGV0aGVyIGxldmVscyBoYXZlIGFuIGVxdWFsIHJhZGlhbCBkaXN0YW5jZSBiZXR3ZW4gdGhlbSwgbWF5IGNhdXNlIGJvdW5kaW5nIGJveCBvdmVyZmxvd1xuICBtaW5Ob2RlU3BhY2luZzogMTAgLy8gbWluIHNwYWNpbmcgYmV0d2VlbiBvdXRzaWRlIG9mIG5vZGVzICh1c2VkIGZvciByYWRpdXMgYWRqdXN0bWVudClcbiAgYm91bmRpbmdCb3g6IG51bGwgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIC8vIGhlaWdodCBvZiBsYXlvdXQgYXJlYSAob3ZlcnJpZGVzIGNvbnRhaW5lciBoZWlnaHQpXG4gIGhlaWdodCA9IG51bGxcbiAgLy8gd2lkdGggb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgd2lkdGgpXG4gIHdpZHRoID0gbnVsbFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICBzcGFjaW5nRmFjdG9yOiBudWxsXG5cbiAgY29uY2VudHJpYyhub2RlOiB7IGRlZ3JlZSgpOiBudW1iZXIgfSk6IG51bWJlciB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIGxldmVsV2lkdGgobm9kZTogeyBtYXhEZWdyZWUoKTogbnVtYmVyIH0pOiBudW1iZXIge1xuICAgIHJldHVybiAwXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyZWFkdGhGaXJzdExheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgU2hhcGVkTGF5b3V0T3B0aW9uc0ltcGwge1xuICBuYW1lID0gJ2JyZWFkdGhmaXJzdCdcblxuICAvLyB3aGV0aGVyIHRoZSB0cmVlIGlzIGRpcmVjdGVkIGRvd253YXJkcyAob3IgZWRnZXMgY2FuIHBvaW50IGluIGFueSBkaXJlY3Rpb24gaWYgZmFsc2UpXG4gIGRpcmVjdGVkID0gZmFsc2VcbiAgLy8gcHV0IGRlcHRocyBpbiBjb25jZW50cmljIGNpcmNsZXMgaWYgdHJ1ZSwgcHV0IGRlcHRocyB0b3AgZG93biBpZiBmYWxzZVxuICBjaXJjbGUgPSBmYWxzZVxuICAvLyB0aGUgcm9vdHMgb2YgdGhlIHRyZWVzXG4gIHJvb3RzPzogc3RyaW5nXG4gIC8vIGhvdyBtYW55IHRpbWVzIHRvIHRyeSB0byBwb3NpdGlvbiB0aGUgbm9kZXMgaW4gYSBtYXhpbWFsIHdheSAoaS5lLiBubyBiYWNrdHJhY2tpbmcpXG4gIG1heGltYWxBZGp1c3RtZW50czogbnVtYmVyXG4gIC8vIHdoZXRoZXIgdG8gc2hpZnQgbm9kZXMgZG93biB0aGVpciBuYXR1cmFsIEJGUyBkZXB0aHMgaW4gb3JkZXIgdG8gYXZvaWQgdXB3YXJkcyBlZGdlcyAoREFHUyBvbmx5KVxuICBtYXhpbWFsID0gZmFsc2VcbiAgZ3JpZCA9IGZhbHNlIC8vIHdoZXRoZXIgdG8gY3JlYXRlIGFuIGV2ZW4gZ3JpZCBpbnRvIHdoaWNoIHRoZSBEQUcgaXMgcGxhY2VkIChjaXJjbGU6ZmFsc2Ugb25seSlcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxufVxuXG5leHBvcnQgY2xhc3MgQ29zZUxheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgU2hhcGVkTGF5b3V0T3B0aW9uc0ltcGwge1xuICBuYW1lID0gJ2Nvc2UnXG5cbiAgLy8gVGhlIGxheW91dCBhbmltYXRlcyBvbmx5IGFmdGVyIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgZm9yIGFuaW1hdGU6dHJ1ZVxuICAvLyAocHJldmVudHMgZmxhc2hpbmcgb24gZmFzdCBydW5zKVxuICBhbmltYXRpb25UaHJlc2hvbGQ6IDI1MFxuXG4gIC8vIE51bWJlciBvZiBpdGVyYXRpb25zIGJldHdlZW4gY29uc2VjdXRpdmUgc2NyZWVuIHBvc2l0aW9ucyB1cGRhdGVcbiAgcmVmcmVzaCA9IDIwXG5cbiAgLy8gUmFuZG9taXplIHRoZSBpbml0aWFsIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXMgKHRydWUpIG9yIHVzZSBleGlzdGluZyBwb3NpdGlvbnMgKGZhbHNlKVxuICByYW5kb21pemUgPSBmYWxzZVxuXG4gIC8vIEV4dHJhIHNwYWNpbmcgYmV0d2VlbiBjb21wb25lbnRzIGluIG5vbi1jb21wb3VuZCBncmFwaHNcbiAgY29tcG9uZW50U3BhY2luZyA9IDQwXG5cbiAgLy8gTm9kZSByZXB1bHNpb24gKG92ZXJsYXBwaW5nKSBtdWx0aXBsaWVyXG4gIG5vZGVPdmVybGFwID0gNFxuXG4gIC8vIE5lc3RpbmcgZmFjdG9yIChtdWx0aXBsaWVyKSB0byBjb21wdXRlIGlkZWFsIGVkZ2UgbGVuZ3RoIGZvciBuZXN0ZWQgZWRnZXNcbiAgbmVzdGluZ0ZhY3RvciA9IDEuMlxuXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5ID0gMVxuXG4gIC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybVxuICBudW1JdGVyID0gMTAwMFxuXG4gIC8vIEluaXRpYWwgdGVtcGVyYXR1cmUgKG1heGltdW0gbm9kZSBkaXNwbGFjZW1lbnQpXG4gIGluaXRpYWxUZW1wID0gMTAwMFxuXG4gIC8vIENvb2xpbmcgZmFjdG9yIChob3cgdGhlIHRlbXBlcmF0dXJlIGlzIHJlZHVjZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBpdGVyYXRpb25zXG4gIGNvb2xpbmdGYWN0b3IgPSAwLjk5XG5cbiAgLy8gTG93ZXIgdGVtcGVyYXR1cmUgdGhyZXNob2xkIChiZWxvdyB0aGlzIHBvaW50IHRoZSBsYXlvdXQgd2lsbCBlbmQpXG4gIG1pblRlbXAgPSAxLjBcblxuICAvLyBOb2RlIHJlcHVsc2lvbiAobm9uIG92ZXJsYXBwaW5nKSBtdWx0aXBsaWVyXG4gIG5vZGVSZXB1bHNpb24gPSAgKCBub2RlICkgPT4gMjA0OFxuXG4gIC8vIElkZWFsIGVkZ2UgKG5vbiBuZXN0ZWQpIGxlbmd0aFxuICBpZGVhbEVkZ2VMZW5ndGggPSAoIGVkZ2UgKSA9PiAzMlxuXG4gIC8vIERpdmlzb3IgdG8gY29tcHV0ZSBlZGdlIGZvcmNlc1xuICBlZGdlRWxhc3RpY2l0eSA9ICggZWRnZSApID0+IDMyXG59XG5cbnR5cGUgUmFua0RpciA9ICdMUicgfCAnVEInXG50eXBlIFJhbmtlciA9ICduZXR3b3JrLXNpbXBsZXgnIHwgJ3RpZ2h0LXRyZWUnIHwgJ2xvbmdlc3QtcGF0aCdcblxuZXhwb3J0IGNsYXNzIERhZ3JlTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBTaGFwZWRMYXlvdXRPcHRpb25zSW1wbCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKClcbiAgfVxuXG4gIG5hbWUgPSAnZGFncmUnXG5cbiAgbm9kZVNlcDogbnVtYmVyID0gbnVsbCAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IG5vZGVzIGluIHRoZSBzYW1lIHJhbmtcbiAgZWRnZVNlcDogbnVtYmVyID0gbnVsbCAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGFkamFjZW50IGVkZ2VzIGluIHRoZSBzYW1lIHJhbmtcbiAgcmFua1NlcDogbnVtYmVyID0gbnVsbCAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGVhY2ggcmFuayBpbiB0aGUgbGF5b3V0XG4gIC8vIFRCIGZvciB0b3AgdG8gYm90dG9tIGZsb3csICdMUicgZm9yIGxlZnQgdG8gcmlnaHRcbiAgcmFua0RpcjogUmFua0RpciA9ICdUQidcbiAgLy8gVHlwZSBvZiBhbGdvcml0aG0gdG8gYXNzaWduIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoLlxuICAvLyBQb3NzaWJsZSB2YWx1ZXM6ICduZXR3b3JrLXNpbXBsZXgnLCAndGlnaHQtdHJlZScgb3IgJ2xvbmdlc3QtcGF0aCdcbiAgcmFua2VyOiBSYW5rZXIgPSBudWxsXG4gIC8vIG51bWJlciBvZiByYW5rcyB0byBrZWVwIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9mIHRoZSBlZGdlXG4gIG1pbkxlbiA9ICggZWRnZSApID0+IDFcbiAgZWRnZVdlaWdodCA9ICggZWRnZSApID0+IDEgLy8gaGlnaGVyIHdlaWdodCBlZGdlcyBhcmUgZ2VuZXJhbGx5IG1hZGUgc2hvcnRlciBhbmQgc3RyYWlnaHRlciB0aGFuIGxvd2VyIHdlaWdodCBlZGdlc1xufVxuIl19