2
0
Files
guilloche-generator/dist/nls-guilloche/bundles/nls-guilloche.umd.js

1335 lines
124 KiB
JavaScript

(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('d3-random'), require('d3-selection'), require('d3-shape'), require('@angular/platform-browser')) :
typeof define === 'function' && define.amd ? define('nls-guilloche', ['exports', '@angular/core', 'd3-random', 'd3-selection', 'd3-shape', '@angular/platform-browser'], factory) :
(factory((global['nls-guilloche'] = {}),global.ng.core,null,null,null,global.ng.platformBrowser));
}(this, (function (exports,core,Random,Selection,Shape,platformBrowser) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
var __assign = function () {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __generator(thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1)
throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (_)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return { value: op[1], done: false };
case 5:
_.label++;
y = op[1];
op = [0];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
}
catch (e) {
op = [6, e];
y = 0;
}
finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return { value: op[0] ? op[1] : void 0, done: true };
}
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
}
catch (error) {
e = { error: error };
}
finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
}
finally {
if (e)
throw e.error;
}
}
return ar;
}
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read(arguments[i]));
return ar;
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsCanvasService = (function () {
function NlsCanvasService(rendererFactory) {
this.rendererFactory = rendererFactory;
this.renderer = rendererFactory.createRenderer(null, null);
}
Object.defineProperty(NlsCanvasService.prototype, "get", {
get: /**
* @return {?}
*/ function () {
return this.canvas;
},
enumerable: true,
configurable: true
});
/**
* @param {?} el
* @return {?}
*/
NlsCanvasService.prototype.set = /**
* @param {?} el
* @return {?}
*/
function (el) {
this.canvas = el;
};
/**
* @return {?}
*/
NlsCanvasService.prototype.adjustToWindow = /**
* @return {?}
*/
function () {
if (this.canvas) {
this.renderer.setStyle(this.canvas, 'width', this.canvas.innerWidth);
this.renderer.setStyle(this.canvas, 'height', this.canvas.innerHeight);
}
};
NlsCanvasService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
NlsCanvasService.ctorParameters = function () {
return [
{ type: core.RendererFactory2 }
];
};
return NlsCanvasService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsHistoryService = (function () {
function NlsHistoryService() {
this.history = [];
}
/**
* @param {?} graphs
* @param {?} config
* @return {?}
*/
NlsHistoryService.prototype.save = /**
* @param {?} graphs
* @param {?} config
* @return {?}
*/
function (graphs, config) {
this.history.push({
date: new Date(),
graphs: graphs,
config: config,
hash: this.hash(graphs)
});
};
/**
* @param {?} graphs
* @return {?}
*/
NlsHistoryService.prototype.hash = /**
* @param {?} graphs
* @return {?}
*/
function (graphs) {
return btoa(JSON.stringify(graphs));
};
/**
* @return {?}
*/
NlsHistoryService.prototype.list = /**
* @return {?}
*/
function () {
return this.history;
};
NlsHistoryService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
NlsHistoryService.ctorParameters = function () { return []; };
return NlsHistoryService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsMathService = (function () {
function NlsMathService() {
}
/**
* Calculate distance between to points with coordinates.
* @param {?} a
* @param {?} b
* @return {?}
*/
NlsMathService.prototype.Δ = /**
* Calculate distance between to points with coordinates.
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) {
return Math.pow(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2), 0.5);
};
/**
* @param {?} point
* @param {?} matrix
* @return {?}
*/
NlsMathService.prototype.getClosestCenter = /**
* @param {?} point
* @param {?} matrix
* @return {?}
*/
function (point, matrix) {
if (this.Δ(point, matrix.start) < this.Δ(point, matrix.end)) {
return matrix.start;
}
else {
return matrix.end;
}
};
/**
* @param {?} point
* @param {?} matrix
* @return {?}
*/
NlsMathService.prototype.getFarestCenter = /**
* @param {?} point
* @param {?} matrix
* @return {?}
*/
function (point, matrix) {
if (this.Δ(point, matrix.start) > this.Δ(point, matrix.end)) {
return matrix.start;
}
else {
return matrix.end;
}
};
/**
* @param {?} matrix
* @param {?} overlap
* @return {?}
*/
NlsMathService.prototype.randomPoint = /**
* @param {?} matrix
* @param {?} overlap
* @return {?}
*/
function (matrix, overlap) {
/** @type {?} */
var x = {
min: matrix.center.x - matrix.width * overlap,
max: matrix.center.x + matrix.width * overlap
};
/** @type {?} */
var y = {
min: matrix.center.y - matrix.height * overlap,
max: matrix.center.y + matrix.height * overlap
};
return {
x: Random.randomUniform(x.min, x.max)(),
y: Random.randomUniform(y.min, y.max)()
};
};
/**
* @param {?} width
* @param {?} height
* @return {?}
*/
NlsMathService.prototype.centerOfArea = /**
* @param {?} width
* @param {?} height
* @return {?}
*/
function (width, height) {
return {
x: width * 0.5,
y: height * 0.5
};
};
/**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
NlsMathService.prototype.centerOfPoints = /**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
function (p1, p2) {
return {
x: (p1.x + p2.x) * 0.5,
y: (p1.y + p2.y) * 0.5
};
};
/**
* @param {?} curve
* @return {?}
*/
NlsMathService.prototype.centerOfCurve = /**
* @param {?} curve
* @return {?}
*/
function (curve) {
/** @type {?} */
var genMedian = this.medianPoint(curve);
/** @type {?} */
var p1 = genMedian.next().value;
/** @type {?} */
var p2 = genMedian.next().value;
/** @type {?} */
var radians = this.angleRadians(p1, p2);
return Object.assign(this.centerOfPoints(p1, p2), { ascent: radians });
};
/**
* @param {?} curve
* @return {?}
*/
NlsMathService.prototype.medianOfCurve = /**
* @param {?} curve
* @return {?}
*/
function (curve) {
/** @type {?} */
var genMedian = this.medianPoint(curve);
/** @type {?} */
var p1 = genMedian.next().value;
/** @type {?} */
var p2 = genMedian.next().value;
/** @type {?} */
var p3 = genMedian.next().value;
/** @type {?} */
var radians = this.angleRadians(p2, p3);
// const radians = Math.round(Math.random() * 10000) / 1000;
// @todo if nodes are less than 5 error occures
return Object.assign(p1, { ascent: radians });
};
/**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
NlsMathService.prototype.angleRadians = /**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
function (p1, p2) {
return Math.atan2(p2.y - p1.y, p2.x - p1.x);
};
/**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
NlsMathService.prototype.angleDegree = /**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
function (p1, p2) {
return this.angleRadians(p1, p2) * 180 / Math.PI;
};
/**
* @param {?} list
* @return {?}
*/
NlsMathService.prototype.medianIndex = /**
* @param {?} list
* @return {?}
*/
function (list) {
return Math.floor(list.length * 0.5);
};
/**
* @param {?} points
* @return {?}
*/
NlsMathService.prototype.medianPoint = /**
* @param {?} points
* @return {?}
*/
function (points) {
var index, list;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
list = points.slice();
_a.label = 1;
case 1:
if (!list)
return [3 /*break*/, 3];
index = this.medianIndex(points);
return [4 /*yield*/, list[index]];
case 2:
_a.sent();
list.splice(index, 1);
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* Generator for sine bounce
*
* @param {?=} amplitude default to 1 indicates the amplitude in positive as well
* in negative range
* @param {?=} decimals amount of decimal places
* @param {?=} start 0 indicates to initiate with positive numbers, 1 indicates to
* start with negative numbers first
* @return {?}
*/
NlsMathService.prototype.bounce = /**
* Generator for sine bounce
*
* @param {?=} amplitude default to 1 indicates the amplitude in positive as well
* in negative range
* @param {?=} decimals amount of decimal places
* @param {?=} start 0 indicates to initiate with positive numbers, 1 indicates to
* start with negative numbers first
* @return {?}
*/
function (amplitude, decimals, start) {
if (amplitude === void 0) {
amplitude = 1;
}
if (decimals === void 0) {
decimals = 1;
}
if (start === void 0) {
start = 0;
}
var power, step, index, radians;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
power = Math.pow(10, decimals);
step = 2 / (power);
index = 0;
_a.label = 1;
case 1:
radians = Math.PI * step * index + start;
return [4 /*yield*/, Math.round((Math.sin(radians) * amplitude) * power) / power];
case 2:
_a.sent();
index++;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* @param {?=} startPositive
* @return {?}
*/
NlsMathService.prototype.flipSign = /**
* @param {?=} startPositive
* @return {?}
*/
function (startPositive) {
if (startPositive === void 0) {
startPositive = true;
}
var sign;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
sign = startPositive ? 1 : -1;
_a.label = 1;
case 1:
return [4 /*yield*/, sign = sign * (-1)];
case 2:
_a.sent();
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
NlsMathService.decorators = [
{ type: core.Injectable },
];
return NlsMathService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsGraphService = (function () {
function NlsGraphService(math) {
this.math = math;
}
/**
* @return {?}
*/
NlsGraphService.prototype.get = /**
* @return {?}
*/
function () {
return this.graphs;
};
/**
* @param {?} newGraphs
* @return {?}
*/
NlsGraphService.prototype.set = /**
* @param {?} newGraphs
* @return {?}
*/
function (newGraphs) {
this.graphs = newGraphs;
};
Object.defineProperty(NlsGraphService.prototype, "isAnimated", {
get: /**
* @return {?}
*/ function () {
return this.animation;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NlsGraphService.prototype.startAnimation = /**
* @return {?}
*/
function () {
this.animation = true;
};
/**
* @return {?}
*/
NlsGraphService.prototype.stopAnimation = /**
* @return {?}
*/
function () {
this.animation = false;
};
/**
* @param {?} start
* @param {?} spacing
* @return {?}
*/
NlsGraphService.prototype.spreadOrthogonal = /**
* @param {?} start
* @param {?} spacing
* @return {?}
*/
function (start, spacing) {
var sign, currentPoint, i, currentSpacing;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
sign = this.math.flipSign();
currentPoint = start;
i = 0;
_a.label = 1;
case 1:
currentSpacing = sign.next().value * spacing * i;
currentPoint = this.shiftPoint(currentPoint, start.ascent, currentSpacing);
return [4 /*yield*/, currentPoint];
case 2:
_a.sent();
i++;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* @param {?} point
* @param {?} radians
* @param {?} spacing
* @return {?}
*/
NlsGraphService.prototype.shiftPoint = /**
* @param {?} point
* @param {?} radians
* @param {?} spacing
* @return {?}
*/
function (point, radians, spacing) {
return {
x: Math.sin(radians * Math.PI) * spacing + point.x,
y: Math.cos(radians * Math.PI) * spacing + point.y
};
};
NlsGraphService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
NlsGraphService.ctorParameters = function () {
return [
{ type: NlsMathService }
];
};
return NlsGraphService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/** @type {?} */
var RESIZING_TIMEOUT = 800;
var NlsGraphsComponent = (function () {
function NlsGraphsComponent(canvasService, historyService, math, graphService) {
this.canvasService = canvasService;
this.historyService = historyService;
this.math = math;
this.graphService = graphService;
this.svgChange = new core.EventEmitter();
this.graphChange = new core.EventEmitter();
this.genLoadedAllGraphs = this.countLoadedGraphs();
this.resizingWindow = false;
}
/**
* @param {?} event
* @return {?}
*/
NlsGraphsComponent.prototype.onResize = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
clearTimeout(this.resizingWindow);
this.resizingWindow = setTimeout(function () {
_this.canvas = _this.adjustCanvas();
_this.matrix = _this.calcMatrix();
_this.updateGraphs();
}, RESIZING_TIMEOUT);
};
/**
* @param {?} changes
* @return {?}
*/
NlsGraphsComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
this.canvas = this.adjustCanvas();
this.matrix = this.calcMatrix();
if (changes["config"]) {
this.updateGraphs();
}
if (this.restoredHistory && this.restoredHistory.hash !== this.hash) {
this.restoreGraph();
}
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.restoreGraph = /**
* @return {?}
*/
function () {
this.graphs = this.restoredHistory.graphs;
this.hash = this.restoredHistory.hash;
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.saveHistory = /**
* @return {?}
*/
function () {
this.hash = this.historyService.hash(this.graphs);
this.historyService.save(this.graphs, this.config);
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.saveGraph = /**
* @return {?}
*/
function () {
this.graphService.set(this.graphs);
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.updateGraphs = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var genShiftStart = this.shiftPoint(this.matrix.start, this.config.vectors.start);
/** @type {?} */
var genShiftEnd = this.shiftPoint(this.matrix.end, this.config.vectors.end, false);
console.log(this.matrix);
/** @type {?} */
var curveList = [
{
color: this.config.colors.primary,
start: genShiftStart.next().value,
end: genShiftEnd.next().value
},
{
color: this.config.colors.secondary,
start: genShiftEnd.next().value,
end: genShiftStart.next().value
}
];
this.graphs = curveList.map(function (curve) {
return __assign({}, _this.adjustGraph(curve), { spread: _this.config.spread, interval: _this.config.interval });
});
this.hash = this.historyService.hash(this.graphs);
this.saveHistory();
this.saveGraph();
};
/**
* @param {?} curve
* @return {?}
*/
NlsGraphsComponent.prototype.adjustGraph = /**
* @param {?} curve
* @return {?}
*/
function (curve) {
return Object.assign(curve, {
stroke: this.config.stroke,
start: Object.assign(curve.start, {
direction: this.genVectorPoint(curve.start.point, curve.start.vector)
}),
end: Object.assign(curve.end, {
direction: this.genVectorPoint(curve.end.point, curve.end.vector)
}),
nodes: this.genRandomPoints(this.config.nodes)
});
};
/**
* @param {?} num
* @return {?}
*/
NlsGraphsComponent.prototype.genRandomPoints = /**
* @param {?} num
* @return {?}
*/
function (num) {
/** @type {?} */
var generatedPoints = [];
for (var i = 0; i < this.config.nodes; i++) {
generatedPoints.push(this.math.randomPoint(this.matrix, this.config.overlap));
}
return generatedPoints;
};
/**
* @param {?} x
* @return {?}
*/
NlsGraphsComponent.prototype.flipflop = /**
* @param {?} x
* @return {?}
*/
function (x) {
return (x === 'start') ? 'end' : 'start';
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.adjustCanvas = /**
* @return {?}
*/
function () {
this.canvasService.set(this.canvas);
this.canvasService.adjustToWindow();
return this.svgElementRef.nativeElement;
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.calcMatrix = /**
* @return {?}
*/
function () {
/** @type {?} */
var canvasWidth = this.canvas.getBoundingClientRect().width;
/** @type {?} */
var canvasHeight = this.canvas.getBoundingClientRect().height;
/** @type {?} */
var totalCenter = this.math.centerOfArea(canvasWidth, canvasHeight);
return {
start: {
x: 0,
y: canvasHeight - this.config.vectors.spacing - this.config.margin.y
},
end: {
x: canvasWidth - this.config.vectors.spacing - this.config.margin.x,
y: 0
},
width: canvasWidth,
height: canvasHeight,
center: totalCenter
};
};
/**
* @param {?} point
* @param {?} vector
* @return {?}
*/
NlsGraphsComponent.prototype.genVectorPoint = /**
* @param {?} point
* @param {?} vector
* @return {?}
*/
function (point, vector) {
/** @type {?} */
var range = this.math.Δ(this.matrix.start, this.matrix.end) * this.config.vectors.range;
return {
x: range * Math.sin(Math.PI * vector) + point.x,
y: range * Math.cos(Math.PI * vector) + point.y
};
};
/**
* @param {?} point
* @param {?} vector
* @param {?=} startPositive
* @return {?}
*/
NlsGraphsComponent.prototype.shiftPoint = /**
* @param {?} point
* @param {?} vector
* @param {?=} startPositive
* @return {?}
*/
function (point, vector, startPositive) {
if (startPositive === void 0) {
startPositive = true;
}
var genShiftX, genShiftY;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
genShiftX = this.shiftNumber(this.config.vectors.spacing, vector, startPositive);
genShiftY = this.shiftNumber(this.config.vectors.spacing, vector, startPositive);
_a.label = 1;
case 1:
return [4 /*yield*/, {
point: {
x: Math.cos(Math.PI * vector) * genShiftX.next().value + point.x,
y: Math.sin(Math.PI * vector) * genShiftY.next().value + point.y,
},
vector: vector
}];
case 2:
_a.sent();
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* @param {?} space
* @param {?} vector
* @param {?=} startPositive
* @return {?}
*/
NlsGraphsComponent.prototype.shiftNumber = /**
* @param {?} space
* @param {?} vector
* @param {?=} startPositive
* @return {?}
*/
function (space, vector, startPositive) {
if (startPositive === void 0) {
startPositive = true;
}
var current, index, sign;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
current = 0;
index = 0;
sign = this.math.flipSign(startPositive);
_a.label = 1;
case 1:
return [4 /*yield*/, current = sign.next().value * index * space + current];
case 2:
_a.sent();
index++;
return [3 /*break*/, 1];
case 3: return [2 /*return*/];
}
});
};
/**
* @param {?} guillocheElement
* @return {?}
*/
NlsGraphsComponent.prototype.prepareGuillocheExport = /**
* @param {?} guillocheElement
* @return {?}
*/
function (guillocheElement) {
if (this.genLoadedAllGraphs.next().value) {
this.svgChange.emit(this.svgElementRef);
}
};
/**
* @return {?}
*/
NlsGraphsComponent.prototype.countLoadedGraphs = /**
* @return {?}
*/
function () {
var cycles;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
cycles = 1;
_a.label = 1;
case 1:
if (!(cycles < this.graphs.length))
return [3 /*break*/, 3];
return [4 /*yield*/, false];
case 2:
_a.sent();
cycles++;
return [3 /*break*/, 5];
case 3: return [4 /*yield*/, true];
case 4:
_a.sent();
cycles = 1;
_a.label = 5;
case 5: return [3 /*break*/, 1];
case 6: return [2 /*return*/];
}
});
};
NlsGraphsComponent.decorators = [
{ type: core.Component, args: [{
selector: 'nls-graphs',
template: "<svg #svg width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\"\nversion=\"1.1\" shape-rendering=\"geometricPrecision\">\n <g nlsGuilloche *ngFor=\"let graph of graphs\" [graph]=\"graph\" [animation]=\"animation\"></g>\n</svg>\n",
styles: [":host{position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden}"]
},] },
];
/** @nocollapse */
NlsGraphsComponent.ctorParameters = function () {
return [
{ type: NlsCanvasService },
{ type: NlsHistoryService },
{ type: NlsMathService },
{ type: NlsGraphService }
];
};
NlsGraphsComponent.propDecorators = {
config: [{ type: core.Input }],
restoredHistory: [{ type: core.Input }],
animation: [{ type: core.Input }],
svgChange: [{ type: core.Output }],
graphChange: [{ type: core.Output }],
svgElementRef: [{ type: core.ViewChild, args: ['svg',] }],
onResize: [{ type: core.HostListener, args: ['window:resize', ['$event'],] }]
};
return NlsGraphsComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsGuillocheDirective = (function () {
function NlsGuillocheDirective(canvasService, el, math, graphService) {
this.canvasService = canvasService;
this.el = el;
this.math = math;
this.graphService = graphService;
}
/**
* @return {?}
*/
NlsGuillocheDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.group.selectAll('*').remove();
};
/**
* @param {?} changes
* @return {?}
*/
NlsGuillocheDirective.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
this.group = Selection.select(this.el.nativeElement);
this.canvas = Selection.select(this.canvasService.get);
// @todo modify graph here instead of in graphs.component.ts
this.initialNodes = this.graph.nodes.slice();
this.initialCurve = __spread([
this.graph.start.point,
this.graph.start.direction
], this.graph.nodes.slice(), [
this.graph.end.direction,
this.graph.end.point
]);
this.medianPoint = this.math.medianOfCurve(this.initialCurve);
this.medianIndex = this.math.medianIndex(this.initialCurve);
if (this.animation) {
this.graph.nodes = this.graph.nodes.slice().map(function (node, i) {
return {
x: node.x,
y: node.y,
// ascent: Math.round(Math.random() * 100) / 100
ascent: _this.medianPoint.ascent + i * 0.5
};
});
this.bounces = this.initialNodes.map(function (node) {
/** @type {?} */
var bounceAmplitude = Math.round(Math.random() * 150);
return _this.math.bounce(bounceAmplitude, 3);
});
/** @type {?} */
var i_1 = 0;
this.animationInterval = setInterval(function () {
_this.animateGraph(i_1++ % 1000 / 10000);
}, this.graph.interval);
}
else {
if (this.animationInterval) {
this.bounce = null;
clearInterval(this.animationInterval);
}
}
this.group.selectAll('*').remove();
this.pathElements = [];
/** @type {?} */
var graphs = this.spreadLines(__spread([
this.graph.start.point,
this.graph.start.direction
], this.graph.nodes, [
this.graph.end.direction,
this.graph.end.point,
])).forEach(function (points, index) { return _this.drawGraph(points); });
};
/**
* @param {?} x
* @return {?}
*/
NlsGuillocheDirective.prototype.animateGraph = /**
* @param {?} x
* @return {?}
*/
function (x) {
var _this = this;
/** @type {?} */
var graphs = this.spreadLines(__spread([
this.graph.start.point,
this.graph.start.direction
], this.graph.nodes.map(function (point, i) {
/** @type {?} */
var ascent = point.ascent * Math.sin(Math.PI * x);
return _this.graphService.shiftPoint(point, ascent, _this.bounces[i].next().value);
}), [
this.graph.end.direction,
this.graph.end.point,
]));
graphs.forEach(function (points, i) { return _this.updateGraph(points, i); });
};
/**
* @param {?} points
* @return {?}
*/
NlsGuillocheDirective.prototype.spreadLines = /**
* @param {?} points
* @return {?}
*/
function (points) {
var _this = this;
/** @type {?} */
var shiftedMedians = [];
/** @type {?} */
var genshiftedMedians = this.graphService.spreadOrthogonal(this.medianPoint, this.graph.spread.spacing);
for (var i = 0; i < this.graph.spread.amount; i++) {
shiftedMedians.push(genshiftedMedians.next().value);
}
return shiftedMedians.map(function (median) {
/** @type {?} */
var shiftedPoints = points.slice();
shiftedPoints.splice(_this.medianIndex, 1, median);
return shiftedPoints;
});
};
/**
* @param {?} points
* @param {?} index
* @return {?}
*/
NlsGuillocheDirective.prototype.updateGraph = /**
* @param {?} points
* @param {?} index
* @return {?}
*/
function (points, index) {
this.pathElements[index]
.attr('d', Shape.line()
.x(function (p) { return p.x; })
.y(function (p) { return p.y; })
.curve(Shape.curveBasis)(points));
};
/**
* @param {?} points
* @return {?}
*/
NlsGuillocheDirective.prototype.drawGraph = /**
* @param {?} points
* @return {?}
*/
function (points) {
this.group
.attr('stroke', this.graph.color)
.attr('stroke-width', this.graph.stroke)
.attr('fill', 'none');
this.pathElements.push(this.group.append('path')
.attr('d', Shape.line()
.x(function (p) { return p.x; })
.y(function (p) { return p.y; })
.curve(Shape.curveBasis)(points)));
};
/**
* @param {?} points
* @return {?}
*/
NlsGuillocheDirective.prototype.debugGraph = /**
* @param {?} points
* @return {?}
*/
function (points) {
var _this = this;
points.forEach(function (point, index) {
/** @type {?} */
var circle = _this.group.append('g');
circle.append('circle')
.attr('cx', point.x)
.attr('cy', point.y)
.attr('r', 3)
.attr('fill-opacity', 0.6)
.attr('fill', _this.graph.color);
circle.append('text')
.attr('x', point.x)
.attr('y', point.y)
.attr('dx', 8)
.attr('dy', 15)
.attr('fill', _this.graph.color)
.text(index);
});
};
NlsGuillocheDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[nlsGuilloche]'
},] },
];
/** @nocollapse */
NlsGuillocheDirective.ctorParameters = function () {
return [
{ type: NlsCanvasService },
{ type: core.ElementRef },
{ type: NlsMathService },
{ type: NlsGraphService }
];
};
NlsGuillocheDirective.propDecorators = {
graph: [{ type: core.Input }],
animation: [{ type: core.Input }]
};
return NlsGuillocheDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsAnimationService = (function () {
// public genAnimation: any;
// private timer: Observable<number>;
// private subscribtion: any;
function NlsAnimationService(math, historyService) {
this.math = math;
this.historyService = historyService;
}
/**
* @param {?} initialGraph
* @return {?}
*/
NlsAnimationService.prototype.animate = /**
* @param {?} initialGraph
* @return {?}
*/
function (initialGraph) {
/** @type {?} */
var newGraph = Object.assign({}, initialGraph);
/** @type {?} */
var indexMiddle = Math.floor(newGraph.nodes.length * 0.5);
/** @type {?} */
var pointMiddle = newGraph.nodes[indexMiddle];
newGraph.nodes.splice(indexMiddle, 1, {
x: pointMiddle.x - 2,
y: pointMiddle.y + 2,
});
return newGraph;
// });
};
NlsAnimationService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
NlsAnimationService.ctorParameters = function () {
return [
{ type: NlsMathService },
{ type: NlsHistoryService }
];
};
return NlsAnimationService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var NlsGuillocheModule = (function () {
function NlsGuillocheModule() {
}
NlsGuillocheModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
platformBrowser.BrowserModule
],
declarations: [
NlsGraphsComponent,
NlsGuillocheDirective
],
providers: [
NlsHistoryService,
NlsCanvasService,
NlsMathService,
NlsGraphService,
],
exports: [
NlsGraphsComponent,
NlsGuillocheDirective
]
},] },
];
return NlsGuillocheModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.NlsGraphsComponent = NlsGraphsComponent;
exports.NlsGuillocheDirective = NlsGuillocheDirective;
exports.NlsAnimationService = NlsAnimationService;
exports.NlsCanvasService = NlsCanvasService;
exports.NlsGraphService = NlsGraphService;
exports.NlsHistoryService = NlsHistoryService;
exports.NlsMathService = NlsMathService;
exports.NlsGuillocheModule = NlsGuillocheModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmxzLWd1aWxsb2NoZS51bWQuanMubWFwIiwic291cmNlcyI6W251bGwsIm5nOi8vbmxzLWd1aWxsb2NoZS9ubHMvc2VydmljZXMvY2FudmFzLnNlcnZpY2UudHMiLCJuZzovL25scy1ndWlsbG9jaGUvbmxzL3NlcnZpY2VzL2hpc3Rvcnkuc2VydmljZS50cyIsIm5nOi8vbmxzLWd1aWxsb2NoZS9ubHMvc2VydmljZXMvbWF0aC5zZXJ2aWNlLnRzIiwibmc6Ly9ubHMtZ3VpbGxvY2hlL25scy9zZXJ2aWNlcy9ncmFwaC5zZXJ2aWNlLnRzIiwibmc6Ly9ubHMtZ3VpbGxvY2hlL25scy9jb21wb25lbnRzL2dyYXBocy5jb21wb25lbnQudHMiLCJuZzovL25scy1ndWlsbG9jaGUvbmxzL2RpcmVjdGl2ZXMvZ3VpbGxvY2hlLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmxzLWd1aWxsb2NoZS9ubHMvc2VydmljZXMvYW5pbWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL25scy1ndWlsbG9jaGUvbmxzL25scy1ndWlsbG9jaGUubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMClcclxuICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggTWljaGFlbCBDemVjaG93c2tpIDxtYWlsQGRhaWx5c2guaXQ+XG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yXG4gKiBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aFxuICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxXG4gKiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFJlbmRlcmVyMiwgUmVuZGVyZXJGYWN0b3J5MiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgU2VsZWN0aW9uIGZyb20gJ2QzLXNlbGVjdGlvbic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBObHNDYW52YXNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyO1xuXG4gIHB1YmxpYyBjYW52YXM6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbmRlcmVyRmFjdG9yeTogUmVuZGVyZXJGYWN0b3J5MlxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzO1xuICB9XG5cbiAgcHVibGljIHNldChlbCkge1xuICAgIHRoaXMuY2FudmFzID0gZWw7XG4gIH1cblxuICBwdWJsaWMgYWRqdXN0VG9XaW5kb3coKSB7XG4gICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgdGhpcy5jYW52YXMuaW5uZXJXaWR0aFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgdGhpcy5jYW52YXMuaW5uZXJIZWlnaHRcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoQykgMjAxOCBNaWNoYWVsIEN6ZWNob3dza2kgPG1haWxAZGFpbHlzaC5pdD5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0XG4gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3JcbiAqIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoXG4gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTFcbiAqIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLlxuICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgU2VsZWN0aW9uIGZyb20gJ2QzLXNlbGVjdGlvbic7XG5cbmltcG9ydCB7IEdyYXBoIH0gZnJvbSAnLi4vbW9kZWxzL2dyYXBoLm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5sc0hpc3RvcnlTZXJ2aWNlIHtcblxuICBwdWJsaWMgaGlzdG9yeTogYW55W107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oaXN0b3J5ID0gW107XG4gIH1cblxuICBwdWJsaWMgc2F2ZShncmFwaHM6IEdyYXBoW10sIGNvbmZpZykge1xuICAgIHRoaXMuaGlzdG9yeS5wdXNoKHtcbiAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICBncmFwaHM6IGdyYXBocyxcbiAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgaGFzaDogdGhpcy5oYXNoKGdyYXBocylcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNoKGdyYXBocykge1xuICAgIHJldHVybiBidG9hKEpTT04uc3RyaW5naWZ5KGdyYXBocykpO1xuICB9XG5cbiAgcHVibGljIGxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeTtcbiAgfVxufVxuXG4iLCIvKipcbiAqIENvcHlyaWdodCAoQykgMjAxOCBNaWNoYWVsIEN6ZWNob3dza2kgPG1haWxAZGFpbHlzaC5pdD5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0XG4gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3JcbiAqIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoXG4gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTFcbiAqIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLlxuICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgU2VsZWN0aW9uIGZyb20gJ2QzLXNlbGVjdGlvbic7XG5pbXBvcnQgKiBhcyBSYW5kb20gZnJvbSAnZDMtcmFuZG9tJztcblxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLy4uL21vZGVscy9wb2ludC5tb2RlbCc7XG5pbXBvcnQgeyBHcmFwaCB9IGZyb20gJy4vLi4vbW9kZWxzL2dyYXBoLm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5sc01hdGhTZXJ2aWNlIHtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gdG8gcG9pbnRzIHdpdGggY29vcmRpbmF0ZXMuXG4gICAqIEBwYXJhbSBhXG4gICAqIEBwYXJhbSBiXG4gICAqL1xuICBwdWJsaWMgw47ClChhOiBQb2ludCwgYjogUG9pbnQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coTWF0aC5wb3coYS54IC0gYi54LCAyKSArIE1hdGgucG93KGEueSAtIGIueSwgMiksIDAuNSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xvc2VzdENlbnRlcihwb2ludDogUG9pbnQsIG1hdHJpeDogYW55KSB7XG4gICAgaWYgKHRoaXMuw47ClChwb2ludCwgbWF0cml4LnN0YXJ0KSA8IHRoaXMuw47ClChwb2ludCwgbWF0cml4LmVuZCkpIHtcbiAgICAgIHJldHVybiBtYXRyaXguc3RhcnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtYXRyaXguZW5kO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRGYXJlc3RDZW50ZXIocG9pbnQ6IFBvaW50LCBtYXRyaXg6IGFueSkge1xuICAgIGlmICh0aGlzLsOOwpQocG9pbnQsIG1hdHJpeC5zdGFydCkgPiB0aGlzLsOOwpQocG9pbnQsIG1hdHJpeC5lbmQpKSB7XG4gICAgICByZXR1cm4gbWF0cml4LnN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWF0cml4LmVuZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmFuZG9tUG9pbnQobWF0cml4OiBhbnksIG92ZXJsYXA6IG51bWJlcikge1xuICAgIGNvbnN0IHggPSB7XG4gICAgICBtaW46IG1hdHJpeC5jZW50ZXIueCAtIG1hdHJpeC53aWR0aCAqIG92ZXJsYXAsXG4gICAgICBtYXg6IG1hdHJpeC5jZW50ZXIueCArIG1hdHJpeC53aWR0aCAqIG92ZXJsYXBcbiAgICB9O1xuICAgIGNvbnN0IHkgPSB7XG4gICAgICBtaW46IG1hdHJpeC5jZW50ZXIueSAtIG1hdHJpeC5oZWlnaHQgKiBvdmVybGFwLFxuICAgICAgbWF4OiBtYXRyaXguY2VudGVyLnkgKyBtYXRyaXguaGVpZ2h0ICogb3ZlcmxhcFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogUmFuZG9tLnJhbmRvbVVuaWZvcm0oeC5taW4sIHgubWF4KSgpLFxuICAgICAgeTogUmFuZG9tLnJhbmRvbVVuaWZvcm0oeS5taW4sIHkubWF4KSgpXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjZW50ZXJPZkFyZWEod2lkdGgsIGhlaWdodCk6IFBvaW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogd2lkdGggKiAwLjUsXG4gICAgICB5OiBoZWlnaHQgKiAwLjVcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGNlbnRlck9mUG9pbnRzKHAxOiBQb2ludCwgcDI6IFBvaW50KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IChwMS54ICsgcDIueCkgKiAwLjUsXG4gICAgICB5OiAocDEueSArIHAyLnkpICogMC41XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjZW50ZXJPZkN1cnZlKGN1cnZlOiBQb2ludFtdKSB7XG4gICAgY29uc3QgZ2VuTWVkaWFuID0gdGhpcy5tZWRpYW5Qb2ludChjdXJ2ZSk7XG4gICAgY29uc3QgcDEgPSBnZW5NZWRpYW4ubmV4dCgpLnZhbHVlO1xuICAgIGNvbnN0IHAyID0gZ2VuTWVkaWFuLm5leHQoKS52YWx1ZTtcbiAgICBjb25zdCByYWRpYW5zID0gdGhpcy5hbmdsZVJhZGlhbnMocDEsIHAyKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRoaXMuY2VudGVyT2ZQb2ludHMocDEsIHAyKSwgeyBhc2NlbnQ6IHJhZGlhbnMgfSk7XG4gIH1cblxuICBwdWJsaWMgbWVkaWFuT2ZDdXJ2ZShjdXJ2ZTogUG9pbnRbXSkge1xuICAgIGNvbnN0IGdlbk1lZGlhbiA9IHRoaXMubWVkaWFuUG9pbnQoY3VydmUpO1xuICAgIGNvbnN0IHAxID0gZ2VuTWVkaWFuLm5leHQoKS52YWx1ZTtcbiAgICBjb25zdCBwMiA9IGdlbk1lZGlhbi5uZXh0KCkudmFsdWU7XG4gICAgY29uc3QgcDMgPSBnZW5NZWRpYW4ubmV4dCgpLnZhbHVlO1xuICAgIGNvbnN0IHJhZGlhbnMgPSB0aGlzLmFuZ2xlUmFkaWFucyhwMiwgcDMpO1xuICAgIC8vIGNvbnN0IHJhZGlhbnMgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMDAwMCkgLyAxMDAwO1xuICAgIC8vIEB0b2RvIGlmIG5vZGVzIGFyZSBsZXNzIHRoYW4gNSBlcnJvciBvY2N1cmVzXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocDEsIHsgYXNjZW50OiByYWRpYW5zIH0pO1xuICB9XG5cbiAgcHVibGljIGFuZ2xlUmFkaWFucyhwMTogUG9pbnQsIHAyOiBQb2ludCkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHAyLnkgLSBwMS55LCBwMi54IC0gcDEueCk7XG4gIH1cblxuICBwdWJsaWMgYW5nbGVEZWdyZWUocDE6IFBvaW50LCBwMjogUG9pbnQpIHtcbiAgICByZXR1cm4gdGhpcy5hbmdsZVJhZGlhbnMocDEsIHAyKSAqIDE4MCAvIE1hdGguUEk7XG4gIH1cblxuICBwdWJsaWMgbWVkaWFuSW5kZXgobGlzdDogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihsaXN0Lmxlbmd0aCAqIDAuNSk7XG4gIH1cblxuICBwdWJsaWMgKm1lZGlhblBvaW50KHBvaW50czogUG9pbnRbXSkge1xuICAgIGxldCBpbmRleDogbnVtYmVyO1xuICAgIGNvbnN0IGxpc3Q6IFBvaW50W10gPSBwb2ludHMuc2xpY2UoKTtcblxuICAgIHdoaWxlIChsaXN0KSB7XG4gICAgICBpbmRleCA9IHRoaXMubWVkaWFuSW5kZXgocG9pbnRzKTtcbiAgICAgIHlpZWxkIGxpc3RbaW5kZXhdO1xuXG4gICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRvciBmb3Igc2luZSBib3VuY2VcbiAgICpcbiAgICogQHBhcmFtIHN0YXJ0IDAgaW5kaWNhdGVzIHRvIGluaXRpYXRlIHdpdGggcG9zaXRpdmUgbnVtYmVycywgMSBpbmRpY2F0ZXMgdG9cbiAgICogc3RhcnQgd2l0aCBuZWdhdGl2ZSBudW1iZXJzIGZpcnN0XG4gICAqIEBwYXJhbSBhbXBsaXR1ZGUgZGVmYXVsdCB0byAxIGluZGljYXRlcyB0aGUgYW1wbGl0dWRlIGluIHBvc2l0aXZlIGFzIHdlbGxcbiAgICogaW4gbmVnYXRpdmUgcmFuZ2VcbiAgICogQHBhcmFtIGRlY2ltYWxzIGFtb3VudCBvZiBkZWNpbWFsIHBsYWNlc1xuICAgKi9cblxuICBwdWJsaWMgKmJvdW5jZShcbiAgICBhbXBsaXR1ZGU6IG51bWJlciA9IDEsXG4gICAgZGVjaW1hbHM6IG51bWJlciA9IDEsXG4gICAgc3RhcnQ6IG51bWJlciA9IDBcbiAgKSB7XG4gICAgY29uc3QgcG93ZXIgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICAgIGNvbnN0IHN0ZXAgPSAyIC8gKHBvd2VyKTtcbiAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJhZGlhbnMgPSBNYXRoLlBJICogc3RlcCAqIGluZGV4ICsgc3RhcnQ7XG4gICAgICB5aWVsZCBNYXRoLnJvdW5kKChNYXRoLnNpbihyYWRpYW5zKSAqIGFtcGxpdHVkZSkgKiBwb3dlcikgLyBwb3dlcjtcblxuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgKmZsaXBTaWduKHN0YXJ0UG9zaXRpdmU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgbGV0IHNpZ24gPSBzdGFydFBvc2l0aXZlID8gMSA6IC0xO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHlpZWxkIHNpZ24gPSBzaWduICogKC0xKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG4vKipcbiAqIENvcHlyaWdodCAoQykgMjAxOCBNaWNoYWVsIEN6ZWNob3dza2kgPG1haWxAZGFpbHlzaC5pdD5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0XG4gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3JcbiAqIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoXG4gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTFcbiAqIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLlxuICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgUmVuZGVyZXIyLCBSZW5kZXJlckZhY3RvcnkyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBTZWxlY3Rpb24gZnJvbSAnZDMtc2VsZWN0aW9uJztcblxuaW1wb3J0IHsgTmxzTWF0aFNlcnZpY2UgfSBmcm9tICcuL21hdGguc2VydmljZSc7XG5pbXBvcnQgeyBHcmFwaCB9IGZyb20gJy4vLi4vbW9kZWxzL2dyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi8uLi9tb2RlbHMvcG9pbnQubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmxzR3JhcGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBncmFwaHM6IEdyYXBoW107XG4gIHByaXZhdGUgYW5pbWF0aW9uOiBib29sZWFuIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1hdGg6IE5sc01hdGhTZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLmdyYXBocztcbiAgfVxuXG4gIHB1YmxpYyBzZXQobmV3R3JhcGhzOiBHcmFwaFtdKSB7XG4gICAgdGhpcy5ncmFwaHMgPSBuZXdHcmFwaHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0QW5pbWF0aW9uKCkge1xuICAgIHRoaXMuYW5pbWF0aW9uID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdG9wQW5pbWF0aW9uKCkge1xuICAgIHRoaXMuYW5pbWF0aW9uID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgKnNwcmVhZE9ydGhvZ29uYWwoc3RhcnQ6IFBvaW50LCBzcGFjaW5nOiBudW1iZXIpIHtcbiAgICBjb25zdCBzaWduID0gdGhpcy5tYXRoLmZsaXBTaWduKCk7XG4gICAgbGV0IGN1cnJlbnRQb2ludCA9IHN0YXJ0O1xuICAgIGxldCBpID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBjdXJyZW50U3BhY2luZyA9IHNpZ24ubmV4dCgpLnZhbHVlICogc3BhY2luZyAqIGk7XG4gICAgICBjdXJyZW50UG9pbnQgPSB0aGlzLnNoaWZ0UG9pbnQoY3VycmVudFBvaW50LCBzdGFydC5hc2NlbnQsIGN1cnJlbnRTcGFjaW5nKTtcblxuICAgICAgeWllbGQgY3VycmVudFBvaW50O1xuXG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNoaWZ0UG9pbnQocG9pbnQ6IFBvaW50LCByYWRpYW5zOiBudW1iZXIsIHNwYWNpbmc6IG51bWJlcik6IFBvaW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5zaW4ocmFkaWFucyAqIE1hdGguUEkpICogc3BhY2luZyArIHBvaW50LngsXG4gICAgICB5OiBNYXRoLmNvcyhyYWRpYW5zICogTWF0aC5QSSkgKiBzcGFjaW5nICsgcG9pbnQueVxuICAgIH07XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDE4IE1pY2hhZWwgQ3plY2hvd3NraSA8bWFpbEBkYWlseXNoLml0PlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXRcbiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXG4gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3JcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvclxuICogbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGhcbiAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MVxuICogRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuXG4gKi9cblxuaW1wb3J0IHsgVmlld0NoaWxkLCBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcywgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGludGVydmFsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBTZWxlY3Rpb24gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCAqIGFzIFNoYXBlIGZyb20gJ2QzLXNoYXBlJztcbmltcG9ydCAqIGFzIFJhbmRvbSBmcm9tICdkMy1yYW5kb20nO1xuaW1wb3J0ICogYXMgRHJhZyBmcm9tICdkMy1kcmFnJztcblxuaW1wb3J0IHsgR3JhcGggfSBmcm9tICcuLy4uL21vZGVscy9ncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLy4uL21vZGVscy9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLy4uL21vZGVscy9wb2ludC5tb2RlbCc7XG5pbXBvcnQgeyBObHNDYW52YXNTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9jYW52YXMuc2VydmljZSc7XG5pbXBvcnQgeyBObHNIaXN0b3J5U2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvaGlzdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IE5sc01hdGhTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9tYXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzR3VpbGxvY2hlRGlyZWN0aXZlIH0gZnJvbSAnLi8uLi9kaXJlY3RpdmVzL2d1aWxsb2NoZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmxzR3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9ncmFwaC5zZXJ2aWNlJztcblxuY29uc3QgUkVTSVpJTkdfVElNRU9VVCA9IDgwMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmxzLWdyYXBocycsXG4gIHRlbXBsYXRlOiBgPHN2ZyAjc3ZnIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbnZlcnNpb249XCIxLjFcIiBzaGFwZS1yZW5kZXJpbmc9XCJnZW9tZXRyaWNQcmVjaXNpb25cIj5cbiAgPGcgbmxzR3VpbGxvY2hlICpuZ0Zvcj1cImxldCBncmFwaCBvZiBncmFwaHNcIiBbZ3JhcGhdPVwiZ3JhcGhcIiBbYW5pbWF0aW9uXT1cImFuaW1hdGlvblwiPjwvZz5cbjwvc3ZnPlxuYCxcbiAgc3R5bGVzOiBbYDpob3N0e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG9wOjA7bGVmdDowO292ZXJmbG93OmhpZGRlbn1gXVxufSlcbmV4cG9ydCBjbGFzcyBObHNHcmFwaHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG4gIHB1YmxpYyBjYW52YXM6IGFueSB8IG51bGw7XG4gIHB1YmxpYyBtYXRyaXg6IGFueSB8IG51bGw7XG4gIHB1YmxpYyBncmFwaHM6IEdyYXBoW107XG4gIHB1YmxpYyB3aW5kb3dIZWlnaHQ6IG51bWJlciB8IG51bGw7XG4gIHB1YmxpYyB3aW5kb3dXaWR0aDogbnVtYmVyIHwgbnVsbDtcblxuICBwcml2YXRlIGdlblNoaWZ0UG9pbnQ6IGFueSB8IG51bGw7XG4gIHByaXZhdGUgZ2VuTG9hZGVkQWxsR3JhcGhzOiBhbnkgfCBudWxsO1xuICBwcml2YXRlIGhhc2g6IHN0cmluZztcbiAgcHJpdmF0ZSByZXNpemluZ1dpbmRvdzogYW55O1xuXG4gIEBJbnB1dCgpIGNvbmZpZzogQ29uZmlnO1xuICBASW5wdXQoKSByZXN0b3JlZEhpc3Rvcnk6IGFueTtcbiAgQElucHV0KCkgYW5pbWF0aW9uOiBib29sZWFuO1xuICBAT3V0cHV0KCkgc3ZnQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZ3JhcGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBWaWV3Q2hpbGQoJ3N2ZycpIHN2Z0VsZW1lbnRSZWY7XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplKGV2ZW50KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXppbmdXaW5kb3cpO1xuXG4gICAgdGhpcy5yZXNpemluZ1dpbmRvdyA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYW52YXMgPSB0aGlzLmFkanVzdENhbnZhcygpO1xuICAgICAgdGhpcy5tYXRyaXggPSB0aGlzLmNhbGNNYXRyaXgoKTtcbiAgICAgIHRoaXMudXBkYXRlR3JhcGhzKCk7XG4gICAgfSwgUkVTSVpJTkdfVElNRU9VVCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNhbnZhc1NlcnZpY2U6IE5sc0NhbnZhc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBoaXN0b3J5U2VydmljZTogTmxzSGlzdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXRoOiBObHNNYXRoU2VydmljZSxcbiAgICBwcml2YXRlIGdyYXBoU2VydmljZTogTmxzR3JhcGhTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZ2VuTG9hZGVkQWxsR3JhcGhzID0gdGhpcy5jb3VudExvYWRlZEdyYXBocygpO1xuICAgIHRoaXMucmVzaXppbmdXaW5kb3cgPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmNhbnZhcyA9IHRoaXMuYWRqdXN0Q2FudmFzKCk7XG4gICAgdGhpcy5tYXRyaXggPSB0aGlzLmNhbGNNYXRyaXgoKTtcblxuICAgIGlmIChjaGFuZ2VzLmNvbmZpZykge1xuICAgICAgdGhpcy51cGRhdGVHcmFwaHMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXN0b3JlZEhpc3RvcnkgJiYgdGhpcy5yZXN0b3JlZEhpc3RvcnkuaGFzaCAhPT0gdGhpcy5oYXNoKSB7XG4gICAgICB0aGlzLnJlc3RvcmVHcmFwaCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUdyYXBoKCkge1xuICAgIHRoaXMuZ3JhcGhzID0gdGhpcy5yZXN0b3JlZEhpc3RvcnkuZ3JhcGhzO1xuICAgIHRoaXMuaGFzaCA9IHRoaXMucmVzdG9yZWRIaXN0b3J5Lmhhc2g7XG4gIH1cblxuICBwcml2YXRlIHNhdmVIaXN0b3J5KCkge1xuICAgIHRoaXMuaGFzaCA9IHRoaXMuaGlzdG9yeVNlcnZpY2UuaGFzaCh0aGlzLmdyYXBocyk7XG4gICAgdGhpcy5oaXN0b3J5U2VydmljZS5zYXZlKHRoaXMuZ3JhcGhzLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVHcmFwaCgpIHtcbiAgICB0aGlzLmdyYXBoU2VydmljZS5zZXQodGhpcy5ncmFwaHMpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVHcmFwaHMoKTogdm9pZCB7XG4gICAgY29uc3QgZ2VuU2hpZnRTdGFydCA9IHRoaXMuc2hpZnRQb2ludCh0aGlzLm1hdHJpeC5zdGFydCwgdGhpcy5jb25maWcudmVjdG9ycy5zdGFydCk7XG4gICAgY29uc3QgZ2VuU2hpZnRFbmQgPSB0aGlzLnNoaWZ0UG9pbnQodGhpcy5tYXRyaXguZW5kLCB0aGlzLmNvbmZpZy52ZWN0b3JzLmVuZCwgZmFsc2UpO1xuXG4gICAgY29uc29sZS5sb2codGhpcy5tYXRyaXgpO1xuXG4gICAgY29uc3QgY3VydmVMaXN0ID0gW1xuICAgICAge1xuICAgICAgICBjb2xvcjogdGhpcy5jb25maWcuY29sb3JzLnByaW1hcnksXG4gICAgICAgIHN0YXJ0OiBnZW5TaGlmdFN0YXJ0Lm5leHQoKS52YWx1ZSxcbiAgICAgICAgZW5kOiBnZW5TaGlmdEVuZC5uZXh0KCkudmFsdWVcbiAgICAgICAgLy8gc3RhcnQ6IHtcbiAgICAgICAgLy8gICBwb2ludDogdGhpcy5tYXRyaXguc3RhcnQsXG4gICAgICAgIC8vICAgdmVjdG9yOiB0aGlzLmNvbmZpZy52ZWN0b3JzLnN0YXJ0XG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIGVuZDoge1xuICAgICAgICAvLyAgIHBvaW50OiB0aGlzLm1hdHJpeC5lbmQsXG4gICAgICAgIC8vICAgdmVjdG9yOiB0aGlzLmNvbmZpZy52ZWN0b3JzLmVuZFxuICAgICAgICAvLyB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjb2xvcjogdGhpcy5jb25maWcuY29sb3JzLnNlY29uZGFyeSxcbiAgICAgICAgc3RhcnQ6IGdlblNoaWZ0RW5kLm5leHQoKS52YWx1ZSxcbiAgICAgICAgZW5kOiBnZW5TaGlmdFN0YXJ0Lm5leHQoKS52YWx1ZVxuICAgICAgICAvLyBlbmQ6IHtcbiAgICAgICAgLy8gICBwb2ludDogdGhpcy5tYXRyaXguc3RhcnQsXG4gICAgICAgIC8vICAgdmVjdG9yOiB0aGlzLmNvbmZpZy52ZWN0b3JzLnN0YXJ0XG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIHN0YXJ0OiB7XG4gICAgICAgIC8vICAgcG9pbnQ6IHRoaXMubWF0cml4LmVuZCxcbiAgICAgICAgLy8gICB2ZWN0b3I6IHRoaXMuY29uZmlnLnZlY3RvcnMuZW5kXG4gICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICBdO1xuXG4gICAgdGhpcy5ncmFwaHMgPSBjdXJ2ZUxpc3QubWFwKGN1cnZlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMuYWRqdXN0R3JhcGgoY3VydmUpLFxuICAgICAgICBzcHJlYWQ6IHRoaXMuY29uZmlnLnNwcmVhZCxcbiAgICAgICAgaW50ZXJ2YWw6IHRoaXMuY29uZmlnLmludGVydmFsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuaGFzaCA9IHRoaXMuaGlzdG9yeVNlcnZpY2UuaGFzaCh0aGlzLmdyYXBocyk7XG4gICAgdGhpcy5zYXZlSGlzdG9yeSgpO1xuICAgIHRoaXMuc2F2ZUdyYXBoKCk7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdEdyYXBoKGN1cnZlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oY3VydmUsIHtcbiAgICAgIHN0cm9rZTogdGhpcy5jb25maWcuc3Ryb2tlLFxuICAgICAgc3RhcnQ6IE9iamVjdC5hc3NpZ24oY3VydmUuc3RhcnQsIHtcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmdlblZlY3RvclBvaW50KGN1cnZlLnN0YXJ0LnBvaW50LCBjdXJ2ZS5zdGFydC52ZWN0b3IpXG4gICAgICB9KSxcbiAgICAgIGVuZDogT2JqZWN0LmFzc2lnbihjdXJ2ZS5lbmQsIHtcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmdlblZlY3RvclBvaW50KGN1cnZlLmVuZC5wb2ludCwgY3VydmUuZW5kLnZlY3RvcilcbiAgICAgIH0pLFxuICAgICAgbm9kZXM6IHRoaXMuZ2VuUmFuZG9tUG9pbnRzKHRoaXMuY29uZmlnLm5vZGVzKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5SYW5kb21Qb2ludHMobnVtOiBudW1iZXIpIHtcbiAgICBjb25zdCBnZW5lcmF0ZWRQb2ludHMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcubm9kZXM7IGkrKykge1xuICAgICAgZ2VuZXJhdGVkUG9pbnRzLnB1c2godGhpcy5tYXRoLnJhbmRvbVBvaW50KHRoaXMubWF0cml4LCB0aGlzLmNvbmZpZy5vdmVybGFwKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlbmVyYXRlZFBvaW50cztcbiAgfVxuXG4gIHByaXZhdGUgZmxpcGZsb3AoeDogc3RyaW5nKSB7XG4gICAgcmV0dXJuICh4ID09PSAnc3RhcnQnKSA/ICdlbmQnIDogJ3N0YXJ0JztcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0Q2FudmFzKCk6IHZvaWQge1xuICAgIHRoaXMuY2FudmFzU2VydmljZS5zZXQodGhpcy5jYW52YXMpO1xuICAgIHRoaXMuY2FudmFzU2VydmljZS5hZGp1c3RUb1dpbmRvdygpO1xuXG4gICAgcmV0dXJuIHRoaXMuc3ZnRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjTWF0cml4KCkge1xuICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gdGhpcy5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gdGhpcy5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGNvbnN0IHRvdGFsQXJlYSA9IE1hdGguYWJzKGNhbnZhc1dpZHRoICogY2FudmFzSGVpZ2h0KTtcbiAgICBjb25zdCB0b3RhbENlbnRlciA9IHRoaXMubWF0aC5jZW50ZXJPZkFyZWEoY2FudmFzV2lkdGgsIGNhbnZhc0hlaWdodCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogY2FudmFzSGVpZ2h0IC0gdGhpcy5jb25maWcudmVjdG9ycy5zcGFjaW5nIC0gdGhpcy5jb25maWcubWFyZ2luLnlcbiAgICAgIH0sXG4gICAgICBlbmQ6IHtcbiAgICAgICAgeDogY2FudmFzV2lkdGggLSB0aGlzLmNvbmZpZy52ZWN0b3JzLnNwYWNpbmcgLSB0aGlzLmNvbmZpZy5tYXJnaW4ueCxcbiAgICAgICAgeTogMFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiBjYW52YXNXaWR0aCxcbiAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgY2VudGVyOiB0b3RhbENlbnRlclxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdlblZlY3RvclBvaW50KHBvaW50OiBQb2ludCwgdmVjdG9yOiBudW1iZXIpIHtcbiAgICBjb25zdCByYW5nZSA9IHRoaXMubWF0aC7DjsKUKHRoaXMubWF0cml4LnN0YXJ0LCB0aGlzLm1hdHJpeC5lbmQpICogdGhpcy5jb25maWcudmVjdG9ycy5yYW5nZTtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiByYW5nZSAqIE1hdGguc2luKE1hdGguUEkgKiB2ZWN0b3IpICsgcG9pbnQueCxcbiAgICAgIHk6IHJhbmdlICogTWF0aC5jb3MoTWF0aC5QSSAqIHZlY3RvcikgKyBwb2ludC55XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgKnNoaWZ0UG9pbnQocG9pbnQ6IFBvaW50LCB2ZWN0b3I6IG51bWJlciwgc3RhcnRQb3NpdGl2ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBnZW5TaGlmdFggPSB0aGlzLnNoaWZ0TnVtYmVyKHRoaXMuY29uZmlnLnZlY3RvcnMuc3BhY2luZywgdmVjdG9yLCBzdGFydFBvc2l0aXZlKTtcbiAgICBjb25zdCBnZW5TaGlmdFkgPSB0aGlzLnNoaWZ0TnVtYmVyKHRoaXMuY29uZmlnLnZlY3RvcnMuc3BhY2luZywgdmVjdG9yLCBzdGFydFBvc2l0aXZlKTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHBvaW50OiB7XG4gICAgICAgICAgeDogTWF0aC5jb3MoTWF0aC5QSSAqIHZlY3RvcikgKiBnZW5TaGlmdFgubmV4dCgpLnZhbHVlICsgcG9pbnQueCxcbiAgICAgICAgICB5OiBNYXRoLnNpbihNYXRoLlBJICogdmVjdG9yKSAqIGdlblNoaWZ0WS5uZXh0KCkudmFsdWUgKyBwb2ludC55LFxuICAgICAgICB9LFxuICAgICAgICB2ZWN0b3I6IHZlY3RvclxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlICpzaGlmdE51bWJlcihzcGFjZTogbnVtYmVyLCB2ZWN0b3I6IG51bWJlciwgc3RhcnRQb3NpdGl2ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBsZXQgY3VycmVudCA9IDA7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBzaWduID0gdGhpcy5tYXRoLmZsaXBTaWduKHN0YXJ0UG9zaXRpdmUpO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHlpZWxkIGN1cnJlbnQgPSBzaWduLm5leHQoKS52YWx1ZSAqIGluZGV4ICogc3BhY2UgKyBjdXJyZW50O1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZUd1aWxsb2NoZUV4cG9ydChndWlsbG9jaGVFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuZ2VuTG9hZGVkQWxsR3JhcGhzLm5leHQoKS52YWx1ZSkge1xuICAgICAgdGhpcy5zdmdDaGFuZ2UuZW1pdCh0aGlzLnN2Z0VsZW1lbnRSZWYpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgKmNvdW50TG9hZGVkR3JhcGhzKCkge1xuICAgIGxldCBjeWNsZXMgPSAxO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChjeWNsZXMgPCB0aGlzLmdyYXBocy5sZW5ndGgpIHtcbiAgICAgICAgeWllbGQgZmFsc2U7XG4gICAgICAgIGN5Y2xlcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeWllbGQgdHJ1ZTtcbiAgICAgICAgY3ljbGVzID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDE4IE1pY2hhZWwgQ3plY2hvd3NraSA8bWFpbEBkYWlseXNoLml0PlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXRcbiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXG4gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3JcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvclxuICogbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGhcbiAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MVxuICogRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuXG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgRGlyZWN0aXZlLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgU2VsZWN0aW9uIGZyb20gJ2QzLXNlbGVjdGlvbic7XG5pbXBvcnQgKiBhcyBTaGFwZSBmcm9tICdkMy1zaGFwZSc7XG5pbXBvcnQgKiBhcyBSYW5kb20gZnJvbSAnZDMtcmFuZG9tJztcbmltcG9ydCAqIGFzIERyYWcgZnJvbSAnZDMtZHJhZyc7XG5pbXBvcnQgKiBhcyBFYXNlIGZyb20gJ2QzLWVhc2UnO1xuaW1wb3J0ICogYXMgVGltZXIgZnJvbSAnZDMtdGltZXInO1xuXG5pbXBvcnQgeyBHcmFwaCB9IGZyb20gJy4vLi4vbW9kZWxzL2dyYXBoLm1vZGVsJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi8uLi9tb2RlbHMvcG9pbnQubW9kZWwnO1xuaW1wb3J0IHsgTmxzQ2FudmFzU2VydmljZSB9IGZyb20gJy4vLi4vc2VydmljZXMvY2FudmFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzTWF0aFNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL21hdGguc2VydmljZSc7XG5pbXBvcnQgeyBObHNHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ncmFwaC5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25sc0d1aWxsb2NoZV0nXG59KVxuZXhwb3J0IGNsYXNzIE5sc0d1aWxsb2NoZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBwcml2YXRlIGNhbnZhczogYW55O1xuICBwcml2YXRlIGdyb3VwOiBhbnk7XG4gIHByaXZhdGUgYm91bmNlOiBhbnkgfCBudWxsO1xuICBwcml2YXRlIGJvdW5jZXM6IGFueSB8IG51bGw7XG4gIHByaXZhdGUgaW5pdGlhbE5vZGVzOiBhbnk7XG4gIHByaXZhdGUgaW5pdGlhbEN1cnZlOiBhbnk7XG4gIHByaXZhdGUgYW5pbWF0aW9uSW50ZXJ2YWw6IGFueTtcbiAgcHJpdmF0ZSBtZWRpYW5Qb2ludDogUG9pbnQ7XG4gIHByaXZhdGUgbWVkaWFuSW5kZXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBwYXRoRWxlbWVudHM6IGFueTtcblxuICBASW5wdXQoKSBncmFwaDogR3JhcGg7XG4gIEBJbnB1dCgpIGFuaW1hdGlvbjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNhbnZhc1NlcnZpY2U6IE5sc0NhbnZhc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIG1hdGg6IE5sc01hdGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JhcGhTZXJ2aWNlOiBObHNHcmFwaFNlcnZpY2VcbiAgKSB7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmdyb3VwLnNlbGVjdEFsbCgnKicpLnJlbW92ZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuZ3JvdXAgPSBTZWxlY3Rpb24uc2VsZWN0KHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5jYW52YXMgPSBTZWxlY3Rpb24uc2VsZWN0KHRoaXMuY2FudmFzU2VydmljZS5nZXQpO1xuICAgIC8vIEB0b2RvIG1vZGlmeSBncmFwaCBoZXJlIGluc3RlYWQgb2YgaW4gZ3JhcGhzLmNvbXBvbmVudC50c1xuICAgIHRoaXMuaW5pdGlhbE5vZGVzID0gdGhpcy5ncmFwaC5ub2Rlcy5zbGljZSgpO1xuICAgIHRoaXMuaW5pdGlhbEN1cnZlID0gW1xuICAgICAgdGhpcy5ncmFwaC5zdGFydC5wb2ludCxcbiAgICAgIHRoaXMuZ3JhcGguc3RhcnQuZGlyZWN0aW9uLFxuICAgICAgLi4udGhpcy5ncmFwaC5ub2Rlcy5zbGljZSgpLFxuICAgICAgdGhpcy5ncmFwaC5lbmQuZGlyZWN0aW9uLFxuICAgICAgdGhpcy5ncmFwaC5lbmQucG9pbnRcbiAgICBdO1xuICAgIHRoaXMubWVkaWFuUG9pbnQgPSB0aGlzLm1hdGgubWVkaWFuT2ZDdXJ2ZSh0aGlzLmluaXRpYWxDdXJ2ZSk7XG4gICAgdGhpcy5tZWRpYW5JbmRleCA9IHRoaXMubWF0aC5tZWRpYW5JbmRleCh0aGlzLmluaXRpYWxDdXJ2ZSk7XG5cbiAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuZ3JhcGgubm9kZXMgPSB0aGlzLmdyYXBoLm5vZGVzLnNsaWNlKCkubWFwKChub2RlLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogbm9kZS54LFxuICAgICAgICAgIHk6IG5vZGUueSxcbiAgICAgICAgICAvLyBhc2NlbnQ6IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEwMCkgLyAxMDBcbiAgICAgICAgICBhc2NlbnQ6IHRoaXMubWVkaWFuUG9pbnQuYXNjZW50ICsgaSAqIDAuNVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmJvdW5jZXMgPSB0aGlzLmluaXRpYWxOb2Rlcy5tYXAobm9kZSA9PiB7XG4gICAgICAgIGNvbnN0IGJvdW5jZUFtcGxpdHVkZSA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDE1MCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGguYm91bmNlKGJvdW5jZUFtcGxpdHVkZSwgMyk7XG4gICAgICB9KTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHRoaXMuYW5pbWF0aW9uSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYW5pbWF0ZUdyYXBoKGkrKyAlIDEwMDAgLyAxMDAwMCk7XG4gICAgICB9LCB0aGlzLmdyYXBoLmludGVydmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uSW50ZXJ2YWwpIHtcbiAgICAgICAgdGhpcy5ib3VuY2UgPSBudWxsO1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYW5pbWF0aW9uSW50ZXJ2YWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ3JvdXAuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7XG4gICAgdGhpcy5wYXRoRWxlbWVudHMgPSBbXTtcblxuICAgIGNvbnN0IGdyYXBocyA9IHRoaXMuc3ByZWFkTGluZXMoW1xuICAgICAgdGhpcy5ncmFwaC5zdGFydC5wb2ludCxcbiAgICAgIHRoaXMuZ3JhcGguc3RhcnQuZGlyZWN0aW9uLFxuICAgICAgLi4udGhpcy5ncmFwaC5ub2RlcyxcbiAgICAgIHRoaXMuZ3JhcGguZW5kLmRpcmVjdGlvbixcbiAgICAgIHRoaXMuZ3JhcGguZW5kLnBvaW50LFxuICAgIF0pLmZvckVhY2goKHBvaW50cywgaW5kZXgpID0+IHRoaXMuZHJhd0dyYXBoKHBvaW50cykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbmltYXRlR3JhcGgoeCkge1xuICAgIGNvbnN0IGdyYXBocyA9IHRoaXMuc3ByZWFkTGluZXMoW1xuICAgICAgdGhpcy5ncmFwaC5zdGFydC5wb2ludCxcbiAgICAgIHRoaXMuZ3JhcGguc3RhcnQuZGlyZWN0aW9uLFxuICAgICAgLi4udGhpcy5ncmFwaC5ub2Rlcy5tYXAoKHBvaW50LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGFzY2VudCA9IHBvaW50LmFzY2VudCAqIE1hdGguc2luKE1hdGguUEkgKiB4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLnNoaWZ0UG9pbnQocG9pbnQsIGFzY2VudCwgdGhpcy5ib3VuY2VzW2ldLm5leHQoKS52YWx1ZSk7XG4gICAgICB9KSxcbiAgICAgIHRoaXMuZ3JhcGguZW5kLmRpcmVjdGlvbixcbiAgICAgIHRoaXMuZ3JhcGguZW5kLnBvaW50LFxuICAgIF0pO1xuXG4gICAgZ3JhcGhzLmZvckVhY2goKHBvaW50cywgaSkgPT4gdGhpcy51cGRhdGVHcmFwaChwb2ludHMsIGkpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3ByZWFkTGluZXMocG9pbnRzOiBQb2ludFtdKSB7XG4gICAgY29uc3Qgc2hpZnRlZE1lZGlhbnMgPSBbXTtcbiAgICBjb25zdCBnZW5zaGlmdGVkTWVkaWFucyA9IHRoaXMuZ3JhcGhTZXJ2aWNlLnNwcmVhZE9ydGhvZ29uYWwodGhpcy5tZWRpYW5Qb2ludCwgdGhpcy5ncmFwaC5zcHJlYWQuc3BhY2luZyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZ3JhcGguc3ByZWFkLmFtb3VudDsgaSsrKSB7XG4gICAgICBzaGlmdGVkTWVkaWFucy5wdXNoKGdlbnNoaWZ0ZWRNZWRpYW5zLm5leHQoKS52YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoaWZ0ZWRNZWRpYW5zLm1hcChtZWRpYW4gPT4ge1xuICAgICAgY29uc3Qgc2hpZnRlZFBvaW50cyA9IHBvaW50cy5zbGljZSgpO1xuICAgICAgc2hpZnRlZFBvaW50cy5zcGxpY2UodGhpcy5tZWRpYW5JbmRleCwgMSwgbWVkaWFuKTtcbiAgICAgIHJldHVybiBzaGlmdGVkUG9pbnRzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVHcmFwaChwb2ludHM6IFBvaW50W10sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhdGhFbGVtZW50c1tpbmRleF1cbiAgICAgIC5hdHRyKCdkJywgU2hhcGUubGluZSgpXG4gICAgICAgIC54KHAgPT4gcC54KVxuICAgICAgICAueShwID0+IHAueSlcbiAgICAgICAgLmN1cnZlKFNoYXBlLmN1cnZlQmFzaXMpKHBvaW50cykpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3R3JhcGgocG9pbnRzOiBQb2ludFtdKTogdm9pZCB7XG4gICAgdGhpcy5ncm91cFxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHRoaXMuZ3JhcGguY29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgdGhpcy5ncmFwaC5zdHJva2UpXG4gICAgICAuYXR0cignZmlsbCcsICdub25lJyk7XG5cbiAgICB0aGlzLnBhdGhFbGVtZW50cy5wdXNoKFxuICAgICAgdGhpcy5ncm91cC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cignZCcsIFNoYXBlLmxpbmUoKVxuICAgICAgICAgIC54KHAgPT4gcC54KVxuICAgICAgICAgIC55KHAgPT4gcC55KVxuICAgICAgICAgIC5jdXJ2ZShTaGFwZS5jdXJ2ZUJhc2lzKShwb2ludHMpKSk7XG4gIH1cblxuICBwcml2YXRlIGRlYnVnR3JhcGgocG9pbnRzOiBQb2ludFtdKSB7XG4gICAgcG9pbnRzLmZvckVhY2goKHBvaW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY2lyY2xlID0gdGhpcy5ncm91cC5hcHBlbmQoJ2cnKTtcblxuICAgICAgY2lyY2xlLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgLmF0dHIoJ2N4JywgcG9pbnQueClcbiAgICAgICAgLmF0dHIoJ2N5JywgcG9pbnQueSlcbiAgICAgICAgLmF0dHIoJ3InLCAzKVxuICAgICAgICAuYXR0cignZmlsbC1vcGFjaXR5JywgMC42KVxuICAgICAgICAuYXR0cignZmlsbCcsIHRoaXMuZ3JhcGguY29sb3IpO1xuXG4gICAgICBjaXJjbGUuYXBwZW5kKCd0ZXh0JylcbiAgICAgICAgLmF0dHIoJ3gnLCBwb2ludC54KVxuICAgICAgICAuYXR0cigneScsIHBvaW50LnkpXG4gICAgICAgIC5hdHRyKCdkeCcsIDgpXG4gICAgICAgIC5hdHRyKCdkeScsIDE1KVxuICAgICAgICAuYXR0cignZmlsbCcsIHRoaXMuZ3JhcGguY29sb3IpXG4gICAgICAgIC50ZXh0KGluZGV4KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggTWljaGFlbCBDemVjaG93c2tpIDxtYWlsQGRhaWx5c2guaXQ+XG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxuICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWVcbiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVRcbiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yXG4gKiBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aFxuICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxXG4gKiBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGludGVydmFsLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBTZWxlY3Rpb24gZnJvbSAnZDMtc2VsZWN0aW9uJztcblxuaW1wb3J0IHsgR3JhcGggfSBmcm9tICcuLi9tb2RlbHMvZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgTmxzTWF0aFNlcnZpY2UgfSBmcm9tICcuL21hdGguc2VydmljZSc7XG5pbXBvcnQgeyBObHNIaXN0b3J5U2VydmljZSB9IGZyb20gJy4vaGlzdG9yeS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5sc0FuaW1hdGlvblNlcnZpY2Uge1xuXG4gIHB1YmxpYyBncmFwaHM6IEdyYXBoW107XG4gIHB1YmxpYyBzcGVlZDogbnVtYmVyO1xuICBwdWJsaWMgcmFuZ2U6IG51bWJlcjtcbiAgLy8gcHVibGljIGdlbkFuaW1hdGlvbjogYW55O1xuICAvLyBwcml2YXRlIHRpbWVyOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIC8vIHByaXZhdGUgc3Vic2NyaWJ0aW9uOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtYXRoOiBObHNNYXRoU2VydmljZSxcbiAgICBwcml2YXRlIGhpc3RvcnlTZXJ2aWNlOiBObHNIaXN0b3J5U2VydmljZSxcbiAgKSB7XG4gIH1cblxuICAvLyBwdWJsaWMgYW5pbWF0ZShpbml0aWFsR3JhcGhzOiBHcmFwaFtdKSB7XG4gIHB1YmxpYyBhbmltYXRlKGluaXRpYWxHcmFwaDogR3JhcGgpIHtcbiAgICAvLyBjb25zdCBuZXdHcmFwaHMgPSBpbml0aWFsR3JhcGhzLnNsaWNlKCk7XG5cbiAgICAvLyByZXR1cm4gbmV3R3JhcGhzLm1hcChncmFwaCA9PiB7XG5cbiAgICAgIGNvbnN0IG5ld0dyYXBoID0gT2JqZWN0LmFzc2lnbih7fSwgaW5pdGlhbEdyYXBoKTtcbiAgICAgIGNvbnN0IGluZGV4TWlkZGxlID0gTWF0aC5mbG9vcihuZXdHcmFwaC5ub2Rlcy5sZW5ndGggKiAwLjUpO1xuICAgICAgY29uc3QgcG9pbnRNaWRkbGUgPSBuZXdHcmFwaC5ub2Rlc1tpbmRleE1pZGRsZV07XG5cbiAgICAgIG5ld0dyYXBoLm5vZGVzLnNwbGljZShpbmRleE1pZGRsZSwgMSwge1xuICAgICAgICB4OiBwb2ludE1pZGRsZS54IC0gMixcbiAgICAgICAgeTogcG9pbnRNaWRkbGUueSArIDIsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ld0dyYXBoO1xuICAvLyAgIH0pO1xuICB9XG59XG5cbiIsImltcG9ydCB7IEJyb3dzZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE5sc0dyYXBoc0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9ncmFwaHMuY29tcG9uZW50JztcbmltcG9ydCB7IE5sc0d1aWxsb2NoZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9ndWlsbG9jaGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5sc0hpc3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9oaXN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzQ2FudmFzU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvY2FudmFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmxzTWF0aFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21hdGguc2VydmljZSc7XG5pbXBvcnQgeyBObHNHcmFwaFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2dyYXBoLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQnJvd3Nlck1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBObHNHcmFwaHNDb21wb25lbnQsXG4gICAgTmxzR3VpbGxvY2hlRGlyZWN0aXZlXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIE5sc0hpc3RvcnlTZXJ2aWNlLFxuICAgIE5sc0NhbnZhc1NlcnZpY2UsXG4gICAgTmxzTWF0aFNlcnZpY2UsXG4gICAgTmxzR3JhcGhTZXJ2aWNlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgTmxzR3JhcGhzQ29tcG9uZW50LFxuICAgIE5sc0d1aWxsb2NoZURpcmVjdGl2ZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE5sc0d1aWxsb2NoZU1vZHVsZSB7fVxuIl0sIm5hbWVzIjpbIkluamVjdGFibGUiLCJSZW5kZXJlckZhY3RvcnkyIiwiUmFuZG9tLnJhbmRvbVVuaWZvcm0iLCJFdmVudEVtaXR0ZXIiLCJDb21wb25lbnQiLCJJbnB1dCIsIk91dHB1dCIsIlZpZXdDaGlsZCIsIkhvc3RMaXN0ZW5lciIsIlNlbGVjdGlvbi5zZWxlY3QiLCJTaGFwZS5saW5lIiwiU2hhcGUuY3VydmVCYXNpcyIsIkRpcmVjdGl2ZSIsIkVsZW1lbnRSZWYiLCJOZ01vZHVsZSIsIkJyb3dzZXJNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7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QUM7d0JBQUMsS0FBSyxDQUFDOzRCQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQUMsTUFBTTt3QkFDOUIsS0FBSyxDQUFDOzRCQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7d0JBQ3hELEtBQUssQ0FBQzs0QkFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFBQyxTQUFTO3dCQUNqRCxLQUFLLENBQUM7NEJBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFBQyxTQUFTO3dCQUNqRDs0QkFDSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0NBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FBQyxTQUFTOzZCQUFFOzRCQUM1RyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUs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